Skip to content

Nasazení

Docker (doporučeno)

Dockerfile

dockerfile
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY dist/ ./dist/
COPY src/assets/ ./dist/assets/
COPY config/ ./config/
EXPOSE 3001
CMD ["node", "dist/index.js"]

Build & push

bash
# Build TypeScript
npm run build

# Docker build
docker build -t atrea-user-api:latest .

# Tag & push do registry
docker tag atrea-user-api:latest registry.firma.cz/atrea-user-api:latest
docker push registry.firma.cz/atrea-user-api:latest

Docker Compose

Lokální vývoj (docker-compose.yml)

Spustí kompletní stack:

  • PostgreSQL 16 na portu 5432
  • Zitadel (OIDC provider) na portu 8080
  • Login UI (custom login stránka) na portu 3000
  • Admin panel na portu 4200
  • Atrea User API na portu 3001
bash
docker compose up -d

Produkce (docker-compose.production.yml)

bash
docker compose -f docker-compose.production.yml up -d

Inicializace databáze

Při prvním spuštění je potřeba inicializovat databázi:

bash
# Vytvoření tabulek
psql -h localhost -U app -d atrea-user-db < sql/init.sql

# Seed data (brands: Atrea, Vallox, Airflow)
psql -h localhost -U app -d atrea-user-db < sql/data.sql

TIP

V Docker Compose je PostgreSQL nakonfigurován s init skriptem — tabulky se vytvoří automaticky při prvním spuštění.

Konfigurace prostředí

Přepínání prostředí

bash
# Produkce
NODE_ENV=production node dist/index.js

# Test
NODE_ENV=test node dist/index.js

Kritická produkční nastavení

Ověřte před nasazením v config/production.yaml:

NastaveníVýchozíProdukce
zitadel.webhookSecretchange-me-in-productionSilný secret
internalApiKeychange-me-in-productionSilný secret
zitadel.serviceAccountTokenprázdnéService account token
email.dkimneníDKIM klíč pro podepisování
database.passwordappSilné heslo

Bezpečnost

Nikdy nenasazujte s výchozími hodnotami change-me-in-production. Tyto hodnoty jsou veřejně známé.

DKIM podpisování emailů

Aktivujte DKIM podepisováním v config/production.yaml:

yaml
email:
  from: "Atrea <noreply@atrea.eu>"
  dkim:
    domainName: "atrea.eu"
    keySelector: "mail"
    privateKeyPath: "/app/config/dkim/atrea.eu.pem"

DKIM klíč je PEM soubor s RSA private key. Generování:

bash
# Generování RSA klíčového páru
openssl genrsa -out atrea.eu.pem 2048
openssl rsa -in atrea.eu.pem -pubout -out atrea.eu.pub

# Přidejte DNS TXT záznam s veřejným klíčem
# mail._domainkey.atrea.eu TXT "v=DKIM1; k=rsa; p=<base64 veřejného klíče>"

Web Push (VAPID)

Pokud potřebujete Web Push notifikace, generujte VAPID klíče:

bash
npx web-push generate-vapid-keys

Přidejte do config/production.yaml:

yaml
push:
  vapidPublicKey: "BM..."
  vapidPrivateKey: "x..."
  vapidSubject: "mailto:admin@atrea.eu"

Nginx proxy (produkce)

Doporučená konfigurace pro nasazení za Nginx:

nginx
server {
    listen 443 ssl;
    server_name api.atrea.eu;

    # SSL certifikát (Let's Encrypt / vlastní)
    ssl_certificate /etc/nginx/ssl/atrea.eu.crt;
    ssl_certificate_key /etc/nginx/ssl/atrea.eu.key;

    location /api/ {
        proxy_pass http://localhost:3001;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /docs/ {
        proxy_pass http://localhost:3001;
    }

    location / {
        return 301 /api/docs;
    }
}

Health Check

bash
# Základní health check
curl https://api.atrea.eu/api/test

# Verze
curl https://api.atrea.eu/api/version

Monitoring & Logování

Aplikace loguje ve formátu JSON přes Winston:

json
{
  "level": "info",
  "message": "Database connected",
  "timestamp": "2024-01-15T10:30:00.000Z"
}

HTTP requesty jsou logovány přes Morgan:

json
{
  "timestamp": "2024-01-15T10:30:01.000Z",
  "method": "GET",
  "url": "/api/profile/me",
  "status": 200,
  "responseTime": 12
}

TIP

Pro produkci doporučujeme sběr logů do centrálního systému (Grafana Loki, Elasticsearch, CloudWatch, apod.).

Checklist před nasazením

  • [ ] NODE_ENV=production nastaven
  • [ ] zitadel.webhookSecret změněn
  • [ ] internalApiKey změněn
  • [ ] zitadel.serviceAccountToken nastaven
  • [ ] Databázové přihlašovací údaje nastaveny
  • [ ] DKIM klíč vygenerován a nakonfigurován (volitelně)
  • [ ] VAPID klíče vygenerovány (pokud používáte Web Push)
  • [ ] DNS záznamy pro email ověřeny (SPF, DKIM, DMARC)
  • [ ] Databáze inicializována (init.sql, data.sql)
  • [ ] Nginx/reverse proxy nakonfigurováno
  • [ ] SSL certifikát platný
  • [ ] Zálohování databáze nakonfigurováno

Atrea User API — interní dokumentace