Skip to content

Environment Variables

Manage environment variables for your applications with Gokku.

Overview

Gokku provides a unified CLI tool for managing environment variables, similar to Heroku's config:set, accessible both locally on the server and remotely from your machine.

gokku config

The gokku config command manages environment variables.

Usage Modes

Remote execution (from local machine):

bash
gokku config <command> [args] -a <app-name>

Local execution (on server):

bash
gokku config <command> [args] --app <app-name>

Commands

set - Set Variable

Set environment variable(s):

From local machine:

bash
gokku config set PORT=8080 -a api-production
gokku config set DATABASE_URL="postgres://..." -a api-production

On server:

bash
gokku config set PORT=8080 --app api
gokku config set DATABASE_URL="postgres://user:pass@localhost/db" --app api

Multiple variables:

bash
gokku config set PORT=8080 -a api-production
gokku config set LOG_LEVEL=info -a api-production
gokku config set WORKERS=4 -a api-production

get - Get Variable

Get a variable value:

From local machine:

bash
gokku config get PORT -a api-production

On server:

bash
gokku config get PORT --app api

Output:

PORT=8080

list - List All Variables

List all environment variables:

From local machine:

bash
gokku config list -a api-production

On server:

bash
gokku config list --app api

Output:

DATABASE_URL=postgres://user:pass@localhost/db
LOG_LEVEL=info
PORT=8080
WORKERS=4

unset - Delete Variable

Delete an environment variable:

From local machine:

bash
gokku config unset PORT -a api-production

On server:

bash
gokku config unset PORT --app api

Storage

Environment variables are stored in:

/opt/gokku/apps/APP_NAME/shared/.env

Example: /opt/gokku/apps/api/shared/.env

Format

Standard .env format:

env
DATABASE_URL=postgres://localhost/db
LOG_LEVEL=info
PORT=8080
REDIS_URL=redis://localhost:6379

How It Works

  • Environment variables are stored in a single shared .env file per application
  • Each release directory gets a symlink to this shared file
  • Changes to environment variables affect all releases immediately
  • No restart is needed for environment variable changes to take effect

Access from Application

Go:

go
import "os"

port := os.Getenv("PORT")
dbURL := os.Getenv("DATABASE_URL")

Python:

python
import os

port = os.getenv("PORT", "8080")
db_url = os.getenv("DATABASE_URL")

Node.js:

javascript
const port = process.env.PORT || 8080;
const dbURL = process.env.DATABASE_URL;

Apply Changes

Environment variables are automatically available to your application. No restart is required for environment variable changes to take effect.

Restart Application (Optional)

If you want to restart the application after changing environment variables:

From local machine:

bash
gokku restart -a api-production

On server:

bash
gokku restart --app api

Common Variables

Server Configuration

bash
# Port
gokku config set PORT=8080 -a api-production

# Workers/Threads
gokku config set WORKERS=4 -a api-production

# Timeout
gokku config set TIMEOUT=30 -a api-production

Database

bash
# PostgreSQL
gokku config set DATABASE_URL="postgres://user:pass@host:5432/dbname" -a api-production

# MySQL
gokku config set DATABASE_URL="mysql://user:pass@host:3306/dbname" -a api-production

# MongoDB
gokku config set MONGO_URL="mongodb://user:pass@host:27017/dbname" -a api-production

Cache

bash
# Redis
gokku config set REDIS_URL="redis://localhost:6379" -a api-production

# Memcached
gokku config set MEMCACHE_SERVERS="localhost:11211" -a api-production

AWS

bash
gokku config set AWS_ACCESS_KEY_ID="AKIA..." -a api-production
gokku config set AWS_SECRET_ACCESS_KEY="secret..." -a api-production
gokku config set AWS_REGION="us-east-1" -a api-production
gokku config set S3_BUCKET="my-bucket" -a api-production

API Keys

bash
gokku config set STRIPE_API_KEY="sk_live_..." -a api-production
gokku config set SENDGRID_API_KEY="SG...." -a api-production
gokku config set OPENAI_API_KEY="sk-..." -a api-production

Application

bash
# Environment
gokku config set APP_ENV=production -a api-production

# Debug mode
gokku config set DEBUG=false -a api-production

# Log level
gokku config set LOG_LEVEL=info -a api-production

# Secret key
gokku config set SECRET_KEY="random-secret-key" -a api-production

Security Best Practices

Good:

bash
# Use gokku config instead
gokku config set DATABASE_URL="postgres://..." -a api-production

2. Use Strong Secrets

bash
# Generate random secret
SECRET=$(openssl rand -hex 32)
gokku config set SECRET_KEY="$SECRET" -a api-production

3. Different Secrets Per Environment

bash
# Production
gokku config set SECRET_KEY="prod-secret" -a api-production

# Staging
gokku config set SECRET_KEY="staging-secret" -a api-staging

4. Rotate Secrets Regularly

bash
# Generate new secret
NEW_SECRET=$(openssl rand -hex 32)

# Update
gokku config set SECRET_KEY="$NEW_SECRET" -a api-production

# Restart app (optional)
gokku restart -a api-production

Multiple Environments

Different variables for different environments:

bash
# Production - Real database
gokku config set DATABASE_URL="postgres://prod-db/app" -a api-production
gokku config set LOG_LEVEL=info -a api-production
gokku config set DEBUG=false -a api-production

# Staging - Staging database
gokku config set DATABASE_URL="postgres://staging-db/app" -a api-staging
gokku config set LOG_LEVEL=debug -a api-staging
gokku config set DEBUG=true -a api-staging

Troubleshooting

Variable Not Found

Check if variable exists:

bash
# From local machine
gokku config get PORT -a api-production

# On server
gokku config get PORT --app api

If empty, set it:

bash
gokku config set PORT=8080 -a api-production

Changes Not Applied

Environment variables are automatically available to your application. If you need to restart:

bash
# Using gokku CLI
gokku restart -a api-production

# Or manually on server
gokku restart --app api

.env File Missing

The .env file is created automatically when you first set a variable:

bash
gokku config set PORT=8080 -a api-production

Permission Denied

Fix permissions:

bash
ssh ubuntu@server "sudo chown ubuntu:ubuntu /opt/gokku/apps/api/shared/.env"
ssh ubuntu@server "chmod 600 /opt/gokku/apps/api/shared/.env"

Advanced Usage

Bulk Set

Set multiple variables at once:

bash
# Set multiple variables in one command
gokku config set PORT=8080 -a api-production
gokku config set LOG_LEVEL=info -a api-production
gokku config set WORKERS=4 -a api-production

Backup Variables

bash
# Backup
ssh ubuntu@server "cat /opt/gokku/apps/api/shared/.env" > backup.env

# Restore
scp backup.env ubuntu@server:/opt/gokku/apps/api/shared/.env
gokku restart -a api-production

Export from Local .env

bash
# Read local .env and set on server
while IFS= read -r line; do
  if [[ $line && $line != \#* ]]; then
    gokku config set "$line" -a api-production
  fi
done < .env.production

Next Steps

Released under the MIT License.