No description
  • HTML 50.7%
  • Python 36.7%
  • Shell 12.6%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
ADMIN 0ea2df97bb Record deployed complete spell-card release
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-10-10 12:47:27 +02:00
__pycache__ Add PhotoPrism and Changedetection services with configuration updates 2026-10-02 13:48:23 +02:00
compose_yamls Record D&D deployment and media staging configuration; untrack environment secrets 2026-10-07 21:08:53 +02:00
scripts Add PhotoPrism and Changedetection services with configuration updates 2026-10-02 13:48:23 +02:00
.gitignore Record D&D deployment and media staging configuration; untrack environment secrets 2026-10-07 21:08:53 +02:00
how_to.md Record D&D deployment and media staging configuration; untrack environment secrets 2026-10-07 21:08:53 +02:00
npm-proxy-pages.html Add Intel VAAPI device passthrough to jellyfin-compose.yml 2026-09-09 20:08:03 +02:00
ocis-import.log Add configuration for Seerr, Radarr, and Sonarr; update README and how-to documentation 2026-09-28 02:22:44 +02:00
plan.md Record deployed fantasy UI and structured spell cards 2026-10-09 20:06:21 +02:00
README.md Record deployed complete spell-card release 2026-10-10 12:47:27 +02:00
ssh_diagnose.py Fix ownCloud desktop 403 and harden OIDC/NPM against timeouts 2026-09-10 12:39:25 +02:00

HOMESERVER

This repository documents the home server deployment and its Docker-based services. The deployment record is maintained in plan.md. Secrets and generated service credentials are stored in .env and are not documented here.

Host Layout

  • OS storage: one NVMe drive
  • Data storage: /dev/sda1, mounted at /srv/ through /etc/fstab
  • Import storage: /dev/sdb1, mounted at /srv/import/ through /etc/fstab
  • Shared Docker network: backend_net
  • Persistent application data: /srv/data/
  • Media library: /srv/Media/ with Movies, Shows, and Music directories

Services

All application containers use pinned image tags and join backend_net unless otherwise noted. Database-dependent services reach MariaDB by container name; database ports are not exposed on the host.

Service Image Data Access address
MariaDB mariadb:11.8 /srv/data/mariadb Internal only
D&D Party Companion dnd-party-companion:2026.10 Database dnd_clean_20261008 in MariaDB (dnd archived) dnd.corvi.hu
phpMyAdmin phpmyadmin/phpmyadmin:5.2.3 Container-managed db.corvi.hu
Jellyfin jellyfin/jellyfin:12.0 /srv/data/jellyfin jellyfin.corvi.hu
ownCloud Infinite Scale owncloud/ocis:8.2.0 Config: /srv/data/ocis/config; data: /srv/import/ocis-data owncloud.corvi.hu
Forgejo codeberg.org/forgejo/forgejo:16.0.3 /srv/data/forgejo git.corvi.hu
Homarr ghcr.io/homarr-labs/homarr:v1.77.0 /srv/data/homarr admin.corvi.hu
Glances nicolargo/glances:4.5.6-full Host metrics glances.corvi.hu
qBittorrent linuxserver/qbittorrent:version-5.2.3_v2.0.14 /srv/data/qbittorrent and /srv/Media qbittorrent.corvi.hu
Prowlarr lscr.io/linuxserver/prowlarr:2.6.5.5623-ls162 /srv/data/prowlarr 192.168.1.69:9696
Seerr ghcr.io/seerr-team/seerr:v3.4.1 /srv/data/seerr seerr.corvi.hu
Radarr lscr.io/linuxserver/radarr:6.4.4.10685-ls318 /srv/data/radarr and /srv/Media 192.168.1.69:7878
Sonarr lscr.io/linuxserver/sonarr:4.0.20.3014-ls326 /srv/data/sonarr and /srv/Media 192.168.1.69:8989

Nginx Proxy Manager terminates HTTPS for the public services. Certificates are currently active for the D&D app, phpMyAdmin, Jellyfin, ownCloud, Forgejo, Homarr, and Seerr. Seerr is proxied through NPM at seerr.corvi.hu; its container port is not published directly on the host. Prowlarr is available on the LAN at port 9696; do not expose its admin interface directly to the internet. Glances is intentionally HTTP-only. Forgejo Git-over-SSH is mapped to host port 2222, leaving the host's SSH service on port 22 unchanged.

