89537d417a
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.
93 lines
2.8 KiB
Markdown
93 lines
2.8 KiB
Markdown
# 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](./reverse-proxy.md) for why.
|
|
- A persistent volume for the server's data directory.
|
|
|
|
## Quick start
|
|
|
|
The reference compose file lives at
|
|
[`deploy/docker-compose.yml`](https://gitea.dcglab.co.uk/steve/restic-manager/src/branch/main/deploy/docker-compose.yml):
|
|
|
|
```yaml
|
|
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:
|
|
|
|
```sh
|
|
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:
|
|
|
|
```sh
|
|
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
|
|
|
|
```sh
|
|
# 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](../operations/updates.md).
|