Files
restic-manager/docs/book/src/getting-started/install.md
T
steve 89537d417a P5: OSS readiness — docs site, contributor onboarding, e2e harness
P5-01 — Documentation site under docs/book/ rendered with mdBook
(downloaded via Makefile, same static-binary pattern as Tailwind).
Structured chapters: getting started, concepts, operations,
security, reference. `make docs` / `make docs-watch`. Generated
output gitignored.

P5-02 — CONTRIBUTING.md rewritten from placeholder to a full
guide. CODE_OF_CONDUCT.md adapted from Contributor Covenant for a
single-maintainer project. .gitea/issue_template/{bug,feature}.md
and PULL_REQUEST_TEMPLATE.md.

P5-04 — Six README screenshots captured live from a fresh server
bootstrap (login, empty dashboard, add-host, alerts, settings,
audit log). README rewritten to centre the screenshot grid and
link out to the docs site.

P5-05 — SECURITY.md with disclosure policy (3-day ack, 30-day
default window), scope in/out, threat-model summary, operator
hardening checklist. Mirrored as a docs-site chapter.

P5-06 — End-to-end test harness. e2e/compose.e2e.yml brings up
server + sibling Linux agent (alpine + restic) + restic/rest-server.
Agent uses announce-and-approve so Playwright can drive the full
operator flow: bootstrap → login → accept pending → backup →
verify terminal status. Second spec scrapes /metrics to assert
the P6-04 endpoint surface. .gitea/workflows/e2e.yml runs on every
PR; local how-to in docs/e2e.md.
2026-05-08 20:08:23 +01:00

2.8 KiB

Installing the server

The reference deployment is a single Docker container fronted by your existing reverse proxy. The image bundles the server binary, the cross-compiled agent binaries, and the install scripts.

Prerequisites

  • A Linux host with Docker and Docker Compose.
  • A reverse proxy in front (Caddy, nginx, Traefik) terminating TLS on a public hostname. The server itself is HTTP-only by design — see Reverse proxy for why.
  • A persistent volume for the server's data directory.

Quick start

The reference compose file lives at deploy/docker-compose.yml:

services:
  restic-manager:
    image: gitea.dcglab.co.uk/steve/restic-manager:${RM_VERSION:-latest}
    restart: unless-stopped
    environment:
      RM_LISTEN: ":8080"
      RM_DATA_DIR: "/data"
      RM_BASE_URL: "https://restic.example.com"
      # Trust your reverse proxy's CIDR so X-Forwarded-* are honoured.
      RM_TRUSTED_PROXY: "10.0.0.0/8"
    volumes:
      - rm-data:/data
    ports:
      # Bind localhost only — your reverse proxy is the public face.
      - "127.0.0.1:8080:8080"

volumes:
  rm-data:

Bring it up:

docker compose up -d
docker compose logs -f restic-manager

The first run prints a one-time bootstrap token to the log. Use it within an hour or it expires; if you miss the window the container print it again on next start as long as no admin user exists.

First-run admin setup

Open https://restic.example.com/bootstrap (or whatever your public URL is). Paste the bootstrap token, pick a username and a password (≥ 12 characters), and submit. You'll land in the dashboard logged in as the new admin.

If you'd rather curl it, the equivalent is:

curl -X POST https://restic.example.com/api/bootstrap \
     -H 'Content-Type: application/json' \
     -d '{"token":"<token-from-log>","username":"admin","password":"<≥12 chars>"}'

Backing up the secret key

Inside the data volume, secret.key holds the AEAD key used to encrypt every credential at rest. Back it up separately from the database. Without it, encrypted credentials in the database are unrecoverable; you'd have to re-enrol every host.

A simple working approach: copy secret.key to your password manager or to a separately-backed-up secrets vault the day you install. It doesn't change.

Updating the server

# Pin a new version in your compose file (.env or docker-compose.yml),
# then:
docker compose pull
docker compose up -d

Migrations run automatically on startup; the server will refuse to start if a migration fails (better to bail than to half-migrate).

For the agent self-update story, see Updating agents.