Database and Backups

MariaDB provides the databases for Forgejo, the D&D companion, and the previous classic ownCloud deployment. ownCloud now runs Infinite Scale, which is self-contained and does not require the MariaDB database. The old database remains in place until it is explicitly cleaned up.

Daily backups run at 03:00 using /home/corvi/mariadb-backup.sh. Dumps are written to /srv/data/mariadb-backups and retained for 14 days. The backup job has been tested successfully.

D&D Party Companion

The campaign-site layout and complete licensed spell cards are deployed (2026-10-10) at https://dnd.corvi.hu. Main/subpages and account screens use the local dragon banner and responsive campaign shell. The Compendium is XPHB-only: 1,638 entries, with 339 complete licensed spell cards and 52 factual-only spell references. Credits centralizes attribution; full cards include effects, upcasting, tables and referenced public creature stats. No gameplay automation, casting-eligibility or migration changes. The Docker build includes generated content, excluding raw book source and unrelated local reference HTML. Validation: 390 tests/26 files, strict container build, runtime health/auth guards, exact public JS/CSS/banner hashes and responsive production login. All 36 live database tables' counts/hashes remained unchanged; actual SQL backup restore matched, and temporary grants/database were removed. Accounts, characters, battles and uploads preserved. Backup: /home/corvi/dnd-deployment-backups/campaign-spell-cards-20261009T235755Z.

The earlier polished fantasy interface and parchment spell cards were deployed (2026-10-09): shared dark-walnut/gold styling, a local SVG dice crest, responsive forms/navigation and school-accented cards in character/battle spellcasting and the Compendium. Cards show verified SRD metadata and link to full source text; no new spell effects/prose or automation were introduced. Validation: 372 tests/22 files, build/diagnostics, all subsection layouts, player/DM draft retention, real private-fixture slot spending and production read-only spell/card/live checks. No migration; all 36 tables' counts/hashes and actual SQL restore matched. Public JS/CSS hashes match the validated build. Backup: /home/corvi/dnd-deployment-backups/fantasy-ui-20261009T180458Z.

Dynamic secondary navigation and a header live-status badge are deployed (2026-10-09). Every main destination shows only its selected role-aware subsection while retaining mounted drafts and filters. Characters has Active/Create/Archived (DM); the other pages separate their existing workflows. The connection status now sits alongside Refresh and Log out. Validation: 370 tests/21 files, build, DM/player browser sections/draft retention, mobile layouts, authenticated production read-only checks and exact public assets. No migration: all 36 tables' counts/hashes and a real SQL restore matched. Backup: /home/corvi/dnd-deployment-backups/secondary-navigation-20261009T174445Z.

Battle turn progress/dropdown controls are deployed (2026-10-09): initiative progress strip with highlighted current combatant and explicit Start battle, Previous player, Next player and Finish battle buttons. Previous starts a fresh turn, not a resource undo. Common/custom numeric values, monster selection, visibility/participation/budget states and preset/custom ruling dropdowns simplify DM input. The long introduction is absent from signed-in subpages. 368 tests/20 files, build, private DM/player/mobile checks and production authenticated read-only buttons/progress/live checks passed. No real turn was changed for deployment testing. No migration; all 36 table counts/hashes and actual SQL restore matched, temporary restore DB/grants removed. Public assets were byte-identical and health passed. Backup: /home/corvi/dnd-deployment-backups/battle-controls-20261009T173213Z.

DM-only reversible character archiving is deployed (2026-10-09). On Characters, Archive character: name removes the character from active rosters/workflow choices; Archived characters contains restore buttons. Records are not deleted. Unfinished battles/rests block archiving, and gameplay edits/reincluding archived combatants are blocked until restoration.

Additive migration 017 defaults existing characters active; all three remained active. Migration repeat passed. All 36 original table row counts/hashes were preserved, excluding only the new migration record; the actual paused SQL backup restored with identical counts/hashes and temporary grants/database were removed. Backup: /home/corvi/dnd-deployment-backups/character-archive-20261009T170857Z. Validation: 366 tests/20 files, build, private compiled DM/player browser archive/cancel/restore/mobile checks, runtime schema/auth guard, public health and byte-identical assets. Production browser was logged out; no live character was archived for testing.

The all-source Compendium is deployed (2026-10-08): one player/DM navigation item with 12,520 names from 125 sources and 17 categories, combined search and source/category/rules-family/class/level/school/SRD filters, retained filter state and pagination. Non-SRD records are names/factual source metadata only; reviewed licensed SRD details use the campaign's installed packs, and monster statistics remain DM-only. Browsing makes no gameplay changes.

Validation: 359 tests/19 files, full build, compiled player/DM phone/draft checks, public byte-identical JS/CSS and health, plus the existing authenticated DM's live index, filtered Druid/Moonbeam licensed detail and connected live state. No migration or production gameplay/test records. All 36 table counts/hashes were unchanged and a real SQL dump restore matched; temporary restore database/grants were removed. Backup: /home/corvi/dnd-deployment-backups/compendium-20261008T194920Z.

Latest basic release (2026-10-08): additive migrations 013-015 are applied to dnd_clean_20261008. Encounters, private SRD/manual enemies, physical roll proposals and DM outcomes, class-resource/Font recovery, guided advancement, phone-friendly sheet/equipment and campaign-scoped live updates are deployed. The catalogs contain 339 spells and 330 reviewed monsters. Party-specific exceptions require source review; homebrew remains deferred.

All existing row counts/original-column hashes were preserved. Backup: /home/corvi/dnd-deployment-backups/basic-release-20261008T171827Z. Its actual paused SQL dump was restored separately and all 29 original tables matched counts/hashes; temporary restore grants/database were removed. The media archive was restored (production uploads were empty), supplemented by a separate nonempty PNG round-trip/byte comparison in the private backup directory. Production uploads and archived dnd were untouched.

The character-only redesign is also deployed (2026-10-08): persistent/compact summary, real ordered section tabs, scoped medieval styling, all-source names-only dropdowns, visual spell slots, and a GP-first reason-required wallet. Additive migration 016 preserved existing balances and all 35 prior table row counts/hashes; its new ledger starts empty. A real paused SQL restore matched all 35 tables and the temporary database/grants were removed. Backup: /home/corvi/dnd-deployment-backups/character-page-20261008T190427Z. Validation: 351 tests/18 files and builds, player/DM phone layouts, persisted dropdowns/wallet/spent slots after restart, public assets/health, and existing authenticated DM read-only wallet/live loading passed. Other page styling and workflows were deliberately left unchanged.

Validation of the preceding general release: 340 tests in 16 files, full builds, local role/browser/live/restart and phone checks, restricted runtime permissions/catalogs, public health and byte-identical assets passed. NPM's existing Upgrade headers were verified; the public WebSocket rejects unauthenticated connections, and the existing DM browser connected live without creating any production test/gameplay records. The actual party practice session remains the human acceptance gate.

The app is deployed from compose_yamls/dnd-compose.yml; its source is staged at /home/corvi/dnd-app. Its container joins backend_net and is not published on a host port. Nginx Proxy Manager forwards dnd.corvi.hu to dnd:4000, terminates HTTPS, and redirects HTTP to HTTPS.

The D&D project's ignored F:\GITS\HOMEPROJECT\DND\.env contains only D&D-specific deployment settings. It was used to populate /home/corvi/compose_yamls/dnd.env on the server (mode 0600); do not copy the complete HomeServer .env to the app container. The initial DM/campaign setup was already complete, so the bootstrap token has been removed from both D&D env files and the app container recreated. The setup endpoint reports bootstrap disabled.

Phase C character portraits and companion photos use the persistent bind mount /srv/data/dnd/uploads:/data/uploads, with MEDIA_DIRECTORY=/data/uploads. The production host directory is provisioned and writable by container UID 1000 (node):

sudo install -d -o 1000 -g 1000 -m 0750 /srv/data/dnd/uploads

