Temă
Operare
Configurare pentru producție
Pornind de la .env.example, schimbă obligatoriu:
| Variabilă | Valoare de producție |
|---|---|
APP_ENV / APP_DEBUG | production / false |
COOKIE_SECURE / COOKIE_DOMAIN | true / .domeniultau.ro |
DIAGNOSTICS_ENABLED, SEED_DEMO_DATA | false |
APP_KEY | generată o singură dată (php artisan key:generate --show; pnpm build:prod o pune în .env.example) |
DB_PASSWORD, DB_ROOT_PASSWORD | parole generate aleator |
MAIL_HOST, MAIL_PORT, MAIL_USERNAME, MAIL_PASSWORD, MAIL_FROM_ADDRESS | furnizorul real de e-mail |
MAIL_ALLOWED_RECIPIENTS | gol (fără restricție) — doar în producție |
PUBLIC_*_URL | adresele HTTPS publice |
SMS_DRIVER, PUSH_DRIVER | driverul furnizorului real, când e integrat |
HTTPS se termină într-un proxy în fața containerelor (de exemplu un load balancer sau Caddy/Traefik) care trimite către porturile 8080–8082.
Monitorizare
| Ce | Cum |
|---|---|
| API viu | GET /api/health/live → {"status":"up"} |
| Starea serviciilor | GET /api/health (sau Backoffice → Stare sistem): baza de date, cache-ul, stocarea fișierelor, e-mailul, cu latențe |
| Starea întregii platforme | http://localhost:8084: aplicațiile web, serviciile și procesele periodice (ultima rulare), actualizată la 30 de secunde; API-ul verifică aplicațiile prin adresele din STATUS_APP_URLS |
| Alerte | e-mail către ALERT_EMAILS când ceva cade și când își revine (vezi mai jos) |
| Jurnale | docker compose logs -f api scheduler sau, pe cPanel, storage/logs/ (procesele periodice raportează ce au făcut: plăți, automatizări, campanii) |
| Cozi operaționale | Backoffice → Panou: anunțuri de moderat, raportări urgente, dispute, tichete |
| Integritatea datelor | pnpm db:check periodic (de exemplu zilnic); orice regulă încălcată e un incident |
Copii de siguranță
Serviciul backup din Docker Compose face zilnic (la BACKUP_TIME, implicit 03:00) o copie a bazei de date și a fișierelor încărcate, în ./backups/taraba-AAAALLZZ-HHMMSS/:
| Fișier | Conținut |
|---|---|
database.sql.gz | mysqldump consistent (o singură tranzacție, aplicația nu se blochează) |
files.tar.gz | fotografiile anunțurilor, avatarele, actele în așteptare (volumul api-storage) |
SHA256SUMS | sumele de control, verificate înainte de orice restaurare |
manifest.json | data și dimensiunile |
- Copia se scrie într-un folder temporar și se redenumește doar când e completă: o copie întreruptă nu pare niciodată validă.
- Se păstrează ultimele
BACKUP_KEEPcopii (implicit 7). - O copie imediată:
docker compose exec backup backup.sh. - Copiază
./backupsși în alt loc (alt disc, alt server, stocare în cloud): o copie pe același disc nu protejează de pierderea discului.
Restaurare
bash
docker compose stop api scheduler
docker compose run --rm backup restore.sh latest # sau restore.sh taraba-20261030-030000
docker compose start api scheduler
pnpm db:check # integritatea după restaurarerestore.sh … --database-only sau --files-only restaurează doar o parte. O copie cu sume de control greșite e refuzată. Restaurarea a fost testată cap-coadă (copie → ștergerea comenzilor și plăților → restaurare → toate regulile de integritate trec); repetă testul lunar, pe o copie a mediului.
Sesiunile, codurile temporare și cache-ul stau în aceeași bază de date, deci intră în aceeași copie. Pe cPanel, pe lângă baza de date (din „Backup” sau phpMyAdmin), salvează folderul api/storage/app.
Alerte
Cu ALERT_EMAILS setat, API-ul verifică la fiecare ALERT_CHECK_SECONDS (implicit 300; minimum 5) serviciile, aplicațiile web și procesele periodice și trimite un e-mail:
- când ceva nu mai răspunde, după
ALERT_AFTER_FAILURES(implicit 2) verificări eșuate la rând (fără alarme pentru un singur răspuns lent); - când își revine;
- o singură dată pe schimbare (nu la fiecare verificare), cu mai multe căderi simultane în același e-mail, cu motivul și linkul către pagina de stare.
Un proces periodic e considerat cu probleme dacă ultima rulare a eșuat sau n-a mai rulat de 2,5 ori intervalul lui. Starea alertelor se păstrează în cache-ul din baza de date (supraviețuiește repornirilor); în dezvoltare, e-mailurile ajung în Mailpit.
Procese periodice
| Proces | Interval |
|---|---|
| Confirmarea automată a comenzilor | 10 min |
| Plăți către vânzători | orar |
| Alerte pentru căutările salvate | orar |
| Campanii programate | 1 min |
| Automatizări CRM | 5 min |
| Amintiri juridice | zilnic |
| Curățarea sesiunilor expirate | orar |
Alerte de stare (doar cu ALERT_EMAILS) | ALERT_CHECK_SECONDS |
Le pornește planificatorul Laravel: serviciul scheduler în Docker (php artisan schedule:work), o linie de cron la fiecare minut pe cPanel (php artisan schedule:run, vezi producția pe cPanel). Fiecare rulare ia o blocare în baza de date, deci un proces nu rulează niciodată de două ori în același timp, nici cu mai multe servere, nici când e pornit și manual (verificat cu 5 porniri simultane). Ultima rulare a fiecărui proces (ora, durata, rezultatul) apare pe pagina de stare. În dezvoltare, runJobNow(name) (cu DIAGNOSTICS_ENABLED) rulează imediat un proces. Setările platformei au un cache de 30 de secunde pe instanță.
Rotirea secretelor
APP_KEY: schimbarea invalidează linkurile de dezabonare deja trimise și codurile SMS în curs; schimb-o doar dacă a fost compromisă și anunță echipa de marketing.- Toate sesiunile se pot închide ștergând tabelul
auth_sessions(toți utilizatorii și membrii echipei se reconectează). - Cheile TOTP ale echipei: un administrator poate reseta verificarea în doi pași a unui membru (Echipă și audit).
Incidente frecvente
| Situație | Pași |
|---|---|
| Coada de moderare crește | Panou → Moderare; scurtăturile A / M / R; anunță echipa dacă ținta de 2 ore e depășită |
| Plăți eșuate în masă | Plăți → filtrul „Eșuate”; de obicei IBAN lipsă; vânzătorii sunt anunțați automat; reîncearcă după corectare |
| Un cont compromis | Utilizatori → Suspendă (deconectare imediată); suport pentru recuperare |
| Un membru al echipei pleacă | Echipă și audit → Dezactivează (deconectare imediată) |
| E-mailurile nu pleacă | Stare sistem → E-mail; verifică setările MAIL_* și jurnalul API (adresele blocate de lista permisă sunt jurnalizate) |
| Date inconsistente | pnpm db:check arată regula; corectarea se face prin aplicație sau migrare, nu manual în producție |