Configuration
Environment variables and certificate challenge setup.
All configuration is stored in /var/lib/devpush/.env. For a starting point, use the .env.example file in the repository.
Environment variables
Required
| Variable | Description |
|---|---|
APP_HOSTNAME |
Domain for the app (e.g., app.example.com) |
DEPLOY_DOMAIN |
Base domain for deployments (defaults to APP_HOSTNAME) |
LE_EMAIL |
Email for Let's Encrypt notifications |
GITHUB_APP_ID |
GitHub App ID |
GITHUB_APP_NAME |
GitHub App name |
GITHUB_APP_PRIVATE_KEY |
GitHub App private key (PEM format, use \n for newlines) |
GITHUB_APP_WEBHOOK_SECRET |
GitHub webhook secret |
GITHUB_APP_CLIENT_ID |
GitHub OAuth client ID |
GITHUB_APP_CLIENT_SECRET |
GitHub OAuth client secret |
EMAIL_SENDER_ADDRESS |
Email sender for invites/login |
RESEND_API_KEY |
API key for Resend |
Auto-generated by installer
| Variable | Description |
|---|---|
SECRET_KEY |
App secret for sessions/CSRF |
ENCRYPTION_KEY |
Fernet key for encrypting secrets |
POSTGRES_PASSWORD |
PostgreSQL password |
SERVICE_UID |
Container user UID (matches host user) |
SERVICE_GID |
Container user GID (matches host user) |
SERVER_IP |
Public IP of the server |
CERT_CHALLENGE_PROVIDER |
ACME challenge provider: default (HTTP-01) or cloudflare, route53, gcloud, digitalocean, azure (DNS-01) |
Optional
| Variable | Description | Default |
|---|---|---|
GOOGLE_CLIENT_ID |
Google OAuth client ID | |
GOOGLE_CLIENT_SECRET |
Google OAuth client secret | |
APP_NAME |
Display name | /dev/push |
APP_DESCRIPTION |
App description | |
EMAIL_SENDER_NAME |
Sender display name | /dev/push |
POSTGRES_DB |
Database name | devpush |
POSTGRES_USER |
Database user | devpush-app |
REDIS_URL |
Redis URL | redis://redis:6379 |
DEFAULT_CPUS |
Default CPU cores per container | 0.5 |
DEFAULT_MEMORY_MB |
Default memory limit (MB) | 2048 |
MAX_CPUS |
Maximum CPU cores per container | 4.0 |
MAX_MEMORY_MB |
Maximum memory limit (MB) | 8192 |
ALLOW_CUSTOM_RESOURCES |
Allow projects to override CPU/memory | false |
JOB_TIMEOUT |
Job timeout (seconds) | 320 |
DEPLOYMENT_TIMEOUT |
Deployment timeout (seconds) | 300 |
LOG_LEVEL |
Logging level | WARNING |
Certificate challenge providers
By default, /dev/push uses Let's Encrypt with HTTP-01 challenge. Set CERT_CHALLENGE_PROVIDER in .env to switch providers. Leave it blank or set default to keep HTTP-01, or choose a DNS provider for DNS-01/wildcard support:
| Provider | CERT_CHALLENGE_PROVIDER |
Required Variables |
|---|---|---|
| Default (HTTP-01) | default |
None |
| Cloudflare | cloudflare |
CF_DNS_API_TOKEN |
| AWS Route53 | route53 |
AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_REGION |
| Google Cloud | gcloud |
GCE_PROJECT + gcloud-sa.json file |
| DigitalOcean | digitalocean |
DO_AUTH_TOKEN |
| Azure | azure |
AZURE_CLIENT_ID, AZURE_CLIENT_SECRET, AZURE_TENANT_ID, AZURE_SUBSCRIPTION_ID, AZURE_RESOURCE_GROUP |
Default (HTTP-01)
The default provider uses Let's Encrypt with HTTP-01 challenge. No additional configuration is required beyond setting LE_EMAIL in your .env file.
Cloudflare
Use Cloudflare DNS for certificate validation. Requires a Cloudflare API token with DNS edit permissions.
Required variable:
CF_DNS_API_TOKEN: Cloudflare API token with "Zone:DNS:Edit" permissions for your domain
Setup:
- Create an API token in your Cloudflare dashboard
- Grant "Zone:DNS:Edit" permissions for your domain
- Add the token to your
.envfile:CERT_CHALLENGE_PROVIDER=cloudflare CF_DNS_API_TOKEN=your_token_here
AWS Route53
Use AWS Route53 for DNS challenge validation.
Required variables:
AWS_ACCESS_KEY_ID: AWS access key IDAWS_SECRET_ACCESS_KEY: AWS secret access keyAWS_REGION: AWS region where your Route53 hosted zone is located (e.g.,us-east-1,eu-west-1)
Setup:
- Create an IAM access key in AWS Console
- Grant the IAM user "Route53:ChangeResourceRecordSets" permission
- Add the credentials to your
.envfile:CERT_CHALLENGE_PROVIDER=route53 AWS_ACCESS_KEY_ID=your_access_key AWS_SECRET_ACCESS_KEY=your_secret_key AWS_REGION=us-east-1
Google Cloud
Use Google Cloud DNS for certificate validation.
Required variables:
GCE_PROJECT: Google Cloud project ID- Service account JSON file:
gcloud-sa.jsonin/var/lib/devpush/
Setup:
- Find your project ID in Google Cloud Console
- Create a service account with "DNS Administrator" role
- Download the JSON key file and save it as
/var/lib/devpush/gcloud-sa.json - Add the project ID to your
.envfile:
CERT_CHALLENGE_PROVIDER=gcloud
GCE_PROJECT=your-project-id
DigitalOcean
Use DigitalOcean DNS for certificate validation.
Required variable:
DO_AUTH_TOKEN: DigitalOcean personal access token
Setup:
- Generate a personal access token in DigitalOcean
- Grant "read" and "write" scopes
- Add the token to your
.envfile:
CERT_CHALLENGE_PROVIDER=digitalocean
DO_AUTH_TOKEN=your_token_here
Azure
Use Azure DNS for certificate validation.
Required variables:
AZURE_CLIENT_ID: Application (client) IDAZURE_CLIENT_SECRET: Client secret valueAZURE_TENANT_ID: Directory (tenant) IDAZURE_SUBSCRIPTION_ID: Subscription IDAZURE_RESOURCE_GROUP: Resource group name containing your DNS zone
Setup:
- Register an application in Azure Portal
- Copy the "Application (client) ID" as
AZURE_CLIENT_ID - Create a client secret in "Certificates & secrets" section and copy the value as
AZURE_CLIENT_SECRET - Find the "Directory (tenant) ID" in "Azure Active Directory › Overview" as
AZURE_TENANT_ID - Find your subscription ID as
AZURE_SUBSCRIPTION_ID - Note the resource group name containing your DNS zone as
AZURE_RESOURCE_GROUP - Add all values to your
.envfile:
CERT_CHALLENGE_PROVIDER=azure
AZURE_CLIENT_ID=your_client_id
AZURE_CLIENT_SECRET=your_client_secret
AZURE_TENANT_ID=your_tenant_id
AZURE_SUBSCRIPTION_ID=your_subscription_id
AZURE_RESOURCE_GROUP=your_resource_group