# 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`

```bash
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`.

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

```bash
# 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)

```bash
./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

```bash
./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

```bash
./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

```bash
./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](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

```bash
# 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

```bash
ssh vps "docker logs combo_prod --tail 50"
```

### Brak miejsca na dysku

Przed deployem wyczyść dysk na serwerze:

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

### Dane nie przeniosły się

Sprawdź zawartość wolumenu na serwerze:

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

### Nginx / SSL

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