Domains & TLS
Voxeltron provides automatic HTTPS for every app via ACME/Let’s Encrypt, with support for custom domains, wildcard certificates, and zero-downtime renewal.
Overview
Every app deployed on Voxeltron gets a TLS certificate automatically. The daemon handles the full lifecycle — issuance, verification, installation, and renewal — so you never touch a certificate file.
ACME/Let’s Encrypt certificates issued and renewed without intervention.
Point any domain at your server and Voxeltron provisions a certificate automatically.
Secure *.yourdomain.com with a single DNS-01 challenge.
Auto-generated self-signed certs for local dev and internal networks.
ACME / Let’s Encrypt
Voxeltron uses the ACME protocol to obtain trusted TLS certificates from Let’s Encrypt (or any ACME-compatible CA). The daemon acts as an ACME client, handling challenges and key management internally.
HTTP-01 Challenge Flow
The default verification method is the HTTP-01 challenge. Here’s how it works:
- Voxeltron requests a certificate for the domain from the ACME directory.
- The CA responds with a token and a challenge URL.
- The daemon places the token at
http://<domain>/.well-known/acme-challenge/<token>. - The CA fetches the token over HTTP to verify domain ownership.
- On success, the CA issues a signed certificate and Voxeltron installs it immediately.
Staging vs Production
During setup, use the Let’s Encrypt staging directory to avoid rate limits. Staging certificates are not trusted by browsers but are functionally identical for testing.
# Staging (for testing)
acme_directory = "https://acme-staging-v02.api.letsencrypt.org/directory"
# Production (default)
acme_directory = "https://acme-v02.api.letsencrypt.org/directory" Auto-Renewal
A background task checks certificate expiry daily. Certificates are renewed when they have fewer than 30 days remaining — well within the 90-day Let’s Encrypt lifetime. Renewal uses the same challenge method as initial issuance and requires zero downtime.
Custom Domains
Add a custom domain to any app with a single command. Voxeltron verifies ownership and provisions a certificate.
Adding a Domain
voxeltron domains add myapp.example.com --app my-app DNS Configuration
Point your domain at the Voxeltron server using one of these DNS record types:
Point the domain directly at your server’s IP address. Best for apex domains.
myapp.example.com. A 203.0.113.10 Alias to your Voxeltron hostname. Best for subdomains.
myapp.example.com. CNAME voxeltron.example.com. Verification
After adding a domain, Voxeltron verifies DNS resolution before requesting a certificate. Check status with:
voxeltron domains list --app my-app
DOMAIN STATUS CERTIFICATE
myapp.example.com verified valid (expires 2026-05-20)
staging.example.com pending awaiting DNS Wildcard Certificates
Wildcard certificates cover all subdomains under a single domain, e.g. *.yourdomain.com. They require the DNS-01 challenge method since the CA must verify control of the entire zone.
DNS-01 Challenge
Instead of placing a token on a web server, DNS-01 requires you to create a TXT record:
- Voxeltron requests a wildcard certificate from the ACME directory.
- The CA returns a challenge value.
- You (or an automated DNS provider integration) create a TXT record at
_acme-challenge.yourdomain.com. - The CA queries DNS to verify the record.
- On success, a wildcard certificate is issued for
*.yourdomain.com.
voxeltron domains add "*.yourdomain.com" --app my-app --challenge dns-01 voxeltron.toml. Manual TXT record creation is supported as a fallback.
Self-Signed Certificates
For local development and internal networks where public CA validation isn’t possible, Voxeltron auto-generates self-signed certificates on first boot. These provide encrypted connections without external dependencies.
[tls]
mode = "self-signed" # Options: "acme" (default), "self-signed", "manual" curl --insecure for API testing.
Certificate Storage
All certificates and private keys are stored on disk in the Voxeltron data directory:
/var/lib/voxeltron/certs/
├── myapp.example.com/
│ ├── cert.pem
│ ├── key.pem
│ └── chain.pem
└── acme-account.json The renewal background task runs daily and checks every certificate’s expiry. Certificates within 30 days of expiration are renewed automatically. The task logs all renewal attempts to the audit log.
0600 permissions and are readable only by the voxeltron system user. Back up the certs/ directory alongside your regular data backups.
Configuration
TLS settings are defined in voxeltron.toml:
[tls]
acme_email = "admin@example.com"
acme_directory = "https://acme-v02.api.letsencrypt.org/directory"
# Optional: DNS provider for DNS-01 challenges
# dns_provider = "cloudflare"
# dns_api_token = "$${CLOUDFLARE_API_TOKEN}"
# Optional: certificate storage path (default: /var/lib/voxeltron/certs)
# cert_path = "/var/lib/voxeltron/certs"
# Optional: renewal check interval in hours (default: 24)
# renewal_interval = 24