110 lines
3.3 KiB
Markdown
110 lines
3.3 KiB
Markdown
# Docker & Deployment
|
|
|
|
## Overview
|
|
|
|
Trackpull is fully containerized with Docker. The `docker-compose.yml` handles all volume mounts and environment configuration. A single `docker compose up -d --build` is enough to get a running instance.
|
|
|
|
---
|
|
|
|
## Quick Start
|
|
|
|
```bash
|
|
cp .env.example .env
|
|
# Edit .env: set ADMIN_USERNAME, ADMIN_PASSWORD, SECRET_KEY, and PORT
|
|
docker compose up -d --build
|
|
```
|
|
|
|
The app will be available at `http://localhost:{PORT}` (default: 5000).
|
|
|
|
---
|
|
|
|
## Environment Variables
|
|
|
|
All configuration goes in `.env`. Copy `.env.example` to get started.
|
|
|
|
| Variable | Default | Description |
|
|
|----------|---------|-------------|
|
|
| `ADMIN_USERNAME` | — | Username for the seeded admin account |
|
|
| `ADMIN_PASSWORD` | — | Password for the seeded admin account |
|
|
| `SECRET_KEY` | — | Flask session key; use a 32-byte random hex string |
|
|
| `PORT` | `5000` | Host port the app is exposed on |
|
|
| `HOST_DOWNLOADS_DIR` | `./downloads` | Host path for downloaded files |
|
|
| `HOST_CONFIG_DIR` | `./config` | Host path for DB, cookies, device cert |
|
|
| `DOWNLOADS_DIR` | `/downloads` | Container-internal downloads path (rarely changed) |
|
|
| `COOKIES_PATH` | `/config/cookies.txt` | Path to Spotify cookies file inside the container |
|
|
| `CONFIG_DIR` | `/config` | Config directory inside the container |
|
|
| `WVD_PATH` | `/config/device.wvd` | Path to Widevine device certificate inside the container |
|
|
|
|
> **Important**: `SECRET_KEY` must be a stable secret. Changing it invalidates all active sessions.
|
|
|
|
---
|
|
|
|
## Volumes
|
|
|
|
| Host path (from `.env`) | Container path | Contents |
|
|
|-------------------------|----------------|---------|
|
|
| `HOST_DOWNLOADS_DIR` | `/downloads` | Per-user download directories |
|
|
| `HOST_CONFIG_DIR` | `/config` | SQLite DB, cookies.txt, device.wvd |
|
|
|
|
Both directories are created automatically by Docker if they don't exist.
|
|
|
|
---
|
|
|
|
## Dockerfile Summary
|
|
|
|
**Base image**: `python:3.12-slim`
|
|
|
|
**System packages installed**:
|
|
- `ffmpeg` — audio conversion
|
|
- `aria2` — download manager
|
|
- `git`, `curl`, `unzip` — tooling
|
|
|
|
**Binaries installed**:
|
|
- **Bento4 `mp4decrypt`** — MP4 DRM decryption (version 1.6.0-641, downloaded from bok.net)
|
|
|
|
**Python packages**:
|
|
- From `requirements.txt`: Flask, gunicorn, mutagen, werkzeug, etc.
|
|
- `websocket-client` — WebSocket support
|
|
- `votify-fix` — Spotify downloader (installed from GitHub: GladistonXD/votify-fix)
|
|
|
|
**Runtime command**:
|
|
```
|
|
gunicorn --bind 0.0.0.0:5000 --workers 1 --threads 4 app:app
|
|
```
|
|
|
|
One worker with four threads keeps SQLite contention low while still handling concurrent requests.
|
|
|
|
---
|
|
|
|
## Persistent Data
|
|
|
|
| File | Created by | Purpose |
|
|
|------|-----------|---------|
|
|
| `/config/trackpull.db` | App on first run | All users, jobs, settings |
|
|
| `/config/cookies.txt` | Admin upload | Spotify auth for Votify |
|
|
| `/config/device.wvd` | Admin upload | Widevine cert for Votify |
|
|
|
|
Back up `/config/` to preserve all user data between rebuilds.
|
|
|
|
---
|
|
|
|
## Updating
|
|
|
|
```bash
|
|
docker compose down
|
|
docker compose up -d --build
|
|
```
|
|
|
|
The database and config files persist on the host, so user data survives rebuilds.
|
|
|
|
---
|
|
|
|
## Key Files
|
|
|
|
| File | Relevance |
|
|
|------|-----------|
|
|
| [Dockerfile](../Dockerfile) | Container image definition |
|
|
| [docker-compose.yml](../docker-compose.yml) | Service orchestration |
|
|
| [.env.example](../.env.example) | Environment template |
|
|
| [requirements.txt](../requirements.txt) | Python dependencies |
|