Network
Public subnet, VM networking, Docker networks, and port exposure.
Network
ByteBite staging exposes only HTTP (80) and HTTPS (443) on the public internet. Application and database ports remain on internal Docker networks.
Port exposure verified on
88.99.0.118: 2026-09-08
Public subnet
| Parameter | Value |
|---|---|
| Subnet | 88.99.0.64/26 |
| Netmask | 255.255.255.192 |
| Gateway | 88.99.0.65 |
| ByteBite APP IP | 88.99.0.118/26 |
| ByteBite MAIL IP | 88.99.0.97 |
Public IP mapping
| IP | Role |
|---|---|
88.99.0.118 | ByteBite application edge (Traefik, Dokploy, app containers) |
88.99.0.97 | Planned mail server (BYTEBITE-MAIL-01) |
88.99.0.100 | Unrelated historical IP — not ByteBite |
Request flow (staging)
Client
-> Cloudflare DNS (A/ALIAS -> edge.getbytebite.co -> 88.99.0.118)
-> ens18 :80 or :443
-> dokploy-traefik (dokploy-network)
-> target container on dokploy-networkDocker networks (staging)
ByteBite staging containers participate in multiple Docker networks. The repository defines one; Dokploy injects others at runtime.
Repository-defined: bytebite
Defined in compose.deploy.yml:
networks:
bytebite:
name: bytebiteAll four application services (api, storefront, dashboard, docs) attach to this network. It enables inter-service communication (e.g. storefront → http://api:3001).
Dokploy-injected: dokploy-network
Traefik's Docker provider watches containers on dokploy-network. Dokploy attaches services with UI-managed domains to this network automatically.
Runtime invariant: storefront and api must be reachable on dokploy-network for Traefik routing (including manual wildcard labels). Dokploy domain configuration currently provides this attachment.
Generated Compose default network
Dokploy creates a per-deployment default network with a generated name, for example:
bytebite-staging-oc5ach_defaultObserved pattern: {project-prefix}_{default}. The suffix (oc5ach) is Dokploy-generated and not stable.
Network attachment summary
| Service | bytebite | dokploy-network | Generated default |
|---|---|---|---|
| api | Yes (compose) | Yes (Dokploy) | Yes |
| storefront | Yes (compose) | Yes (Dokploy) | Yes |
| dashboard | Yes (compose) | Yes (Dokploy) | Yes |
| docs | Yes (compose) | Yes (Dokploy) | Yes |
Exact attachment is confirmed via docker network inspect on the host.
Local Docker networks
Local development (compose.yml) uses:
| Network | Purpose |
|---|---|
proxy | Traefik + app-facing services |
backend | PostgreSQL, MinIO, API (dual-homed) |
Traefik routes via the file provider (infrastructure/traefik/dev/dynamic.yml), not Docker labels.
Public port exposure
Verified externally on 88.99.0.118 (2026-09-08):
| Port | Status | Service |
|---|---|---|
| 80 | OPEN | Traefik HTTP |
| 443 | OPEN | Traefik HTTPS (+ HTTP/3 UDP) |
| 3000 | CLOSED | Storefront (internal only) |
| 3001 | CLOSED | API (internal only) |
| 3002 | CLOSED | Docs (internal only) |
| 5432 | CLOSED | PostgreSQL (internal only) |
| 8080 | CLOSED | Dashboard (internal only) |
Applications use expose: in compose.deploy.yml, not host ports: mappings. This is a deliberate security boundary — only Traefik is internet-facing.
Internal service ports
| Service | Container port |
|---|---|
| storefront | 3000 |
| api | 3001 |
| docs | 3002 |
| dashboard | 8080 |
| PostgreSQL | 5432 |
Related
- Traefik — ingress routing
- DNS — how hostnames reach the edge IP
- Security — port closure rationale
- Validation — port check commands