Migrare internal-app · 17 august 2026

Producția e sus. Lanțul git → producție e tăiat.

Comutarea pe codebase-ul unificat a reușit — app.elevarts.com răspunde normal, clienții nu simt nimic. Dar munca din git nu mai are pe unde ajunge în producție, iar o parte din automatizări s-au oprit. Mai jos: ce e rupt exact și cei 4 pași care repun totul.

Aplicația:3002 · 307 · app.elevarts.com 200
Cliențioferte, portal, semnături — OK
Deploy din gitoprit — nu mai ajunge în prod
Automatizări14 rute API dau 401

Cum se adăuga funcționalitate

Toți lucram pe același drum — George, Andreea, Florin, agenții. Astăzi drumul se termină la pasul 5.

Până pe 17 august

1

ia-worktree <temă>
worktree propriu + branch din main

2

editezi doar acolo — guardrails blochează clona-sursă

3

ia-ship "mesaj"
rebase pe main + tsc + build + gate vizual

4

push → CI (lint, tsc, teste, build) → squash-merge automat

5

auto-deploy la 120s → build → rsync → restart → smoke test

Acum

1

merge neschimbat

2

merge neschimbat

3

merge neschimbat

4

merge — azi a trecut PR #597, CI verde, 20 de commituri în main

5

tăiat. Deploy-ul construiește și copiază în ~/.local/share/internal-app, director care nu mai servește nimic, apoi încearcă să pornească com.elevarts.brain-app, serviciu care nu mai există. main e corect, verificat — și inert

De ce contează: producția e acum /Users/Shared/elevarts-next, care nu e repo git. Codul nostru e acolo — fișierele coincid la bit — dar copiat, nu tras. Deci nu există cale înapoi: nici PR, nici review, nici rollback pe o singură modificare. INAPOI.sh întoarce tot app-ul la varianta veche, nu o schimbare anume.

Practic, azi un coleg nu poate livra o funcționalitate: ori scrie cod care rămâne în main, ori editează direct în producție fără plasă.

Automatizările — ce ține, ce s-a rupt

Portul 3002 a rămas același, de-aia majoritatea n-a simțit nimic.

Tot ce vorbește direct cu Postgres

Baza elevarts a rămas live ca PG_BRAIN_URL. Payroll, sync catalog, briefuri, memoria, task runner, health-monitor — neatinse. Asta e majoritatea.

Apelurile autentificate spre API 401

Scoase din PUBLIC în proxy.ts. Middleware-ul respinge înainte ca ruta să apuce să-și verifice x-cron-token.

Moarte azi: draft-uri CRM (crm-autodraft, pipeline-heal, reply-triage, auto-read), ingestia de taskuri, notificarea de mail nou din n8n.

Orbi: captura de erori /api/ops/client-error și telemetria de cron — nu mai vedem erorile aplicației.

Pontajul prin Telegram adormit

/api/parse-report dă 401, dar nu doare încă: în ultimele 14 zile 137 din 137 de rapoarte au intrat prin interfața web, zero prin Telegram. Florin a înregistrat ore și după comutare. Se repară odată cu restul.

Oprite deliberat de noi

internal-app-deploy (construia și copia în gol la fiecare 120s) și request-deploy (chema deploy-ul și aplica migrări pe producție autonom, pe baza veche). Ambele scrise în ops.changes, cu comanda de repornire.

Ce ne trebuie de la Dorin

În ordine. Primul deblochează tot restul.

01 Folderul de producție în git

/Users/Shared/elevarts-next să primească git init, remote pe 1elevarts/internal-app, un commit cu starea curentă, apoi merge cu main.

Fără pasul ăsta nimic din ce lucrăm nu mai ajunge la clienți, iar producția rămâne fără istoric și fără rollback pe modificare. În main te așteaptă deja 20 de commituri verificate: portalul de agenție, licențierea fonturilor, opțiunile de catalog.

02 Peticul pentru automatizări

Decizia de a scoate rutele de automatizare din PUBLIC e corectă — la noi erau apelabile fără sesiune. Dar cronurile trimit x-cron-token, nu cookie, iar middleware-ul le taie înainte. Cinci linii în proxy.ts, după verificarea PUBLIC și înainte de cerința de JWT, repun toată coloana:

// automatizări interne:
// token, nu sesiune
const t = req.headers
  .get("x-cron-token");
if (t && t === process.env.CRON_TOKEN) {
  return NextResponse.next();
}

03 Drepturile pe folderul live

.env.local are 54 de chei și ACL group:staff allow read — orice cont local le citește. Folderul e drwxrwxr-x dorin:staff, iar din staff fac parte elevartsbrain, florin și root: trei conturi pot rescrie codul live fără nicio urmă.

Recomandat: chmod 600 .env.local și chmod 750 pe folder.

04 Parola de test

Contul lui George a rămas cu o parolă trivială, trimisă și pe WhatsApp. De schimbat înainte ca aplicația să fie considerată deschisă pentru echipă.

Un lucru mărunt care ne-ar scuti o alarmă: comutarea a fost făcută manual, deci n-a lăsat urmă în ops.changes. Monitorizarea a văzut „un proces necunoscut a luat portul 3002" și era gata să propună repornirea aplicației vechi — adică anularea migrării. A oprit-o o poartă care escaladează orice atinge cuvântul „producție". Am completat noi intrarea acum; data viitoare, o linie în ops.changes înainte de comutare scutește exact alarma asta.

Ce e bine scris: COMUTARE.sh și INAPOI.sh verifică, nu șterg nimic și au drum de întoarcere. Iar comentariul din proxy.ts care explică de ce s-au închis rutele ne-a economisit o oră de diagnostic — era exact cauza.