Parte 6 - Deploy proiect pe VPS
Tema lab - hello world deploy pe contul vostru
Singura temă notată din lab. După ce primiți credențialele pe email, faceți deploy NewsPortal pe <username>.student-dev.ro ca “hello world” pe contul vostru. Trimiteți dovezile pe Teams (canalul DAW, assignment dedicat).
Nu ați primit cont? Scrieți-mi pe Teams (“vreau cont VPS pentru temă”) și vă trimit credențialele pe email. Contul se creează în câteva minute, nu e nevoie să vă înscriați undeva.
Deliverables (toate într-un singur post / fișier ZIP / PDF, format la alegere):
-
Screenshot Adminer pe DB-ul vostru: login la
https://db.student-dev.ro, conectați-vă la DB-ul vostru (server =student-<username>-db, user/parolă din.env-ul vostru), deschideți tabela cu articole - screenshot cu lista vizibilă. -
cat Dockerfile- conținutul fișierului final, cu ce ați pus voi acolo. Copy-paste din terminal sau screenshot. -
cat docker-compose.yml- același, fișierul final. -
Comenzile cu care ați copiat sursa pe server: scp / rsync / etc. Copy-paste din terminal sau screenshot al sesiunii SSH care arată istoricul.
-
Mini-exercițiu scp (să învățați comanda): dați copy-paste sau screenshot la două comenzi:
- una care urcă un fișier de pe laptop pe server (orice fișier, ex:
notes.txt) - una care descarcă un fișier de pe server pe laptop (orice fișier de pe server, ex:
~/.bashrc)
Exemplu de format acceptat:
# upload laptop -> server scp notes.txt cosmo@student-dev.ro:~/ # download server -> laptop scp cosmo@student-dev.ro:~/.bashrc .E ok dacă le faceți și cu
rsyncîn loc descp, dar menționați-le explicit pe ambele direcții. - una care urcă un fișier de pe laptop pe server (orice fișier, ex:
-
Răspunsuri scurte la întrebări (1-2 propoziții fiecare, nu eseu):
- Cu ce ne ajută Docker concret la deploy-ul proiectului vostru?
- De ce folosim
.envîn loc să scriem parolele direct îndocker-compose.yml? - Ce rol are nginx reverse proxy în fața containerelor voastre (de ce nu expuneți direct portul aplicației la internet)?
- Ce ați învățat azi nou și ce vi s-a părut cel mai interesant?
Acceptat: copy-paste din terminal (text), screenshot-uri (PNG/JPG), PDF, sau orice combinație. Nu trebuie să fie frumos, doar să demonstreze că deploy-ul a mers la voi.
Pașii concreți pentru deploy sunt mai jos + pe pagina standalone docker-deploy cu variații per stack.
Această secțiune a fost mutată într-o pagină standalone: daw.danielwagner.ro/docker-deploy
Motivul: lab-ul rămâne concis (concepte Docker + nginx + TLS + DNS), iar deploy-ul propriu-zis are propria pagină care:
- e accesibilă și din afara lab-ului 13
- acoperă diverse stack-uri (backend: .NET / Node / Python / Java; frontend: Angular / React / Vue / static; DB: SqlServer / Postgres / MySQL / MongoDB / SQLite)
- e referință vie pentru întreg semestrul, nu doar lab-ul curent
Ce e gata deja (să nu vă chinuiți cu chestii repetitive)
| Pas | Cine îl face | Ce înseamnă concret |
|---|---|---|
| Configurare VPS (UFW, fail2ban, SSH hardening) | Pre-setat | Setat o dată, valabil pt toată lumea |
Cont Linux + grup docker + sudo whitelist |
Pre-setat (script provision_user.sh) |
Primiți la opt-in |
Workspace ~/apps/ + $SUBDOMAIN în shell |
Pre-setat (provision_user.sh) | docker-compose.yml-ul vostru folosește $SUBDOMAIN/$USER ca default-uri |
| Cert HTTPS Let’s Encrypt pentru subdomeniul vostru | Pre-setat (certbot în container) | Auto-emis, auto-renewed la 12h - nu rulați nimic |
Reverse proxy nginx la <sub>.student-dev.ro |
Pre-setat | Routing automat la containerul vostru pe port 8080 |
| Adminer pentru DB | Pre-setat (https://db.student-dev.ro) |
UI gata, suportă MS SQL / Postgres / MySQL / Mongo |
| DB-ul aplicației voastre | Voi (în docker-compose.yml) |
propriul container, izolat de colegi |
Codul + docker-compose.yml + Dockerfile |
Voi (în repo-ul vostru) | Aduceți repo-ul întreg; el conține rețeta de rulare |
Pe scurt: aduci repo-ul (cu docker-compose.yml + Dockerfile) + docker compose up. Restul e gata.
Pași rezumați (detalii în pagina dedicată)
-
Primiți credențialele pe email după lab (username + parolă + URL public). Username-ul e legat de nume (ex:
adriand,octaviand,mariap), iar URL-ul implicit e<username>.student-dev.rodacă n-ați ales alt subdomeniu în formular. -
Conectați-vă ca user-ul vostru:
ssh <username>@student-dev.ro # parola din email ls ~/apps # workspace gol; aici aduceti repo-ul vostru (sau zip-ul demo)(Opțional) SSH cu cheie în loc de parolă
Dacă nu vreți să tastați parola la fiecare conectare (recomandat - mai sigur și mai rapid), instalați-vă o cheie publică în contul vostru de pe VPS. Nu aveți nevoie de sudo și nu modificați nimic global - doar adăugați cheia voastră în propriul
~/.ssh/authorized_keys.Pe laptop, dacă nu aveți deja o cheie SSH:
ssh-keygen -t ed25519 -C "your-email@example.com" # Output: ~/.ssh/id_ed25519 (privata, NU o partajati) + ~/.ssh/id_ed25519.pub (publica)Copiați cheia publică pe server - cea mai ușoară cale:
ssh-copy-id <username>@student-dev.ro # vi se cere parola O DATA, apoi cheia e instalataDacă
ssh-copy-idnu e disponibil (de ex. pe Windows fără Git Bash), faceți manual:# Pe laptop, afisati cheia publica: cat ~/.ssh/id_ed25519.pub # macOS / Linux / Git Bash type %USERPROFILE%\.ssh\id_ed25519.pub # PowerShell / cmd # Apoi pe server (logat cu parola), adaugati linia in authorized_keys: ssh <username>@student-dev.ro mkdir -p ~/.ssh && chmod 700 ~/.ssh echo "ssh-ed25519 AAAA... your-email@example.com" >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys exitTestați:
ssh <username>@student-dev.ro- nu mai trebuie parolă.Important: NU modificați
/etc/ssh/sshd_configpe server. Nu aveți sudo pe asta și nu e nevoie - SSH client-ul încearcă cheia automat înainte de a cere parola. Cheia odată instalată, login-ul devine fără parolă. Dacă pierdeți cheia privată, puteți reveni la parola din email.Nu commit-uiți niciodată cheia privată (
id_ed25519fără.pub) în git. E plictisitor să o revocați dacă scapă pe github. -
Aduceți sursa pe server. Aveți două cazuri distincte:
Cazul A: NewsPortal demo (ăsta din lab) - curl direct pe server
Pentru temă, vă dăm noi un zip
newsportal.zipgata pregătit (același pe care l-am folosit live în demo). Pe SERVER, într-o singură comandă:cd ~ && curl -fLO https://daw.danielwagner.ro/downloads/newsportal.zip mkdir -p apps && cd apps && unzip ~/newsportal.zip cd NewsPortalAșa nu transferați nimic de pe laptop - totul e direct de pe internet pe server, mai rapid și scutește o etapă. Apoi direct
docker compose up -d --build- defaults dindocker-compose.ymlmerg fără.env(vezi${VAR:-default}la fiecare variabilă). Dacă vreți random reale, copiațicp .env.example .envși schimbați.Cazul B: Proiectul vostru - aduceți repo-ul întreg
Proiectul vostru e un repo care conține propriul
docker-compose.yml+Dockerfile(-uri) - exact ca NewsPortal (backend/cu Dockerfile-ul lui,news-portal-app/cu al lui). Îl aduceți întreg pe server; nu copiați fișiere peste vreun template.# cea mai curata varianta, daca proiectul e pe GitHub: cd ~/apps && git clone https://github.com/<voi>/<proiect>.git && cd <proiect> # sau rsync de pe laptop (transfera doar diff-ul): rsync -rlptD --delete --chmod=D755,F644 \ --exclude='.git' --exclude='bin' --exclude='obj' --exclude='node_modules' --exclude='.env' \ ~/cale/spre/proiect/ <username>@student-dev.ro:~/apps/<proiect>/Rețeta completă - schelet
docker-compose.yml+Dockerfileper stack (.NET / Node / Python / Java, Angular / React / Vue, Postgres / MySQL / Mongo / SQLite) - e pe pagina dedicată: docker-deploy. -
(Opțional)
.envpentru parole reale:cp .env.example .env, completațiDB_PASSWORD+JWT_KEY. Fără.env, default-urile bazate pe$SUBDOMAINmerg pentru demo. Schelet compose + Dockerfile per stack: docker-deploy. -
Build + run:
docker compose up -d --build(3-5 min cu cache rece) -
Verify:
- Browser:
https://<subdomeniul-vostru>.student-dev.ro- lock verde Let’s Encrypt + aplicația voastră docker compose logs api --tail=50- migrări EF Core aplicate, Kestrel listening- Adminer la
https://db.student-dev.ro- alegeți tipul DB-ului vostru, server =student-<username>-db, user/parolă din.env-ul vostru
- Browser:
Lab = doar concepte + demo live
În lab am învățat de ce + cum la nivel conceptual:
- Secțiunile 01-05: Docker, compose, reverse proxy, DNS, TLS, VPS hardening, deploy
- Demo live: configurare VPS de la zero (wipe + bootstrap + Docker stack + cert-uri Let’s Encrypt) + deploy News Portal pe
newsportal.student-dev.ro
Aplicarea concretă pe proiectul vostru stă pe pagina dedicată docker-deploy. Faceți deploy oricând pe parcursul semestrului, fără să vă întoarceți la lab ca referință.