Tmavý režim
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:latestDocker 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 -dProdukce (docker-compose.production.yml)
bash
docker compose -f docker-compose.production.yml up -dInicializace 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.sqlTIP
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.jsKritická produkční nastavení
Ověřte před nasazením v config/production.yaml:
| Nastavení | Výchozí | Produkce |
|---|---|---|
zitadel.webhookSecret | change-me-in-production | Silný secret |
internalApiKey | change-me-in-production | Silný secret |
zitadel.serviceAccountToken | prázdné | Service account token |
email.dkim | není | DKIM klíč pro podepisování |
database.password | app | Silné 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-keysPř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/versionMonitoring & 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=productionnastaven - [ ]
zitadel.webhookSecretzměněn - [ ]
internalApiKeyzměněn - [ ]
zitadel.serviceAccountTokennastaven - [ ] 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