Both character portraits and companion photos were fetched successfully after a forced production container recreation. Back this directory up alongside the D&D MariaDB database; restoring the actual production backup and media remains a Phase H acceptance check.

Phases A–C, including migrations 006–009, are deployed and the container is healthy. The full local MariaDB-backed application suite passes 45 tests. Existing HomeServer SMTP settings were configured at the user's request; a real test email was confirmed received, and password recovery was confirmed working. D&D backup/restore was validated locally against an isolated migrated schema and representative application records. The actual production backup artifact and uploaded media have not been restored; keep that verification in Phase H. Phase B party-specific spell, weapon, and subclass curation remains open.

The SRD 5.2.1 v5 reference pack (391 entries) is installed and selected for the production campaign. The database is included in the existing daily MariaDB dump. An isolated local dump/restore round trip passed, but the actual production dump and uploaded media have not been restored and remain a Phase H deployment check. Party-specific spell, weapon, and subclass references can be added after players complete their sheets.

On 2026-10-08, basic Phase D spell workflows were deployed: migration 010, the fingerprint-verified 339-spell catalog, and initial campaign spell-pack selection with an audit event. Repeat migration/import checks, container/public health, expected frontend assets, and spell-route authentication checks passed. Pre-deployment database/source backups and the previous image are retained at /home/corvi/dnd-deployment-backups/phase-d-20261008T104712Z. The local application regression suite passes 54 tests. Phase D remains partial; class-specific selection rules, multiclass slot derivation, broader exceptions, and effect expiry are still outstanding. Production runtime dependency audit reported no vulnerabilities; critical development-dependency advisories in concurrently/shell-quote need separate remediation.

The class-level spell picker (be1d3c4) and migration 011 were subsequently deployed on 2026-10-08. The production build, repeated migration check, container/public health, expected picker assets, migration columns, and the unchanged selected 339-spell catalog passed verification. Local validation passed 232 tests and a bounded Druid 3 desktop/mobile browser smoke check. Backups are retained at /home/corvi/dnd-deployment-backups/spell-picker-20261008T112841Z. Authenticated production selection writes were not exercised.

Follow-up authenticated smoke testing found a legacy-sheet spell-state HTTP 500. A server-only parser fix was tested (209 targeted tests and full build), deployed, and verified through sheet opening, catalog search/pagination, and Refresh. No production character writes were performed. Server-source/image rollback checkpoint: spell-legacy-fix-20261008T115400Z. Existing rules-reference footer overflow at 390px was fixed in the navigation update.

On 2026-10-08 the user requested a fresh production database retaining only the DM account, campaign settings, and SRD catalogs. The app now selects dnd_clean_20261008 through dnd.env; original dnd is retained intact. Players, characters, invitations, items/custom definitions, spell state, commands and history start empty. DM sessions, setup and migration records were retained. Players need new invitations. Backup/config/source/media and prior image checkpoint: /home/corvi/dnd-deployment-backups/navigation-clean-20261008T141500Z. The actual SQL backup was restored temporarily and row counts checked for all 26 tables. Runtime permissions/counts, selected SRD packs, migration checks, container/public health and new assets passed. Uploads were archived and left intact, not deleted. Keep archived data until retention is agreed.

The deployed top navbar groups functions into Characters, Play tools, Rules, and DM administration (DM only). Authenticated local role/navigation/edit- preservation tests and mobile checks passed alongside 33 DB API tests and full builds. Live browser loading was verified signed out.

The next spell-resource/rest slice and additive migration 012 were deployed on 2026-10-08 after user confirmation. Ordinary/multiclass/Pact slot derivation and per-class casting guidance are available in sheets. Play tools contains player rest proposals/physical Hit Dice previews, DM-confirmed completion and interruptions, supported spell-feature recovery, ordinary rest preparation, focused attunement, DM game time and separately reviewed dawn recharge. Supported base-level fixed spell durations expire through game time; upcast, round/turn/conditional/legacy effects remain manual. Homebrew, encounters and spell outcomes are not automated.

