Vikunja
v1.0.0Project and task management with lists, boards, and calendars.
x-arcane:
icon: "https://cdn.jsdelivr.net/gh/selfhst/icons@main/svg/vikunja.svg"
urls:
- "https://vikunja.io/docs/full-docker-example/"
services:
vikunja:
image: "vikunja/vikunja:latest"
restart: "unless-stopped"
ports:
- "${PORT:-3456}:3456"
environment:
VIKUNJA_SERVICE_PUBLICURL: "${PUBLIC_URL:-http://localhost:3456/}"
VIKUNJA_SERVICE_SECRET: "${SERVICE_SECRET:?Set SERVICE_SECRET in .env}"
VIKUNJA_DATABASE_TYPE: "postgres"
VIKUNJA_DATABASE_HOST: "db"
VIKUNJA_DATABASE_DATABASE: "vikunja"
VIKUNJA_DATABASE_USER: "vikunja"
VIKUNJA_DATABASE_PASSWORD: "${DB_PASSWORD:?Set DB_PASSWORD in .env}"
VIKUNJA_SERVICE_ENABLEREGISTRATION: "${ENABLE_REGISTRATION:-true}"
volumes:
- "files:/app/vikunja/files"
depends_on:
db:
condition: "service_healthy"
files-init:
condition: "service_completed_successfully"
healthcheck:
test: ["CMD", "/app/vikunja/vikunja", "healthcheck"]
interval: 30s
timeout: 5s
retries: 5
start_period: 30s
labels:
com.getarcaneapp.arcane.icon: "https://cdn.jsdelivr.net/gh/selfhst/icons@main/svg/vikunja.svg"
db:
image: "postgres:16-alpine"
restart: "unless-stopped"
environment:
POSTGRES_DB: "vikunja"
POSTGRES_USER: "vikunja"
POSTGRES_PASSWORD: "${DB_PASSWORD:?Set DB_PASSWORD in .env}"
volumes:
- "db-data:/var/lib/postgresql/data"
healthcheck:
test:
- "CMD-SHELL"
- "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"
interval: "10s"
timeout: "5s"
retries: 10
start_period: "30s"
labels:
com.getarcaneapp.arcane.icon: https://cdn.jsdelivr.net/gh/selfhst/icons@main/svg/postgresql.svg
files-init:
image: "busybox:latest"
user: "0:0"
command:
- "chown"
- "1000:1000"
- "/files"
volumes:
- "files:/files"
restart: "no"
labels:
com.getarcaneapp.arcane.icon: https://cdn.jsdelivr.net/gh/selfhst/icons@main/svg/vikunja.svg
volumes:
files: {}
db-data: {}
# Replace every change-me with an independent secret before deployment.
# Generate secrets with: openssl rand -hex 32
PORT=3456
PUBLIC_URL=http://localhost:3456/
SERVICE_SECRET=change-me
DB_PASSWORD=change-me
ENABLE_REGISTRATION=true
README
Project and task management with lists, boards, and calendars.
Copy .env.example to .env, review the settings, then run docker compose up -d. In Arcane, import the template and supply the same environment variables. Replace every change-me value before starting. Generate independent secrets with openssl rand -hex 32; use hexadecimal database passwords so connection URLs need no escaping. Use docker compose ps and docker compose logs to check startup.
Open PUBLIC_URL and register your account. After registering all users, set ENABLE_REGISTRATION=false and recreate the application. The one-shot initialization service gives the files volume to the application UID 1000; PostgreSQL stores task data.
Named volumes preserve server data across container recreation. Back up these volumes before upgrades; docker compose down -v deletes them. Set PORT to an unused host port. For remote browser access, put HTTPS in front of the application and update its public URL setting where provided.
Upstream documentation: Vikunja deployment.