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.envjest 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:
- Kopiuje
.env(secrets GoPos) na serwer przez SCP - Na VPS:
git pull --ff-only+docker compose --profile prod up -d --build - Sprawdza healthcheck kontenera
combo_prod
Kod + synchronizacja danych
./scripts/deploy-prod.sh --with-data
Dodatkowo:
- Eksportuje
auth.jsoniemail.jsonz lokalnego wolumenucombo_data - Kopiuje je na serwer przez SCP
- Importuje do wolumenu
combo_datana 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 podczasdocker builddist/— budowane na serwerze podczasdocker 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:
.envi.deploy.envNIGDY 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)
| Hasło | Rola | |
|---|---|---|
matfl@tuta.com |
pułtusk |
admin |
daniel.piekarski@t-pizza.pl |
daniel |
user |
Tworzone TYLKO gdy
auth.jsonjest 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"
No comments to display
No comments to display