Costin Pietraru
Cum instalezi un CMS administrat de AI: din GitHub în cPanel, în doi pași
Doi pași: o comandă pe calculatorul tău și un zip urcat în cPanel. Pas cu pas, cu capturi reale — git, PHP pe Windows, Extract și verificarea.

Instalarea are doi pași: o comandă pe calculatorul tău și un zip urcat în cPanel. Comanda rulează testele, face cele două chei ale site-ului, scrie config.php și împachetează codul; tu urci pachetul în File Manager, apeși Enter, iar comanda verifică serverul și leagă Claude Code de site.
Singura pregătire care se face o dată, înainte de toate, e PHP pe calculatorul tău. Acolo se pierde cel mai mult timp, dacă nu l-ai mai instalat până acum, așa că încep cu el.
La final ai un site public — pagini, articole, căutare, sitemap, feed — pe care îl schimbi din chat: îi ceri lui Claude un articol, primești un link de previzualizare, te uiți la el și spui „publică”. Site-ul pe care citești acum a fost instalat exact așa, pe 20 septembrie 2026, cu versiunea 0.5.0 — iar capturile de mai jos sunt chiar de la instalarea lui.
Ce îți trebuie înainte să începi
- Un domeniu sau un subdomeniu numai pentru site. Site-ul stă la rădăcina lui. Într-un subfolder,
site.ro/blog/, nu merge. - PHP 8.0 sau mai nou pe găzduire, ales din MultiPHP Manager, și HTTPS activ — certificatul din cPanel (AutoSSL) sau Cloudflare. Comanda refuză o adresă fără https.
- PHP pe calculatorul tău. Capitolul următor.
- Claude Code, instalat și conectat la contul tău. El va fi editorul site-ului.
- Opțional, git. Fără el iei codul ca zip, de pe aceeași pagină.

