177 lines
4.7 KiB
Markdown
177 lines
4.7 KiB
Markdown
# 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
|
||
|
||
```bash
|
||
chmod +x scripts/init-docker-config.sh
|
||
./scripts/init-docker-config.sh
|
||
```
|
||
|
||
This creates these files if they do not already exist:
|
||
|
||
```text
|
||
.env
|
||
config/settings.json
|
||
runtime/cookies.json
|
||
runtime/upload_config.json
|
||
data/workspace/
|
||
```
|
||
|
||
## 2. Edit Required Secrets And IDs
|
||
|
||
Edit `.env`:
|
||
|
||
```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:
|
||
|
||
```json
|
||
{
|
||
"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:
|
||
|
||
```text
|
||
runtime/biliup
|
||
```
|
||
|
||
It must be executable inside the container:
|
||
|
||
```bash
|
||
chmod +x runtime/biliup
|
||
```
|
||
|
||
The image installs the `codex` CLI for `song_detect.provider=codex`. Provide
|
||
Codex auth in one of these ways:
|
||
|
||
```text
|
||
OPENAI_API_KEY in .env
|
||
runtime/codex mounted to /root/.codex
|
||
```
|
||
|
||
## 3. Start
|
||
|
||
```bash
|
||
docker compose up -d --build
|
||
```
|
||
|
||
Open:
|
||
|
||
```text
|
||
http://127.0.0.1:8000
|
||
```
|
||
|
||
Drop videos into:
|
||
|
||
```text
|
||
data/workspace/stage/
|
||
```
|
||
|
||
## Common Commands
|
||
|
||
```bash
|
||
docker compose logs -f api
|
||
docker compose logs -f worker
|
||
docker compose restart worker
|
||
docker compose down
|
||
```
|
||
|
||
Run one scheduler cycle manually:
|
||
|
||
```bash
|
||
docker compose run --rm worker biliup-next run-once
|
||
```
|
||
|
||
Run doctor:
|
||
|
||
```bash
|
||
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:
|
||
|
||
```text
|
||
BILIUP_NEXT__GROUP__FIELD=value
|
||
```
|
||
|
||
Examples:
|
||
|
||
```env
|
||
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:
|
||
|
||
```env
|
||
GROQ_API_KEY=...
|
||
COLLECTION_SEASON_ID_A=7196643
|
||
COLLECTION_SEASON_ID_B=7196624
|
||
```
|
||
|
||
## Data Persistence
|
||
|
||
These host paths are mounted into the containers:
|
||
|
||
```text
|
||
./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.
|