NewsPortal Deploy - Docker, nginx, VPS

Partea 7 din 7

Actualizat 2026-05-24Sursă pe GitHub ↗Cod start

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):

  1. 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ă.

  2. cat Dockerfile - conținutul fișierului final, cu ce ați pus voi acolo. Copy-paste din terminal sau screenshot.

  3. cat docker-compose.yml - același, fișierul final.

  4. Comenzile cu care ați copiat sursa pe server: scp / rsync / etc. Copy-paste din terminal sau screenshot al sesiunii SSH care arată istoricul.

  5. 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 de scp, dar menționați-le explicit pe ambele direcții.

  6. 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 în docker-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ă)

  1. 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.ro dacă n-ați ales alt subdomeniu în formular.

  2. 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 instalata
    

    Dacă ssh-copy-id nu 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
    exit
    

    Testați: ssh <username>@student-dev.ro - nu mai trebuie parolă.

    Important: NU modificați /etc/ssh/sshd_config pe 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_ed25519 fără .pub) în git. E plictisitor să o revocați dacă scapă pe github.

  3. 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.zip gata 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 NewsPortal
    

    Aș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 din docker-compose.yml merg fără .env (vezi ${VAR:-default} la fiecare variabilă). Dacă vreți random reale, copiați cp .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 + Dockerfile per stack (.NET / Node / Python / Java, Angular / React / Vue, Postgres / MySQL / Mongo / SQLite) - e pe pagina dedicată: docker-deploy.

  4. (Opțional) .env pentru parole reale: cp .env.example .env, completați DB_PASSWORD + JWT_KEY. Fără .env, default-urile bazate pe $SUBDOMAIN merg pentru demo. Schelet compose + Dockerfile per stack: docker-deploy.

  5. Build + run: docker compose up -d --build (3-5 min cu cache rece)

  6. 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

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ță.