De ce îți trebuie PHP pe calculator, dacă găzduirea are deja PHP?
Pentru că partea care contează se întâmplă înainte ca vreun fișier să ajungă pe server. Comanda de la pasul 1 face patru lucruri, local:
- Rulează testele. Pornesc o copie a site-ului într-un dosar temporar, cu chei de unică folosință, și încearcă atât funcțiile, cât și atacurile: cod PHP trimis drept conținut, imagini cu cod ascuns,
../în adrese, un rând de jurnal modificat de mână. Dacă pică un singur test, comanda se oprește și nu face pachetul. - Face cele două chei ale site-ului — una de citire, una de scriere — și le scrie într-un fișier, în afara folderului de cod. Nu apar niciodată pe ecran.
- Scrie
config.phpcu adresa site-ului și cu amprentele cheilor, nu cu cheile. Dintr-o amprentă cheia nu se poate reface, deci cine intră pe server nu obține accesul lui Claude. - Împachetează site-ul într-un zip, cu
config.phpdeja pus la locul lui, înapp/.
Nimic din toate acestea nu se poate face de pe server. PHP-ul de pe calculator nu e un moft de programator: e unealta care produce pachetul.
Cum instalezi PHP pe Windows?
Cinci pași, o singură dată pe calculator.
- Intri pe windows.php.net/download și descarci pachetul Zip, varianta x64. Pe 20 septembrie 2026, versiunea curentă acolo e 8.5.10, dar merge orice versiune de la 8.0 în sus — codul e scris anume ca să meargă și pe 8.0, fiindcă atât au unele găzduiri. Între „Thread Safe” și „Non Thread Safe” alegi oricare: la linia de comandă nu se vede diferența.
- Dezarhivezi în
C:\php. Alege o cale fără spații și fără diacritice. - Faci fișierul de configurare: copiezi
C:\php\php.ini-developmentîn același folder, sub numelephp.ini. Îl deschizi în Notepad și ștergi punctul și virgula de la începutul a două rânduri:extension_dir = "ext" extension=openssl
- Adaugi
C:\phpîn PATH: în meniul Start scrii „variabile de mediu”, deschizi Editare variabile de mediu pentru contul tău, selectezi Path → Editare → Nou →C:\php. Închizi și redeschizi PowerShell, altfel schimbarea nu se vede. - Verifici:
php -v php -r "var_dump(extension_loaded('openssl'));"Primul răspunde cu versiunea, al doilea trebuie să scriebool(true).
De ce tocmai openssl? Comanda de instalare vorbește cu site-ul tău pe https: verifică paginile, întreabă serverul ce comenzi are, leagă Claude Code. Fără extensia aceasta, PHP nu știe să deschidă o adresă https și verificarea cade cu „Unable to find the wrapper https”. E singura pe care o pornești de mână; restul vin pornite.
Pe Mac: brew install php. Pe Linux: sudo apt install php-cli. În ambele cazuri openssl e deja acolo, iar în comenzi separatorul e /, nu \.
Cum iei codul de pe GitHub?
Într-un folder ales de tine, unul singur pentru proiect:
git clone https://github.com/paycodero/mini-cms-mcp.git
Fără git: pe pagina depozitului, Code → Download ZIP, apoi dezarhivezi. Folderul se va numi mini-cms-mcp-main; nu contează, comenzile rămân aceleași.
Înăuntru sunt trei lucruri:
| Folder | Ce e |
|---|---|
site/ | Ce se urcă pe server: site-ul public, punctul de intrare pentru AI, jurnalul, șabloanele, codul. |
unelte/ | Comenzile care rulează pe calculatorul tău: instalarea și copia de siguranță. |
teste/ | Verificările automate, inclusiv instalarea cap-coadă. |
Dacă vrei să vezi cu ochii tăi că merge, înainte de orice instalare:
cd mini-cms-mcp php teste\ruleaza.php
Pe calculatorul meu, cu PHP 8.4.16, se termină cu 164 din 164 teste trecute. Aceleași teste rulează oricum la începutul pasului 1.
Pentru o versiune nouă a codului: git pull aduce codul nou pe calculator, apoi rulezi din nou comanda de la pasul 1 (cheile existente se refolosesc) și urci pachetul nou. Conținutul site-ului nu e în depozit — stă pe server — deci o actualizare de cod nu atinge articolele.
Pasul 1: comanda de pe calculator
cd C:\proiectul-tau\mini-cms-mcp php unelte\instaleaza.php https://site.ro
Adresa se scrie exact cum o deschizi în browser, cu https și fără / la final. Din ea comanda își dă singură numele conexiunii: https://cms.paycode.ro devine cms-paycode.

cms.paycode.ro: 164 de teste trecute, două chei noi scrise în fișier, pachetul de 36 de fișiere. Nicio cheie nu apare pe ecran. La final, comanda îți spune ce ai de făcut în cPanel și așteaptă Enter.Cheile și pachetul nu stau în folderul de cod, ci un nivel mai sus, în afara lui git:
chei-<nume>.json— cele două chei, în clar, pe calculatorul tău._livrare\<nume>\—config.phpși pachetulminicms-<versiune>-<nume>.zip.
Nimic nu se suprascrie: la o rulare nouă cheile existente se refolosesc, iar pachetul și config-ul vechi rămân pe disc, cu data în nume.
Cât comanda așteaptă, deschide fișierul cu cheile și copiază-le în managerul de parole. Pe server stau doar amprentele lor, deci de acolo nu le mai poți recupera.
Pasul 2: zip-ul în cPanel
- File Manager → folderul domeniului (
public_htmlsau folderul subdomeniului). - Upload → alegi zip-ul din
_livrare\<nume>\. - Clic dreapta pe zip → Extract. Dacă cPanel întreabă, alegi înlocuirea fișierelor.
- Ștergi zip-ul. Oricum nu se poate descărca — o regulă din
.htaccessblochează arhivele — dar n-are ce căuta acolo. - Te întorci în terminal și apeși Enter.


config.php nu se urcă separat: vine în zip și ajunge singur la locul lui. După Extract, folderul domeniului arată așa:
/ ← folderul domeniului .htaccess index.php mcp.php jurnal.php app/ ← codul, blocat din web; aici e config.php, venit din zip assets/ sabloane/ date/ media/ ← apar singure la prima vizită

