- HTML 50.7%
- Python 36.7%
- Shell 12.6%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
|
||
| __pycache__ | ||
| compose_yamls | ||
| scripts | ||
| .gitignore | ||
| how_to.md | ||
| npm-proxy-pages.html | ||
| ocis-import.log | ||
| plan.md | ||
| README.md | ||
| ssh_diagnose.py | ||
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/withMovies,Shows, andMusicdirectories
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
.envor 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.