Docker Compose
Install script (recommended)
The fastest way to get started is the install script. It creates the required files, generates secrets, and starts the container:
curl -fsSL https://raw.githubusercontent.com/awaitstep/awaitstep/main/scripts/install.sh -o install.sh && bash install.shAfter it finishes, open http://localhost:8080.
Manual setup
If you prefer to set things up yourself, follow the steps below.
1. Create a directory
mkdir awaitstep && cd awaitstep2. Write docker-compose.yml
services:
awaitstep:
image: ghcr.io/awaitstep/awaitstep:latest
restart: unless-stopped
expose:
- '8080'
- '3000'
env_file:
- .env
volumes:
- awaitstep-data:/app/data
caddy:
image: caddy:2-alpine
restart: unless-stopped
ports:
- '8080:80'
configs:
- source: caddyfile
target: /etc/caddy/Caddyfile
configs:
caddyfile:
content: |
:80 {
handle /api/* {
reverse_proxy awaitstep:8080
}
handle {
reverse_proxy awaitstep:3000
}
}
volumes:
awaitstep-data:Caddy routes /api/* to the API server and everything else to the web UI.
TIP
If you need the Local Test feature, add a /local-dev/* route to the Caddyfile that proxies to port 8787. See Reverse Proxy for details.
3. Write .env
# Security
TOKEN_ENCRYPTION_KEY=your-first-generated-key
BETTER_AUTH_SECRET=your-second-generated-key
BETTER_AUTH_URL=http://localhost:8080
# Database (SQLite default)
# PostgreSQL (uncomment and fill in to use)
# DATABASE_URL=postgresql://user:password@host:5432/awaitstep
# Auth — configure at least one
# GITHUB_CLIENT_ID=
# GITHUB_CLIENT_SECRET=
# GOOGLE_CLIENT_ID=
# GOOGLE_CLIENT_SECRET=
RESEND_API_KEY=4. Generate secrets
openssl rand -hex 32 # use output for TOKEN_ENCRYPTION_KEY
openssl rand -hex 32 # use output for BETTER_AUTH_SECRETPaste each value into .env.
5. Start
docker compose up -dCheck logs:
docker compose logs -f awaitstepOpen http://localhost once the container is healthy.
Data persistence
All application data — the SQLite database and any local files — is stored in the awaitstep_data Docker volume mounted at /app/data. As long as this volume exists, your data survives container restarts and image upgrades.
WARNING
Never mount a host directory that the Docker user cannot write to. If AwaitStep cannot write to /app/data, it will fail to start.