app, assets, sabloane și cele trei fișiere PHP. Cele trei .htaccess nu se văd aici fiindcă File Manager ascunde implicit fișierele care încep cu punct — sunt acolo. Ultimul lucru rămas e ștergerea zip-ului.După Enter, comanda verifică serverul și leagă Claude Code:
Verific serverul OK / 200 OK /mcp 405 OK /app/config.php 403, blocat OK /date/ 403, blocat OK /date/jurnal/2026-09.ndjson 403, blocat OK /sabloane/baza.php 403, blocat OK /.htaccess 403, blocat OK /media/proba.php 403, blocat OK /minicms-0.5.0-cms-paycode.zip 403, blocat OK cheia de citire: 11 comenzi, doar de citire OK cheia de scriere: 21 comenzi, inclusiv scrierea Leg Claude Code de site OK conexiunea "cms-paycode" e adăugată, cu cheia de scriere
Două rânduri merită citite mai atent. 405 la /mcp înseamnă că punctul de intrare pentru AI e acolo și refuză, corect, o cerere obișnuită din browser. Iar dosarele interne trebuie să fie închise. Aici răspund cu 403, dar pe primul site pe care l-am instalat răspundeau cu 404, fiindcă acea găzduire trimite eroarea spre pagina de eroare a site-ului. Verificarea acceptă ambele coduri, cu condiția ca în răspuns să nu ajungă nimic din fișier — nici măcar un rând de jurnal.
Dacă ceva nu e în regulă, comanda scrie GREȘIT, spune cauza pe rândul următor și așteaptă. Repari în cPanel și apeși din nou Enter. Nu se reia nimic de la capăt.
Dacă prima pagină dă 500 după Extract
Înseamnă că folderul avea deja un .htaccess pus de cPanel — blocul MultiPHP — iar Extract l-a înlocuit. Reparația: intri în MultiPHP Manager și alegi încă o dată versiunea de PHP pentru domeniu. cPanel își scrie blocul înapoi, peste cel din pachet. Apoi Enter.
Dacă ai închis terminalul între timp, verificarea se reia oricând, fără să refaci pachetul:
php unelte\instaleaza.php https://site.ro --verifica
Prima conversație cu site-ul
Numele site-ului, descrierea, autorul și culoarea nu stau în vreun fișier de configurare. Sunt conținut: le pune Claude, rămân în jurnal și au versiuni. Deschizi o sesiune nouă de Claude Code în folderul proiectului și scrii:
Cheamă despre_site. Apoi setează numele site-ului „…”, descrierea „…” și autorul „…”. Fă pagina acasa ca ciornă, cu două paragrafe despre ce face site-ul, și dă-mi linkul de previzualizare.
Linkul de previzualizare arată pagina exact cum va fi pe site, cu o bandă portocalie deasupra. E semnat, expiră într-o oră și nu ajunge în Google. Ceri modificări până îți convine, apoi spui: Publică pagina acasa.
Verificarea finală o faci în două locuri: pe prima pagină a site-ului și în /jurnal.php, unde lipești cheia de citire în formular. Acolo apare fiecare apel — ora, IP-ul, comanda, ținta, rezultatul — sub o bandă verde care spune „Lanțul e intact”. Fiecare rând poartă amprenta rândului dinainte, așa că un rând scos sau schimbat pe dinafară rupe lanțul, iar verificarea arată exact unde.
Opțional: conectorul din claude.ai, pentru web și telefon
Claude Code e legat de la pasul 2. Dacă vrei să publici și de pe telefon, adaugi site-ul o singură dată ca „custom connector” în claude.ai: Settings → Connectors → Add custom connector, cu adresa https://site.ro/mcp. Claude se înregistrează singur la site și deschide pagina de aprobare a site-ului tău; acolo introduci cheia de scriere și apeși Permite.
Cheia nu ajunge în claude.ai. De acolo încolo Claude primește token-uri temporare — unul de acces, valabil o oră, unul de reînnoire, valabil 60 de zile, rotit la fiecare folosire — iar pe server stau doar amprentele lor. Accesul se vede oricând cu listeaza_conexiuni și se retrage cu retrage_conexiune.
Legătura durează un minut, iar urma ei rămâne în jurnal: înregistrarea aplicației, aprobarea de pe pagina site-ului (de la IP-ul tău, din browser), emiterea tokenului, apoi primele comenzi cerute din claude.ai.
Ce nu face
- AI-ul nu atinge codul. Nicio comandă nu scrie fișiere PHP, șabloane, configurare sau jurnal. Schimbă conținutul și identitatea site-ului, atât. O temă nouă o pune omul pe server.
- Urcarea rămâne la tine, intenționat. E singurul moment în care ceva nou ajunge pe server, iar
config.phpîl duce acolo omul, nu AI-ul. - Nu e WordPress și nu vrea să fie. Fără bază de date, fără panou de administrare, fără module. Potrivit pentru zeci sau sute de pagini și articole, nu pentru zeci de mii.
- Imaginile: JPEG, PNG, GIF și WebP, cel mult 5 MB. Limita reală o poate coborî
post_max_sizeal găzduirii. SVG nu se acceptă. .htaccesse pentru Apache și LiteSpeed. Pe nginx aceleași reguli se scriu o dată, de mână, în configurarea serverului.
Întrebări frecvente
De ce îmi trebuie PHP pe calculator, dacă găzduirea are deja PHP?
Fiindcă testele, cheile, config.php și pachetul se fac înainte ca ceva să ajungă pe server. Cheile în clar rămân la tine, iar pe server pleacă doar amprentele lor — asta nu se poate face de pe server.
Merge dacă domeniul trece prin Cloudflare?
Da, și nu trebuie setat nimic. Probat pe 20 septembrie 2026 pe un domeniu cu proxy Cloudflare pornit: în jurnal apare adresa IP reală a vizitatorului, nu cea a Cloudflare. Mecanismul e simplu și nu se poate păcăli — site-ul crede antetul CF-Connecting-IP doar când cererea vine chiar dintr-o rețea Cloudflare; trimis de altcineva, antetul e ignorat. Dacă vrei oricum să-l oprești, pui 'cloudflare' => false în config.php.
Ce se întâmplă dacă pierd fișierul cu cheile?
Nu se pierde nimic de pe site, iar Claude Code merge mai departe pe calculatorul pe care e deja legat. Chei noi îți trebuie doar pentru jurnal sau pentru alt calculator: rulezi comanda cu --chei-noi și urci noul config.php. Din acel moment, cheile vechi și legăturile aprobate cu ele nu mai merg.
Merge pe orice găzduire?
Pe orice găzduire cu PHP 8.0+ și Apache, adică pe majoritatea pachetelor cu cPanel. Nu-i trebuie Composer, bază de date, acces SSH sau sarcini programate. Dacă găzduirea taie antetul Authorization, comanda trece singură pe un antet alternativ.
Pot instala site-ul într-un subfolder, la site.ro/blog?
Nu. Site-ul stă la rădăcina unui domeniu sau subdomeniu. Pentru un blog lângă un site existent, faci un subdomeniu.
Cum fac o copie de siguranță?
Cu a doua unealtă din depozit:
php unelte\copie.php https://site.ro
Salvează pe calculator paginile și articolele — inclusiv ciornele și cele programate — identitatea, redirecționările și imaginile, verificate după amprentă. Nicio copie nu se scrie peste alta. Aceeași unealtă pune copia pe un site nou, gol, cu --pune=…, dacă vrei să muți site-ul pe altă găzduire.
Ce vede AI-ul din site-ul meu?
Conținutul: pagini, articole, versiunile lor, imaginile, jurnalul și legăturile aprobate. Nu vede codul, nu vede config.php și nu poate scrie în jurnal. Fiecare apel al lui, inclusiv citirile, rămâne scris acolo, cu ora și rezultatul.
Ce dispare din munca ta
FTP-ul, panoul de administrare și drumul de la „ar trebui schimbat un paragraf” până la paragraful schimbat. Rămâne o conversație: ceri, te uiți la previzualizare, spui „publică”. Codul e aici: github.com/paycodero/mini-cms-mcp.
Dacă te oprești la un pas — cel mai probabil la PHP pe Windows sau la .htaccess-ul rescris de MultiPHP după Extract — scrie-mi și îți spun ce să verifici.