Skip to main content

Deploy na produkcję

Deploy na produkcję

Skrypt scripts/deploy-prod.sh automatyzuje przenoszenie aplikacji + danych z lokalnego środowiska dev na serwer produkcyjny (home.pl ComboVPS → combo.t-pizza.pl).


Architektura danych

LOKALNIE (dev)                         VPS (prod)
┌──────────────┐                       ┌──────────────┐
│  combo_data  │  ── deploy-prod.sh →  │  combo_data  │
│  (wolumin)   │                       │  (wolumin)   │
├──────────────┤                       ├──────────────┤
│ auth.json    │                       │ auth.json    │
│ email.json   │                       │ email.json   │
└──────────────┘                       └──────────────┘
     ↕                                      ↕
  combo_dev                              combo_prod
  port 5173                              127.0.0.1:4173 (za Nginx)
                                         → combo.t-pizza.pl
Plik Zawartość
auth.json Użytkownicy, hasła (scrypt), JWT secret, logi audytowe
email.json SMTP config, harmonogramy raportów, szablony email, lista odbiorców

Jednorazowy setup

1. Skonfiguruj połączenie SSH

Klucz SSH do VPS (root@212.132.103.157). Sugerowany wpis w ~/.ssh/config:

Host vps
    HostName 212.132.103.157
    User root
    IdentityFile ~/.ssh/jprdl

2. Utwórz plik .deploy.env

cp .deploy.env.example .deploy.env

Domyślna konfiguracja (host=vps, klucz=~/.ssh/jprdl, katalog=/opt/docker/combo-raport, profil=prod) działa bez zmian, jeśli używasz wpisu vps z ~/.ssh/config.

DEPLOY_HOST=vps
DEPLOY_SSH_PORT=22
DEPLOY_USER=root
DEPLOY_SSH_KEY=~/.ssh/jprdl
DEPLOY_APP_DIR=/opt/docker/combo-raport
DEPLOY_PROFILE=prod
DEPLOY_CONTAINER=combo_prod

.deploy.env jest w .gitignore — nigdy nie trafi do repozytorium.

3. Przygotuj VPS

Na serwerze (jednorazowo):

# Sieć Docker `web` (external) — utworzona w trakcie VPS init
docker network ls | grep web

# Klon repo
mkdir -p /opt/docker
git clone git@github.com:matzxp84/combo-raport-app.git /opt/docker/combo-raport

# Vhost Nginx → docker/nginx-vhost.conf
cp /opt/docker/combo-raport/docker/nginx-vhost.conf \
   /etc/nginx/sites-available/combo.t-pizza.pl.conf
ln -s /etc/nginx/sites-available/combo.t-pizza.pl.conf /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx

# SSL (po wskazaniu DNS A → 212.132.103.157)
certbot --nginx -d combo.t-pizza.pl

Użycie

Pełny deploy (tylko kod, domyślnie)

./scripts/deploy-prod.sh

Co robi:

  1. Kopiuje .env (secrets GoPos) na serwer przez SCP
  2. Na VPS: git pull --ff-only + docker compose --profile prod up -d --build
  3. Sprawdza healthcheck kontenera combo_prod

Kod + synchronizacja danych

./scripts/deploy-prod.sh --with-data

Dodatkowo:

  1. Eksportuje auth.json i email.json z lokalnego wolumenu combo_data
  2. Kopiuje je na serwer przez SCP
  3. Importuje do wolumenu combo_data na VPS

Tylko dane

./scripts/deploy-prod.sh --data-only

Przydatne gdy dodałeś użytkowników w panelu admina na dev i chcesz ich przenieść na prod.

One-shot: commit + push + deploy

./scripts/publish.sh "commit message"
# lub
pnpm publish:prod

Co jest przenoszone

Element Jak przenoszone Gdzie ląduje
Kod źródłowy git pull --ff-only /opt/docker/combo-raport/
.env (GoPos secrets) SCP /opt/docker/combo-raport/.env
auth.json (użytkownicy) Docker volume export/import wolumin combo_data
email.json (SMTP, szablony) Docker volume export/import wolumin combo_data

Co NIE jest przenoszone

  • node_modules — instalowane na serwerze podczas docker build
  • dist/ — budowane na serwerze podczas docker build
  • Logi Docker — per kontener, nie migrowane

Secrets — bezpieczeństwo

Secret Plik Ochrona
GOPOS_CLIENT_ID / GOPOS_CLIENT_SECRET .env .gitignore + .dockerignore
JWT secret auth.json (w wolumenie) nie w repo, w Docker volume
Hasła użytkowników auth.json (scrypt hash) hashowane, nie w repo
Hasło SMTP email.json (w wolumenie) nie w repo, w Docker volume

Zasady:

  • .env i .deploy.env NIGDY nie trafiają do gita
  • Dane runtime (auth.json, email.json) żyją w Docker volumes, nie w repo
  • Backup danych: scripts/backup-gdrive.sh (patrz Backup)
  • Przy pierwszym uruchomieniu bez danych serwer tworzy seed users — zmień hasła natychmiast

Seed users (domyślne)

Email Hasło Rola
matfl@tuta.com pułtusk admin
daniel.piekarski@t-pizza.pl daniel user

Tworzone TYLKO gdy auth.json jest pusty (brak użytkowników). Jeśli deployujesz z danymi — seed nie występuje.


Troubleshooting

Nie mogę połączyć się z serwerem

# Test ręczny
ssh vps "echo ok"
# lub bezpośrednio
ssh -i ~/.ssh/jprdl root@212.132.103.157 "echo ok"

Sprawdź: klucz SSH, wpis w ~/.ssh/config, czy IP nie jest zbanowane w fail2ban (fail2ban-client status sshd).

Kontener nie startuje

ssh vps "docker logs combo_prod --tail 50"

Brak miejsca na dysku

Przed deployem wyczyść dysk na serwerze:

ssh vps "docker system prune -a && apt clean"

Dane nie przeniosły się

Sprawdź zawartość wolumenu na serwerze:

ssh vps "docker run --rm -v combo_data:/data alpine cat /data/auth.json"

Nginx / SSL

ssh vps "nginx -t && systemctl reload nginx"
ssh vps "certbot certificates"