mirror of
https://github.com/thegeneralist01/archivr
synced 2026-07-21 18:55:36 +02:00
chore: add Dockerfile, docker-compose, and Docker hosting docs (#12)
* chore: add Dockerfile, docker-compose, and Docker docs - Multi-stage Dockerfile: Rust builder stage + debian:bookworm-slim runtime with Chromium, Node/single-file-cli, Python venv (yt-dlp + twitter-api-client) - docker-compose.yml: wires ARCHIVR_BIND, config volume, and persistent data volume - docker/config.example.toml: annotated TOML template for Docker deployments - docs/README.md: add Hosting with Docker section; add ARCHIVR_BIND and ARCHIVR_STATIC_DIR to the Environment Variables reference * fix: address code review issues with Docker setup - .gitignore: whitelist Dockerfile, docker-compose.yml, docker/ so they are actually tracked (the * catch-all was silently dropping them) - Dockerfile: build and ship the archivr CLI alongside archivr-server so users can run `archivr init` inside the container on first setup - docker/config.example.toml: fix archive_path to point at the .archivr subdirectory that archivr init creates (not the parent directory), which is what read_archive_paths expects - docs/README.md: replace the bare mkdir quickstart step with `archivr init`, explain why mkdir is insufficient; add a callout that auth_db_path must be set explicitly to a writable path when the config mount is read-only * fix: address second round of Docker review issues Chromium sandbox (P2): - singlefile.rs: add ARCHIVR_CHROME_ARGS env var (space-separated flags appended to Chromium's --browser-args JSON array); Dockerfile sets it to --no-sandbox because Chromium refuses to start as root without it Store-path outside volume (P1): - README: pass explicit absolute store-path as the second positional arg to `archivr init` so the blob store lands on /data instead of the container layer (CLI default is ./.archivr/store, resolved from cwd, which is / with no WORKDIR set) ENTRYPOINT vs CMD (P2): - Dockerfile: switch from ENTRYPOINT to CMD so `docker compose run archivr archivr init …` overrides the full command instead of being appended to the server invocation ffmpeg missing (P2): - Dockerfile: add ffmpeg to the apt-get install block (required by yt-dlp --merge-output-format mp4 for bestvideo+bestaudio streams) Node version (P2): - Dockerfile: replace Debian bookworm's nodejs (18.x) with Node 20 via the NodeSource setup script (single-file-cli declares engines.node >=20) Build context secrets (P2): - Add .dockerignore excluding config/ and docker/ from the build context so runtime secrets (e.g. twitter-cookies.txt) are never sent to the builder - Whitelist .dockerignore in .gitignore docs: - README: document ARCHIVR_CHROME_ARGS in the Environment Variables section * fix: third round of Docker review issues Rust toolchain (P1): - Dockerfile: bump builder from rust:1.87 to rust:1.88; time@0.3.51, time-core@0.1.9, and time-macros@0.2.30 (present in Cargo.lock) all require MSRV 1.88, so the real cargo build --release step was failing single-file-cli wait mode (P2): - singlefile.rs: replace --browser-wait-until=networkidle2 with networkAlmostIdle; the single-file-cli option only accepts InteractiveTime/networkIdle/networkAlmostIdle/load/domContentLoaded (verified in options.js); networkidle2 is a Puppeteer concept that the CLI does not recognise, causing silent fallback to the earliest state and incomplete captures. networkAlmostIdle is the closest equivalent (<=2 open connections, matching Puppeteer's networkidle2 semantics) Build context size (P3): - .dockerignore: add target/, frontend/node_modules/, frontend/dist/; these can reach 1.4G+ after a local dev build and are never read by the Dockerfile, so sending them to the builder wastes time and memory
This commit is contained in:
parent
685b6cc7ea
commit
2414acf0df
7 changed files with 279 additions and 8 deletions
|
|
@ -191,6 +191,69 @@ services.archivr-server = {
|
|||
Initialise them with `archivr init` first, then `chown -R archivr:archivr /srv/archivr`.
|
||||
|
||||
|
||||
### Hosting with Docker
|
||||
|
||||
A `Dockerfile` and `docker-compose.yml` are provided for self-hosting without Nix.
|
||||
|
||||
**Quickstart**
|
||||
|
||||
1. Copy the example config and edit it:
|
||||
|
||||
```sh
|
||||
mkdir config
|
||||
cp docker/config.example.toml config/archivr-server.toml
|
||||
# edit config/archivr-server.toml — set archive id, label, and archive_path
|
||||
```
|
||||
|
||||
2. Initialize each archive on the persistent data volume before the first start.
|
||||
The image includes the `archivr` CLI for this purpose:
|
||||
|
||||
```sh
|
||||
docker compose run --rm archivr archivr init /data/archives/main /data/archives/main/.archivr/store --name "Main Archive"
|
||||
```
|
||||
|
||||
This creates `/data/archives/main/.archivr/` with the metadata the server requires.
|
||||
A bare `mkdir` is not enough — the server reads `name` and `store_path` files that
|
||||
only `archivr init` writes.
|
||||
|
||||
3. Start the server:
|
||||
|
||||
```sh
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
Then open `http://localhost:8080`.
|
||||
|
||||
**Volumes**
|
||||
|
||||
| Mount | Purpose |
|
||||
|-------|---------|
|
||||
| `./config` (read-only) | Directory containing `archivr-server.toml` |
|
||||
| `archivr-data` named volume | Auth database (`/data/archivr-auth.sqlite`) and archive directories |
|
||||
|
||||
> **Important:** `auth_db_path` must be set explicitly in `archivr-server.toml` to a
|
||||
> path on the writable data volume (e.g. `/data/archivr-auth.sqlite`). If left unset,
|
||||
> the server defaults to writing the auth database next to the config file — which is
|
||||
> on the read-only `/config` mount and will fail. The example config sets this correctly.
|
||||
|
||||
**Twitter/X archiving**
|
||||
|
||||
Supply a cookies file inside the config volume and set `ARCHIVR_TWITTER_CREDENTIALS_FILE` in `docker-compose.yml`:
|
||||
|
||||
```yaml
|
||||
environment:
|
||||
ARCHIVR_TWITTER_CREDENTIALS_FILE: /config/twitter-cookies.txt
|
||||
```
|
||||
|
||||
**Building the image locally**
|
||||
|
||||
```sh
|
||||
docker build -t archivr-server .
|
||||
```
|
||||
|
||||
The image compiles the Rust binary in a separate build stage so only the runtime
|
||||
dependencies (Chromium, Node.js, Python) land in the final layer.
|
||||
|
||||
### Supported Shorthand Inputs
|
||||
|
||||
- YouTube video/short media:
|
||||
|
|
@ -219,15 +282,29 @@ Initialise them with `archivr init` first, then `chown -R archivr:archivr /srv/a
|
|||
|
||||
### Environment Variables
|
||||
|
||||
- `ARCHIVR_BIND`
|
||||
- Optional.
|
||||
- Overrides the bind address from the TOML config. Useful in Docker where you need
|
||||
`0.0.0.0:8080` without editing the config file. Default: `127.0.0.1:8080`.
|
||||
- `ARCHIVR_STATIC_DIR`
|
||||
- Optional.
|
||||
- Path to the directory of pre-built frontend assets served by the web UI.
|
||||
Set automatically by the Nix wrapper and the Docker image. When running from
|
||||
source with `cargo run`, falls back to `crates/archivr-server/static`.
|
||||
- `ARCHIVR_YT_DLP`
|
||||
- Optional.
|
||||
- Overrides the `yt-dlp` binary used for YouTube, X media posts, Instagram, Facebook, TikTok, Reddit, and Snapchat downloads.
|
||||
- `ARCHIVR_SINGLE_FILE`
|
||||
- Optional.
|
||||
- Overrides the `single-file` binary used for web page archiving. When installed through Nix, this is set automatically to the Nixpkgs `single-file-cli` binary.
|
||||
- Overrides the `single-file` binary used for web page archiving. Set automatically by the Nix wrapper and the Docker image.
|
||||
- `ARCHIVR_CHROME`
|
||||
- Optional.
|
||||
- Overrides the Chromium/Chrome executable passed to `single-file` via `--browser-executable-path`. When installed through Nix, this is set automatically to the Nixpkgs `chromium` binary. Default: `chromium`.
|
||||
- Overrides the Chromium/Chrome executable passed to `single-file` via `--browser-executable-path`. Set automatically by the Nix wrapper and the Docker image. Default: `chromium`.
|
||||
- `ARCHIVR_CHROME_ARGS`
|
||||
- Optional.
|
||||
- Space-separated extra flags appended to Chromium's `--browser-args`. The Docker
|
||||
image sets this to `--no-sandbox` because Chromium refuses to run as root without
|
||||
it. Leave unset when running natively (Nix, Linux desktop).
|
||||
- `ARCHIVR_TWITTER_CREDENTIALS_FILE`
|
||||
- Required for tweet/thread scraping inputs such as `tweet:ID` and `x:thread:ID`.
|
||||
- Must point to a cookies file for the vendored scraper.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue