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.
Toți lucram pe același drum — George, Andreea, Florin, agenții. Astăzi drumul se termină la pasul 5.
ia-worktree <temă>
worktree propriu + branch din main
editezi doar acolo — guardrails blochează clona-sursă
ia-ship "mesaj"
rebase pe main + tsc + build + gate vizual
push → CI (lint, tsc, teste, build) → squash-merge automat
auto-deploy la 120s → build → rsync → restart → smoke test
merge neschimbat
merge neschimbat
merge neschimbat
merge — azi a trecut PR #597, CI verde, 20 de commituri în main
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ă.
Portul 3002 a rămas același, de-aia majoritatea n-a simțit nimic.
Baza elevarts a rămas live ca PG_BRAIN_URL. Payroll, sync catalog, briefuri, memoria, task runner, health-monitor — neatinse. Asta e majoritatea.
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.
/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.
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.
În ordine. Primul deblochează tot restul.
/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.
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();
}
.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.
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.