Requirements
- A server running Docker and Docker Compose v2
- Ports 80 and 443 available on the host (used by Caddy)
- A domain name with DNS you control
- The full repository cloned on the server — not just
docker-compose.yml
Deploy to a server
1
Clone the full repository
SSH into your server and clone the entire repository. The Compose file builds All subsequent commands run from this directory (the repository root, where
apps/api and apps/web; a standalone docker-compose.yml is not enough.docker-compose.yml lives).2
Point DNS at your server
Create an A record (and an AAAA record if your server has IPv6) for your chosen hostname pointing to the server’s public IP address.Caddy uses the HTTP-01 ACME challenge on port 80 to obtain a certificate from Let’s Encrypt. DNS must resolve before you start the stack, or certificate issuance will fail.
3
Configure your production .env
Copy the example file and set all required variables:The table below lists every variable you must set for a production deployment.
A minimal production
.env looks like this:4
Open required ports
Ensure your server’s firewall or security group allows inbound traffic on these ports:
If your hosting panel already occupies ports 80 or 443, consult your panel’s reverse-proxy documentation or adjust the port bindings in
docker-compose.yml.5
Build and start the stack
From the repository root:Compose builds the API and web images, then starts all six services. Caddy contacts Let’s Encrypt and obtains a certificate for
CADDY_PUBLIC_HOST automatically.6
Verify the deployment
Check that the API is healthy:A successful response looks like:Then open
https://app.example.com in a browser. The first visit triggers the setup wizard.7
Complete the setup wizard
Register as the first user. Because no organization exists yet, the registration flow launches the setup wizard:
- Enter your name, email, and password.
- Name your workspace (organization).
- Review the hostname shown in the wizard — it should match your public URL.
Port reference
Environment variable reference
For all available variables including optional ones, see Environment Variables.
Workspace limit
If the API detects more than one organization in the database (for example after a legacy data migration), it logs a warning at startup and refuses to create additional organizations until only one remains.Next steps
- Custom domains and subdomains — See the Domains guide for BYO domain configuration and optional
*.hyperspeedapp.comsubdomains. - TLS behind another proxy — See the TLS guide if Caddy sits behind Traefik, nginx, or a cloud load balancer.
- Backups — See Backups for Postgres and MinIO backup strategies.
- Upgrades — See Upgrades for the upgrade process and breaking change notes.