From 4a73d0dd39e8baf0e6b84612be1ee7d71c95b33e Mon Sep 17 00:00:00 2001 From: Marius Date: Thu, 9 Jul 2026 14:15:45 +0300 Subject: [PATCH] docs(lxc103): autopass - env vars noi obligatorii + fix DB readonly (uid non-root) Documentate doua probleme intalnite la deploy: variabile env noi (AUTOPASS_RAR_ENV, AUTOPASS_SESSION_SECRET, AUTOPASS_WORKER_SEND_ENABLED) devenite obligatorii in docker-compose.yml fara actualizare in Dokploy, si crash-loop api/worker cu "readonly database" dupa ce imaginea a trecut la user non-root (uid 10001) fara chown pe volumul SQLite existent. Co-Authored-By: Claude Sonnet 5 --- proxmox/lxc103-dokploy/docs/autopass.md | 53 ++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/proxmox/lxc103-dokploy/docs/autopass.md b/proxmox/lxc103-dokploy/docs/autopass.md index 51b7e10..0e1807d 100644 --- a/proxmox/lxc103-dokploy/docs/autopass.md +++ b/proxmox/lxc103-dokploy/docs/autopass.md @@ -48,12 +48,29 @@ expirat în Dokploy). Folosește tab-ul **` Git`**: |-----------|---------| | `AUTOPASS_CREDS_KEY` | cheie Fernet, **partajată api↔worker** (vezi mai jos) | | `AUTOPASS_REQUIRE_API_KEY` | `true` pentru prod | +| `AUTOPASS_RAR_ENV` | `prod` | +| `AUTOPASS_SESSION_SECRET` | secret random (vezi generare mai jos), doar pt `api` | +| `AUTOPASS_WORKER_SEND_ENABLED` | `true` pentru prod (worker-ul trimite efectiv la RAR) | ```bash # Generare AUTOPASS_CREDS_KEY: python3 -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())" + +# Generare AUTOPASS_SESSION_SECRET: +openssl rand -hex 32 ``` -Fără cheie, compose pică explicit (`:?seteaza AUTOPASS_CREDS_KEY`). +Fără cheie, compose pică explicit (`:?seteaza AUTOPASS_CREDS_KEY` / `:?seteaza +AUTOPASS_RAR_ENV` / `:?seteaza AUTOPASS_SESSION_SECRET` / `:?seteaza +AUTOPASS_WORKER_SEND_ENABLED`) — compose-ul din repo a adăugat ulterior aceste variabile +ca obligatorii pentru `api`/`worker`; dacă lipsesc din Environment-ul Dokploy, deploy-ul +pică la interpolare **înainte** de build, câte una pe rând (docker compose se oprește la +prima variabilă lipsă, deci fixul se poate face în mai multe runde), cu eroare de tipul: +``` +error while interpolating services.api.environment.AUTOPASS_RAR_ENV: required variable +AUTOPASS_RAR_ENV is missing a value: seteaza AUTOPASS_RAR_ENV (test|prod) in .env +``` +containerele deja rulante nu sunt afectate — doar noul deploy eșuează, prod rămâne pe +imaginea veche până se adaugă variabilele lipsă și se redeploy-ează. ### 4. Domain **Domains** → service **`api`**, port **`8010`**, domain `autopass.roa.romfast.ro`. @@ -111,7 +128,39 @@ reconstruit imaginea (commit `412102b`). > 404 vs 502: 404 = niciun backend sănătos / niciun router care să răspundă; 502 = portul > din Traefik ≠ portul containerului. Aici api nu pornea deloc → 404. -### 3. (Nu era o problemă) `/` → 303 +### 3. Deploy eșuat la interpolare — variabile noi obligatorii lipsă din Dokploy +**Simptom:** deploy-ul pică **înainte** de build, cu `error while interpolating +services..environment.: required variable is missing a value`. +**Cauză:** un commit ulterior în `docker-compose.yml` a adăugat `AUTOPASS_RAR_ENV`, +`AUTOPASS_SESSION_SECRET` (api) și `AUTOPASS_WORKER_SEND_ENABLED` (worker) ca variabile +`${VAR:?...}` obligatorii, dar Environment-ul din Dokploy pentru serviciul `autopass` nu +fusese actualizat. Docker compose se oprește la **prima** variabilă lipsă, deci fixul +poate ieși în mai multe runde (adaugi una, redeploy, apare următoarea). +**Fix:** adaugă în Dokploy → service `autopass` → Environment toate cele 3 (vezi tabelul +de mai sus), apoi redeploy. + +### 4. 404 la `https://autopass.romfast.ro/` — api + worker crash-loop, DB readonly +**Simptom:** după fixul de la #3, deploy-ul trece de build, dar `api` și `worker` intră în +crash-loop (`docker ps` → `Restarting`), site-ul răspunde **404**. Loguri: +`sqlite3.OperationalError: attempt to write a readonly database`. +**Cauză:** imaginea nouă rulează containerele ca user non-root `app` (uid **10001**, +`docker inspect --format '{{.Config.User}}'` → `app`), dar volumul Docker +`autopass-data` (cu `autopass.db`) era deținut de `root:root` din deploy-urile vechi +(când containerul rula ca root) → userul `app` nu poate scrie nici fișierul, nici WAL-ul +din directorul volumului. +**Fix:** +```bash +ssh root@10.0.20.201 "pct exec 103 -- docker volume inspect autopass-roaautopass-jqqw1l_autopass-data --format '{{.Mountpoint}}'" +# chown pe mountpoint-ul returnat, la uid/gid-ul userului din imagine: +ssh root@10.0.20.201 "pct exec 103 -- chown -R 10001:10001 /var/lib/docker/volumes/autopass-roaautopass-jqqw1l_autopass-data/_data" +# apoi restart: +ssh root@10.0.20.201 "pct exec 103 -- sh -lc 'cd /etc/dokploy/compose/autopass-roaautopass-jqqw1l/code && docker compose -p autopass-roaautopass-jqqw1l -f ./docker-compose.yml restart api worker'" +``` +Fără pierdere de date — doar schimbă proprietarul fișierului SQLite existent. Dacă +imaginea schimbă din nou uid-ul userului non-root, verifică din nou cu `docker run --rm + id app` înainte de chown. + +### 5. (Nu era o problemă) `/` → 303 După fix, root-ul redirectează `303 → /login` (auth pe sesiune). E comportament normal, nu eroare.