Docker install¶
The fastest way to run Channel Vault NAS. Two Docker paths are covered here:
- Start in 60 seconds — pull the published images (no build).
- Build from source — build the images from this repo.
Both store archive data in bind-mounted host folders (./metadata,
./downfolder, ./runtime).
Start in 60 seconds (published images)¶
Use the release Compose file for the fastest path. It publishes only the web port and keeps the API inside the Compose network:
mkdir channel-vault-nas && cd channel-vault-nas
curl -fsSLO https://raw.githubusercontent.com/hyeonsangjeon/channel-vault-nas/main/compose.release.yml
docker compose -f compose.release.yml up -d
Older Synology Docker packages expose docker-compose instead of
docker compose. The same release file is verified with Compose v2 and legacy
Compose 1.28.5.
Then open http://127.0.0.1:5173/ and jump to
Your first channel backup.
Prefer GHCR images?
Create a .env beside compose.release.yml and set both image overrides:
CVN_API_IMAGE=ghcr.io/hyeonsangjeon/channel-vault-nas-api:0.2.0
CVN_WEB_IMAGE=ghcr.io/hyeonsangjeon/channel-vault-nas-web:0.2.0
Always set CVN_API_IMAGE and CVN_WEB_IMAGE together. Both the GHCR
mirror and the default Docker Hub images support anonymous pulls.
Build from source¶
Best for evaluating the current main or a branch:
git clone https://github.com/hyeonsangjeon/channel-vault-nas.git
cd channel-vault-nas
cp .env.example .env
mkdir -p metadata downfolder runtime
docker compose up --build
The Compose stack runs:
api— FastAPI backend withyt-dlp,ffmpeg, andffprobeweb— nginx-served React app./metadata— SQLite DB and startup backups./downfolder— archived media and sidecars./runtime/.env.runtime— Settings-tab runtime overrides
Verify without touching your real archive
Override the ports and host folders to run a throwaway check:
mkdir -p /tmp/channel-vault-compose/{metadata,downfolder,runtime}
CVN_WEB_PORT=15173 \
CVN_API_PORT=18000 \
CVN_METADATA_HOST_DIR=/tmp/channel-vault-compose/metadata \
CVN_DOWNLOAD_HOST_DIR=/tmp/channel-vault-compose/downfolder \
CVN_RUNTIME_HOST_DIR=/tmp/channel-vault-compose/runtime \
docker compose up --build
Direct docker run (registry smoke test)¶
Compose is recommended because it keeps ports, volumes, health checks, and
restart policy in one file. But you can also run the two containers directly on
one Docker network. The api network alias is required because the web image
proxies /api and /ws to http://api:8000.
export CVN_API_IMAGE=modenaf360/channel-vault-nas-api:0.2.0
export CVN_WEB_IMAGE=modenaf360/channel-vault-nas-web:0.2.0
mkdir -p metadata downfolder runtime
docker network create channel-vault-nas 2>/dev/null || true
docker run -d \
--name channel-vault-nas-api \
--network channel-vault-nas \
--network-alias api \
-p 8000:8000 \
-e CVN_DATABASE_URL='sqlite+aiosqlite:///./metadata/app.db' \
-e CVN_METADATA_DIR='./metadata' \
-e CVN_DOWNLOAD_DIR='./downfolder' \
-e CVN_RUNTIME_ENV_FILE='/app/runtime/.env.runtime' \
-e CVN_DB_MIGRATE_ON_STARTUP=true \
-v "$PWD/metadata:/app/metadata" \
-v "$PWD/downfolder:/app/downfolder" \
-v "$PWD/runtime:/app/runtime" \
"$CVN_API_IMAGE"
docker run -d \
--name channel-vault-nas-web \
--network channel-vault-nas \
-p 5173:80 \
"$CVN_WEB_IMAGE"
Open http://127.0.0.1:5173/. Clean up with:
Going beyond localhost¶
For anything more than a local trial, edit .env before starting:
- Set
CVN_AUTH_TOKENto a long random value — see Access token. -
Behind a reverse proxy, publish only the web port and bind the API to loopback:
Then continue with the NAS install guide for host-folder separation and reverse-proxy recipes.
Open the web port, not the API port
If you see only {"detail":"Not Found"}, you opened the raw API port. Open
the web port (CVN_WEB_PORT, default 5173).
See NAS troubleshooting.