Update README.md for v0.14.1: auto Tier 2 + infra backup docs
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
+21
-8
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
A single, lightweight Go container that replaces Portainer + scattered systemd scripts with a unified, Hungarian-language web dashboard for managing Docker Compose stacks, backups, storage, monitoring, and notifications on customer hardware.
|
A single, lightweight Go container that replaces Portainer + scattered systemd scripts with a unified, Hungarian-language web dashboard for managing Docker Compose stacks, backups, storage, monitoring, and notifications on customer hardware.
|
||||||
|
|
||||||
**Current version: v0.14.0**
|
**Current version: v0.14.1**
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -194,7 +194,7 @@ self-sufficient backup** — any single tier can fully restore an app.
|
|||||||
|
|
||||||
The nightly backup has two phases that run sequentially. All paths are **per-drive** — each physical drive gets its own restic repo and per-app DB dump directories.
|
The nightly backup has two phases that run sequentially. All paths are **per-drive** — each physical drive gets its own restic repo and per-app DB dump directories.
|
||||||
|
|
||||||
**Drive layout (v0.14.0):**
|
**Drive layout (v0.14.1):**
|
||||||
```
|
```
|
||||||
<drive>/
|
<drive>/
|
||||||
├── appdata/<app>/ ← app user data
|
├── appdata/<app>/ ← app user data
|
||||||
@@ -208,6 +208,7 @@ Path computation is centralized in `backup/paths.go`:
|
|||||||
- `PrimaryResticRepoPath(drivePath)` → `<drive>/backups/primary/restic/`
|
- `PrimaryResticRepoPath(drivePath)` → `<drive>/backups/primary/restic/`
|
||||||
- `AppDBDumpPath(drivePath, stackName)` → `<drive>/backups/primary/<stack>/db-dumps/`
|
- `AppDBDumpPath(drivePath, stackName)` → `<drive>/backups/primary/<stack>/db-dumps/`
|
||||||
- `AppDataDir(drivePath, stackName)` → `<drive>/appdata/<stack>/`
|
- `AppDataDir(drivePath, stackName)` → `<drive>/appdata/<stack>/`
|
||||||
|
- `SecondaryInfraPath(drivePath)` → `<drive>/backups/secondary/_infra/`
|
||||||
|
|
||||||
**Phase 1 — Database Dumps** (`internal/backup/dbdump.go`, scheduled 02:30)
|
**Phase 1 — Database Dumps** (`internal/backup/dbdump.go`, scheduled 02:30)
|
||||||
|
|
||||||
@@ -240,6 +241,13 @@ Does NOT protect against drive failure (backup is on the same physical drive).
|
|||||||
**Complete backup** to a different physical drive. Available for **all apps** — apps with HDD
|
**Complete backup** to a different physical drive. Available for **all apps** — apps with HDD
|
||||||
data back up config + DB + user data; apps without HDD back up config + DB dumps only.
|
data back up config + DB + user data; apps without HDD back up config + DB dumps only.
|
||||||
|
|
||||||
|
- **Auto-enable for small apps (v0.14.1):** Apps without HDD mounts (config-only, DB-only) are
|
||||||
|
automatically configured for daily rsync Tier 2 when ≥2 storage paths are registered.
|
||||||
|
`AutoEnableSmallApps()` runs at the start of each nightly backup cycle. Never overwrites
|
||||||
|
existing user-configured cross-drive settings (even disabled ones).
|
||||||
|
- **Infrastructure config backup (v0.14.1):** `syncInfraConfig()` rsyncs the stacks directory
|
||||||
|
and `controller.yaml` to `<dest>/backups/secondary/_infra/` on every secondary destination
|
||||||
|
drive. Runs before per-app backups. Cross-drive restic also includes infra paths.
|
||||||
- **Two methods:**
|
- **Two methods:**
|
||||||
- **rsync** — Simple mirror with `--delete` (fast, no versioning, **browsable** on disk)
|
- **rsync** — Simple mirror with `--delete` (fast, no versioning, **browsable** on disk)
|
||||||
- **restic** — Versioned, deduplicated, encrypted (shared repo across apps, not browsable)
|
- **restic** — Versioned, deduplicated, encrypted (shared repo across apps, not browsable)
|
||||||
@@ -254,9 +262,12 @@ data back up config + DB + user data; apps without HDD back up config + DB dumps
|
|||||||
| External mount (different device than `/`) | Block if <100 MB free |
|
| External mount (different device than `/`) | Block if <100 MB free |
|
||||||
| System drive (same device as `/`) | Require ≥10 GB free AND <90% used; logged warning |
|
| System drive (same device as `/`) | Require ≥10 GB free AND <90% used; logged warning |
|
||||||
|
|
||||||
- **Secondary drive layout (v0.14.0):**
|
- **Secondary drive layout (v0.14.1):**
|
||||||
```
|
```
|
||||||
<dest-drive>/backups/secondary/
|
<dest-drive>/backups/secondary/
|
||||||
|
├── _infra/ ← infrastructure config mirror (v0.14.1)
|
||||||
|
│ ├── controller.yaml
|
||||||
|
│ └── stacks/ ← full stacks dir (all app configs)
|
||||||
├── <app>/rsync/ ← per-app rsync mirror
|
├── <app>/rsync/ ← per-app rsync mirror
|
||||||
│ ├── _db/ ← DB dump files
|
│ ├── _db/ ← DB dump files
|
||||||
│ ├── _config/ ← compose.yml, app.yaml, .felhom.yml
|
│ ├── _config/ ← compose.yml, app.yaml, .felhom.yml
|
||||||
@@ -266,7 +277,7 @@ data back up config + DB + user data; apps without HDD back up config + DB dumps
|
|||||||
- DB dump files read from **per-app home drive** path (`AppDBDumpPath`)
|
- DB dump files read from **per-app home drive** path (`AppDBDumpPath`)
|
||||||
- `_` prefix directories prevent collision with user data
|
- `_` prefix directories prevent collision with user data
|
||||||
- For non-HDD apps, only `_db/` and `_config/` are present (no user data directory)
|
- For non-HDD apps, only `_db/` and `_config/` are present (no user data directory)
|
||||||
- **Restic backup paths:** includes HDD mounts (if any) + config dir + per-app DB dump dir from home drive
|
- **Restic backup paths:** includes HDD mounts (if any) + config dir + per-app DB dump dir from home drive + stacks dir + controller.yaml (infra, v0.14.1)
|
||||||
- Safety guards: destination ≠ source, path-overlap check (HDD mounts only), writable check
|
- Safety guards: destination ≠ source, path-overlap check (HDD mounts only), writable check
|
||||||
- **Chained execution:** runs immediately after nightly restic — daily apps every night, weekly apps on Sundays
|
- **Chained execution:** runs immediately after nightly restic — daily apps every night, weekly apps on Sundays
|
||||||
- Per-app concurrency lock prevents overlapping runs
|
- Per-app concurrency lock prevents overlapping runs
|
||||||
@@ -783,7 +794,7 @@ Response format: `{"ok": true/false, "data": ..., "error": "...", "message": "..
|
|||||||
# On build server (192.168.0.180)
|
# On build server (192.168.0.180)
|
||||||
cd ~/build/felhom-controller
|
cd ~/build/felhom-controller
|
||||||
git -C ~/git/deploy-felhom-compose pull
|
git -C ~/git/deploy-felhom-compose pull
|
||||||
./build.sh v0.14.0 --push
|
./build.sh v0.14.1 --push
|
||||||
```
|
```
|
||||||
|
|
||||||
### Deploy on customer node
|
### Deploy on customer node
|
||||||
@@ -791,8 +802,8 @@ git -C ~/git/deploy-felhom-compose pull
|
|||||||
```bash
|
```bash
|
||||||
# On customer node (e.g., 192.168.0.162)
|
# On customer node (e.g., 192.168.0.162)
|
||||||
cd /opt/docker/felhom-controller
|
cd /opt/docker/felhom-controller
|
||||||
sudo docker pull gitea.dooplex.hu/admin/felhom-controller:v0.14.0
|
sudo docker pull gitea.dooplex.hu/admin/felhom-controller:v0.14.1
|
||||||
sudo sed -i 's|image: gitea.dooplex.hu/admin/felhom-controller:.*|image: gitea.dooplex.hu/admin/felhom-controller:v0.14.0|' docker-compose.yml
|
sudo sed -i 's|image: gitea.dooplex.hu/admin/felhom-controller:.*|image: gitea.dooplex.hu/admin/felhom-controller:v0.14.1|' docker-compose.yml
|
||||||
sudo docker compose up -d
|
sudo docker compose up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -830,6 +841,8 @@ See `docker-compose.yml` for the full volume configuration.
|
|||||||
- [x] Dashboard alert system
|
- [x] Dashboard alert system
|
||||||
- [x] Per-drive backup architecture (v0.14.0) — per-drive restic repos, per-app DB dumps, path helpers
|
- [x] Per-drive backup architecture (v0.14.0) — per-drive restic repos, per-app DB dumps, path helpers
|
||||||
- [x] Cross-drive restic pruning (v0.14.0)
|
- [x] Cross-drive restic pruning (v0.14.0)
|
||||||
|
- [x] Auto Tier 2 for small apps (v0.14.1) — auto-enable daily rsync for non-HDD apps when ≥2 drives
|
||||||
|
- [x] Infrastructure config in cross-drive backup (v0.14.1) — stacks dir + controller.yaml in `_infra/` + restic
|
||||||
|
|
||||||
### In Progress / Planned
|
### In Progress / Planned
|
||||||
|
|
||||||
@@ -846,7 +859,7 @@ See `docker-compose.yml` for the full volume configuration.
|
|||||||
|
|
||||||
| Node | Hardware | Domain | Status |
|
| Node | Hardware | Domain | Status |
|
||||||
|------|----------|--------|--------|
|
|------|----------|--------|--------|
|
||||||
| demo-felhom | Acemagic GK3PLUS N100, 16G RAM, 512G SSD + 1TB HDD | demo-felhom.eu | Controller v0.14.0 (pending OS reinstall) |
|
| demo-felhom | Acemagic GK3PLUS N100, 16G RAM, 512G SSD + 1TB HDD | demo-felhom.eu | Controller v0.14.1 (pending OS reinstall) |
|
||||||
| pi-customer-1 | Raspberry Pi 3B+, 1G RAM, 32G SD | pi-customer-1.local | Not yet tested |
|
| pi-customer-1 | Raspberry Pi 3B+, 1G RAM, 32G SD | pi-customer-1.local | Not yet tested |
|
||||||
|
|
||||||
## Related Repositories
|
## Related Repositories
|
||||||
|
|||||||
Reference in New Issue
Block a user