the easiest way to get started. this spins up both packry and a postgres database, with automatic health checks and persistent storage.
# .env — place next to docker-compose.yml POSTGRES_PASSWORD=your-strong-password-here BETTER_AUTH_SECRET=$(openssl rand -hex 32) APP_URL=https://packry.example.com RESEND_API_KEY=re_your_key_here EMAIL_FROM="packry <noreply@yourdomain.com>"
services:
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_DB: packry
POSTGRES_USER: packry
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5433:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U packry -d packry"]
interval: 10s
timeout: 5s
retries: 5
app:
image: ghcr.io/danielkerwin/packry:latest
restart: unless-stopped
depends_on:
db:
condition: service_healthy
ports:
- "3000:3000"
environment:
DATABASE_URL: postgres://packry:${POSTGRES_PASSWORD}@db:5432/packry
BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET}
APP_URL: ${APP_URL}
RESEND_API_KEY: ${RESEND_API_KEY}
EMAIL_FROM: ${EMAIL_FROM}
volumes:
postgres_data:docker compose up -d
packry will run migrations automatically on first boot, then start the server on port 3000.
already have a postgres instance? run the packry container on its own and point it at your existing database.
docker run -d \ --name packry \ -p 3000:3000 \ -e DATABASE_URL="postgres://packry:secret@host.docker.internal:5432/packry" \ -e BETTER_AUTH_SECRET="$(openssl rand -hex 32)" \ -e APP_URL="https://packry.example.com" \ -e RESEND_API_KEY="re_your_key_here" \ -e EMAIL_FROM="packry <noreply@yourdomain.com>" \ --restart unless-stopped \ ghcr.io/danielkerwin/packry:latest
all configuration is via environment variables. no config files to manage.
| variable | description | required |
|---|---|---|
DATABASE_URL postgres://packry:secret@db:5432/packry | PostgreSQL connection string. When using docker-compose, this points to the db service internally. For standalone Docker, point to your existing Postgres instance. Construct from your Postgres host, port, user, and password. | required |
POSTGRES_PASSWORD changeme | Password for the PostgreSQL database. Used by the postgres container to initialize the database and by the app to connect. Choose a strong password. Used only if running the bundled Postgres container. | required |
BETTER_AUTH_SECRET a95ced22…(64 hex chars) | Secret key used to sign session tokens and encrypt auth data. Must be at least 32 bytes of randomness. Run: openssl rand -hex 32 | required |
APP_URL https://packry.example.com | Public URL where packry is served. Used for auth callbacks, invitation links, and email URLs. Your domain or IP where packry will be served (include https://). | required |
RESEND_API_KEY re_xxxxxxxx_xxxxxxxxxxxxxxxxxxxx | API key for Resend, used to send transactional emails (magic link login, group invitations). Without this, email features are disabled. Sign up at resend.com, create an API key, and verify your sending domain. | optional |
EMAIL_FROM "packry <noreply@yourdomain.com>" | The sender address for outgoing emails. Must match a verified domain in your Resend account. Format: "display name <address@your-verified-domain>". | optional |
skip the setup. create an account on the managed version and start building packs in seconds.
register free