4.7 KiB
Docker Compose Deployment
This deployment runs the API and worker as two services from the same image. Runtime state, credentials, staged videos, generated sessions, and the SQLite database stay on the host through bind mounts.
1. Initialize Local Files
chmod +x scripts/init-docker-config.sh
./scripts/init-docker-config.sh
This creates these files if they do not already exist:
.env
config/settings.json
runtime/cookies.json
runtime/upload_config.json
data/workspace/
2. Edit Required Secrets And IDs
Edit .env:
GROQ_API_KEY=your_groq_key
OPENAI_API_KEY=your_openai_key_if_using_codex
COLLECTION_SEASON_ID_A=7196643
COLLECTION_SEASON_ID_B=7196624
Edit runtime/cookies.json and runtime/upload_config.json with real Bilibili
credentials and upload metadata.
runtime/upload_config.json also controls pure-video title, description,
dynamic text, and top-comment formatting. Existing deployments mount
./runtime from the host, so updating the image does not overwrite this file.
When you want to change output text, edit the host file directly.
Common output templates:
{
"template": {
"title": "【{streamer} (歌曲纯享版)】 {date} 共{song_count}首歌",
"description": "{streamer} {date} 歌曲纯享版。\n\n完整歌单与时间轴见置顶评论。\n直播完整版:{current_full_video_link}\n上次直播:{previous_full_video_link}\n\n本视频为歌曲纯享切片,适合只听歌曲。",
"dynamic": "{streamer} {date} 歌曲纯享版已发布。完整歌单见置顶评论。\n直播完整版:{current_full_video_link}\n上次直播:{previous_full_video_link}"
},
"comment_template": {
"split_header": "当前视频:歌曲纯享版:只保留本场直播中的歌曲片段,歌单见下方。\n直播完整版:{current_full_video_link} (完整录播,含聊天/互动/完整流程)\n上次直播:{previous_full_video_link} (上一场完整录播)",
"full_header": "当前视频:直播完整版:保留本场完整录播内容,歌曲时间轴见下方。\n歌曲纯享版:{current_pure_video_link} (只听歌曲看这里)\n上次直播:{previous_full_video_link} (上一场完整录播)",
"split_part_header": "P{part_index}:",
"full_part_header": "P{part_index}:",
"split_song_line": "{song_index}. {title}{artist_suffix}",
"split_text_song_line": "{song_index}. {song_text}",
"full_timeline_line": "{song_index}. {line_text}"
}
}
Supported comment variables:
{current_full_video_link}/{current_pure_video_link}{previous_full_video_link}/{previous_pure_video_link}{part_index}/{song_index}{title}/{artist}/{artist_suffix}/{song_text}/{line_text}
If a comment header line contains an empty link variable, that whole line is
omitted. This prevents comments from showing blank 上次直播: lines when the
previous live video cannot be found.
Provide the biliup binary at:
runtime/biliup
It must be executable inside the container:
chmod +x runtime/biliup
The image installs the codex CLI for song_detect.provider=codex. Provide
Codex auth in one of these ways:
OPENAI_API_KEY in .env
runtime/codex mounted to /root/.codex
3. Start
docker compose up -d --build
Open:
http://127.0.0.1:8000
Drop videos into:
data/workspace/stage/
Common Commands
docker compose logs -f api
docker compose logs -f worker
docker compose restart worker
docker compose down
Run one scheduler cycle manually:
docker compose run --rm worker biliup-next run-once
Run doctor:
docker compose run --rm api biliup-next doctor
Environment Overrides
config/settings.json is still the base configuration. Environment variables
override selected values at runtime.
The Compose file already forces container-safe paths such as
/app/data/workspace and /app/runtime/cookies.json, so an existing local
config/settings.json with host paths can still be mounted safely.
Generic format:
BILIUP_NEXT__GROUP__FIELD=value
Examples:
BILIUP_NEXT__PATHS__STAGE_DIR=/app/data/workspace/stage
BILIUP_NEXT__PUBLISH__BILIUP_PATH=/app/runtime/biliup
BILIUP_NEXT__PUBLISH__RETRY_SCHEDULE_MINUTES=[15,5,5,5,5]
Convenience aliases:
GROQ_API_KEY=...
COLLECTION_SEASON_ID_A=7196643
COLLECTION_SEASON_ID_B=7196624
Data Persistence
These host paths are mounted into the containers:
./config -> /app/config
./runtime -> /app/runtime
./data/workspace -> /app/data/workspace
Do not store cookies.json, Groq keys, or generated workspace data in the image.
They should stay in the mounted host directories.