Deploy to Cloud
Deploy a self-hosted Openfuse instance on a cloud VM or from a CI pipeline. Non-interactive setup with automatic secret generation for team evaluation and staging environments.
This guide deploys Openfuse on a cloud VM with a real domain, TLS certificates, and optionally a managed database. Use it for team evaluations, staging environments, or automated CI pipelines.
If you just want to try Openfuse on your laptop, start with Try Locally instead.
Prerequisites
- A Linux VM (Ubuntu 22.04+, Debian 12+, or Amazon Linux 2023)
- A domain with DNS access
- Docker and Docker Compose v2 installed
Install Docker (if needed)
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
# Log out and back in, then verify:
docker compose version1. Set up DNS
Openfuse needs three DNS records pointing to your VM's public IP:
| Record | Type | Value |
|---|---|---|
openfuse.example.com | A | <vm-public-ip> |
*.openfuse.example.com | A | <vm-public-ip> |
*.api.openfuse.example.com | A | <vm-public-ip> |
Replace openfuse.example.com with your chosen domain. You can use any subdomain of a domain you control.
Wildcard records are required for multi-tenant routing. Each company gets its own API subdomain (e.g., acme.api.openfuse.example.com).
Verify DNS has propagated before continuing:
dig +short openfuse.example.com
dig +short test.openfuse.example.com
dig +short test.api.openfuse.example.com
# All three should return your VM's IP2. Open ports
Ensure ports 80 and 443 are open in your VM's firewall or security group. Caddy needs port 80 for ACME HTTP-01 certificate validation and port 443 for HTTPS traffic.
3. Run the installer
SSH into your VM and run the installer in non-interactive mode. Set the required environment variables and pass --ci:
export ROOT_DOMAIN=openfuse.example.com
export ROOT_USER_EMAIL=admin@example.com
export ROOT_USER_PASSWORD='YourStr0ng!Password'
# SMTP (optional — omit to skip email features)
export SMTP_HOST=smtp.example.com
export SMTP_USER=smtp-user
export SMTP_PASSWORD=smtp-password
# Install and start
curl -sSL https://get.openfuse.io/install | bash -s -- --ci --version 1.2.0
cd openfuse && docker compose up -dThe --ci flag:
- Reads all values from environment variables (fails fast if required ones are missing)
- Auto-generates secrets that aren't provided (client secrets, session secret, DB password)
- Skips all interactive prompts
- Detects external databases when
DATABASE_HOSTis set
Using an external database
If you have a managed PostgreSQL instance (RDS, Cloud SQL, Azure Database), pass the connection details:
export DATABASE_HOST=your-rds-endpoint.amazonaws.com
export DATABASE_PASSWORD=your-db-password
export DATABASE_SSL=true
# Then run the installer as above
curl -sSL https://get.openfuse.io/install | bash -s -- --ci --version 1.2.0You need to create two databases on your PostgreSQL server beforehand: openfuse and keycloak. The API and Keycloak handle their own schema setup on first run.
4. Verify the deployment
Once docker compose ps shows all services as healthy:
| What | URL |
|---|---|
| UI | https://openfuse.example.com |
| SSO | https://sso.openfuse.example.com |
| API health | https://admin.api.openfuse.example.com/health |
Sign in with the admin credentials you set, create a company, and generate SDK credentials from the dashboard.
CI pipeline example
Here's a GitHub Actions workflow that deploys Openfuse to a VM for integration testing:
name: Integration Tests with Openfuse
on: [pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Start Openfuse
env:
ROOT_DOMAIN: lvh.me
ROOT_USER_EMAIL: admin@test.com
ROOT_USER_PASSWORD: Test1234!@#$
run: |
curl -sSL https://get.openfuse.io/install | bash -s -- --ci
cd openfuse && docker compose up -d
# Wait for API to be healthy
timeout 120 bash -c 'until curl -sf https://admin.api.lvh.me/health; do sleep 5; done'
- name: Run tests
run: pnpm testFor CI, use lvh.me as the domain — it resolves to 127.0.0.1 and works without DNS setup. The installer auto-configures self-signed certificates.
SMTP providers
For team evaluations, configure SMTP so invites and password resets work:
| Provider | SMTP_HOST | SMTP_PORT | Notes |
|---|---|---|---|
| Amazon SES | email-smtp.<region>.amazonaws.com | 587 | Requires domain verification |
| SendGrid | smtp.sendgrid.net | 587 | Use API key as password |
| Mailgun | smtp.mailgun.org | 587 | Free tier available |
| Resend | smtp.resend.com | 465 | Set SMTP_SECURE=true |
| Google Workspace | smtp.gmail.com | 587 | App password required |
Next steps
Try Locally
Run a self-hosted Openfuse instance on your laptop in under 5 minutes. No domain, no DNS, no cloud account — just Docker.
Docker Compose
Deploy Openfuse to production with managed databases, wildcard TLS, SMTP, and automated backups. A complete guide for running Openfuse reliably on your own infrastructure.