Install: Docker Compose
Goal and result
Section titled “Goal and result”Deploy DiscVault 26 beta from the canonical moving Compose and environment files.
Applies to
Section titled “Applies to”This page applies only to DiscVault 26 beta. It downloads the moving release/v26-beta files and lists commit-pinned verification links. Because the current source .env.example still defaults to the engineering :dev image, the procedure rewrites and validates DISCVAULT_NEXT_IMAGE=ghcr.io/helmerznl/discvault:beta before pull or startup. It uses project discvault_next_deploy, host API port 6180, persistent /mnt/user/appdata/discvault, and PostgreSQL path /mnt/user/appdata/discvault-next/postgres.
DiscVault v26 beta
Section titled “DiscVault v26 beta”- DiscVault v26 beta ·
ghcr.io/helmerznl/discvault:beta - official files from
release/v26-beta - Compose project
discvault_next_deploy - host
6180→ API container5000
Prerequisites
Section titled “Prerequisites”- Docker Compose
v2 - OpenSSL
- writable persistent storage and free backup space
Procedure
Section titled “Procedure”- Install:
docker-compose.yml·.env.example·release/v26-beta - Create:
/opt/discvault-next/.env· owner-only file permissions (0600) · random secrets - Choose: with a valid FQDN, keep
RP_IDandRP_ORIGINSaligned and use trusted HTTPS · for a direct private or loopback IP without an FQDN, leaveRP_IDandRP_ORIGINSempty - Verify:
DISCVAULT_NEXT_IMAGE=ghcr.io/helmerznl/discvault:beta· no:dev - Run:
docker compose -p discvault_next_deploy config --quiet· pull · up - Test:
GET http://localhost:6180/api/next/health
Commands and settings
Section titled “Commands and settings”DiscVault v26 beta
Section titled “DiscVault v26 beta”set -euo pipefailinstall -d -m 0700 /opt/discvault-nextcd /opt/discvault-nextcurl --fail --location --proto '=https' --tlsv1.2 \ --output docker-compose.yml \ https://raw.githubusercontent.com/helmerzNL/DiscVault/release/v26-beta/app/deploy/next/docker-compose.ymlcurl --fail --location --proto '=https' --tlsv1.2 \ --output .env.example \ https://raw.githubusercontent.com/helmerzNL/DiscVault/release/v26-beta/app/deploy/next/.env.example
umask 077ENV_FILE=/opt/discvault-next/.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 -base64 48)"awk \ -v image='ghcr.io/helmerznl/discvault:beta' \ -v postgres_password="$POSTGRES_PASSWORD" \ -v jwt_secret="$JWT_SECRET" \ -v data_dir='/mnt/user/appdata/discvault' \ -v postgres_dir='/mnt/user/appdata/discvault-next/postgres' ' /^DISCVAULT_NEXT_IMAGE=/ { print "DISCVAULT_NEXT_IMAGE=" image; next } /^POSTGRES_PASSWORD=/ { print "POSTGRES_PASSWORD=" postgres_password; next } /^JWT_SECRET=/ { print "JWT_SECRET=" jwt_secret; next } /^DISCVAULT_DATA_DIR=/ { print "DISCVAULT_DATA_DIR=" data_dir; next } /^DISCVAULT_NEXT_POSTGRES_DATA=/ { print "DISCVAULT_NEXT_POSTGRES_DATA=" postgres_dir next } /^LEGACY_AUTH_ENABLED=/ { print "LEGACY_AUTH_ENABLED=true"; next } { print }' .env.example > "$ENV_TMP"chmod 0600 "$ENV_TMP"ln "$ENV_TMP" "$ENV_FILE"rm -f "$ENV_TMP"trap - EXITset -euo pipefailcd /opt/discvault-nextFQDN=discvault.example.comENV_FILE=/opt/discvault-next/.envENV_TMP="$(mktemp "$ENV_FILE.tmp.XXXXXX")"trap 'rm -f "$ENV_TMP"' EXITawk -v rp_id="$FQDN" -v rp_origin="https://$FQDN" ' /^RP_ID=/ { print "RP_ID=" rp_id; next } /^RP_NAME=/ { print "RP_NAME=DiscVault"; next } /^RP_ORIGINS=/ { print "RP_ORIGINS=" rp_origin; next } /^LEGACY_AUTH_ENABLED=/ { print "LEGACY_AUTH_ENABLED=true"; next } { print }' "$ENV_FILE" > "$ENV_TMP"chmod 0600 "$ENV_TMP"mv "$ENV_TMP" "$ENV_FILE"trap - EXITset -euo pipefailcd /opt/discvault-nextENV_FILE=/opt/discvault-next/.envENV_TMP="$(mktemp "$ENV_FILE.tmp.XXXXXX")"trap 'rm -f "$ENV_TMP"' EXITawk ' /^RP_ID=/ { print "RP_ID="; next } /^RP_NAME=/ { print "RP_NAME=DiscVault"; next } /^RP_ORIGINS=/ { print "RP_ORIGINS="; next } /^LEGACY_AUTH_ENABLED=/ { print "LEGACY_AUTH_ENABLED=true"; next } { print }' "$ENV_FILE" > "$ENV_TMP"chmod 0600 "$ENV_TMP"mv "$ENV_TMP" "$ENV_FILE"trap - EXITset -euo pipefailcd /opt/discvault-nextENV_FILE=/opt/discvault-next/.envtest "$(stat -c '%a' "$ENV_FILE")" = 600read_env() { sed -n "s/^$1=//p" "$ENV_FILE"; }
test "$(read_env DISCVAULT_NEXT_IMAGE)" = 'ghcr.io/helmerznl/discvault:beta'! grep -q ':dev' "$ENV_FILE"test "$(read_env LEGACY_AUTH_ENABLED)" = truePOSTGRES_PASSWORD_VALUE="$(read_env POSTGRES_PASSWORD)"JWT_SECRET_VALUE="$(read_env JWT_SECRET)"test "${#POSTGRES_PASSWORD_VALUE}" -ge 32test "$POSTGRES_PASSWORD_VALUE" != 'change-me-to-a-long-random-password'test "${#JWT_SECRET_VALUE}" -ge 48grep -qx 'DISCVAULT_DATA_DIR=/mnt/user/appdata/discvault' "$ENV_FILE"grep -qx 'DISCVAULT_NEXT_POSTGRES_DATA=/mnt/user/appdata/discvault-next/postgres' "$ENV_FILE"
RP_ID_VALUE="$(read_env RP_ID)"RP_ORIGINS_VALUE="$(read_env RP_ORIGINS)"if [ -z "$RP_ID_VALUE" ]; then test -z "$RP_ORIGINS_VALUE"else test "$RP_ORIGINS_VALUE" = "https://$RP_ID_VALUE"fi
docker compose -p discvault_next_deploy config --quietdocker compose -p discvault_next_deploy pulldocker compose -p discvault_next_deploy up -ddocker compose -p discvault_next_deploy pscurl --fail http://localhost:6180/api/next/healthExpected result
Section titled “Expected result”Compose project discvault_next_deploy reports PostgreSQL healthy and API, worker, and MCP running from the beta image; the health endpoint succeeds on host port 6180.
postgres·next-api·next-worker·next-mcp- host
6180→ API container5000 - HTTP
2xx·/api/next/health
Safety and rollback
Section titled “Safety and rollback”Next step
Section titled “Next step”Install: First start and health check
