Vlastní hosting
Přehled
Pro většinu uživatelů je doporučenou cestou cloud BriefGate (app.briefgate.dev) — žádná infrastruktura ke správě, data zůstávají v EU a rozjedete to za 5 minut.
Vlastní hosting je tu pro případy, kdy potřebujete data na vlastní infrastruktuře, nasazení on-premises, compliance požadavky, které cloud nesplní, nebo vlastní integrace na úrovni serveru. Server BriefGate je pod licencí MIT.
Požadavky
| Komponenta | Minimální verze |
|---|---|
| Node.js | 22+ |
| PostgreSQL | 16+ |
| Redis | 7+ |
| Úložiště kompatibilní s S3 | Nepovinné (Cloudflare R2, MinIO, AWS S3) — výchozí je lokální disk |
| API klíč Resend | Doporučené — bez něj se upomínkové e-maily neodesílají |
Rychlý start přes Docker Compose
Zdrojový kód je pod licencí MIT, ale repozitář zatím není veřejný — napište podpoře a přidá vás do něj.
git clone [email protected]:sekera.radim/briefgate.git
cd briefgate
cp .env.example .env
# Upravte .env — minimální sada proměnných:
# DATABASE_URL, REDIS_URL, BASE_URL, PORTAL_URL,
# SECRETS_PUBLIC_KEY, SECRETS_PRIVATE_KEY
docker compose up -dCompose soubor spustí Postgres, Redis a server BriefGate. V produkci provozujte Postgres a Redis jako samostatné spravované instance a nasměrujte na ně DATABASE_URL a REDIS_URL.
Vygenerování páru klíčů pro trezor
Trezor na přístupy potřebuje pár klíčů libsodium. Vygenerujte si ho před prvním spuštěním:
import libsodium from 'libsodium-wrappers';
await libsodium.ready;
const { publicKey, privateKey } = libsodium.crypto_box_keypair();
console.log('SECRETS_PUBLIC_KEY=' + Buffer.from(publicKey).toString('base64'));
console.log('SECRETS_PRIVATE_KEY=' + Buffer.from(privateKey).toString('base64'));Privátní klíč uložte do svého správce tajemství (Vault, AWS Secrets Manager, 1Password Secrets Automation a podobně). Ani jeden z klíčů nikdy nedávejte do gitu.
Veřejný klíč šifruje hodnoty v prohlížeči klienta, privátní je dešifruje na serveru. Když pár vyměníte, stávající dosud neodhalené hodnoty už nepůjde dešifrovat — měňte ho tedy jen tehdy, když chcete začít načisto, a až poté, co jste si ověřili, že jsou všechny stávající hodnoty odhalené.
Proměnné prostředí
| Proměnná | Povinná | Popis |
|---|---|---|
DATABASE_URL |
Ano | Připojovací řetězec k PostgreSQL (například postgres://user:pass@host:5432/briefgate) |
REDIS_URL |
Ano | Připojovací řetězec k Redisu (například redis://localhost:6379) |
BASE_URL |
Ano | Veřejná adresa API (například https://api.vasedomena.cz) |
PORTAL_URL |
Ano | Veřejná adresa portálu (například https://p.vasedomena.cz) |
SECRETS_PUBLIC_KEY |
Ano | Veřejný klíč libsodium v base64 |
SECRETS_PRIVATE_KEY |
Ano | Privátní klíč libsodium v base64. Držte ho ve správci tajemství, ne v souboru .env v gitu. |
RESEND_API_KEY |
Doporučené | Doručování e-mailů přes Resend. Bez něj se upomínky ani pozvánky do portálu neodesílají. |
ALLOW_SIGNUP |
Při prvním spuštění | true povolí zakládání účtů. Po vytvoření vašeho účtu nastavte na false. |
STRIPE_SECRET_KEY |
Nepovinné | Napojení na fakturaci. Bez něj jsou limity tarifů vypnuté (každý má přístup jako Agency). |
R2_ENDPOINT |
Nepovinné | Endpoint kompatibilní s S3 (například https://<account>.r2.cloudflarestorage.com) |
R2_ACCESS_KEY_ID |
Nepovinné | Přístupový klíč k S3 |
R2_SECRET_ACCESS_KEY |
Nepovinné | Tajný klíč k S3 |
R2_BUCKET |
Nepovinné | Název bucketu pro soubory |
STORAGE_LOCAL_DIR |
Nepovinné | Cesta na lokálním disku pro soubory, když R2 není nastavené (výchozí ./storage) |
SECRETS_TTL_DAYS |
Nepovinné | Výchozí expirace tokenu k přístupům ve dnech (výchozí 30) |
TRUST_PROXY |
Za proxy | Počet proxy skoků před API — 1 za jednou reverzní proxy. Výchozí 0 (použije se adresa socketu). Viz varování níže. |
CORS_ORIGIN |
Když je portál na jiném originu | Čárkou oddělené originy, které smějí volat API z prohlížeče. Nenastaveno = jen stejný origin. |
COOKIE_SECURE |
Produkce | true označí session cookies jako Secure. Zapíná se samo při NODE_ENV=production. |
CLAMAV_HOST |
Doporučené | Host clamd pro antivirovou kontrolu nahraných souborů. Bez něj se soubory označí jako skipped a servírují neprověřené. |
CLAMAV_TIMEOUT_MS |
Nepovinné | Timeout kontroly (výchozí 30000). Při timeoutu se soubor označí jako error a chybné soubory se neservírují nikdy. |
SESSION_COOKIE_NAME / PORTAL_COOKIE_NAME |
Nepovinné | Názvy cookies pro session dashboardu a klientského portálu (výchozí bg_session a bg_portal). Změňte, když na stejné doméně provozujete i něco jiného. |
LOG_LEVEL |
Nepovinné | debug, info, warn, error (výchozí info) |
Varování k TRUST_PROXY
Nastavte ho na počet proxy, které před API opravdu stojí, a na veřejném listeneru nikdy na true. true znamená „věř hlavičce X-Forwarded-For od kohokoli“, což volajícímu dovolí zvolit si vlastní request.ip: střídáním hlavičky obejde limit pokusů o přihlášení na IP a do každého auditního záznamu si zapíše adresu, jakou si vymyslí.
Ponechat 0 za proxy má opačný následek: každý požadavek vypadá, že přišel od proxy, takže se limit na IP scvrkne do jednoho společného koše a jeden hlučný klient zablokuje všechny ostatní.
Health checky
| Endpoint | Typ | Popis |
|---|---|---|
GET /healthz |
Liveness | Vrátí 200, pokud proces běží |
GET /readyz |
Readiness | Vrátí 200 jen tehdy, když jsou dostupné DB i Redis |
Load balancer nebo orchestrátor nastavte tak, aby o směrování rozhodoval podle /readyz. /healthz použijte pro politiku restartů (zdravý proces, který se nedostane k databázi, nemá dostávat provoz, ale nemá se ani zabíjet).
První přihlášení
Po docker compose up:
- Nastavte v
.envhodnotuALLOW_SIGNUP=truea restartujte (nebo ji nastavte ještě před prvním spuštěním) - Vytvořte si účet:
curl -X POST https://api.vasedomena.cz/v1/auth/signup \
-H "Content-Type: application/json" \
-d '{"email":"[email protected]","password":"...","name":"Vaše jméno"}'- Nastavte
ALLOW_SIGNUP=falsea restartujte, aby se už nikdo další nezaregistroval
Když potřebujete víc účtů (třeba pro tým), založte je všechny, dokud je ALLOW_SIGNUP=true, a pak to vypněte.
Napojení MCP balíčku na vaši instanci
Balíček @briefgate/mcp funguje i s vlastním hostingem. Stačí nastavit základní adresu:
# Přes proměnnou prostředí
BRIEFGATE_BASE_URL=https://api.vasedomena.cz briefgate-mcp --api-key bg_live_xxxxx# Přes parametr CLI
briefgate-mcp --api-key bg_live_xxxxx --base-url https://api.vasedomena.czNebo v konfiguraci MCP pro Claude Code:
claude mcp add briefgate -- briefgate-mcp \
--api-key bg_live_xxxxx \
--base-url https://api.vasedomena.czAdresa portálu se bere z PORTAL_URL — vaši klienti tedy dostanou odkazy směřující na vaši doménu.