Install: Docker run
Goal and result
Section titled “Goal and result”Use raw Docker commands only as an advanced, complete equivalent of the recommended v26 Compose stack.
Applies to
Section titled “Applies to”Set DISCVAULT_IMAGE to ghcr.io/helmerznl/discvault:latest for DiscVault v26 stable or ghcr.io/helmerznl/discvault:beta for DiscVault v26 beta. Both require PostgreSQL, DATABASE_URL, API, worker, MCP, and persistent /data.
DiscVault v26 stable
Section titled “DiscVault v26 stable”- DiscVault v26 stable ·
ghcr.io/helmerznl/discvault:latest - PostgreSQL + API + worker + MCP
- host
6080→ API container5000
DiscVault v26 beta
Section titled “DiscVault v26 beta”- DiscVault v26 beta ·
ghcr.io/helmerznl/discvault:beta - PostgreSQL + API + worker + MCP
- host
6080→ API container5000
Prerequisites
Section titled “Prerequisites”- Docker Engine
24+ - OpenSSL
- advanced container operations
Procedure
Section titled “Procedure”- Record:
DISCVAULT_IMAGE·:latest/:beta - Create: private
--env-file·DATABASE_URL· owner-only file permissions (0600) - Start:
discvault-postgres→discvault-api→ worker + MCP - Verify:
6080:5000·GET /api/next/health· all four containers
Commands and settings
Section titled “Commands and settings”DiscVault v26 stable
Section titled “DiscVault v26 stable”export DISCVAULT_IMAGE=ghcr.io/helmerznl/discvault:latestDiscVault v26 beta
Section titled “DiscVault v26 beta”export DISCVAULT_IMAGE=ghcr.io/helmerznl/discvault:betaBoth channels
Section titled “Both channels”set -euo pipefailtest -n "$DISCVAULT_IMAGE"case "$DISCVAULT_IMAGE" in ghcr.io/helmerznl/discvault:latest|ghcr.io/helmerznl/discvault:beta) ;; *) printf '%s\n' "$DISCVAULT_IMAGE" >&2; exit 64 ;;esacinstall -d -m 0700 /opt/discvaultinstall -d -m 0750 /srv/discvaultinstall -d -o 70 -g 70 -m 0700 /srv/discvault-postgresumask 077ENV_FILE=/opt/discvault/docker-run.envtest ! -e "$ENV_FILE"ENV_TMP="$(mktemp "$ENV_FILE.tmp.XXXXXX")"trap 'rm -f "$ENV_TMP"' EXITPOSTGRES_PASSWORD="$(openssl rand -hex 32)"JWT_SECRET="$(openssl rand -hex 32)"printf '%s\n' \ 'POSTGRES_DB=discvault' \ 'POSTGRES_USER=discvault' \ "POSTGRES_PASSWORD=$POSTGRES_PASSWORD" \ "DATABASE_URL=postgresql://discvault:$POSTGRES_PASSWORD@discvault-postgres:5432/discvault" \ "JWT_SECRET=$JWT_SECRET" \ 'TZ=Europe/Amsterdam' \ 'RP_ID=localhost' \ 'RP_NAME=DiscVault' \ 'RP_ORIGINS=http://localhost:6080' \ 'DISCVAULT_DATA_DIR=/data' \ 'DISCVAULT_PLUGIN_INSTALL_DIR=/data/plugins' \ 'DISCVAULT_WORKER_ID=worker-1' \ 'DISCVAULT_WORKER_POLL_INTERVAL=2' \ 'DISCVAULT_API=http://discvault-api:5000' > "$ENV_TMP"chmod 0600 "$ENV_TMP"ln "$ENV_TMP" "$ENV_FILE"rm -f "$ENV_TMP"trap - EXITdocker network inspect discvault >/dev/null 2>&1 || docker network create discvaultdocker run -d --name discvault-postgres --restart unless-stopped \ --network discvault --env-file "$ENV_FILE" \ --health-cmd 'pg_isready -U "$POSTGRES_USER" -d "$POSTGRES_DB"' \ --health-interval 10s --health-timeout 5s --health-retries 10 \ -v /srv/discvault-postgres:/var/lib/postgresql/data postgres:17-alpineuntil [ "$(docker inspect discvault-postgres --format '{{.State.Health.Status}}')" = healthy ]; do sleep 2donedocker run -d --name discvault-api --restart unless-stopped \ --network discvault --env-file "$ENV_FILE" -w /opt/discvault/backend \ -p 6080:5000 -v /srv/discvault:/data "$DISCVAULT_IMAGE" \ sh -c 'python next_database.py migrate && exec gunicorn --bind 0.0.0.0:5000 --workers 2 --timeout 180 next_app:app'until curl --fail http://localhost:6080/api/next/health; do sleep 2; donedocker run -d --name discvault-worker --restart unless-stopped \ --network discvault --env-file "$ENV_FILE" -w /opt/discvault/backend \ -v /srv/discvault:/data "$DISCVAULT_IMAGE" python next_worker.py workdocker run -d --name discvault-mcp --restart unless-stopped \ --network discvault --env-file "$ENV_FILE" -w /opt/discvault/mcp-server \ -p 6090:6090 "$DISCVAULT_IMAGE" \ python server.py --http --host 0.0.0.0 --port 6090docker ps --filter 'name=discvault-'Expected result
Section titled “Expected result”All four containers are running, PostgreSQL is healthy, and http://localhost:6080/api/next/health succeeds through host port 6080 mapped to internal API port 5000.
- HTTP
2xx·/api/next/health - four v26 containers
Safety and rollback
Section titled “Safety and rollback”Next step
Section titled “Next step”Install: First start and health check
Source and status
Section titled “Source and status”helmerzNL/DiscVault@6d27c689ac21- Verified:
2026-07-14 - DiscVault Docs:
0.1.0
