From 4927338c98aac53751fdeba15487aecd347df250 Mon Sep 17 00:00:00 2001 From: Asep Haryana Date: Sun, 2 Aug 2026 16:54:10 +0700 Subject: [PATCH] docs: sync infra docs to Caddy+Nix 4000s (Traefik/Docker legacy) --- .claude/skills/deploy-workflow.md | 2 +- .claude/skills/hub-rules.md | 16 +++--- ARCHITECTURE.md | 94 +++++++++++++++++-------------- CHANGELOG.md | 10 ++++ CLAUDE.md | 37 ++++++------ docs/ARCHITECTURE.md | 12 ++-- docs/plan/tools/architecture.md | 2 + docs/plan/tools/implementation.md | 2 + docs/plan/tools/infrastructure.md | 2 + docs/plan/tools/pipeline.md | 2 + docs/troubleshooting.md | 5 +- 11 files changed, 106 insertions(+), 78 deletions(-) diff --git a/.claude/skills/deploy-workflow.md b/.claude/skills/deploy-workflow.md index 87f972b..9797943 100644 --- a/.claude/skills/deploy-workflow.md +++ b/.claude/skills/deploy-workflow.md @@ -1,6 +1,6 @@ --- name: deploy-workflow -description: Panduan deploy, CI/CD, dan Docker compose patterns untuk Asepharyana Hub +description: Panduan deploy, CI/CD, dan Nix/systemd patterns untuk Asepharyana Hub --- # Deploy & Workflow — Asepharyana Hub diff --git a/.claude/skills/hub-rules.md b/.claude/skills/hub-rules.md index 741f72e..270ab5a 100644 --- a/.claude/skills/hub-rules.md +++ b/.claude/skills/hub-rules.md @@ -14,8 +14,9 @@ asepharyana-hub/ ├── infra/ # Infrastructure as code │ ├── compose/ # Satu compose file per service │ ├── dapr/ # Dapr component configs -│ ├── docker/ # Dockerfiles per service -│ └── traefik/ # Static & dynamic Traefik config +│ ├── docker/ # Dockerfiles (LEGACY — Docker dihapus) +│ ├── traefik/ # Traefik config (LEGACY — diganti Caddy) +│ └── caddy/ # Caddyfile.prod (reverse proxy produksi) ├── scripts/ # Utility scripts (cleanup, update-deps) └── .github/workflows/ # CI/CD pipelines ``` @@ -28,9 +29,8 @@ asepharyana-hub/ ## Infrastructure Patterns ### Networking -- Semua service join **`app-shared-net`** (external Docker bridge) -- Service discovery via Docker DNS (container alias) -- Traefik sebagai ingress untuk HTTP/S eksternal +- Semua service Nix/systemd, inter-service via 127.0.0.1: +- Caddy sebagai ingress untuk HTTP/S eksternal (auto-TLS LE, HTTP/3) - Tailscale untuk cross-VPS (PostgreSQL, Redis) ### Compose File Pattern @@ -78,8 +78,8 @@ networks: - ../../infra/dapr/components:/components ``` -### Traefik Routing -- Router + service definition di `infra/traefik/dynamic/apps.yaml` +### Caddy Routing +- Site block di `/etc/caddy/Caddyfile` (ref `infra/caddy/Caddyfile.prod`) - Subdomain pattern: `.asepharyana.my.id` + `.asepharyana.web.id` - TLS cert dari volume mount (bukan auto-acme) @@ -92,5 +92,5 @@ networks: 1. `shared.yml` (Redis) 2. `nats.yml` (NATS message bus) 3. `dapr.yml` (Dapr placement) -4. `traefik.yml` (Reverse proxy) +4. Caddy (reverse proxy) 5. Service compose files (apps + Dapr sidecar) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 378873e..dbb1855 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -10,12 +10,12 @@ asepharyana-hub/ │ ├── adr/ # Architecture Decision Records │ ├── add-new-app.md # Guide for adding new services │ └── superpowers/ # Project capabilities tracking -├── infra/ # Infrastructure as code -│ ├── compose/ # Docker Compose files per service +├── infra/ # Infrastructure as code (LEGACY Docker layout) +│ ├── compose/ # Docker Compose files (LEGACY — Docker dihapus 2026-08-02) │ ├── config/ # Infrastructure configuration -│ ├── docker/ # Dockerfiles per service -│ └── traefik/ # Traefik reverse proxy config -│ └── dynamic/ # Dynamic routing rules (YAML) +│ ├── docker/ # Dockerfiles (LEGACY) +│ ├── traefik/ # Traefik config (LEGACY — diganti Caddy) +│ └── caddy/ # Caddyfile.prod (reverse proxy produksi) ├── scripts/ # Utility scripts │ ├── git-hooks/ # Git hook scripts │ ├── cleanup-ghcr.sh # GHCR image cleanup @@ -38,9 +38,10 @@ asepharyana-hub/ | Component | Technology | Purpose | | ------------------ | ----------------------- | ---------------------------------------------------------------- | -| Reverse Proxy | Traefik v3.6 | TLS termination, routing, middleware (rate-limit, headers, auth) | -| Container Runtime | Docker + Docker Compose | Service isolation and orchestration | -| Container Registry | GHCR (ghcr.io) | Docker image storage | +| Reverse Proxy | Caddy 2.11.4 | TLS termination (auto-LE), routing, HTTP/3, keep-alive tuning | +| Runtime | Nix + systemd | Service isolation and orchestration (Docker dihapus 2026-08-02) | +| Deployment | GitHub Actions | nix build → nix copy ssh:// → systemctl restart | +| Secrets | Bitwarden Secrets Manager (BWS) | Central secret store, bws-exec wrapper | | Networking | Tailscale | Secure overlay network between VPS nodes | | Message Bus | NATS + JetStream | Event-driven pub/sub, job queues, streaming | | Runtime Sidecar | Dapr | Service invocation, pub/sub abstraction, state management | @@ -49,41 +50,50 @@ asepharyana-hub/ ## Infrastructure -### Traefik Reverse Proxy +### Caddy Reverse Proxy -Traefik runs as the entry point for all HTTP/S traffic. It is configured via: +Caddy 2.11.4 runs as the entry point for all HTTP/S traffic (systemd `caddy.service`, `/etc/caddy/Caddyfile`). It is configured via: -- **Static config**: CLI arguments in `infra/compose/traefik.yml` — entry points, providers, plugins -- **Dynamic config**: `infra/traefik/dynamic/` — routers, services, middlewares, TLS -- **Docker provider**: Auto-discovers containers with `traefik.enable=true` labels -- **File provider**: Loads `apps.yaml` (routers/services), `middlewares.yaml`, `ssl.yaml` +- **Auto-TLS**: Let's Encrypt per-domain (email asepharyana@gmail.com) +- **HTTP/3**: h3 enabled on :443 (QUIC) +- **Snippet `(proxy)`**: shared handler — `encode zstd gzip`, security headers, keep-alive upstream (keepalive 120s, max_conns_per_host 100, dial_timeout 3s) +- **Upload domain** (`upload.asepharyana.my.id`): `flush_interval -1` (streaming), `request_body max_size 0` (unlimited) -Key middleware chains (`infra/traefik/dynamic/middlewares.yaml`): +Reference: `infra/caddy/Caddyfile.prod`. Legacy Traefik configs stay under `infra/traefik/` for reference only. -- `secure-headers` — SSL redirect, HSTS, XSS protection, CSP -- `compress` — Gzip compression for responses over 256 bytes -- `rate-limit` — 100 avg / 50 burst requests -- `buffer` — 10MB request/response body limit -- `block-sensitive-paths` — blocks `.env`, `.git`, `/wp-admin` etc. -- `common-chain` — composes secure-headers + compress + retry + rate-limit + buffer +### Port Mapping (Produksi) -All services route through Traefik on port 443 (TLS), with automatic HTTP-to-HTTPS redirect. +| Service | Port | Domain | +|---------|------|--------| +| TeleUploader | 4000 | upload.asepharyana.my.id | +| GMW backend | 4001 | (internal) | +| pr-agent | 4002 | pr-agent.asepharyana.my.id | +| hub frontend | 4003 | asepharyana.my.id | +| lidm frontend | 4004 | lidm.asepharyana.my.id | +| lidm backend | 4005 | lidm-api.asepharyana.my.id | +| zeavis API | 4006 | api-zeavisedu.asepharyana.my.id | +| tools frontend | 4007 | tools.asepharyana.my.id | +| tools gateway | 4008 | (internal) | +| GMW proxy | 4009 | imphnen.asepharyana.my.id | +| llm-api | 4010 | ai.asepharyana.my.id | +| zeavisedu nginx | 4011 | zeavisedu.asepharyana.my.id | +| zeavis ML | 4012 | ml-zeavisedu.asepharyana.my.id | +| dashboard | 4013 | dashboard.asepharyana.my.id | +| 9router | 4014 | 9router.asepharyana.my.id | +| scraper | 4091 | scraper.asepharyana.my.id | -### Docker Compose +### Nix + systemd Deployment -Each service has its own Compose file under `infra/compose/`. All services join the `app-shared-net` external Docker network, enabling inter-service communication by container name. - -Shared services: - -- `infra/compose/shared.yml` — Redis (alias: `redis`) -- `infra/compose/traefik.yml` — Traefik reverse proxy - -Service compose files are combined during deployment: +Docker dihapus dari produksi (2026-08-02). Semua service deploy via Nix flakes + systemd: ```bash -docker compose -f traefik.yml -f shared.yml -f scraper.yml up -d +nix build .#default --impure --option sandbox false +nix copy --to ssh://vps /nix/store/ +systemctl restart ``` +CI/CD: GitHub Actions (`deploy.yml`) → nix build → nix copy → systemctl restart. Flake dibatasi `x86_64-linux` (nixpkgs 26.11 drop darwin). + ### Tailscale Networking ```mermaid @@ -99,12 +109,12 @@ graph TB REDIS[Redis] end - subgraph "orangevps Containers" - TRAEFIK[Traefik :443] + subgraph "orangevps Services (Nix)" + CADDY[Caddy :443] SCRAPER[scraper-api :4091] end - TRAEFIK --> SCRAPER + CADDY --> SCRAPER style IMRNES fill:#3a7,color:#fff style ORANGEVPS fill:#37a,color:#fff @@ -127,17 +137,17 @@ This is managed by `/etc/systemd/system/tailscale-routes.service` on the `orange sequenceDiagram participant User as Browser/Client participant DNS as Cloudflare DNS - participant Traefik as Traefik Proxy + participant Caddy as Caddy Proxy participant App as Application Container participant DB as PostgreSQL (imrnes via Tailscale) participant Redis as Redis (imrnes via Tailscale) User->>DNS: asepharyana.my.id DNS->>User: A/AAAA record → orangevps VPS IP - User->>Traefik: HTTPS request :443 - Traefik->>Traefik: TLS termination - Traefik->>Traefik: Middleware chain (headers, rate-limit, buffer) - Traefik->>App: HTTP reverse-proxy (internal network) + User->>Caddy: HTTPS request :443 + Caddy->>Caddy: TLS termination + Caddy->>Caddy: encode + headers + Caddy->>App: HTTP reverse-proxy (127.0.0.1:) alt Database query App->>DB: sqlx/Drizzle query via Tailscale @@ -147,8 +157,8 @@ sequenceDiagram Cache-->>App: Cached value end - App-->>Traefik: HTTP response - Traefik-->>User: HTTPS response + App-->>Caddy: HTTP response + Caddy-->>User: HTTPS response ``` ### CI/CD Pipeline diff --git a/CHANGELOG.md b/CHANGELOG.md index 97f7171..759fecc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,16 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [2026-08-02] + +### Changed + +- **Infra overhaul**: Docker + Traefik dihapus dari produksi → Caddy 2.11.4 (reverse proxy, auto-TLS LE, HTTP/3) + Nix/systemd services. +- **Port migration**: semua service pindah ke port 4000-an (hub 4003, tools 4007/4008, scraper 4091, llm-api 4010, dll). +- **DB via PgBouncer pool**: semua service konek ke imrnes 100.121.180.82:6432 (bukan :5432 langsung). +- **Secrets**: Bitwarden Secrets Manager (BWS) sebagai central secret store, wrapper bws-exec. +- **Flake**: dibatasi x86_64-linux (nixpkgs 26.11 drop darwin). + ## [Unreleased] ### Changed diff --git a/CLAUDE.md b/CLAUDE.md index d6b132a..dba78b4 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,7 +4,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co ## Repository Overview -Asepharyana Hub is a **hub monorepo** for Asep Haryana Saputra's portfolio ecosystem. Application services live in separate repos imported as Git submodules under `apps/`. Infrastructure (Docker Compose, Traefik, Dapr) lives in `infra/`. +Asepharyana Hub is a **hub monorepo** for Asep Haryana Saputra's portfolio ecosystem. Application services live in separate repos imported as Git submodules under `apps/`. Production infrastructure: Caddy reverse proxy + Nix/systemd services (Docker/Traefik removed 2026-08-02; legacy configs under `infra/` marked LEGACY). ``` asepharyana-hub/ @@ -13,9 +13,9 @@ asepharyana-hub/ │ └── scraper/ # Rust scraper API (asepharyana-hub-scraper) ├── docs/ # ADRs, deployment guide, new-app guide ├── infra/ -│ ├── compose/ # One Docker Compose file per service +│ ├── compose/ # Docker Compose files (LEGACY — Docker dihapus) │ ├── dapr/ # Dapr config + component definitions -│ ├── docker/ # Dockerfiles per service +│ ├── docker/ # Dockerfiles (LEGACY) │ └── traefik/ # Reverse proxy config (static + dynamic) ├── scripts/ # Utility scripts (cleanup, update-deps, git hooks) └── .github/workflows/ # CI/CD pipelines @@ -31,23 +31,22 @@ asepharyana-hub/ - `apps/tools` → `asepharyana/asepharyana-hub-tools`. ### Infrastructure Stack -- **Traefik v3.6** — reverse proxy, TLS termination, middleware chain, Prometheus metrics (`--metrics.prometheus=true`) +- **Caddy 2.11.4** — reverse proxy, TLS termination (auto-LE), HTTP/3, zstd/gzip, keep-alive tuning (`/etc/caddy/Caddyfile`, ref `infra/caddy/Caddyfile.prod`) - **NATS + JetStream** — message broker with persistent streaming - **Dapr** — sidecar runtime (pub/sub abstraction, state management, service invocation) - **Redis (Alpine)** — cache, session store, Dapr state store & pub/sub backend -- **Prometheus** — metrics backend with Docker service discovery (`docker_sd_configs`). Auto-discovers containers with `prometheus.io/scrape=true` label. +- **Prometheus** — metrics backend with `file_sd_configs` target files. - **Jaeger** — distributed tracing backend (all-in-one), OTLP receiver - **Tailscale** — secure overlay network between VPS nodes (PostgreSQL on `imrnes`, containers on `orangevps`) ### Monitoring - **Hub dashboard** at `/dashboard` (Next.js client page, auto-refresh 15s) -- **Dashboard API** at `/api/dashboard` — returns JSON with Docker containers, Jaeger traces, Prometheus metrics (RPS, latency, errors, node CPU/RAM/Disk) -- **Docker socket** mounted on `hub` container (`--group-add 988`) for container discovery -- **Prometheus** auto-scrapes Traefik for per-service request metrics +- **Dashboard API** at `/api/dashboard` — returns JSON with systemd services, Jaeger traces, Prometheus metrics (RPS, latency, errors, node CPU/RAM/Disk) +- **Prometheus** scrapes node-exporter + app metrics endpoints ### Networking -- All containers join `app-shared-net` (external Docker bridge network). Service discovery via Docker DNS (container name aliases). -- Traefik handles all external HTTP/S traffic on port 443. +- All services run as Nix/systemd units; inter-service via 127.0.0.1:. +- Caddy handles all external HTTP/S traffic on port 443 (and HTTP/3 UDP). - Cross-VPS traffic (DB, Redis) goes through Tailscale (`100.64.0.0/10`). Container-to-Tailscale connectivity requires a route in the main routing table (managed by `tailscale-routes.service`). ## Commands @@ -62,7 +61,7 @@ bun run ci # Biome CI mode (no writes, exit code on issues) bun run format # Format only bun run lint # Lint only -docker build -f infra/docker/scraper.Dockerfile -t scraper-api:latest . # Build image +# Nix build (produksi): nix build .#default --impure --option sandbox false ``` ### Validate YAML @@ -76,8 +75,8 @@ for f in infra/compose/*.yml; do docker compose -f "$f" config >/dev/null && ech | Workflow | Trigger | Action | |----------|---------|--------| | `lint.yml` | PR/push to main touching `*.json`, `*.js`, `biome.json` | `bun run ci` (Biome lint) | -| `docker-build-push.yml` | Push to main touching `apps/**`/`infra/**`, or `repository_dispatch` | Build Docker images per changed service, push to GHCR, update compose manifests | -| `deploy-docker.yml` | After build completes, or push touching `infra/**` | SSH to VPS (orangevps), pull images, restart containers selectively | +| `deploy.yml` | Push to main | nix build → nix copy ssh:// → systemctl restart | +| `docker-build-push.yml` | LEGACY (Docker dihapus) | LEGACY | | `security.yml` | PR to main + weekly Monday | CodeQL analysis (Rust) | | `update-submodule.yml` | `repository_dispatch` | Update submodule pointer in hub repo | @@ -99,11 +98,11 @@ Each service gets one compose file. Containers join `app-shared-net` with a `con ### Dapr Sidecar Pattern Each app gets a companion `daprd` sidecar container. Dapr components (pubsub, statestore) are mounted from `infra/dapr/components/`. The sidecar communicates with NATS for pub/sub and Dapr placement for actor coordination. -### Traefik Routing -- Routers + services defined in `infra/traefik/dynamic/apps.yaml` +### Caddy Routing +- Site blocks in `/etc/caddy/Caddyfile` (ref `infra/caddy/Caddyfile.prod`) - Subdomain pattern: `.asepharyana.my.id` and `.asepharya.web.id` -- TLS certs from volume mounts (not auto-ACME) -- Middleware chain: `secure-headers` → `compress` → `retry` → `rate-limit` → `buffer` +- Auto-TLS via Let's Encrypt +- Shared handler snippet `(proxy)`: `encode zstd gzip` + security headers + keep-alive tuning ### Image Tagging - `sha-` — immutable, for deterministic rollbacks @@ -115,9 +114,9 @@ Each app gets a companion `daprd` sidecar container. Dapr components (pubsub, st 1. Create a separate repo for the app code 2. Add as submodule: `git submodule add apps/` -3. Create Dockerfile in `infra/docker/` +3. Create Nix flake package + systemd unit 4. Create compose file in `infra/compose/` (app + Dapr sidecar) -5. Add Traefik router in `infra/traefik/dynamic/apps.yaml` +5. Add Caddy site block in `/etc/caddy/Caddyfile` 6. Add build job in `.github/workflows/docker-build-push.yml` 7. See `docs/add-new-app.md` for full guide diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 12b670f..13533b4 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -11,7 +11,7 @@ Dua node terhubung via **Tailscale** overlay network: │ Tailscale: 100.x.x.x │◄──────┤ │ │ │ │ Layanan: │ │ Layanan: │ │ ├─ PostgreSQL (port 6432) │ -│ ├─ Traefik (port 80/443) │ │ └─ Redis (port 6379) │ +│ ├─ Caddy (port 80/443) │ │ └─ Redis (port 6379) │ │ ├─ NATS + JetStream │ │ │ │ ├─ Dapr Placement │ └──────────────────────────────┘ │ ├─ Redis (cache, Dapr) │ @@ -30,7 +30,7 @@ Container di `orangevps` tidak bisa langsung mencapai IP Tailscale (`100.x.x.x`) Internet │ ▼ Port 443 -Traefik (v3.6) +Caddy 2.11.4 (auto-TLS LE, HTTP/3) ├─ TLS termination (sertifikat dari volume mount) ├─ Middleware chain: secure-headers → compress → retry → rate-limit → buffer ├─ Plugin: real-ip (Cloudflare), block-sensitive-paths @@ -40,11 +40,11 @@ Host(`asepharyana.my.id`) || Host(`www.asepharyana.my.id`) → hub host(`hub.asepharyana.my.id`) → hub (SPA + dashboard) Host(`scraper.asepharyana.my.id`) || Host(`api.asepharyana.my.id`) → scraper-api │ - ├─ hub (Next.js, port 3000) + ├─ hub (Next.js, port 4003) │ ├─ / — Portfolio SPA │ ├─ /dashboard — Ops dashboard (client-side, auto-refresh 15s) - │ ├─ /api/dashboard — JSON: Docker containers, Jaeger traces, Prometheus metrics - │ └─ Docker socket mounted (:ro) for container discovery + │ ├─ /api/dashboard — JSON: systemd services, Jaeger traces, Prometheus metrics + │ └─ Metrics via node-exporter + app endpoints │ ▼ Service load balancer http://scraper-api:4091 @@ -71,7 +71,7 @@ Semua service berjalan dalam satu Docker Compose project bernama `compose` dan b | `nats.yml` | `nats` | Message broker + JetStream persistent streaming | | `dapr.yml` | `dapr-placement` | Koordinasi actor placement untuk sidecar Dapr | | `scraper.yml` | `scraper-api` + `scraper-api-dapr` | Aplikasi Rust + sidecar Dapr | -| `hub.yml` | `hub` | Next.js SPA portfolio + dashboard + Docker socket | +| systemd hub | `hub` | Next.js SPA portfolio + dashboard | | `observability.yml` | `otel-collector`, `jaeger`, `prometheus`, `node-exporter` | Tracing, metrics, observability | ### Dapr Sidecar Pattern diff --git a/docs/plan/tools/architecture.md b/docs/plan/tools/architecture.md index 013f903..4cbc20e 100644 --- a/docs/plan/tools/architecture.md +++ b/docs/plan/tools/architecture.md @@ -1,5 +1,7 @@ # Architecture +> **LEGACY (2026-08-02):** Dokumen plan ini ditulis saat infra masih Docker/Traefik. Produksi sekarang Caddy + Nix/systemd dengan port 4000-an. Gunakan hanya sebagai referensi historis. + ## System Overview ``` diff --git a/docs/plan/tools/implementation.md b/docs/plan/tools/implementation.md index 43af0e9..23a57b8 100644 --- a/docs/plan/tools/implementation.md +++ b/docs/plan/tools/implementation.md @@ -1,5 +1,7 @@ # Implementation Plan — Granular Task Breakdown +> **LEGACY (2026-08-02):** Dokumen plan ini ditulis saat infra masih Docker/Traefik. Produksi sekarang Caddy + Nix/systemd dengan port 4000-an. Gunakan hanya sebagai referensi historis. + Setiap task adalah unit kerja terkecil yang bisa dikerjakan dalam 1-4 jam. Format: ``` diff --git a/docs/plan/tools/infrastructure.md b/docs/plan/tools/infrastructure.md index c4104cd..b228462 100644 --- a/docs/plan/tools/infrastructure.md +++ b/docs/plan/tools/infrastructure.md @@ -1,5 +1,7 @@ # Infrastructure & Deployment +> **LEGACY (2026-08-02):** Dokumen plan ini ditulis saat infra masih Docker/Traefik. Produksi sekarang Caddy + Nix/systemd dengan port 4000-an. Gunakan hanya sebagai referensi historis. + ## Docker Image Architecture Project ini punya **satu Docker image** dengan multi-stage build. Backend Rust + Tesseract + ONNX model plus frontend Next.js. diff --git a/docs/plan/tools/pipeline.md b/docs/plan/tools/pipeline.md index 962f10b..0752803 100644 --- a/docs/plan/tools/pipeline.md +++ b/docs/plan/tools/pipeline.md @@ -1,5 +1,7 @@ # Document Scanner — Processing Pipeline +> **LEGACY (2026-08-02):** Dokumen plan ini ditulis saat infra masih Docker/Traefik. Produksi sekarang Caddy + Nix/systemd dengan port 4000-an. Gunakan hanya sebagai referensi historis. + Ini adalah inti dari project. Pipeline mengubah foto dokumen HP jadi dokumen scan yang proper. Setiap tahap dibahas detail teknisnya. ## Pipeline Overview diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index 2acfe06..254d675 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -2,14 +2,15 @@ Kumpulan solusi untuk masalah umum yang spesifik di infrastruktur `asepharyana-hub`. +> **Catatan (2026-08-02):** Produksi sekarang Caddy + Nix/systemd. Section Traefik/Docker di bawah adalah LEGACY — Docker dan Traefik dihapus dari produksi; gunakan hanya sebagai referensi historis. + ## Daftar Isi - [Deployment](#deployment) - [Dapr](#dapr) - [NATS](#nats) -- [Traefik](#traefik) - [Tailscale / Networking](#tailscale--networking) -- [Docker / Container](#docker--container) +- [Caddy](#caddy) - [Database](#database) - [Submodule](#submodule)