Skip to main content
Skip to main content

Public Access on Zerops

Keywords

public access, domain, subdomain, zerops.app, ipv4, ipv6, https, ssl, custom domain, dedicated ip, shared ip, direct port

TL;DR

Zerops offers three public access methods: zerops.app subdomains (dev only, 50MB upload limit), custom domains (production, needs IPv4/IPv6), and direct port access (TCP/UDP on 10-65435).

Access Methods

1. Zerops Subdomains (.zerops.app)

  • Shared HTTPS balancer (scalability bottleneck)
  • Max upload: 50 MB
  • Not for production — use for development/testing only
  • Auto-provisioned SSL
  • Pre-configure via import YAML: enableSubdomainAccess: true (works for all runtime/web types)
  • Activate routing via API: zerops_subdomain enable (only works on deployed/ACTIVE services) — call once after the first deploy of each new service, even if enableSubdomainAccess: true was set in import. Import pre-configures routing but does NOT activate L7 balancer; without the explicit enable call, the subdomain returns 502. Re-deploys do NOT deactivate it. Use zerops_discover to check current status and get the URL (subdomainEnabled + subdomainUrl fields).
  • Port-specific subdomains: If HTTP ports are defined in zerops.yml, each port gets its own subdomain: {hostname}-{subdomainHost_prefix}-{port}.{subdomainHost_rest}. Example: hostname appdev, subdomainHost 1df2.prg1.zerops.app, port 3000 → actual URL https://appdev-1df2-3000.prg1.zerops.app. Port 80 omits the port suffix: https://appdev-1df2.prg1.zerops.app
  • Internal network fallback: Every service is accessible internally via http://{hostname}:{port} (e.g., http://appdev:3000). Use this to verify the app is running when subdomain access is uncertain — curl http://appdev:3000/health from the ZCP container or any other service in the project
  • Works for: nodejs, static, nginx, go, python, php, java, rust, dotnet, and all other runtime types

2. Custom Domains (Production)

  • Per-project HTTPS balancer (2 containers, HA)
  • Round-robin load balancing + health checks
  • Full upload limit: 512 MB
  • Requires IP address assignment:
IP TypeCostProtocolNotes
Shared IPv4FreeHTTP/HTTPS onlyLimited connections, shorter timeouts
Dedicated IPv4$3/30 daysAll protocolsNon-refundable, auto-renews
IPv6FreeAll protocolsDedicated per project

3. Direct Port Access

  • Available for: Runtime services, PostgreSQL
  • Port range: 10-65435 (80, 443 reserved)
  • Protocols: TCP, UDP
  • Configurable firewall: blacklist or whitelist per port

DNS Setup (Custom Domain)

Point your domain to the project's IP:

  • A record → Dedicated IPv4
  • AAAA record → IPv6
  • Shared IPv4: Requires both A and AAAA records (AAAA needed for SNI routing)

Gotchas

  1. Shared IPv4 needs AAAA record: Without AAAA, SNI routing fails — always add both A and AAAA
  2. zerops.app 50MB limit: File uploads over 50MB fail on subdomains — use custom domain
  3. Dedicated IPv4 is non-refundable: $3/30 days, auto-renews — cannot get refund if removed early
  4. Ports 80/443 reserved: Your app cannot bind to these — Zerops uses them for SSL termination

See Also

  • zerops://guides/cloudflare
  • zerops://guides/firewall
  • zerops://guides/networking
  • zerops://themes/core — platform infrastructure