← Înapoi la proiecte
Site & CMS

Speranță pentru Viitor

Deschide sperantapentruviitor.com →
Speranță pentru Viitor

Speranță pentru Viitor este o asociație care organizează tabere pentru copii, adolescenți și tineri, și care închiriază locația în restul anului. Își publica activitatea pe Blogger din 2008, iar înscrierile la tabere le strângea printr-un formular Google. Am construit un site nou și un panou de administrare din care asociația își ține singură conținutul, taberele și cererile de închiriere.

Ce am avut de rezolvat

Site-ul arăta a 2008, pentru că din 2008 era. Optsprezece ani de activitate — 82 de articole, de la meditații scrise între 2008 și 2013 până la invitațiile și rezultatele taberelor din ultimii ani — trăiau pe o platformă pe care asociația nu o putea modela și care nu o mai reprezenta.

Înscrierile veneau separat, printr-un formular Google. Un formular returnează rânduri într-un tabel: nu știe că o serie are 150 de locuri, nu scade locurile rezervate, nu are stări prin care o cerere trece de la „în așteptare" la „confirmată". Evidența o ținea cineva, manual, lângă formular.

Ce am construit

  • Arhiva, întreagă — 82 de articole, 8 pagini statice și 143 de fișiere media, de pe 10 aprilie 2008 până pe 15 ianuarie 2026, cu 90 de redirecturi 301 care duc fiecare adresă veche la cea nouă.
  • Site public — pagina principală construită în jurul ediției curente de tabără, noutăți, arhivă pe ani, contact, donații și paginile instituționale.
  • Înscrieri la tabere — înlocuiesc formularul Google. O rezervare scade locurile din capacitatea seriei și trece prin stări: în așteptare, confirmată, listă de așteptare, anulată. Ediția 2026 are 8 serii a câte 150 de locuri.
  • Cereri de închiriere — cu interval de date verificat față de perioadele în care locația e ocupată, ca să nu se accepte o cerere peste o tabără.
  • Panou de administrare — 19 secțiuni în 6 grupuri: pagini, articole, media, mesaje, tabere, donații, aspect, utilizatori, securitate. Cu autentificare în doi pași și roluri care limitează accesul la o singură zonă.
  • Șapte ediții de tabără — generate automat din invitațiile deja migrate, cu tema anului și versetul extrase din text, în loc să ceară cuiva să reintroducă manual nouă ani de istoric.
  • Ghid de administrator — bilingv, 15 secțiuni pe limbă, scris pentru oameni care nu administrează site-uri, nu pentru dezvoltatori.

Migrarea, partea nevăzută

„Mutăm conținutul de pe Blogger" sună a export și import. Nu a fost. Blogger returna imaginile împachetate în HTML în loc de fișiere, păstra video în etichete object Flash care nu mai rulează nicăieri, avea linkuri de email stricate de propriile lui rescrieri și butoane de distribuire lipite în corpul articolelor, nu în șablon. Fiecare dintre ele a fost găsit abia după ce conținutul a ajuns în baza nouă și ceva arăta greșit.

Extractorul e un script Python de 486 de linii, fără nicio dependență externă — rulează oriunde există Python, și peste cinci ani la fel. Am ținut la asta pentru că o migrare pe care n-o mai poți rula a doua oară nu e o migrare, e un noroc. L-am rulat de mai multe ori, cu corecturi între rulări.

Verificarea n-a fost „arată bine": 82 din 82 de articole și 8 din 8 pagini extrase fără corp gol, 90 de redirecturi fiecare cu țintă unică, zero linkuri către fișiere care nu există.

Ce nu face, și de ce

Pagina de donații merge pe transfer bancar, Formular 230 și sponsorizare. Nu acceptă plata cu cardul, deși partea de server e scrisă și funcțională. O asociație mică nu are nevoie de comisioane și de un flux de rambursări pentru donații care vin oricum prin bancă; ziua în care va avea, se pornește din administrare.

Panoul a moștenit de la baza noastră de admin module pe care asociația nu le folosește — magazin, galerii pentru clienți, newsletter. Nu le-am șters, pentru că ștergerea lor ar fi atins 61 de modele de date la un pas de lansare. Le-am scos din navigație și am blocat cele 12 prefixe de API rămase, care altfel ascultau în continuare pe internet fără ca nimeni să le mai citească codul.

Cum e construit

Next.js 16 cu React 19, PostgreSQL prin Prisma, autentificare cu Auth.js și parole bcrypt plus cod de unică folosință. Rulează pe un server propriu, lângă alt site, cu nginx în față, certificat care se reînnoiește singur și o copie de siguranță a bazei în fiecare noapte.

Imaginile stau în baza de date, nu pe disc și nu pe un CDN. E o alegere, nu o scăpare, și are un cost: fără CDN, prima încărcare a unei imagini e puțin mai lentă — compensat cu un antet care face browserul s-o ceară o singură dată. În schimb, întregul site încape într-un singur fișier. S-a dovedit la mutarea de pe găzduirea gestionată pe server propriu: 26 MB, un `pg_dump` și un `pg_restore`, fără al doilea sistem de backup de ținut minte și fără fișiere rămase în urmă.

Unde e acum

Live la sperantapentruviitor.com, pe server propriu, în mentenanță.