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 <noreply@anthropic.com>
This commit is contained in:
Marius
2026-07-09 14:15:45 +03:00
parent fef7ff472e
commit 4a73d0dd39

View File

@@ -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.<serviciu>.environment.<VAR>: required variable <VAR> 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
<image-api> 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.