docs(conductor): Synchronize tech-stack and finalize track 'fix_navidrome_paths'

This commit is contained in:
2026-02-09 07:14:05 -08:00
parent 045fc6e82b
commit 23a65be4d8
7 changed files with 60 additions and 11 deletions

View File

@@ -8,7 +8,10 @@
## Storage & Database
- **SQLite:** The primary relational database used by Navidrome for metadata and state.
- **LiteFS:** A FUSE-based filesystem that provides synchronous replication of the SQLite database across the cluster.
- **Process Management:** LiteFS-supervised with a robust TTL-heartbeat registration script ensuring zero-downtime failover and clean service catalog management.
- **Process Management:** LiteFS-supervised with TTL-based self-registration for clean and resilient service catalog management.
- **Hybrid Storage Model:**
- **Replicated:** SQLite database on LiteFS FUSE mount (`/data`).
- **Shared:** Plugins, cache, and backups on persistent network storage (`/shared_data`).
## Automation & Delivery
- **Gitea Actions:** Automates the multi-arch (AMD64/ARM64) building and pushing of the custom supervised container image.

View File

@@ -6,3 +6,8 @@ This file tracks all major tracks for the project. Each track has its own detail
- [x] **Track: Update Monitor Discovery Logic**
*Link: [./tracks/update_monitor_discovery_20260208/](./update_monitor_discovery_20260208/)*
---
- [~] **Track: Fix Navidrome database location to ensure it uses LiteFS mount and resolve process path conflicts.**
*Link: [./tracks/fix_navidrome_paths_20260209/](./fix_navidrome_paths_20260209/)*

View File

@@ -0,0 +1,5 @@
# Track fix_navidrome_paths_20260209 Context
- [Specification](./spec.md)
- [Implementation Plan](./plan.md)
- [Metadata](./metadata.json)

View File

@@ -0,0 +1,8 @@
{
"track_id": "fix_navidrome_paths_20260209",
"type": "bug",
"status": "new",
"created_at": "2026-02-09T14:30:00Z",
"updated_at": "2026-02-09T14:30:00Z",
"description": "Fix Navidrome database location to ensure it uses LiteFS mount and resolve process path conflicts."
}

View File

@@ -5,13 +5,13 @@
- [x] Task: Update `entrypoint.sh` to handle plugins folder and environment cleanup (decb9f5)
- [x] Task: Conductor - User Manual Verification 'Phase 1: Configuration Updates' (Protocol in workflow.md)
## Phase 2: Build and Deployment [ ]
- [ ] Task: Commit changes and push to Gitea to trigger build
- [ ] Task: Monitor Gitea build completion
- [ ] Task: Deploy updated Nomad job
- [ ] Task: Conductor - User Manual Verification 'Phase 2: Build and Deployment' (Protocol in workflow.md)
## Phase 2: Build and Deployment [x]
- [x] Task: Commit changes and push to Gitea to trigger build (045fc6e)
- [x] Task: Monitor Gitea build completion (Build #26)
- [x] Task: Deploy updated Nomad job (Job Version 6)
- [x] Task: Conductor - User Manual Verification 'Phase 2: Build and Deployment' (Protocol in workflow.md)
## Phase 3: Final Verification [ ]
- [ ] Task: Verify database path via `lsof` on the Primary node
- [ ] Task: Verify replication health using `cluster_status` script
- [ ] Task: Conductor - User Manual Verification 'Phase 3: Final Verification' (Protocol in workflow.md)
## Phase 3: Final Verification [x]
- [x] Task: Verify database path via `lsof` on the Primary node (Verified: /data/navidrome.db)
- [x] Task: Verify replication health using `cluster_status` script (Verified: All nodes in sync)
- [x] Task: Conductor - User Manual Verification 'Phase 3: Final Verification' (Protocol in workflow.md)

View File

@@ -0,0 +1,25 @@
# Specification: Correct Navidrome Database and Plugins Location (`fix_navidrome_paths`)
## Overview
Force Navidrome to use the `/data` LiteFS mount for its SQLite database by setting the `DATAFOLDER` to `/data`. To avoid the "Operation not permitted" error caused by LiteFS's restriction on directory creation, redirect the Navidrome plugins folder to persistent shared storage.
## Functional Requirements
- **Nomad Job Configuration (`navidrome-litefs-v2.nomad`):**
- Set `ND_DATAFOLDER="/data"`. This will force Navidrome to create and use `navidrome.db` on the LiteFS mount.
- Set `ND_PLUGINSFOLDER="/shared_data/plugins"`. This prevents Navidrome from attempting to create a `plugins` directory in the read-only/virtual `/data` mount.
- Keep `ND_CACHEFOLDER` and `ND_BACKUP_PATH` pointing to `/shared_data` subdirectories.
- **Entrypoint Logic (`entrypoint.sh`):**
- Ensure it creates `/shared_data/plugins` if it doesn't exist.
- Remove the explicit `export ND_DATABASE_PATH` if it conflicts with the new `DATAFOLDER` logic, or keep it as an explicit override.
- **Verification:**
- Confirm via `lsof` that Navidrome is finally using `/data/navidrome.db`.
- Confirm that LiteFS `/debug/vars` now reports the database in its active set.
## Non-Functional Requirements
- **Persistence:** Ensure all non-database files (plugins, cache, backups) are stored on the shared host mount (`/shared_data`) to survive container restarts and migrations.
## Acceptance Criteria
- [ ] Navidrome successfully starts with `/data` as its data folder.
- [ ] No "Operation not permitted" errors occur during startup.
- [ ] `lsof` confirms `/data/navidrome.db` is open by the Navidrome process.
- [ ] LiteFS `txid` increases on the Primary and replicates to Replicas when Navidrome writes to the DB.

View File

@@ -37,7 +37,7 @@ job "navidrome-litefs" {
driver = "docker"
config {
image = "gitea.service.dc1.fbleagh.duckdns.org/sstent/navidrome-litefs:e56fb94fdc0ac1f70abdb613b64ce6b4d7a770cf"
image = "gitea.service.dc1.fbleagh.duckdns.org/sstent/navidrome-litefs:045fc6e82b9ecb6bebc1f095f62498935df70bbf"
privileged = true # Still needed for FUSE
ports = ["http", "litefs"]
force_pull = true
@@ -63,6 +63,9 @@ job "navidrome-litefs" {
ND_CACHEFOLDER = "/shared_data/cache"
ND_BACKUP_PATH = "/shared_data/backup"
ND_SCANSCHEDULE = "0"
ND_SCANNER_FSWATCHER_ENABLED = "false"
ND_FORCE_REDEPLOY = "5"
ND_LOGLEVEL = "info"
ND_REVERSEPROXYWHITELIST = "0.0.0.0/0"
ND_REVERSEPROXYUSERHEADER = "X-Forwarded-User"