Validation: 274 local tests in ten files (including isolated MariaDB workflows), full builds, editor/diff checks, and real disposable player/DM rest/dawn browser checks passed. Play tools passed 390/700/701/1280px for both roles. The active database was paused/backed up before migration; every original table's count and original-column row hash remained identical afterward. Repeated migration, restricted runtime schema access, unchanged 339 spells, container/public health, signed-out production browser and byte-identical current frontend passed. No production test records were created and the archived original dnd was untouched. Authenticated rest writes were not exercised in production. Backup/source/config/media/checksum and prior-image checkpoint: /home/corvi/dnd-deployment-backups/spell-rests-20261008T154104Z. Artifact checksums passed; this particular SQL/media backup was not restored.

For schema changes, build the image and run the migration profile before recreating the app:

docker compose --env-file ~/compose_yamls/dnd.env \
  -f ~/compose_yamls/dnd-compose.yml build dnd
docker compose --profile migration --env-file ~/compose_yamls/dnd.env \
  -f ~/compose_yamls/dnd-compose.yml run --rm migrate npm run migrate:production
docker compose --env-file ~/compose_yamls/dnd.env \
  -f ~/compose_yamls/dnd-compose.yml up -d dnd

Monitoring

Glances runs with host network and PID access so Homarr can read host-level CPU, memory, disk, and Docker metrics. Its read-only /srv mount uses rslave propagation so the /dev/sdb1 filesystem at /srv/import is also reported. Glances is directly available at http://192.168.1.69:61208 and through the HTTP-only proxy listed above. The Glances filesystem config hides Docker's duplicate bind mounts for /etc/hosts, /etc/resolv.conf, and the config file itself. One representative LVM entry remains visible for the OS disk. Homarr may show N/A beside disks because its Glances integration does not provide SMART health status; disk usage data remains valid.

qBittorrent shares /srv/Media with Jellyfin at the container path /media. Its radarr and sonarr download categories use /media/Downloads/Movies and /media/Downloads/Shows as staging paths. Radarr and Sonarr import completed items into /media/Movies and /media/Shows; their hardlink support keeps qBittorrent's files available for seeding without a second full-size copy. Jellyfin libraries should point only to /media/Movies, /media/Shows, and /media/Music, never the Downloads staging directory. qBittorrent does not use a separate incomplete-download mount. Its admin password is stored on the server at /srv/data/qbittorrent/config/qbittorrent-admin-password.

Seerr, Radarr, and Sonarr run on backend_net; their Compose files and pinned image versions are in compose_yamls/. Seerr connects to Jellyfin at http://jellyfin:8096, Radarr at http://radarr:7878, and Sonarr at http://sonarr:8989. Both library managers mount /srv/Media at /media, matching qBittorrent's existing path so completed downloads are visible to the importers. Configure library roots as /media/Movies and /media/Shows.

For automated imports, configure qBittorrent categories radarr and sonarr with save paths /media/Downloads/Movies and /media/Downloads/Shows, and configure those same categories as the download-client categories in Radarr and Sonarr. See how_to.md for the initial setup and request workflow.

The oCIS managed datastore was migrated to /srv/import/ocis-data on sdb1; the previous /srv/data/ocis/data directory is retained as a rollback copy. Existing folders on the import disk are being copied into ownCloud by the ocis-import rclone container. Its source, ownCloud destination, and rclone configuration all reside on sdb1. PROXY_ENABLE_BASIC_AUTH=true is enabled only for this import and must be removed from the oCIS Compose file after the container completes.

Security Checklist

  • Protect phpMyAdmin and Forgejo with strong authentication, 2FA, and preferably IP restrictions where practical.
  • Review UFW rules before exposing additional service ports.
  • Use unique credentials for every service; keep them in .env or another protected secret store.
  • Keep application data on bind mounts so backups and migrations remain simple.
  • Enable 2FA for ownCloud and Forgejo administrator accounts.
  • Restrict SSH to key-based authentication and disable password authentication once the deployment is stable.
  • Enable unattended security updates on the host.
  • Review Nginx Proxy Manager access lists for phpMyAdmin, Portainer, and Homarr.

Repository Notes

The referenced F:/git/etc directory was not present in the workspace when this README was updated, so this document reflects the verified deployment details in plan.md and does not infer any files from that missing directory.