diff --git a/docs/SERVER.md b/docs/SERVER.md index 8d068b3..04c6f4f 100644 --- a/docs/SERVER.md +++ b/docs/SERVER.md @@ -85,7 +85,7 @@ Pamiętaj: opublikowany port kontenera omija ufw — patrz `CLAUDE.md`, sekcja 3 | Stack | Ścieżka | Status | Opis | |---|---|---|---| -| Traefik | `/srv/infra/stacks/traefik` | _(planowany)_ | reverse proxy, TLS, wejście do wszystkiego | +| Traefik | `/srv/infra/stacks/traefik` | **działa** (od 2026-08-20) | reverse proxy, TLS DNS-01 przez OVH (`ovh-ca`), image `traefik:v3.7.11`, dashboard tylko przez tunel SSH (`127.0.0.1:8080`) | | Gitea | `/srv/infra/stacks/gitea` | _(planowany)_ | repozytoria kodu, mirror na GitHub | | Monitoring | `/srv/infra/stacks/monitoring` | _(planowany)_ | Uptime Kuma, alerty na maila | @@ -128,6 +128,7 @@ odtworzyć, co się działo — nie o pełny changelog. | Data | Co się zmieniło | Kto | |---|---|---| +| 2026-08-20 | Krok 13 bootstrapu (część 1/3 — Traefik): stack `traefik:v3.7.11` uruchomiony, DNS-01 przez OVH (endpoint `ovh-ca`), klucze API w `.env` (poza repo, `chmod 600`), dashboard na `127.0.0.1:8080` (tylko tunel SSH). Zweryfikowane: redirect 80→443, dashboard odpowiada lokalnie, logi czyste. Certyfikat wildcard wystawi się przy podpięciu pierwszej usługi (Gitea) | Claude + Kacper | | 2026-08-20 | Krok 11 bootstrapu: snapshot OVH zrobiony — czysty, utwardzony system przed postawieniem usług | Kacper | | 2026-08-20 | Krok 10 bootstrapu: `/srv/apps`, `/srv/data` utworzone (`/srv/infra` już istniało), właściciel `ubuntu:ubuntu` | Claude | | 2026-08-20 | Krok 9 bootstrapu: `~/.tmux.conf` skonfigurowany (mouse, vi keys, `focus-events on`), przeładowany w sesji `bootstrap` bez restartu | Claude | diff --git a/stacks/traefik/.env.example b/stacks/traefik/.env.example new file mode 100644 index 0000000..512b9c2 --- /dev/null +++ b/stacks/traefik/.env.example @@ -0,0 +1,6 @@ +# Klucze API OVH — DNS-01 dla wildcard *.dfkk.cloud +# Panel OVH regionu CA: https://ca.api.ovh.com/createToken/ +# Uprawnienia: GET/PUT/POST/DELETE na /domain/zone/* +OVH_APPLICATION_KEY= +OVH_APPLICATION_SECRET= +OVH_CONSUMER_KEY= diff --git a/stacks/traefik/compose.yaml b/stacks/traefik/compose.yaml new file mode 100644 index 0000000..bceac15 --- /dev/null +++ b/stacks/traefik/compose.yaml @@ -0,0 +1,43 @@ +services: + traefik: + image: traefik:v3.7.11 + container_name: traefik + restart: unless-stopped + command: + - --providers.docker=true + - --providers.docker.exposedByDefault=false + - --providers.docker.network=edge + - --entrypoints.web.address=:80 + - --entrypoints.web.http.redirections.entrypoint.to=websecure + - --entrypoints.web.http.redirections.entrypoint.scheme=https + - --entrypoints.websecure.address=:443 + - --entrypoints.traefik.address=:8080 + - --api.dashboard=true + - --certificatesresolvers.ovh.acme.dnschallenge=true + - --certificatesresolvers.ovh.acme.dnschallenge.provider=ovh + - --certificatesresolvers.ovh.acme.email=k.kruszka@hotmail.com + - --certificatesresolvers.ovh.acme.storage=/letsencrypt/acme.json + - --log.level=INFO + environment: + - OVH_ENDPOINT=ovh-ca + - OVH_APPLICATION_KEY=${OVH_APPLICATION_KEY} + - OVH_APPLICATION_SECRET=${OVH_APPLICATION_SECRET} + - OVH_CONSUMER_KEY=${OVH_CONSUMER_KEY} + ports: + - "80:80" + - "443:443" + - "127.0.0.1:8080:8080" # dashboard, wyłącznie przez tunel SSH + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./letsencrypt:/letsencrypt + networks: + - edge + labels: + - traefik.enable=true + - traefik.http.routers.dashboard.rule=Host(`traefik.dfkk.cloud`) + - traefik.http.routers.dashboard.entrypoints=traefik + - traefik.http.routers.dashboard.service=api@internal + +networks: + edge: + external: true