Skip to content

Konfigurace serveru ​

Jabcore Platform API používá balíček config s YAML soubory v adresáři config/. Konfigurace se přepíná pomocí proměnné NODE_ENV.

Soubory konfigurace ​

SouborNODE_ENVPopis
config/default.yaml(výchozí, dev)Lokální vývoj s Dockerem
config/production.yamlproductionProdukční přepisy
config/test.yamltestTestovací prostředí

Produkční soubor přepisuje pouze změněné hodnoty z default.yaml.


Kompletní schéma konfigurace ​

Síť & Server ​

yaml
hostname: "0.0.0.0"          # IP pro naslouchání (0.0.0.0 = všechna rozhraní)
port: 3001                     # Port HTTP serveru

Databáze (PostgreSQL) ​

yaml
database:
  host: "db"                   # Hostname PostgreSQL
  database: "jabcore-platform-db"    # Název databáze
  user: "app"                  # Uživatelské jméno
  password: "app"              # Heslo (změňte v produkci!)
  port: 5432                   # Port PostgreSQL
  log: true                    # SQL query logování (vypnout v produkci)
  synchronize: false           # TypeORM auto-migrate (NIKDY true v produkci!)

DANGER

synchronize: true v produkci může způsobit ztrátu dat. Vždy používejte false a migrujte ručně přes SQL soubory.

JWT Provideři ​

yaml
token:
  keyRefreshIntervalMinutes: 60  # Interval refreshe JWKS klíčů

  jwt:
    - provider: "zitadel"
      baseUrl: "http://zitadel:8080"    # URL JWKS endpointu (interní)
      jwk: "/oauth/v2/keys"             # Cesta k JWKS
      issuer: "http://localhost:8080"   # Očekávaný issuer v JWT
      hostOverride: "localhost"         # Přepíše Host header při fetchování klíčů

Jediným providerem je Zitadel — token musí patřit účtu některého user poolu.

Google / Microsoft přihlášení

Federovaný login přes Google a Microsoft se konfiguruje uvnitř Zitadelu (Identity Providers). Jabcore Platform API vždy verifikuje pouze Zitadel JWT — Google/Microsoft nejsou samostatní JWT provideři tohoto API.

Zitadel integrace ​

yaml
zitadel:
  apiUrl: "http://zitadel:8080"         # Interní API URL (Docker service name)
  publicUrl: "http://localhost:8080"    # Veřejná URL (pro OIDC redirecty)
  serviceAccountToken: ""               # Service account token pro Zitadel API
  webhookSecret: "change-me-in-production"  # Secret pro webhook validaci

  orgToApp:                             # Mapování orgId → appCode
    "org_abc123": "crm"
    "org_def456": "klient-panel"

Email (SMTP) ​

yaml
email:
  from: "Jabcore <noreply@jabcore.cz>"      # Odesílatel (přepíše brand.emailFrom pro systémové emaily)
  assetsBaseUrl: "http://localhost:3001" # Base URL pro obrázky v emailech

  # DKIM podepisování (volitelné)
  dkim:
    domainName: "jabcore.cz"
    selector: "mail"
    privateKeyPath: "/app/config/dkim/jabcore.cz.pem"

Web Push (VAPID) ​

yaml
# Volitelné — bez konfigurace push notifikace nefungují
push:
  publicKey: "BM8U3B..."
  privateKey: "x7Vc3A2..."
  subject: "mailto:dev@jabcore.cz"

Interní API klíč ​

yaml
internalApiKey: "change-me-in-production"  # x-internal-api-key header

Produkční konfigurace (příklad) ​

yaml
# config/production.yaml — přepisuje pouze rozdíly od default.yaml

zitadel:
  apiUrl: "https://zitadel.auth.test.jabcore.cloud"
  publicUrl: "https://zitadel.auth.test.jabcore.cloud"
  serviceAccountToken: "<token>"
  webhookSecret: "<silny-secret>"

database:
  host: "postgres"
  password: "<silne-heslo>"
  log: false

email:
  from: "Jabcore <noreply@jabcore.cz>"
  assetsBaseUrl: "https://api.auth.jabcore.cloud"
  dkim:
    domainName: "jabcore.cz"
    selector: "mail"
    privateKeyPath: "/app/config/dkim/jabcore.cz.pem"

internalApiKey: "<silny-api-klic>"

push:
  publicKey: "<vapid-public-key>"
  privateKey: "<vapid-private-key>"
  subject: "mailto:dev@jabcore.cz"

token:
  jwt:
    - provider: "zitadel"
      baseUrl: "https://zitadel.auth.test.jabcore.cloud"
      jwk: "/oauth/v2/keys"
      issuer: "https://zitadel.auth.test.jabcore.cloud"

Přístup ke konfiguraci v kódu ​

Konfigurace je typována v src/utils/serverConfig.ts:

typescript
import config from 'config';

// Přímý přístup
const port = config.get<number>('port');
const dbHost = config.get<string>('database.host');
const jwtProviders = config.get<JwtProviderConfig[]>('token.jwt');

// Bezpečný přístup (vrátí undefined pokud neexistuje)
const dkim = config.has('email.dkim') ? config.get('email.dkim') : undefined;

Proměnné prostředí ​

Balíček config podporuje přepsání libovolné hodnoty z proměnné prostředí pomocí NODE_CONFIG:

bash
NODE_CONFIG='{"database":{"password":"tajne"}}' node dist/index.js

Nebo pomocí NODE_APP_INSTANCE pro instance-specifickou konfiguraci:

bash
NODE_APP_INSTANCE=2 node dist/index.js  # Načte config/default-2.yaml pokud existuje

DKIM klíče ​

DKIM klíče jsou uloženy v config/dkim/. Soubory jsou vynechány z git (.gitignore) z bezpečnostních důvodů.

bash
config/dkim/
├── jabcore.cz.pem       # RSA private key pro DKIM podepisování
└── jabcore.cz.pub       # Veřejný klíč (pro DNS TXT záznam)

Viz Nasazení → DKIM pro instrukce.


Logování ​

typescript
// src/utils/logger.ts
// Winston logger s JSON výstupem
logger.info('Zpráva');
logger.error('Chyba', { detail: 'popis' });
logger.warn('Varování');

Log level závisí na NODE_ENV:

  • development: debug
  • production: info
  • test: silent

Jabcore Platform — interní dokumentace