ByteBite Docs
Infrastructure

Security

Security boundaries, implemented controls, known gaps, and planned hardening.

Security

ByteBite staging follows a defense-in-depth model: minimal public exposure, internal-only services, and strict tenant trust boundaries.

Implemented controls

Network exposure

ControlDetail
Public portsOnly 80 and 443 on 88.99.0.118 (verified 2026-09-08)
App ports closed3000, 3001, 3002, 5432, 8080 not reachable externally
Internal routingTraefik → Docker network only
PostgreSQLNo public port; internal Dokploy network only

TLS

ControlDetail
HTTPS everywhere (staging)HTTP → HTTPS redirect verified on all explicit hosts
Valid certificatesLet's Encrypt HTTP-01 (explicit) + DNS-01 (wildcard)
Separate ACME storesacme.json and acme-cloudflare.json isolated

Tenant trust boundary

ControlDetail
trustProxy: falseFastify does not trust X-Forwarded-* from clients
Tenant from Host only (external)Browser and same-origin /api use Traefik-delivered Host
X-ByteBite-Tenant-Host restrictedHonored only when request Host is internal (api, localhost, 127.0.0.1, ::1)
No public API portRaw api:3001 not host-published
Exact hostname lookupNo slug inference from DNS labels

Secrets

ControlDetail
No secrets in Git.env git-ignored; Dokploy env for staging
Cloudflare token scopedZone Read + DNS Edit on getbytebite.co only
Token file permissions600, root:root on host filesystem
ACME keys on hostNot in repository

Container security

ControlDetail
Non-root runtimeNode apps run as node user; nginx unprivileged for dashboard
Docker socketTraefik mounts read-only
No privileged modeNot used in deployment compose
No bind mounts (deploy)Application images are self-contained

DNS

ControlDetail
DNS-only CloudflareNot proxied — Traefik terminates TLS directly
Edge indirectionedge.getbytebite.co centralizes IP changes

Staging indexing

ControlDetail
noindex, nofollowStorefront, docs (when BYTEBITE_DEPLOY_ENV=staging), dashboard (always)

Known gaps

GapSeverityStatus
Dashboard SPA fallback returns HTTP 200 for /.env, /.git/HEAD, etc.MediumOPEN
No staging access protection (Cloudflare Access / BasicAuth)Low (staging)OPEN
Unknown storefront tenant returns HTTP 200 instead of 404Low (SEO)OPEN — application issue
No WAF or rate limiting at edgeMediumOPEN
No centralized security monitoringMediumOPEN
Public internet scanner noiseInformationalACCEPTED — normal for exposed services
Dokploy Traefik custom wiring may not survive upgradesHighOPEN — ops risk

Dashboard dot-path issue

Requests such as /.env, /.git/HEAD, /.git/config to the dashboard return HTTP 200 with the SPA index.html (~566 bytes). This is not evidence of real file exposure but is undesirable HTTP semantics. Storefront and docs correctly return 404 for these paths.

Scanner traffic

Public internet scanners probe common paths (.env, .git, GraphQL, PHP, WordPress). This is normal for internet-exposed services and does not indicate compromise.

Planned hardening

ItemStatus
Staging access protection (Cloudflare Access or Traefik BasicAuth)PLANNED — not enabled
Webhook exceptions if access protection addedPLANNED
Production WAF strategyPLANNED
Production custom-domain TLS verificationPLANNED
CSP and security headers auditPLANNED

On this page