No description
  • Go 79.2%
  • JavaScript 15.5%
  • CSS 4%
  • HTML 0.7%
  • Dockerfile 0.5%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Ivan Pavlina d401989817
All checks were successful
ci / check (push) Successful in 2m39s
ci / docker (push) Successful in 48s
ci / notify (push) Successful in 1s
Remove the classic web UI and the interface switch
The redesigned UI has been in production since 9482ff4 and the owner has
signed it off, so the classic one goes: templates/index.html and
login.html, static/app.js, app.css and login.js, the backup_engine_ui
cookie with GET /ui/new and /ui/classic, and the links between the two.
The new UI moves into the places the old one held (templates/,
static/js, static/css, static/fonts), and its comments no longer point
at code that is gone or at working notes outside the repository.

Changing the password was already in Setup; the phone menu now links to
it next to Sign out. Removing a password stays unavailable by decision.

The switch tests are replaced by pages_test.go: both pages are served
with their caching, signed out / goes to /login, and every asset the
pages and stylesheets name is embedded.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-22 22:50:12 +02:00
.forgejo/workflows ci: drop the repull job, the router repulls on its own 2026-10-20 11:07:01 +02:00
cmd/backup-engine Merge branch 'fix2/stage' into fix2/all 2026-10-21 05:50:36 +02:00
docs Remove the classic web UI and the interface switch 2026-10-22 22:50:12 +02:00
internal Remove the classic web UI and the interface switch 2026-10-22 22:50:12 +02:00
.dockerignore Run the checks as a build stage, so CI stops skipping them 2026-09-04 09:34:27 +02:00
.gitignore Replace the shell engine with a Go service that has a web UI 2026-09-04 09:21:58 +02:00
CLAUDE.md Remove the classic web UI and the interface switch 2026-10-22 22:50:12 +02:00
Dockerfile Use the method that was unused, finish the assertion, add staticcheck 2026-09-04 21:41:53 +02:00
FABLE_AUDIT.md Fix two data races the race detector found in the SSH tests 2026-10-12 09:41:17 +02:00
go.mod Connect to IMAP servers 2026-10-06 14:42:20 +02:00
go.sh Mount the checksum database cache in go.sh 2026-10-06 14:42:20 +02:00
go.sum Connect to IMAP servers 2026-10-06 14:42:20 +02:00
README.md ci: drop the repull job, the router repulls on its own 2026-10-20 11:07:01 +02:00

backup-engine

A single Go binary with a web UI that manages rsync, RouterOS-config and IMAP mailbox backup jobs, and records a run that never started as missed instead of staying silent. Jobs and targets live in a SQLite database and are edited in the UI; there is no config file.

Quick start

BACKUP_ENGINE_DATA=$(mktemp -d) BACKUP_ENGINE_ADDR=127.0.0.1:8080 \
  go run ./cmd/backup-engine
# open http://127.0.0.1:8080  (set BACKUP_ENGINE_PASSWORD to seed a password)

Tests: go test ./.... Go 1.26+ is required (see go.mod); ./go.sh <args> runs the same commands inside a golang:1.26-alpine container if the host has no Go.

Build and deploy

docker build -t backup-engine . produces a small static image. On every push to main, Forgejo Actions runs vet, race tests, gofmt, govulncheck and staticcheck, then publishes a multi-arch (amd64 + arm64) image to git.exithub.net/ivan.pavlina/backup-engine. The container runs on a MikroTik RB5009 and repulls it within a minute of the push (scheduler repull-tick).

More

  • CLAUDE.md — architecture, commands, deployment, gotchas
  • docs/DESIGN.md — full design and operations reference (data flow, run guards, security, configuration)