Nemac Home Server Runbook

Dokumentacija domačega serverja

Centralni pregled infrastrukture, storitev, poti, backupov, monitoring sistema in postopkov. Namen dokumenta je, da lahko nekdo drug razume in prevzame vzdrževanje serverja brez ugibanja.

VPS: vmi3247278 Public IP: 178.238.233.68 Tailscale IP: 100.74.84.18 Disk: 387G / 42G used / 345G free Docker + Caddy + Tailscale
Accordion runbook
📌 Trenutno stanje serverja

Disk

11%
42G porabljeno od 387G

Prosto približno 345G.

Minecraft backupi

3.1G
trenutna velikost /srv/backups

Backup se izvaja vsak dan ob 03:30.

Docker

22
aktivnih runtime containerjev

Večina aplikacij je v Dockerju. Paperless, Netdata in Glances so odstranjeni iz runtime stanja; Crafty trenutno ne teče.

Pomembno

Runbook se ureja v Gitei v repozitoriju nemacd/home-server, datoteka site/index.html.

Objavljena verzija za branje je na: https://hub.nemac.si/runbook/

Večje spremembe maj 2026

  • Navidrome music server je aktiven na https://ente.nemac.si/music/app/#/login.
  • Dodan Stirling PDF na https://pdf.nemac.si; javno prek Caddyja, z loginom.
  • File Browser ima mount /srv/navidrome/music kot /srv/Music.
  • Paperless je odstranjen, ker se doma ne uporablja več.
  • Ente Photos ni več aktiven servis; ostaja samo kot arhiv/cleanup kandidat.
  • SSH password login je izklopljen; SSH dostop deluje samo s ključem za uporabnika nemacd.
  • Stare Ente/Crafty javne Caddy route ne proxyjajo več na ugasnjene porte, ampak vračajo 410 Gone.
  • Stara UFW pravila za opuščene Ente porte 3010, 3012 in 8088 so odstranjena.
  • RustDesk konfiguracija v /srv/rustdesk je backupirana in dokumentirana.
  • Portainer data volume in File Browser config/database sta backupirana in dokumentirana.
  • Gitea SQLite baza, repoji in konfiguracija so backupirani in dokumentirani.
  • Tedenski config/admin backup je avtomatiziran s systemd timerjem in Telegram povzetkom.
  • Restore test weekly config/admin backupa je bil uspešno izveden v ločeno testno mapo.
  • Docker cleanup je zaključen: brez stopped containerjev, dangling image-ov, unused volume-ov ali build cache-a.
  • Minecraft image itzg/minecraft-server:latest je posodobljen; backup je narejen, rollback tag je začasno ohranjen, server je healthy.
  • Prvi avtomatski weekly config/admin backup je uspel; Telegram povzetek in retention sta preverjena.
  • Uptime Kuma je posodobljen na 2.4.0, DIUN na v4.33.0; rollback taga sta začasno ohranjena.
  • BentoPDF je dodan testno poleg Stirling PDF, Tailscale-only na 100.74.84.18:8097.
  • File Browser je posodobljen na 2.63.14, Jellyfin na 10.11.11; rollback taga sta začasno ohranjena.
  • osTicket test lab je dodan Tailscale-only na 100.74.84.18:8098, z MariaDB in popravljenim healthcheckom.
  • DIUN update alerti za Navidrome, Stirling PDF in Vikunja Postgres so bili obdelani 2026-06-12; storitve so po update-u delujoče.
  • Minecraft image je bil ponovno posodobljen 2026-06-16 zaradi novega upstream itzg/minecraft-server:latest; narejen je bil offline backup, server je healthy, TPS je 20.0 / 20.0 / 20.0.
  • Update 2026-06-15: posodobljeni so bili File Browser, Minecraft image in plugina EssentialsX/EssentialsXSpawn; Minecraft je po update-u healthy s TPS 20.0.
  • File Browser je bil prej posodobljen na 2.63.10, Caddy pa na nov caddy:2 image.
  • Portainer je posodobljen na 2.41.1 STS.
  • Uptime Kuma je na louislam/uptime-kuma:2, verzija 2.4.0; DIUN je posodobljen na v4.33.0.
  • Monitoring je poenostavljen: ostaneta Uptime Kuma in DIUN.

Objavljena HTML datoteka

Caddy bere objavljeno datoteko iz: /srv/caddy/data/runbook/site/index.html

Znotraj Caddy containerja je to pot: /data/runbook/site/index.html

🧾 Snapshot za nov pogovor / handover

Ta razdelek je namenjen temu, da se lahko delo nadaljuje tudi v novem ChatGPT pogovoru. Če se pogovor zaklene ali izgubi kontekst, odpri ta runbook in novemu pogovoru prilepi ta snapshot oziroma poženi spodnje ukaze za sveže stanje.

Kako nadaljevati v novem pogovoru

  1. Odpri https://hub.nemac.si/runbook/.
  2. Novemu pogovoru povej, da gre za domači server vmi3247278.
  3. Prilepi povezavo ali kopijo tega runbooka.
  4. Poženi “Current snapshot” ukaze spodaj in prilepi izpis.
  5. Ne lepi gesel, tokenov ali vsebine .env datotek.

Current snapshot ukazi

sudo docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}"
sudo grep -nE "^[a-zA-Z0-9.-]+\.nemac\.si[[:space:]]*\{" /srv/caddy/Caddyfile
sudo find /srv -maxdepth 4 \( -name "docker-compose.yml" -o -name "compose.yml" -o -name "docker-compose.yaml" \) -print
df -h
sudo du -sh /srv/* 2>/dev/null | sort -h
systemctl list-timers --all | grep -Ei "minecraft|backup|alert|runbook" || true
sudo crontab -l || true
tailscale status

Snapshot: 2026-05-04

Docker containerji

NAMES                     IMAGE                                                            STATUS                 PORTS
gitea                     gitea/gitea:latest                                               Up 3 hours             22/tcp, 127.0.0.1:3002->3000/tcp
uptime-kuma               louislam/uptime-kuma:2                                      Up 5 days (healthy)    127.0.0.1:3001->3001/tcp
minecraft                 itzg/minecraft-server:latest                                     Up 6 days (healthy)    0.0.0.0:25565->25565/tcp, [::]:25565->25565/tcp
crafty                    registry.gitlab.com/crafty-controller/crafty-4:latest            Up 6 days              5520-5550/tcp, 127.0.0.1:8123->8123/tcp, 8000/tcp, 19132/tcp, 25500-25600/tcp, 127.0.0.1:8443->8443/tcp
vaultwarden               vaultwarden/server:latest                                        Up 9 days (healthy)    127.0.0.1:8087->80/tcp
jellyfin                  jellyfin/jellyfin:latest                                         Up 9 days (healthy)    127.0.0.1:8096->8096/tcp
paperless                 ghcr.io/paperless-ngx/paperless-ngx:latest                       Up 11 days (healthy)   127.0.0.1:8000->8000/tcp
paperless-db              postgres:18                                                      Up 11 days             5432/tcp
paperless-redis           redis:8                                                          Up 11 days             6379/tcp
vikunja                   vikunja/vikunja:latest                                           Up 12 days             127.0.0.1:3456->3456/tcp
vikunja-db                postgres:18                                                      Up 12 days (healthy)   5432/tcp
homarr                    ghcr.io/homarr-labs/homarr:latest                                Up 12 days             127.0.0.1:7575->7575/tcp
pingvin-share             stonith404/pingvin-share:latest                                  Up 12 days (healthy)   127.0.0.1:3000->3000/tcp
caddy                     caddy:2                                                          Up 12 days
immich_server             ghcr.io/immich-app/immich-server:v2                              Up 12 days (healthy)   127.0.0.1:2283->2283/tcp
immich_postgres           ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0   Up 12 days (healthy)   5432/tcp
immich_machine_learning   ghcr.io/immich-app/immich-machine-learning:v2                    Up 12 days (healthy)
immich_redis              valkey/valkey:9                                                  Up 12 days (healthy)   6379/tcp
netdata                   netdata/netdata:stable                                           Up 12 days (healthy)
hbbs                      rustdesk/rustdesk-server:latest                                  Up 12 days
hbbr                      rustdesk/rustdesk-server:latest                                  Up 12 days
portainer                 portainer/portainer-ce:sts                                       Up 12 days             8000/tcp, 9000/tcp, 100.74.84.18:9443->9443/tcp
filebrowser               filebrowser/filebrowser:latest                                   Up 12 days (healthy)   100.74.84.18:8090->80/tcp

Caddy domene

photos.nemac.si
share.nemac.si
hub.nemac.si
todo.nemac.si
docs.nemac.si
media.nemac.si
gesla.nemac.si
mcadmin.nemac.si
uptime.nemac.si
git.nemac.si

Compose datoteke

/srv/crafty/docker-compose.yml
/srv/diun/docker-compose.yml
/srv/gitea/docker-compose.yml
/srv/glances/docker-compose.yml
/srv/immich/app/docker-compose.yml
/srv/jellyfin/docker-compose.yml
/srv/minecraft/docker-compose.yml
/srv/uptime-kuma/docker-compose.yml
/srv/vaultwarden/docker-compose.yml

Disk

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       387G   28G  359G   8% /

Velikosti /srv map

20K     /srv/media
24K     /srv/filebrowser
76K     /srv/netdata
108K    /srv/runbook
144K    /srv/rustdesk
452K    /srv/caddy
468K    /srv/pingvin-share
576K    /srv/vaultwarden
692K    /srv/jellyfin
2.7M    /srv/gitea
6.2M    /srv/homarr
9.9M    /srv/uptime-kuma
53M     /srv/crafty
66M     /srv/vikunja
74M     /srv/paperless
277M    /srv/minecraft
517M    /srv/immich
3.1G    /srv/backups

Timerji in cron

minecraft-health-alert.timer   aktivno, preverja Minecraft health vsakih približno 2 minuti
dpkg-db-backup.timer           sistemski Debian/Ubuntu timer

Root cron:
30 3 * * * /usr/local/bin/backup-minecraft.sh
Opomba: če systemctl list-timers prikaže minecraf-health-alert.service, je to lahko samo vizualno odrezan izpis v terminalu. Timer file je preverjen in vsebuje pravilno: Unit=minecraft-health-alert.service.

Tailscale snapshot

100.74.84.18     vmi3247278       linux
100.117.117.115  cpk-nemacd       windows
100.89.249.115   daniels-s24      android
100.112.191.45   desktop-p3s06tf  windows

Changelog

Datum Sprememba
2026-06-16 Minecraft image update Po dodatnem DIUN alertu je bil preverjen remote digest za itzg/minecraft-server:latest; digest se je spremenil, zato je bil narejen varen Minecraft image update. Prejšnji image je bil sha256:d54e9c99dfc77b18c02b896772798884b430f8e65865e785a2f5a9780d566320, novi image je sha256:9cd46375d0921e77784eabd88d67b4501eaf0b9af9de7d0ca71784d76d358ee4. Pred restartom je bil izveden save-all flush, nato clean stop in offline backup v /srv/backups/minecraft-image-update-2026-06-16-092859. Po update-u je Minecraft healthy, RCON deluje, TPS je 20.0 / 20.0 / 20.0, Essentials in EssentialsSpawn ostajata na verziji 2.22.0.
2026-06-15 File Browser, Minecraft in EssentialsX update Obdelani so bili DIUN alerti za filebrowser/filebrowser:latest in itzg/minecraft-server:latest. File Browser je bil posodobljen, container je healthy, UI na http://100.74.84.18:8090 je bil preverjen v browserju. Minecraft image je bil posodobljen po save-all flush in offline backupu sveta; po zagonu je container healthy, RCON deluje, TPS je 20.0 / 20.0 / 20.0. Dodatno sta bila plugina EssentialsX in EssentialsXSpawn premaknjena iz 2.22.0-dev+111 na stable 2.22.0. Backupi in rollback tagi ostanejo začasno ohranjeni.
2026-06-12 DIUN update alerti obdelani Obdelani so bili Telegram/DIUN alerti za deluan/navidrome:latest, stirlingtools/stirling-pdf:latest in postgres:18 za vikunja-db. Navidrome je bil posodobljen z backupom /srv/backups/navidrome-update-2026-06-12-072926 in rollback tagom deluan/navidrome:rollback-2026-06-12-072926. Stirling PDF je bil posodobljen z backupom /srv/backups/stirling-pdf-update-2026-06-12-073721 in rollback tagom stirlingtools/stirling-pdf:rollback-2026-06-12-073721. Vikunja Postgres je bil posodobljen po pg_dumpall backupu v /srv/backups/vikunja-postgres-update-2026-06-12-074812; pri compose ukazih je obvezen project name -p vikunja, DB service ime je db, container pa vikunja-db. Po update-u delujejo https://ente.nemac.si/music/, https://pdf.nemac.si in https://todo.nemac.si/. Rollback tagi in backupi ostanejo začasno ohranjeni.
2026-06-08 osTicket test lab dodan Dodan je bil testni osTicket lab na osebnem serverju, dostopen samo prek Tailscale na http://100.74.84.18:8098. Stack uporablja rinkp/osticket-dockerized:latest in mariadb:10.11, compose je v /srv/osticket/docker-compose.yml. Urejeni so Docker bind na Tailscale IP, UFW pravilo 8098/tcp on tailscale0 in Tailscale ACL port 8098. Admin geslo ni dokumentirano v runbooku. Healthcheck je bil popravljen na wget, ker v app containerju ni curl. Namen je lab test z dummy podatki, ne produkcijska uporaba za službene tickete.
2026-06-08 File Browser + Jellyfin update Posodobljena sta bila File Browser na verzijo 2.63.14 in Jellyfin na verzijo 10.11.11. File Browser je ostal healthy in Tailscale-only na 100.74.84.18:8090. Jellyfin je ostal healthy in se odpre prek https://media.nemac.si. Pred updateom sta bila narejena backup in rollback tag. Minecraft ni bil spreminjan in je ostal healthy.
2026-06-04 File Browser + Caddy update Posodobljena sta bila File Browser in Caddy. File Browser je bil posodobljen prek Portainer compose stacka na verzijo 2.63.10 in ostaja Tailscale-only na 100.74.84.18:8090. Caddy je bil posodobljen na nov caddy:2 image cb9d71ad8318; pred posegom je bil Caddyfile validiran z novim image-om. Po updateu sta https://hub.nemac.si/runbook/ in https://git.nemac.si vrnila HTTP/2 200. Rollback taga sta začasno ohranjena.
2026-06-03 BentoPDF testno dodan Dodan je bil BentoPDF kot testni PDF toolkit poleg obstoječega Stirling PDF. Teče v containerju bentopdf iz image-a bentopdfteam/bentopdf:latest, dostopen samo prek Tailscale na http://100.74.84.18:8097. Stirling PDF ostaja nespremenjen in healthy na 100.74.84.18:8095. Za dostop so bili usklajeni Docker bind, UFW pravilo na tailscale0 in Tailscale ACL port 8097.
2026-06-02 Uptime Kuma + DIUN update Posodobljena sta bila louislam/uptime-kuma:2 na verzijo 2.4.0 in crazymax/diun:latest na v4.33.0. Pred updateom je bil narejen Uptime Kuma SQLite backup z integrity_check: ok, shranjeni so bili before/after inspect/log zapisi in ustvarjena rollback taga. Po updateu je Uptime Kuma healthy, DIUN je zaključil cron job, Minecraft je ostal healthy.
2026-05-31 Prvi avtomatski weekly backup Prvi avtomatski zagon nemac-weekly-backup.timer je uspel. Ustvarjen je bil backup /srv/backups/weekly/2026-05-31-041654, skupna velikost 49M. Retention hrani zadnjih 8 weekly backupov; izbrisanih starih backupov je bilo 0. Disk po backupu: 36G used / 351G free (10%).
2026-05-28 Minecraft image update Posodobljen je bil Docker image itzg/minecraft-server:latest. Pred updateom je bil narejen svež backup /srv/backups/minecraft-image-update-2026-05-28-094832/minecraft-pre-update.tar.gz in rollback tag itzg/minecraft-server:rollback-2026-05-28-094832. Po updateu je Minecraft ostal healthy, RCON deluje, TPS je bil 19.9. Rollback tag je začasno ohranjen.
2026-05-27 Docker cleanup Počiščeni so bili stari ustavljeni Ente containerji, stari Ente/Netdata/File Browser Docker volume-i, ente_default network, Docker build cache, dangling image-i, opuščeni Ente/Crafty/Netdata/Glances/Paperless image-i, stari rollback image-i ter stare mape /srv/ente, /srv/crafty, /srv/netdata in /srv/glances. Minecraft ni bil spreminjan in je po cleanupu ostal healthy.
2026-05-27 Weekly backup restore test Uspešno testiran restore zadnjega weekly config/admin backupa v ločeno mapo /tmp/weekly-restore-test-*. Preverjeni so bili SQLite integrity checki za Gitea, Uptime Kuma in Navidrome, razpakiranje arhivov ter prisotnost ključnih poti. Produkcijski servisi niso bili ustavljeni ali spremenjeni.
2026-05-27 Weekly config/admin backup avtomatika Dodana je skripta /usr/local/sbin/nemac-weekly-backup in systemd timer nemac-weekly-backup.timer. Backup se izvaja tedensko v nedeljo okoli 04:15, hrani zadnjih 8 weekly backupov in pošlje Telegram povzetek z velikostmi posameznih backupov.
2026-05-27 Gitea backup Narejen je bil svež lokalni backup Gitee v /srv/backups/gitea/gitea-backup-*. SQLite baza je bila backupirana konsistentno in preverjena z PRAGMA integrity_check. Backup vsebuje občutljive datoteke, zato ne sme v Git/Giteo ali javne zapiske.
2026-05-27 Portainer + File Browser backup Narejen je bil lokalni backup Portainer data volume-a in File Browser config/database v /srv/backups/portainer-filebrowser-*. Backup vsebuje občutljive datoteke, zato ne sme v Git/Giteo ali javne zapiske. Oba servisa ostajata dostopna samo prek Tailscale IP-ja.
2026-05-27 RustDesk backup + dokumentacija Narejen je bil lokalni backup RustDesk konfiguracije iz /srv/rustdesk v /srv/backups/rustdesk-*. Backup vsebuje tudi RustDesk server private key id_ed25519, zato ne sme v Git ali javne zapiske. Dokumentirani so containerji hbbs/hbbr, javni porti in testni postopek.
2026-05-27 UFW cleanup starih Ente pravil Odstranjena so bila stara UFW pravila za Ente porte 3010, 3012 in 8088, vključno z IPv6/tailscale pravili. Porti ne poslušajo več, Caddy za stare Ente domene vrača 410 Gone, ente.nemac.si/ preusmeri na /music/, Navidrome login pa je bil preverjen v browserju.
2026-05-27 SSH + Caddy hardening SSH password login je izklopljen; dovoljen je samo key-based login za uporabnika nemacd. Stare javne route za Ente API, Ente Albums, Ente S3 in Crafty/Minecraft admin ne proxyjajo več na ugasnjene porte, ampak vračajo 410 Gone. ente.nemac.si/ preusmeri na /music/, Navidrome ostaja aktiven.
2026-05-27 Runbook refresh / stanje serverja Osvežen snapshot aktivnih containerjev, dodan Stirling PDF na pdf.nemac.si, dokumentiran trenutni resource baseline ter označen Ente Photos kot opuščen servis. Navidrome ostaja aktiven na ente.nemac.si/music.
2026-05-14 Kraken Simulator v3.2 candle confirmation Strategija Kraken Telegram Crypto Simulator je bila nadgrajena na Strategy v3.2 — candle-based confirmation. Entry/exit confirmation se zdaj šteje po različnih zaprtih 15m svečah, ne več po worker ciklih. V decision_logs sta dodana audit stolpca signal_candle in htf_candle.
2026-05-14 Kraken Telegram Crypto Simulator dokumentiran Dodan je interni simulacijski crypto trading bot/portal Kraken Telegram Crypto Simulator. Projekt teče v /srv/kraken-telegram-sim kot Docker Compose stack z lokalnim Streamlit portalom na 127.0.0.1:8501, background workerjem, SQLite bazo data/sim.db in Telegram obvestili. Sistem je namenjen samo simulaciji in ne uporablja Kraken private API ključev.
2026-05-13 APT/Docker update + reboot Izveden je bil sistemski apt upgrade: Docker CE paketi so bili posodobljeni na vejo 29.4.3, nameščena je bila nova kernel verzija 6.8.0-111-generic, nato je bil izveden reboot. Po rebootu ni bilo več pending updateov ali zahteve po rebootu; zombie procesi so izginili, Docker/Caddy sta se normalno pobrala, ključne storitve pa so bile po settle checku healthy.
2026-05-13 Caddy update + Tailscale port konflikt Pri varnem updateu Caddyja je Tailscale Serve/Funnel držal port 443 na Tailscale IP-ju, zato se Caddy ni mogel zagnati in je padel v restart loop. Rešitev: resetiran je bil samo Tailscale Serve/Funnel, ne Tailscale VPN; nato je Caddy uspešno prevzel porta 80/443.
2026-05-13 Paperless odstranjen Paperless stack je bil odstranjen, ker se doma ne uporablja več. Containerji paperless, paperless-db in paperless-redis so odstranjeni; podatkovna mapa /srv/paperless je bila po potrditvi izbrisana.
2026-05-04 Postavljena Gitea na git.nemac.si.
2026-05-04 Ustvarjen private repo nemacd/home-server.
2026-05-04 Runbook shranjen v Gitei kot site/index.html.
2026-05-04 Runbook objavljen na https://hub.nemac.si/runbook/.
2026-05-04 Dodana skripta /usr/local/bin/publish-runbook.
2026-05-04 Počiščen star failed minecraft-map-proxy.service ostanek od Dynmap testa.
2026-05-05 Dodan 8G swapfile na /swapfile kot varnostna mreža za RAM.
2026-05-05 Netdata je namenoma ustavljena, ker je povzročala visok CPU/load. Za lahek dnevni monitoring se uporablja Glances + Homarr + Uptime Kuma.
2026-05-05 Dodan Glances kot lahek vir za Homarr System resources widget. Glances nima več Docker socket mounta in je povezan na homarr_default network.
2026-05-05 Minecraft UX nadgrajen: dodan death counter, EssentialsX, EssentialsSpawn, /spawn, /setspawn, /home in /sethome.
2026-05-05 Dodan tedenski Telegram health report: hourly metric collector in nedeljski report ob 20:00.
2026-05-06 Postavljen Ente Photos stack z domenami ente.nemac.si, ente-api.nemac.si, ente-albums.nemac.si in ente-s3.nemac.si. Preverjen upload, refresh, logout/login in obstoj slike.
2026-05-06 Narejen cold backup Ente konfiguracije, Postgres volume-a in MinIO volume-a.
2026-05-06 Paperless Redis in Paperless app posodobljena; Paperless deluje kot v2.20.15. Nastavljen tudi vm.overcommit_memory=1 za Redis priporočilo.
2026-05-06 Dodan Navidrome na https://ente.nemac.si/music/; File Browser ima mount /srv/navidrome/music kot /srv/Music.
2026-05-07 Navidrome external integrations izklopljene in pobrisan napačen cached artist metadata za eXtreme.
2026-05-07 Ente web image posodobljen in preverjen z web/API testi.
2026-05-11 Portainer posodobljen na 2.41.1 STS; dostop ostaja samo prek Tailscale 100.74.84.18:9443.
2026-05-11 Počiščen monitoring: odstranjen Netdata, odstranjen Glances, Crafty ustavljen za test.
2026-05-11 Uptime Kuma migriran iz latest/v1 na louislam/uptime-kuma:2, verzija 2.3.2; monitor intervali optimizirani.

TODO / stvari na čakanju

  • Testirati restore Minecraft backupa.
  • Naslednji restore test weekly config/admin backupa ponoviti po večjih spremembah ali čez nekaj mesecev.
  • Občasno preveriti weekly backup Telegram povzetek, retention in zadnji backup folder.
  • Dodati ali preveriti Uptime Kuma monitor za git.nemac.si.
  • Dodati ali preveriti Uptime Kuma monitor za hub.nemac.si/runbook/.
  • Občasno preveriti Docker stanje z docker system df; trenutno je Docker cleanup zaključen.
  • Preveriti Portainer dodatno utrjevanje: encryption secret, MFA/močno geslo in minimalen dostop.
  • Preveriti File Browser uporabnike, močno geslo in ali so mounti še vedno smiselni.
  • Oceniti javne porte/storitve: RustDesk in Minecraft naj ostaneta javna samo, če je to res potrebno; Tailscale-only prehod samo s testnim planom in rollbackom.
  • Jellyfin: napolniti in urediti knjižnice v /srv/media.
  • Razmisliti o Telegram bot UX za Minecraft whitelist.
  • Kasneje po želji nastaviti Tailscale exit node za potovanja.
🧹 Docker cleanup stanje

Docker cleanup je bil izveden 2026-05-27 po tem, ko so bili pomembni config/admin backupi avtomatizirani in je bil weekly backup restore test uspešno preverjen. Cleanup je bil izveden po sklopih, z vmesnimi sanity checki.

Končno stanje po cleanupu

Images:       21 total / 21 active / 0B reclaimable
Containers:   22 total / 22 active / 0B reclaimable
Local volumes: 2 total / 2 active / 0B reclaimable
Build cache:   0B
Disk:           34G used / 353G free / 9%

Odstranjeno

  • stari ustavljeni Ente containerji,
  • stari Ente Docker volume-i in ente_default network,
  • stari Netdata Docker volume-i,
  • stari File Browser Docker volume-i, ki niso bili več uporabljeni,
  • Docker build cache,
  • dangling Docker image-i,
  • opuščeni image-i za Ente, Crafty, Netdata, Glances, Paperless in podobne stare teste,
  • stari rollback/test image-i za File Browser, Gitea, Jellyfin, Stirling PDF in hello-world,
  • stare mape /srv/ente, /srv/crafty, /srv/netdata in /srv/glances.

Namerno ohranjeno

  • itzg/minecraft-server:latest in live Minecraft container — Minecraft ni bil spreminjan.
  • Aktivni image-i in containerji za Gitea, Caddy, Uptime Kuma, Jellyfin, Navidrome, Portainer, File Browser, RustDesk, Vaultwarden, Vikunja, Immich, Pingvin Share, Stirling PDF, DIUN in Kraken simulator.
  • Aktivna Docker volume-a immich_model-cache in portainer_data.

Cleanup metadata/backupi

Med cleanupom so bili ustvarjeni metadata snapshoti v /srv/backups/docker-cleanup-*, /srv/backups/docker-cleanup-volumes-*, /srv/backups/docker-cleanup-images-*, /srv/backups/docker-cleanup-rollback-images-* in arhiv starih map v /srv/backups/old-srv-dirs-cleanup-*/old-srv-dirs.tar.gz.

Preverjanje

sudo docker system df
sudo docker ps -a --filter status=exited --filter status=created --filter status=dead
sudo docker images -f dangling=true
sudo docker volume ls
sudo docker ps --filter name=minecraft
Rezultat: Docker je čist; ni stopped containerjev, dangling image-ov, unused volume-ov ali build cache-a. Minecraft je po cleanupu ostal Up in healthy.
🔐 Osnovna pravila
V Git nikoli ne shranjuj: gesel, API tokenov, Telegram bot tokenov, Vaultwarden admin tokenov, zasebnih ključev, produkcijskih .env datotek ali backupov baz.
  • Pred večjimi spremembami naredi backup relevantne mape ali datoteke.
  • Docker aplikacije naj poslušajo lokalno, npr. 127.0.0.1:PORT, javno pa gre promet prek Caddyja.
  • Če servis ni namenjen javnosti, naj bo dostopen samo prek Tailscale/VPN ali naj zahteva login.
  • SSH password login naj ostane izklopljen; prijava naj poteka samo s SSH ključem.
  • Ugasnjene javne domene naj ne proxyjajo na mrtve porte; raje naj vračajo 410 Gone ali preusmeritev.
  • Po spremembi Caddyfile vedno naredi reload in preveri loge.
  • Po spremembi Docker Compose vedno preveri docker ps in loge containerja.
  • V dokumentaciji skrivnosti zamenjaj z ***skrito***.

SSH hardening

sudo sshd -T | grep -Ei 'permitrootlogin|passwordauthentication|pubkeyauthentication|kbdinteractiveauthentication|x11forwarding|maxauthtries|allowusers'

Pričakovano stanje: PasswordAuthentication no, PubkeyAuthentication yes, PermitRootLogin no, AllowUsers nemacd.

Firewall / UFW opomba

Stara Ente pravila za porte 3010, 3012 in 8088 so odstranjena. Pred brisanjem UFW pravil vedno naredi sudo ufw status numbered in briši od največje številke proti najmanjši, ker se številke po vsakem brisanju premaknejo.

sudo ufw status numbered
sudo ss -ltnp
curl -I https://ente-api.nemac.si --max-time 15
🌐 Storitve in dostopi
Storitev URL / dostop Namen Status / opomba
Homarr https://hub.nemac.si Glavni dashboard / portal. Javno prek HTTPS
Runbook https://hub.nemac.si/runbook/ HTML dokumentacija serverja. Javno prek HTTPS
Vaultwarden https://gesla.nemac.si Gesla. Javno prek HTTPS
Stirling PDF https://pdf.nemac.si PDF urejanje, merge/split, konverzije in OCR. Javno prek HTTPS + login
Jellyfin https://media.nemac.si Media server za filme, serije, domače videe. Javno prek HTTPS
Immich https://photos.nemac.si Fotografije in backup slik. Javno prek HTTPS
Vikunja https://todo.nemac.si Todo / projekti / naloge. Javno prek HTTPS
Pingvin Share https://share.nemac.si Deljenje datotek. Javno prek HTTPS
Uptime Kuma https://uptime.nemac.si Monitoring storitev. Javno prek HTTPS + login
Gitea https://git.nemac.si Git, dokumentacija, skripte, zgodovina sprememb. Javno prek HTTPS + login
Minecraft 178.238.233.68:25565 Minecraft server za otroke. Javni game port + whitelist
Crafty https://mcadmin.nemac.si Minecraft admin dashboard. Onemogočen; domena vrača 410 Gone, glavni Minecraft dela brez njega
RustDesk 178.238.233.68:21115-21117 Self-hosted RustDesk ID/relay server: hbbs + hbbr. Javni RustDesk porti
Portainer https://100.74.84.18:9443 Docker web admin. Samo prek Tailscale
File Browser http://100.74.84.18:8090 Brskanje po datotekah. Samo prek Tailscale
Netdata Container netdata Napredna sistemska metrika. Odstranjeno zaradi overhead/OOM šuma
RustDesk server Containerja hbbs, hbbr Self-hosted RustDesk relay/signaling. Nameščeno
📁 Pomembne poti
Pot Namen
/srv/caddy/CaddyfileCaddy reverse proxy konfiguracija.
/srv/caddy/dataCaddy certifikati in podatki; tudi objavljen runbook.
/srv/caddy/data/runbook/site/index.htmlObjavljena HTML verzija runbooka.
/srv/giteaGitea podatki in compose.
/srv/gitea/data/gitea/conf/app.iniGitea konfiguracija.
/srv/minecraftMinecraft compose in podatki.
/srv/minecraft/dataMinecraft svet, whitelist, ops, server properties.
/srv/backupsMinecraft backup arhivi.
/srv/jellyfinJellyfin konfiguracija in cache.
/srv/mediaMedia knjižnica za Jellyfin.
/srv/uptime-kumaUptime Kuma podatki.
/srv/immichImmich stack.
/srv/vikunjaVikunja podatki.
/usr/local/bin/backup-minecraft.shMinecraft backup skripta.
/etc/minecraft-telegram.envTelegram bot token in chat ID. Ne commitaj v Git.

Velikosti map v /srv ob zadnjem pregledu

/srv/backups      3.1G
/srv/immich       517M
/srv/minecraft    277M
/srv/paperless    74M
/srv/vikunja      66M
/srv/crafty       53M
/srv/uptime-kuma  9.8M
/srv/gitea        2.7M
/srv/media        20K
🧭 Caddy / HTTPS / domene

Caddy teče kot Docker container caddy:2 v host network načinu. Uporablja se kot reverse proxy za javne HTTPS domene.

Caddy container

Container: caddy
Image: caddy:2
Network mode: host
Restart policy: unless-stopped
Command: caddy run --config /etc/caddy/Caddyfile --adapter caddyfile

Mounti

/srv/caddy/Caddyfile -> /etc/caddy/Caddyfile
/srv/caddy/data      -> /data
/srv/caddy/config    -> /config

Domene v Caddyfile

photos.nemac.si
share.nemac.si
hub.nemac.si
todo.nemac.si
docs.nemac.si
media.nemac.si
gesla.nemac.si
uptime.nemac.si
git.nemac.si
ente.nemac.si
ente-api.nemac.si
ente-albums.nemac.si
ente-s3.nemac.si
pdf.nemac.si

Pomembne route

hub.nemac.si/runbook/ -> /data/runbook/site
ente.nemac.si/        -> 308 redirect na /music/
ente.nemac.si/music/  -> 127.0.0.1:4533
pdf.nemac.si          -> 100.74.84.18:8095
ente-api.nemac.si     -> 410 Gone, Ente API opuščen
ente-albums.nemac.si  -> 410 Gone, Ente Albums opuščen
ente-s3.nemac.si      -> 410 Gone, Ente S3 opuščen
mcadmin.nemac.si      -> 410 Gone, Crafty/Minecraft admin opuščen

Pred spremembo naredi backup

sudo cp /srv/caddy/Caddyfile /srv/caddy/Caddyfile.bak-$(date +%F-%H%M)

Validate + reload Caddy

sudo docker exec caddy caddy validate --config /etc/caddy/Caddyfile --adapter caddyfile
sudo docker exec caddy caddy reload --config /etc/caddy/Caddyfile

Preverjanje

curl -I https://pdf.nemac.si --max-time 15
curl -sS -o /dev/null -w '%{http_code}\n' https://ente.nemac.si/music/ --max-time 15
curl -I https://ente-api.nemac.si --max-time 15
curl -I https://mcadmin.nemac.si --max-time 15
curl -I https://photos.nemac.si --max-time 15
curl -I https://media.nemac.si --max-time 15
Tailscale-only test za Ente je bil narejen in vrnjen nazaj na public HTTPS, ker so Windows/browser TLS povezave prek Tailscale IP povzročale težave.
🧩 Portainer in source of truth

Portainer je admin UI za Docker. Ni nujno source of truth za vse stacke. Nekateri stacki so bili ustvarjeni v Portainerju, novejši servisi se lahko upravljajo prek /srv/<service>/docker-compose.yml.

Pred spremembo vedno preveri, ali ima servis compose file v /srv, ali pa je njegov compose shranjen znotraj Portainerja v /var/lib/docker/volumes/portainer_data/_data/compose.

Priporočeno pravilo

  • /srv compose stacki: urejaj v datoteki /srv/.../docker-compose.yml in zaženi docker compose up -d.
  • Portainer stacki: urejaj v Portainer UI ali najprej migriraj v /srv.
  • Portainer UI: uporaben za pregled, loge, restart, emergency, ne pa nujno kot edini vir resnice.

/srv docker-compose.yml source of truth

Stack Compose file Opomba
crafty/srv/crafty/docker-compose.ymlCrafty admin UI.
gitea/srv/gitea/docker-compose.ymlGit in runbook source.
diun/srv/diun/docker-compose.ymlDocker image update notifier, Telegram alerti.
glances/srv/glances/docker-compose.ymlLahek monitoring vir za Homarr System resources widget.
immich/srv/immich/app/docker-compose.ymlPhotos stack.
jellyfin/srv/jellyfin/docker-compose.ymlMedia server.
minecraft/srv/minecraft/docker-compose.ymlGlavni Minecraft server.
uptime-kuma/srv/uptime-kuma/docker-compose.ymlMonitoring.
vaultwarden/srv/vaultwarden/docker-compose.ymlPassword manager.

Portainer stack source of truth

Stack Portainer compose path Containerji
filebrowser/data/compose/2/docker-compose.ymlfilebrowser
rustdesk/data/compose/3/docker-compose.ymlhbbs, hbbr
netdata/data/compose/4/docker-compose.ymlnetdata
caddy/data/compose/5/docker-compose.ymlcaddy
pingvin-share/data/compose/6/docker-compose.ymlpingvin-share
homarr/data/compose/7/docker-compose.ymlhomarr
vikunja/data/compose/8/docker-compose.ymlvikunja, vikunja-db
paperless/data/compose/9/docker-compose.ymlpaperless, paperless-db, paperless-redis
minecraft-old-2026-04-27-2239/data/compose/10/docker-compose.ymlStar rollback container od migracije Minecrafta.

Fizična lokacija Portainer compose datotek na hostu

/var/lib/docker/volumes/portainer_data/_data/compose/2/docker-compose.yml
/var/lib/docker/volumes/portainer_data/_data/compose/3/docker-compose.yml
/var/lib/docker/volumes/portainer_data/_data/compose/4/docker-compose.yml
/var/lib/docker/volumes/portainer_data/_data/compose/5/docker-compose.yml
/var/lib/docker/volumes/portainer_data/_data/compose/6/docker-compose.yml
/var/lib/docker/volumes/portainer_data/_data/compose/7/docker-compose.yml
/var/lib/docker/volumes/portainer_data/_data/compose/8/docker-compose.yml
/var/lib/docker/volumes/portainer_data/_data/compose/9/docker-compose.yml
/var/lib/docker/volumes/portainer_data/_data/compose/10/docker-compose.yml

Preverjanje source-of-truth

sudo docker inspect $(sudo docker ps -aq) \
  --format '{{.Name}} | image={{.Config.Image}} | project={{index .Config.Labels "com.docker.compose.project"}} | workdir={{index .Config.Labels "com.docker.compose.project.working_dir"}} | config={{index .Config.Labels "com.docker.compose.project.config_files"}}' \
  | sort

Brez compose labelov

  • portainer — Portainer container sam, brez compose labelov.
Testna hello-world containerja hungry_davinci in sleepy_wilson sta bila odstranjena.
🐳 Docker in Compose

Caddy update 2026-06-04

Caddy je bil posodobljen na nov caddy:2 image cb9d71ad8318. Caddy teče kot host-network container iz Portainer compose datoteke: /var/lib/docker/volumes/portainer_data/_data/compose/5/docker-compose.yml.

  • Pred updateom je bil narejen backup /srv/caddy v /srv/backups/caddy-update-2026-06-04-091855.
  • Caddyfile je bil validiran z novim image-om pred ustavitvijo starega containerja.
  • Po updateu sta porta 80 in 443 poslušala.
  • Preverjeno po updateu: https://hub.nemac.si/runbook/ in https://git.nemac.si sta vrnila HTTP/2 200.
  • Rollback tag je začasno ohranjen: caddy:rollback-2026-06-04-091855.
Opomba: Caddy je javni reverse proxy. Update vedno izvajaj ločeno, z backupom, validacijo Caddyfile-a z novim image-om in public URL checki po zagonu.

Aktivni containerji

Container Image Porti / opomba
giteagitea/gitea:latest127.0.0.1:3002 -> 3000
uptime-kumalouislam/uptime-kuma:2127.0.0.1:3001
minecraftitzg/minecraft-server:latest0.0.0.0:25565
craftyregistry.gitlab.com/crafty-controller/crafty-4:latest127.0.0.1:8443
vaultwardenvaultwarden/server:latest127.0.0.1:8087 -> 80
jellyfinjellyfin/jellyfin:latest127.0.0.1:8096
paperlessghcr.io/paperless-ngx/paperless-ngx:latest127.0.0.1:8000
vikunjavikunja/vikunja:latest127.0.0.1:3456
homarrghcr.io/homarr-labs/homarr:latest127.0.0.1:7575
pingvin-sharestonith404/pingvin-share:latest127.0.0.1:3000
immich_serverghcr.io/immich-app/immich-server:v2127.0.0.1:2283
portainerportainer/portainer-ce:sts100.74.84.18:9443
filebrowserfilebrowser/filebrowser:latest100.74.84.18:8090

Compose datoteke, ki obstajajo v /srv

/srv/crafty/docker-compose.yml
/srv/diun/docker-compose.yml
/srv/gitea/docker-compose.yml
/srv/glances/docker-compose.yml
/srv/immich/app/docker-compose.yml
/srv/jellyfin/docker-compose.yml
/srv/minecraft/docker-compose.yml
/srv/uptime-kuma/docker-compose.yml
/srv/vaultwarden/docker-compose.yml

Koristni ukazi

sudo docker ps
sudo docker ps -a
sudo docker logs IME_CONTAINERJA --tail 100
sudo docker restart IME_CONTAINERJA
sudo docker inspect IME_CONTAINERJA --format '{{range .Mounts}}{{println .Source "->" .Destination}}{{end}}'

Posodobitev aplikacije s compose

cd /srv/IME_STORITVE
sudo docker compose pull
sudo docker compose up -d
sudo docker logs IME_CONTAINERJA --tail 100
📷 Ente Photos
Status: Ente Photos trenutno ni več aktiven servis. Domena ente.nemac.si se uporablja za Navidrome music server na poti /music/. Ente containerji, image-i in volume-i ostajajo kot arhiv/cleanup kandidati, dokler ni ročno potrjeno, da jih je varno odstraniti. Legacy Ente domene ente-api, ente-albums in ente-s3 v Caddyju vračajo 410 Gone.
KomponentaVrednost
Frontendente-web-1, ghcr.io/ente-io/web, 127.0.0.1:3010
Albums frontend127.0.0.1:3012
API / Museumente-museum-1, ghcr.io/ente-io/server, 127.0.0.1:8088
Postgresente-postgres-1, postgres:15
MinIOente-minio-1, minio/minio, 127.0.0.1:3200
Compose/srv/ente/compose.yaml
Config/srv/ente/museum.yaml

Domene

https://ente.nemac.si
https://ente-api.nemac.si
https://ente-albums.nemac.si
https://ente-s3.nemac.si

Pomembne opombe

  • Ente porti 3010, 3012, 8088 in 3200 trenutno ne poslušajo več.
  • Stara UFW pravila za Ente porte 3010, 3012 in 8088 so odstranjena.
  • Stare Ente javne domene so ohranjene kot jasen 410 Gone odgovor, ne kot reverse proxy na ugasnjen servis.
  • Stare opombe o MinIO/S3 endpointu so zgodovinske in niso več aktivno runtime stanje.
  • Na Ente računu je bil v času testa vklopljen MFA in shranjen recovery key.

Backup

Narejen je cold backup Ente konfiguracije in Docker volume-ov. Backupi so v /srv/backups/ente-*.

Preverjanje

sudo docker ps -a --filter name=ente
sudo docker compose --project-directory /srv/ente -f /srv/ente/compose.yaml -p ente ps
# Ente API trenutno ni več pričakovano aktiven; javno naj vrne 410:
curl -I https://ente-api.nemac.si --max-time 20
curl -I https://ente-albums.nemac.si --max-time 20
curl -I https://ente-s3.nemac.si --max-time 20
📷 Immich / Photos

Immich je photos stack na /srv/immich/app/docker-compose.yml. Trenutno ni aktivno uporabljen kot glavni photo backup, zato so spremembe nižjega uporabniškega tveganja, vendar se baza in cache vseeno obravnavata previdno.

KomponentaContainerImagePort
Serverimmich_serverghcr.io/immich-app/immich-server:v2127.0.0.1:2283
Databaseimmich_postgresghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.05432/tcp
Redis / Valkeyimmich_redisdocker.io/valkey/valkey:96379/tcp

Immich DB/Valkey update — 2026-06-17

Po preklopu DIUN na file provider sta prišli enkratni obvestili New image found za Immich Postgres in Valkey. Ker sta bila image-a v compose datoteki pinana na stare digeste, sta bila podporna image-a varno posodobljena na nova pinana digesta.

KomponentaStaroNovoStatus
immich_postgres sha256:bcf63357191b76a916ae5eb93464d65c07511da41e3bf7a8416db519b40b1c23 sha256:b1d33572a9a0634aa6d344077467ad32847812a37fa3859f702952cba22a2f55 healthy
immich_redis sha256:3b55fbaa0cd93cf0d9d961f405e4dfcc70efe325e2d84da207a0a8e6d8fde4f9 sha256:e30fbdc8d6d6b355712e50f4008321026f69db3e450254b4f0008d22745d8d0e healthy
Preverjeno: immich_server, immich_postgres in immich_redis so po update-u healthy. Lokalni HTTP check na http://127.0.0.1:2283 je vrnil HTTP/1.1 200 OK.
Backup direktorij/srv/backups/immich-db-valkey-update-2026-06-17-100459
DB dumpimmich-db-dump.sql.gz, približno 16M, gzip integrity OK
Compose backupdocker-compose.yml.before
Env backupenv.before
Postgres rollback tagghcr.io/immich-app/postgres:rollback-2026-06-17-100702
Valkey rollback tagvalkey/valkey:rollback-2026-06-17-100702

Koristni ukazi

# Status
sudo docker ps --filter name="immich_server" --filter name="immich_postgres" --filter name="immich_redis"

# Lokalni HTTP check
curl -I http://127.0.0.1:2283 --max-time 15

# Backup
sudo ls -lh /srv/backups/immich-db-valkey-update-2026-06-17-100459

# Compose
cd /srv/immich/app
sudo docker compose ps
⛏️ Minecraft

Image update 2026-05-28

Minecraft Docker image itzg/minecraft-server:latest je bil posodobljen 2026-05-28. Pred updateom je bil narejen svež backup sveta in konfiguracije: /srv/backups/minecraft-image-update-2026-05-28-094832/minecraft-pre-update.tar.gz.

  • Stari image je začasno ohranjen kot rollback tag: itzg/minecraft-server:rollback-2026-05-28-094832.
  • Novi latest image po updateu: 6d282b627be8.
  • Po updateu je container minecraft postal healthy.
  • RCON test list deluje; TPS po updateu je bil 19.9, 19.9, 19.9.
  • Po uspešnem updateu je bil izveden še save-all flush.
Rollback: rollback tag naj ostane nekaj dni. Če otroci normalno igrajo in ni težav, ga lahko kasneje počistimo skupaj z update backup mapo po dogovorjenem retentionu.

Minecraft UX nadgradnje

Server ima dodane osnovne quality-of-life funkcije za igralce. Oba otroka ostaneta OP.

Funkcija Kaj pomeni Ukaz v igri
Death counter V TAB listi prikazuje število smrti igralcev. TAB
Spawn Glavna skupna točka serverja, kamor se igralec lahko vrne. /spawn
Set spawn Nastavi glavni spawn serverja. To naj uporablja samo OP. /setspawn
Home Osebna shranjena lokacija igralca, recimo njegova baza. /home
Set home Nastavi osebno home lokacijo igralca. /sethome

Plugin status

EssentialsX: /srv/minecraft/data/plugins/EssentialsX.jar
EssentialsXSpawn: /srv/minecraft/data/plugins/EssentialsXSpawn.jar
Uporabljena verzija: 2.22.0 stable
Posodobljeno: 2026-06-15

Preverjanje

sudo docker exec minecraft rcon-cli plugins
sudo docker exec minecraft rcon-cli 'scoreboard objectives list'
sudo docker exec minecraft rcon-cli list

Death counter nastavitev

sudo docker exec minecraft rcon-cli 'scoreboard objectives add deaths deathCount {"text":"Deaths"}'
sudo docker exec minecraft rcon-cli 'scoreboard objectives setdisplay list deaths'
Minecraft memory nastavitev trenutno ostane MEMORY: "2G", ker server otrokom deluje hitro in stabilno.
Postavka Vrednost
Containerminecraft
Imageitzg/minecraft-server:latest
Path/srv/minecraft
Data/srv/minecraft/data
Compose/srv/minecraft/docker-compose.yml
Port25565/tcp
Server178.238.233.68:25565

Igralci

Whitelist je vklopljen. Dovoljena igralca:

  • gabothefloppa
  • CitySkrat

Operatorja/admina:

  • gabothefloppa
  • CitySkrat

Preverjanje

sudo docker ps --filter name=minecraft
sudo docker exec minecraft rcon-cli list
sudo docker exec minecraft rcon-cli whitelist list
sudo docker exec minecraft grep -E '^(white-list|enforce-whitelist|enable-rcon)=' /data/server.properties

Pričakovano:

white-list=true
enforce-whitelist=true
enable-rcon=true

Whitelist ukazi

sudo docker exec minecraft rcon-cli whitelist list
sudo docker exec minecraft rcon-cli whitelist add IME_IGRALCA
sudo docker exec minecraft rcon-cli whitelist remove IME_IGRALCA

Admin/operator

sudo docker exec minecraft rcon-cli op IME_IGRALCA
sudo docker exec minecraft cat /data/ops.json

Restart in logi

cd /srv/minecraft
sudo docker compose restart
sudo docker logs minecraft --tail 120

Dynmap

Dynmap je bil testiran, vendar odstranjen, ker je upočasnjeval zagon serverja. Ostal je počiščen; minecraft-map-proxy.service je resetiran.

Crafty

Crafty je trenutno ustavljen za test, ker glavni Minecraft container deluje brez njega.

🖥️ RustDesk

RustDesk je self-hosted remote support/remote desktop relay. Stack ima dva containerja: hbbs za ID/signaling in hbbr za relay promet.

PostavkaVrednost
Containerjihbbs, hbbr
Imagerustdesk/rustdesk-server:latest
Networkhost
Restart policyunless-stopped
Data/config/srv/rustdesk -> /root
Občutljive datoteke/srv/rustdesk/id_ed25519, /srv/rustdesk/id_ed25519.pub

Porti

PortNamenFirewall stanje
21115/tcpNAT test / hbbs dodatni portJavno odprt v UFW
21116/tcphbbs rendezvous/signalingJavno odprt v UFW
21116/udphbbs rendezvous/signaling UDPJavno odprt v UFW
21117/tcphbbr relayJavno odprt v UFW
21118/tcphbbs websocketProces posluša, ni odprt v UFW
21119/tcphbbr websocketProces posluša, ni odprt v UFW
Varnost: RustDesk private key /srv/rustdesk/id_ed25519 je občutljiv. Ne shranjuj ga v Git/Gitea, ne lepi ga v chat in ga ne objavljaj v runbooku.

Backup

Backup konfiguracije je lokalno v /srv/backups/rustdesk-*/rustdesk-config.tar.gz. Arhiv vsebuje tudi server private key, zato mora ostati zaščiten na serverju ali v šifrirani shrambi.

Preverjanje

sudo docker ps --filter name=hbb
sudo docker logs hbbs --tail 80
sudo docker logs hbbr --tail 80

sudo ufw status numbered | grep -E '2111[4-9]|Status'
sudo ss -ltnup | grep -E ':2111[5-9] '

sudo find /srv/rustdesk -maxdepth 2 -type f -printf '%p %m %u:%g\n'

Opomba glede Tailscale-only

RustDesk trenutno ostaja javno dostopen na minimalnih osnovnih portih, ker mora delovati tudi za naprave, ki niso nujno na Tailscale. Prehod na Tailscale-only je možen, vendar ga je treba narediti kot ločen test z rollbackom, ker lahko prekine povezave za naprave zunaj Tailscale omrežja.

🧬 Gitea backup

Gitea hrani runbook source, Git zgodovino in interne skripte. Zato mora imeti ločen backup poleg samega objavljenega HTML runbooka.

PostavkaVrednost
Containergitea
Imagegitea/gitea:latest
Data mount/srv/gitea/data -> /data
Database/srv/gitea/data/gitea/gitea.db / SQLite
Repoji/srv/gitea/data/git/repositories
Glavni reponemacd/home-server.git
Public URLhttps://git.nemac.si
Local target127.0.0.1:3002 -> 3000
Varnost: Gitea backup vsebuje občutljive datoteke, kot so app.ini, jwt/private.pem, session podatki, SSH host ključi in Git repoji. Backup ne sme v Git/Giteo ali javne zapiske.

Backup lokacija

Svež lokalni backup je v /srv/backups/gitea/gitea-backup-*/. SQLite baza se backupira ločeno kot gitea.db, ostali podatki pa kot gitea-data-without-live-db.tar.gz.

Priporočen backup postopek

TS=$(date +%F-%H%M%S)
BACKUP_DIR="/srv/backups/gitea/gitea-backup-$TS"

sudo mkdir -p "$BACKUP_DIR"
sudo chmod 700 "$BACKUP_DIR"

# 1) Konsistenten SQLite backup naredi z Python sqlite3 backup API-jem.
#    Uporabi postopek iz operativnih zapiskov ali zadnjega preverjenega backup ukaza.

# 2) Preveri backup baze:
sudo python3 -c 'import sqlite3, sys; db=sys.argv[1]; c=sqlite3.connect(db); print(c.execute("PRAGMA integrity_check;").fetchone()[0]); c.close()' "$BACKUP_DIR/gitea.db"

# 3) Ostali podatki brez live sqlite datoteke:
sudo tar --exclude='data/gitea/gitea.db' --exclude='data/gitea/gitea.db-*' \
  -czf "$BACKUP_DIR/gitea-data-without-live-db.tar.gz" \
  -C /srv/gitea data

Preverjanje

sudo ls -lh /srv/backups/gitea/gitea-backup-*/
sudo tar -tzf /srv/backups/gitea/gitea-backup-*/gitea-data-without-live-db.tar.gz | head
sudo docker ps --filter name=gitea
curl -I https://git.nemac.si --max-time 15

Restore opomba

Restore še ni testiran. Pred pravim restore postopkom najprej ustavi Gitea container, naredi dodatni safety backup trenutnega /srv/gitea/data, nato obnovi bazo in data arhiv.

🛠️ Portainer + File Browser

File Browser update 2026-06-08

File Browser je bil posodobljen na 2.63.14. Update je bil izveden prek Portainer compose stacka z izrecnim project name-om -p filebrowser.

  • Backup/update mapa: /srv/backups/filebrowser-update-2026-06-08-065647.
  • Prejšnji image ID: b0308060fb45.
  • Novi image ID: 1ec9b0c68297.
  • Rollback tag je začasno ohranjen: filebrowser/filebrowser:rollback-2026-06-08-065647.
  • Po updateu je container filebrowser ostal healthy in UI se odpre prek http://100.74.84.18:8090.

File Browser update 2026-06-04

File Browser je bil posodobljen na 2.63.10. Ker je File Browser Portainer stack, je bil update izveden z izrecnim project name-om -p filebrowser in compose datotekama:

/var/lib/docker/volumes/portainer_data/_data/compose/2/docker-compose.yml
/var/lib/docker/volumes/portainer_data/_data/compose/2/docker-compose.healthcheck-override.yml
  • Pred updateom je bil narejen backup config/database v /srv/backups/filebrowser-update-2026-06-04-090542.
  • Nov image po updateu: filebrowser/filebrowser:latest, image ID b0308060fb45.
  • Rollback tag je začasno ohranjen: filebrowser/filebrowser:rollback-2026-06-04-090542.
  • Po updateu je container filebrowser ostal healthy in UI se odpre prek http://100.74.84.18:8090.

Portainer in File Browser sta admin orodji, zato ostajata dostopna samo prek Tailscale IP-ja. Nista javno objavljena prek Caddy domen.

Portainer

PostavkaVrednost
URLhttps://100.74.84.18:9443
Containerportainer
Imageportainer/portainer-ce:sts
Data volume/var/lib/docker/volumes/portainer_data/_data -> /data
Docker socket/var/run/docker.sock -> /var/run/docker.sock
Host port100.74.84.18:9443 -> 9443
StatusDostop samo prek Tailscale IP-ja.
Varnost: Portainer ima Docker socket mount. Kdor ima admin dostop do Portainerja, ima praktično nadzor nad Docker containerji. Zato naj ostane samo na Tailscale, z močnim geslom/MFA.

File Browser

PostavkaVrednost
URLhttp://100.74.84.18:8090
Containerfilebrowser
Imagefilebrowser/filebrowser:latest
Config/srv/filebrowser/config -> /config
Database/srv/filebrowser/database -> /database
Data root/srv/filebrowser/data -> /srv
Music mount/srv/navidrome/music -> /srv/Music
Host port100.74.84.18:8090 -> 80
StatusDostop samo prek Tailscale IP-ja.

Backup

Backup Portainer + File Browser konfiguracije je lokalno v /srv/backups/portainer-filebrowser-*/. Arhivi lahko vsebujejo občutljive datoteke, zato ne smejo v Git/Giteo ali javne zapiske.

Preverjanje

sudo docker ps --filter name=portainer --filter name=filebrowser
sudo ss -ltnp | grep -E ':9443 |:8090 '
sudo docker inspect portainer filebrowser --format '{{.Name}} | {{range .Mounts}}{{.Source}}->{{.Destination}} {{end}}'

# Browser check prek Tailscale:
# https://100.74.84.18:9443
# http://100.74.84.18:8090

Opombe

  • Portainer porta 8000 in 9000 v host sistemu trenutno ne poslušata.
  • File Browser ima dostop do map, ki so mountane v container; dostop naj ostane omejen na zaupanja vredne uporabnike.
  • Če se kdaj odpira dostop širše od Tailscale, je treba pred tem ponovno oceniti tveganje.
📄 Stirling PDF

Stirling PDF je self-hosted PDF orodje za urejanje, združevanje, razrez, OCR in konverzije PDF dokumentov.

PostavkaVrednost
URLhttps://pdf.nemac.si
Containerstirling-pdf
Imagestirlingtools/stirling-pdf:latest
Compose/srv/stirling-pdf/docker-compose.yml
Backend bind100.74.84.18:8095 -> 8080
Caddypdf.nemac.si -> 100.74.84.18:8095
StatusAktiven, healthy; HTTP preverjanje vrne 401, ker zahteva login.

Preverjanje

sudo docker ps --filter name=stirling-pdf
sudo docker logs stirling-pdf --tail 100
curl -I https://pdf.nemac.si --max-time 15
🎫 osTicket test lab

osTicket je dodan kot testni lab za preverjanje uporabnosti ticketing sistema. Namenjen je samo testiranju z dummy podatki. Realnih službenih ticketov, mailov, prilog ali osebnih podatkov se ne vnaša na osebni VPS.

PostavkaVrednost
URLhttp://100.74.84.18:8098
Agent/admin URLhttp://100.74.84.18:8098/scp/
DostopSamo prek Tailscale
App containerosticket
DB containerosticket-db
App imagerinkp/osticket-dockerized:latest
DB imagemariadb:10.11
Compose/srv/osticket/docker-compose.yml
Env/secrets/srv/osticket/.env — ne objavljaj in ne kopiraj v chat
DB data/srv/osticket/db
Attachments/srv/osticket/attachments
Host bind100.74.84.18:8098 -> 80/tcp
UFW8098/tcp on tailscale0
Tailscale ACLPort 8098 mora biti dodan v Access Controls za 100.74.84.18.
Status: osTicket test lab je bil uspešno zagnan 2026-06-08. App in MariaDB container sta healthy, HTTP endpoint vrne 200 OK, agent/admin portal /scp/ deluje.
Varnost: začetno admin geslo se ne zapisuje v runbook. Ker se je prvotno geslo pojavilo v Docker logu, je bilo po prvem loginu zamenjano v UI. Ne izvajaj docker logs osticket po nepotrebnem; če je diagnostika nujna, naj se logi filtrirajo in naj se gesel ne kopira v chat.

Posebnosti setupa

  • Prvi poskus je padal, ker je prazen bind mount /srv/osticket/config:/config prekril pričakovano notranjo konfiguracijo image-a.
  • Compose je bil popravljen tako, da se /config ne mounta več.
  • Dodano je bilo OST_DBTYPE=mysql, OST_DBHOST=osticket-db in ločen mount za attachments.
  • Healthcheck je bil spremenjen iz curl --fail http://localhost v wget -q --spider http://localhost/, ker v app containerju ni curl, wget pa je prisoten.

Preverjanje

sudo docker ps --filter name=osticket
curl -I http://100.74.84.18:8098 --max-time 15
curl -I http://100.74.84.18:8098/scp/ --max-time 15
sudo ufw status numbered | grep 8098

Admin dostop

Admin uporabnik za test je admin@local.test. Geslo je lokalno v /srv/osticket/.env, vendar ga ne zapisuj v runbook in ga ne lepi v chat. Po prvem loginu je geslo zamenjano v UI.

Odstranitev testa

sudo bash -lc "cd /srv/osticket && docker compose down"
sudo rm -rf /srv/osticket
sudo ufw delete allow in on tailscale0 to any port 8098 proto tcp
# Nato odstrani še port 8098 iz Tailscale ACL.
📄 BentoPDF test

BentoPDF je dodan kot testni PDF toolkit poleg obstoječega Stirling PDF. Namenjen je primerjavi uporabnosti, ne zamenjavi Stirling PDF. Stirling PDF ostaja aktiven in nespremenjen.

PostavkaVrednost
URLhttp://100.74.84.18:8097
DostopSamo prek Tailscale
Containerbentopdf
Imagebentopdfteam/bentopdf:latest
Compose/srv/bentopdf/docker-compose.yml
Host bind100.74.84.18:8097 -> 8080/tcp
UFW8097/tcp on tailscale0
Tailscale ACLPort 8097 mora biti dodan v Access Controls za 100.74.84.18.
Status: BentoPDF je bil testno zagnan 2026-06-03 in se je odprl prek Tailscale po dodanem Tailscale ACL portu 8097.
Opomba: pri novih Tailscale-only servisih je treba vedno preveriti tri plasti: Docker bind na Tailscale IP, UFW pravilo za tailscale0 in Tailscale Access Controls / ACL.

Preverjanje

sudo docker ps --filter name=bentopdf
sudo docker logs --tail 80 bentopdf
curl -I http://100.74.84.18:8097 --max-time 15
sudo ufw status numbered | grep 8097

Odstranitev, če test ni uporaben

sudo docker compose -f /srv/bentopdf/docker-compose.yml down
sudo rm -rf /srv/bentopdf
# Po odstranitvi pobriši še UFW pravilo za 8097 in odstrani 8097 iz Tailscale ACL.
💾 Backupi

Weekly config/admin backup

Tedenski config/admin backup pokriva majhne, kritične konfiguracije in baze. Namenoma ne pokriva velikih media map in ne podvaja Minecraft backupa, ker ima Minecraft že dnevni backup s Telegram obvestilom.

PostavkaVrednost
Skripta/usr/local/sbin/nemac-weekly-backup
Systemd servicenemac-weekly-backup.service
Systemd timernemac-weekly-backup.timer
UrnikNedelja okoli 04:15, z do 5 min naključnega zamika.
Lokacija/srv/backups/weekly/YYYY-MM-DD-HHMMSS/
RetentionHrani zadnjih 8 weekly backup folderjev.
ObvestilaTelegram povzetek prek /usr/local/bin/mc-telegram-send.sh.

Prvi avtomatski zagon

Prvi avtomatski weekly backup prek nemac-weekly-backup.timer je uspel 2026-05-31. Backup mapa: /srv/backups/weekly/2026-05-31-041654. Skupna velikost: 49M.

  • Telegram povzetek je bil poslan.
  • Retention: hrani zadnjih 8 weekly backup folderjev.
  • Izbrisanih starih weekly backupov: 0.
  • Disk po backupu: 36G used / 351G free (10%).

Kaj vključuje

  • Gitea: SQLite baza z integrity checkom + data/repo arhiv brez live DB datoteke.
  • Caddy + runbook: Caddyfile in objavljen runbook.
  • SSH + UFW: SSH konfiguracija in UFW status izpisi.
  • RustDesk: konfiguracija in server key datoteke.
  • Portainer: data volume.
  • File Browser: config in database.
  • Uptime Kuma: SQLite baza z integrity checkom + data arhiv brez live DB datoteke.
  • Navidrome: SQLite baza z integrity checkom + data arhiv brez live DB datoteke; brez music mape.
  • Jellyfin: config; brez media map.

Kaj je namenoma izključeno

  • Minecraft: že ima dnevni backup ob 03:30 in Telegram obvestilo.
  • Vaultwarden: zelo občutljiv servis; potrebuje ločen backup plan.
  • Vikunja: uporablja Postgres; potrebuje ločen pg_dump backup plan.
  • Immich, media, photos, music: potrebujejo ločeno media/offsite strategijo.

Ročni ukazi

sudo /usr/local/sbin/nemac-weekly-backup --dry-run
sudo /usr/local/sbin/nemac-weekly-backup --telegram-test
sudo /usr/local/sbin/nemac-weekly-backup --run
sudo /usr/local/sbin/nemac-weekly-backup --cleanup-only

Timer preverjanje

systemctl status nemac-weekly-backup.timer --no-pager
systemctl list-timers --all | grep -E 'nemac-weekly-backup|NEXT'
systemctl status nemac-weekly-backup.service --no-pager

Backup preverjanje

LATEST=$(sudo find /srv/backups/weekly -mindepth 1 -maxdepth 1 -type d | sort | tail -1)
echo "$LATEST"
sudo du -sh "$LATEST"
sudo find "$LATEST" -maxdepth 2 -type f -printf '%p\t%k KB\n' | sort

Zadnji restore test

Zadnji restore test je bil uspešno izveden v ločeno mapo /tmp/weekly-restore-test-*. Test je preveril SQLite baze gitea.db, kuma.db in navidrome.db, razpakiranje vseh weekly arhivov, prisotnost ključnih datotek ter stanje produkcijskih containerjev. Testna mapa je bila po preverjanju izbrisana.

Rezultat: weekly backup je osnovno obnovljiv brez posega v produkcijo.
Varnost: weekly backup vsebuje občutljive datoteke, kot so Gitea config, Portainer data, RustDesk private key, SSH konfiguracija in aplikacijske baze. Ne objavljaj ga v Git/Giteo ali v chat.

Minecraft backup

Backup se izvaja vsak dan ob 03:30 prek root crona.

sudo crontab -l

Pričakovano:

30 3 * * * /usr/local/bin/backup-minecraft.sh

Backup skripta

/usr/local/bin/backup-minecraft.sh

Backup lokacija

/srv/backups

Ročni backup

sudo /usr/local/bin/backup-minecraft.sh

Pregled backupov

du -sh /srv/backups
ls -lh /srv/backups
tail -80 /var/log/minecraft-backup.log

Telegram obvestila

Backup skripta pošlje Telegram obvestilo ob uspešnem backupu in ob preveliki backup mapi.

Telegram token je skrivnost. Ne kopiraj /etc/minecraft-telegram.env ali pravega tokena v Git.

Restore

Restore še ni formalno testiran. Priporočilo: ob prvi priložnosti narediti testni restore v ločeno mapo ali testni container.

📈 Monitoring in alerti

🔔 DIUN / Docker update alerti

DIUN politika spremljanja — 2026-06-17

DIUN je bil 2026-06-17 preklopljen iz Docker provider načina watchByDefault=true na ekspliciten file provider seznam image-ov. Namen spremembe je zmanjšati šum pri dnevnih Telegram obvestilih, predvsem zaradi pogostih rebuildov itzg/minecraft-server:latest.

PostavkaStanje
DIUN Docker watch-allDIUN_PROVIDERS_DOCKER=false
DIUN file providerDIUN_PROVIDERS_FILE_FILENAME=/data/custom-images.yml
Seznam spremljanih image-ov/srv/diun/data/custom-images.yml
Backup pred spremembo/srv/diun/backups/file-provider-policy-2026-06-17-094406
Izločeno iz dnevnih alertovitzg/minecraft-server:latest in lokalni kraken image-i
Po restartu DIUNprovider=file, 21 image-ov, failed=0, naslednji run ob 09:00
Rezultat: Minecraft ni bil restartan ali posodobljen. Minecraft je ostal healthy, TPS je bil 20.0 / 20.0 / 20.0.
Opomba: ob prvem zagonu po preklopu na file provider sta prišli Telegram obvestili New image found za ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0 in docker.io/valkey/valkey:9. To je pričakovan enkraten učinek prehoda, ker DIUN image-e zdaj vidi prek drugega providerja.
# Trenutna DIUN politika
sudo docker inspect diun --format '{{json .Config.Env}}'

# Seznam spremljanih image-ov
sudo sed -n '1,160p' /srv/diun/data/custom-images.yml

# DIUN logi
sudo docker logs diun --tail 160

DIUN spremlja Docker image-e in pošlje Telegram obvestilo, ko je na voljo nova verzija. DIUN ne posodablja containerjev avtomatsko; uporablja se samo za obvestila.

Best practice za ta server: najprej obvestilo, potem ročni update po backupu in preverjanju. Avtomatski update ni vklopljen.
Postavka Vrednost
Containerdiun
Imagecrazymax/diun:latest
Compose/srv/diun/docker-compose.yml
Data/srv/diun/data
Env skrivnosti/srv/diun/diun.env
Telegram source/etc/minecraft-telegram.env
ScheduleVsak dan ob 09:00

DIUN konfiguracija

DIUN_PROVIDERS_DOCKER=true
DIUN_PROVIDERS_DOCKER_WATCHBYDEFAULT=true
DIUN_WATCH_SCHEDULE=0 9 * * *
DIUN_WATCH_RUNONSTARTUP=true
DIUN_WATCH_FIRSTCHECKNOTIF=false
DIUN_DEFAULTS_NOTIFYON=new,update

Preverjanje statusa

sudo docker ps --filter name=diun
sudo docker logs diun --tail 120
sudo ls -lah /srv/diun/data

Ročni ponovni zagon

sudo docker compose -f /srv/diun/docker-compose.yml -p diun up -d

Kaj pomeni prvi zagon

Ob prvem zagonu DIUN naredi baseline vseh obstoječih image-ov. Ker je DIUN_WATCH_FIRSTCHECKNOTIF=false, ne pošlje Telegram spama za vse obstoječe image-e. Obvestila pridejo šele, ko se pojavi nova verzija oziroma update.

Trenutni prvi pregled

Found 24 image(s) to analyze
Jobs completed added=24 failed=0 skipped=0 unchanged=0 updated=0
Next run: daily around 09:00
/srv/diun/diun.env vsebuje Telegram token in chat ID. Ne commitaj te datoteke v Giteo.

Update 2026-06-02

Uptime Kuma je bil posodobljen na 2.4.0, DIUN na v4.33.0. Backup/rollback mapa: /srv/backups/uptime-kuma-diun-update-2026-06-02-070041. Uptime Kuma SQLite backup je imel integrity_check: ok.

  • Uptime Kuma po updateu: healthy, lokalni HTTP check vrne 302 /dashboard.
  • DIUN po updateu: Jobs completed, naslednji cron zagon nastavljen.
  • Minecraft med posegom ni bil spreminjan in je ostal healthy.
  • DIUN opozorila za lokalne Kraken image-e so pričakovan registry šum.

Minimalni monitoring setup

Monitoring je namenoma poenostavljen. Za domač hub ostaneta Uptime Kuma za dosegljivost storitev in DIUN za Docker image update obvestila. Netdata, Glances in Crafty so bili odstranjeni oziroma ustavljeni, ker so dodajali več šuma kot koristi.

OrodjeStatusNamen
Uptime KumaAktivenHTTP/TCP health checki ključnih storitev.
DIUNAktivenTelegram obvestila za Docker image update.
Weekly health reportAktivenLahek tedenski Telegram povzetek CPU/RAM/swap/disk.
NetdataOdstranjenPrej napreden monitoring; odstranjen po Exited (137).
GlancesOdstranjenPrej lahek monitoring vir; odstranjen zaradi CPU overheada.
CraftyUstavljen za testGlavni Minecraft deluje brez njega.

Uptime Kuma

Monitor Tip Interval Retry Timeout
MinecraftTCP Port60s2x / 30s48s pri TCP monitorju
VaultwardenHTTP120s2x / 30s10s
PaperlessHTTP120s2x / 30s10s
ImmichHTTP180s2x / 60s10s
JellyfinHTTP180s2x / 60s10s
File Browser / ShareHTTP300s2x / 60s10s
Hub / RunbookHTTP300s2x / 60s10s

Uptime Kuma verzija

Container: uptime-kuma
Image: louislam/uptime-kuma:2
Version: 2.3.2
Local port: 127.0.0.1:3001
URL: https://uptime.nemac.si

Preverjanje Uptime Kuma nastavitev

sudo docker run --rm \
  -v /srv/uptime-kuma/data:/data:ro \
  alpine sh -c '
    apk add --no-cache sqlite >/dev/null
    sqlite3 -header -column /data/kuma.db "
      SELECT id, name, type, active, interval, retry_interval, timeout, resend_interval
      FROM monitor
      ORDER BY name ASC;
    "
  '

Tedenski health report

Server vsako uro shrani lahek sample CPU/RAM/swap/disk metrik v /srv/server-metrics/metrics.csv. Vsako nedeljo ob 20:00 pošlje Telegram health report.

systemctl list-timers --all | grep -E "server-metrics|server-weekly"
sudo systemctl status server-metrics-collect.timer --no-pager
sudo systemctl status server-weekly-report.timer --no-pager
sudo tail -n 10 /srv/server-metrics/metrics.csv
sudo /usr/local/bin/server-weekly-report

Minecraft Telegram alerti

  • uspešen backup,
  • velikost backupov,
  • login/logout otrok,
  • Minecraft server down/up health check.
🧰 Gitea in runbook workflow

Gitea je interni Git sistem za dokumentacijo, skripte in konfiguracije. Uporablja se kot zasebni arhiv sprememb.

Postavka Vrednost
URLhttps://git.nemac.si
Containergitea
Path/srv/gitea
Local port127.0.0.1:3002 -> 3000
Config/srv/gitea/data/gitea/conf/app.ini
Reponemacd/home-server
Runbook sourcesite/index.html

Varnostne nastavitve

INSTALL_LOCK = true
DISABLE_REGISTRATION = true
REQUIRE_SIGNIN_VIEW = true
DISABLE_SSH = true
ROOT_URL = https://git.nemac.si/
DOMAIN = git.nemac.si

Preverjanje Gitee

sudo docker ps --filter name=gitea
sudo docker logs gitea --tail 100
sudo grep -nE "DISABLE_REGISTRATION|REQUIRE_SIGNIN_VIEW|DISABLE_SSH|ROOT_URL|DOMAIN|INSTALL_LOCK" /srv/gitea/data/gitea/conf/app.ini

Objava runbooka iz Gitee na hub

Po spremembi site/index.html v Gitei najprej naredi commit, potem na serverju poženi:

sudo publish-runbook

Skripta je tukaj:

/usr/local/bin/publish-runbook

Skripta naredi:

  • prebere site/index.html iz Gitea repozitorija home-server,
  • naredi backup trenutne objavljene verzije,
  • objavi novo verzijo v /srv/caddy/data/runbook/site/index.html,
  • preveri, da stran vrne pravilen HTML title.

Ročna objava, če skripta ne deluje

sudo git --git-dir=/srv/gitea/data/git/repositories/nemacd/home-server.git show main:site/index.html \
  | sudo tee /srv/caddy/data/runbook/site/index.html > /dev/null

Preverjanje objavljene strani

curl -s https://hub.nemac.si/runbook/ --max-time 20 | grep -i "<title>"

Pričakovano:

<title>Nemac Home Server Runbook</title>
🎬 Jellyfin

Jellyfin update 2026-06-08

Jellyfin je bil posodobljen na 10.11.11. Pred updateom je bil narejen backup konfiguracije, shranjeni so bili inspect/log zapisi in ustvarjen rollback tag.

  • Backup/update mapa: /srv/backups/jellyfin-update-2026-06-08-065857.
  • Prejšnji image ID: bc9fa8e1462f.
  • Novi image ID: aefb67e6a7ff.
  • Rollback tag je začasno ohranjen: jellyfin/jellyfin:rollback-2026-06-08-065857.
  • Po updateu je container jellyfin ostal healthy.
  • Preverjeno: lokalni endpoint vrne 302 /web/, javni dostop prek https://media.nemac.si deluje.
  • Minecraft med posegom ni bil spreminjan in je ostal healthy.

Jellyfin ne prenaša filmov iz interneta. Datoteke je treba naložiti na server. Jellyfin potem sam poišče metadata, naslovnice, opise in igralce.

Postavka Vrednost
URLhttps://media.nemac.si
Containerjellyfin
Compose/srv/jellyfin/docker-compose.yml
Config/srv/jellyfin/config -> /config
Cache/srv/jellyfin/cache -> /cache
Media/srv/media -> /media

Predlagana struktura

/srv/media/movies
/srv/media/series
/srv/media/home-videos

Primeri imen

/srv/media/movies/Interstellar (2014)/Interstellar (2014).mkv
/srv/media/series/Bluey/Season 01/Bluey - S01E01.mkv

Preverjanje mountov

sudo docker inspect jellyfin --format '{{range .Mounts}}{{println .Source "->" .Destination}}{{end}}'
sudo docker exec jellyfin ls -lah /media
🔒 Tailscale / VPN

Tailscale je nameščen in omogoča zasebni VPN dostop med napravami.

Tailscale server IP

100.74.84.18

Naprave ob zadnjem pregledu

100.74.84.18     vmi3247278       linux
100.117.117.115  cpk-nemacd       windows
100.89.249.115   daniels-s24      android
100.112.191.45   desktop-p3s06tf  windows

Preverjanje

tailscale status
tailscale ip -4

Storitve samo prek Tailscale

  • Portainer: https://100.74.84.18:9443
  • File Browser: http://100.74.84.18:8090

Exit node

Exit node za potovanja trenutno ni aktiviran. Ideja za kasneje: družina se na javnem Wi-Fi poveže v Tailscale in promet gre prek VPS-ja.

# Ni aktivirano za zdaj:
sudo tailscale set --advertise-exit-node
Exit node naj ostane na stand-by, dokler se ga namenoma ne vklopi in potrdi v Tailscale admin konzoli.
Vikunja / Todo

Vikunja je todo/project aplikacija na todo.nemac.si. Uporablja container vikunja in Postgres container vikunja-db.

Postavka Vrednost
URLhttps://todo.nemac.si
Containervikunja
Databasevikunja-db
Local port127.0.0.1:3456 -> 3456
Caddy targetreverse_proxy 127.0.0.1:3456
🛠️ Vzdrževanje

Odstranjeni servisi

OS update + reboot — 2026-06-18

Na strežniku je bil izveden sistemski update paketov, vključno z Docker komponentami, nato pa kontroliran reboot zaradi novega kernela in AppArmor sprememb.

PostavkaStanje po vzdrževanju
Kernel6.8.0-124-generic
Ubuntu24.04.4 LTS noble
Docker29.5.3
Docker Composev5.1.4
containerd2.2.4
APT stanje po rebootu0 updates, no reboot required
Backup pred update-om/srv/backups/os-upgrade-2026-06-18-092603
Preverjeno po rebootu: Docker in containerd sta active. Ključni servisi so se ponovno zagnali. Preverjeni so bili Runbook, Stirling PDF, Immich, Uptime Kuma, Jellyfin, Vikunja in Minecraft TCP port.

Cloud-init disabled — 2026-06-18

Po rebootu je bil cloud-init.service v stanju failed zaradi starega provider NoCloud bootcmd ukaza, ki je poskušal spreminjati SSH root/password nastavitve. Efektivni SSH hardening je ostal pravilen, zato je bil cloud-init deaktiviran za prihodnje boote z marker datoteko.

PostavkaStanje
Marker/etc/cloud/cloud-init.disabled
cloud-init boot statusdisabled-by-marker-file
Backup pred spremembo/srv/backups/cloud-init-disable-2026-06-18-094323
Rollbacksudo rm -f /etc/cloud/cloud-init.disabled
Efektivni SSH po spremembi: permitrootlogin no, passwordauthentication no, pubkeyauthentication yes, maxauthtries 3.
# OS / reboot stanje
uname -r
apt list --upgradable
test -f /var/run/reboot-required && cat /var/run/reboot-required || echo "OK: no reboot required"

# Docker stanje
docker --version
docker compose version
systemctl is-active docker
systemctl is-active containerd
sudo docker ps

# Cloud-init stanje
ls -l /etc/cloud/cloud-init.disabled
cloud-init status --long

# SSH efektivne nastavitve
sudo sshd -T | grep -Ei 'permitrootlogin|passwordauthentication|pubkeyauthentication|maxauthtries'

Maintenance zgodovina

Spodnji zapisi so arhiv večjih vzdrževalnih posegov in update batch-ev. Niso samostojni servisi, zato so zbrani tukaj pod Maintenance.

📄 Stirling PDF update — 2026-07-02

DIUN file provider je javil nov image digest za stirlingtools/stirling-pdf:latest. Stirling PDF je bil posodobljen kontrolirano: najprej pull/check, nato backup persistent konfiguracije, rollback image tag, recreate containerja in endpoint preverjanje.

PodatekVrednost
Compose path/srv/stirling-pdf/docker-compose.yml
Old imagesha256:dc2d06bc68bb5a023d3635060ba0070381446bff02011143c7e46ea0c184755c
New imagesha256:a6c5e627ceef6ed323a63da13e0d44ef68503320d1917cbc7ca2fd8e4a827aae
Version after update2.14.0
Backup/srv/backups/stirling-pdf-update-2026-07-02-084502
Rollback tagstirlingtools/stirling-pdf:rollback-2026-07-02-084502
Post-checkrunning, healthy
Tailscale endpointHTTP 401
Public HTTPS endpointHTTP 401
Rezultat: Stirling PDF je po updateu uspešno dosegljiv prek http://100.74.84.18:8095 in https://pdf.nemac.si. HTTP 401 je pričakovan, ker je vklopljen login (SECURITY_ENABLELOGIN=true).
Opomba: zagon po recreateu je trajal približno minuto. Prvih 12 preverjanj je vrnilo http=000 in health=starting, nato je container postal healthy in endpoint je vrnil pričakovani 401.
# Stirling PDF quick check
docker inspect stirling-pdf --format 'IMAGE={{.Image}} STATUS={{.State.Status}} HEALTH={{if .State.Health}}{{.State.Health.Status}}{{else}}none{{end}}'
curl -sS -o /dev/null -w '%{http_code}\n' --max-time 15 http://100.74.84.18:8095
curl -sS -o /dev/null -w '%{http_code}\n' --max-time 20 https://pdf.nemac.si

# Stirling PDF rollback
cd /srv/stirling-pdf
docker rm -f stirling-pdf
docker tag stirlingtools/stirling-pdf:rollback-2026-07-02-084502 stirlingtools/stirling-pdf:latest
docker compose up -d stirling-pdf

🧰 OS / Docker / Tailscale update — 2026-06-30

Izveden je bil varnostno-nadzorovan APT update za Docker stack, Tailscale in povezane sistemske pakete. Pred nadgradnjo je bil narejen preflight snapshot, APT simulacija, pregled Docker containerjev, preverjanje endpointov in preverjanje reboot statusa. Po nadgradnji je bil Docker daemon ponovno zagnan, containerji pa so se samodejno pobrali prek svojih restart politik.

KomponentaPred updateomPo updateu
Docker Engine29.5.329.6.1
containerd2.2.42.2.5
runc1.3.51.3.6
Docker Compose plugin5.1.45.2.0
Tailscale1.98.41.98.8
kpartx0.9.4-5ubuntu8.10.9.4-5ubuntu8.2
multipath-tools0.9.4-5ubuntu8.10.9.4-5ubuntu8.2
PreverjanjeRezultat
APT simulation9 upgraded, 0 newly installed, 0 to remove, 0 not upgraded
APT after updateListing... Done brez preostalih paketov za nadgradnjo
Reboot requiredno
Failed systemd units0 loaded units listed
docker.serviceactive
containerd.serviceactive
tailscaled.serviceactive
EndpointPost-check
FileBrowserHTTP 200
BentoPDFHTTP 200
GLPIHTTP 200
osTicketHTTP 200
VikunjaHTTP 200
GiteaHTTP 200
Uptime KumaHTTP 302
VaultwardenHTTP 200
ImmichHTTP 200
Pingvin ShareHTTP 200, container healthy
Stirling PDFHTTP 401 — pričakovano zaradi zaščite/prijave
Rezultat: OS paketni update je uspešno zaključen. Docker, containerd in Tailscale so aktivni, ni zahtevanega reboot-a, ni preostalih APT updateov in glavni self-hosted servisi so dosegljivi.
Opomba: Docker daemon se je med updateom ponovno zagnal. Zato so se containerji ponovno pobrali in so bili nekaj minut prikazani kot Up <minute> oziroma začasno health: starting. Končni post-check je potrdil normalno stanje.
ArtefaktLokacija
Preflight snapshot/srv/backups/os-update-preflight-2026-06-30-124812
Update log / backup dir/srv/backups/os-update-docker-tailscale-2026-06-30-125205
# Quick version check
docker version
docker compose version
tailscale version

# Service status
systemctl is-active docker containerd tailscaled
systemctl --failed --no-pager

# Reboot / APT check
test -f /var/run/reboot-required && cat /var/run/reboot-required || echo "REBOOT_REQUIRED=no"
apt list --upgradable

# Main endpoint checks
curl -sS -o /dev/null -w '%{http_code}\n' --max-time 10 http://100.74.84.18:8090  # FileBrowser
curl -sS -o /dev/null -w '%{http_code}\n' --max-time 10 http://100.74.84.18:8097  # BentoPDF
curl -sS -o /dev/null -w '%{http_code}\n' --max-time 10 http://100.74.84.18:8099  # GLPI
curl -sS -o /dev/null -w '%{http_code}\n' --max-time 10 http://100.74.84.18:8098  # osTicket
curl -sS -o /dev/null -w '%{http_code}\n' --max-time 10 http://127.0.0.1:3456    # Vikunja

2026-07-30 — DNS fix + TLS renewal: hub.nemac.si

  • Po objavi runbook vnosa je bil zaznan potekel TLS certifikat za hub.nemac.si; javni HTTPS check brez -k je padel z napako certificate has expired.
  • Vsebina runbooka je bila objavljena pravilno; preverjanje s curl -k je vrnilo HTTP 200 in našlo nov runbook marker.
  • Vzrok je bil napačen javni DNS A zapis za hub.nemac.si, ki je kazal na Tailscale IP 100.74.84.18 namesto na javni IP 178.238.233.68.
  • DNS A zapis je bil popravljen na 178.238.233.68; javni resolverji in authoritative Neoserv NS so po popravku vrnili pravi IP.
  • Na strežniku je bil počiščen lokalni systemd-resolved DNS cache z sudo resolvectl flush-caches, nato je tudi lokalni resolver vrnil 178.238.233.68.
  • Caddy konfiguracija je bila validirana kot veljavna; v aktivnem Caddyfile ni bilo posebne staging ACME nastavitve.
  • Izveden je bil kontroliran restart Caddy containerja; Caddy je uspešno izvedel Let's Encrypt HTTP-01 validacijo in obnovil certifikat.
  • Novi certifikat za hub.nemac.si je izdan prek Let's Encrypt YE2 in velja od 2026-07-30 do 2026-10-28.
  • Končni public HTTPS check za https://hub.nemac.si/runbook/ brez -k je vrnil HTTP 200.
  • Začasne runbook delovne mape in temp HTML check datoteke so bile po popravku odstranjene.

2026-07-30 — Claude Code + GitHub lab

  • Vzpostavljen je bil izoliran testni uporabnik claude-lab za preizkus Claude Code + GitHub workflowa na strežniku.
  • Uporabnik claude-lab nima sudo pravic; lab pot je /srv/ai-lab.
  • Sistemski node, npm in claude niso nameščeni; Node/npm/Claude Code so nameščeni samo pod uporabnikom claude-lab prek nvm.
  • Preverjene verzije: Node v24.18.1, npm 11.16.0, Claude Code 2.1.220, GitHub CLI 2.96.0.
  • Claude Code auto-update je izklopljen z okoljsko spremenljivko DISABLE_AUTOUPDATER=1.
  • GitHub CLI prijava je bila uspešna; tokeni, OAuth URL-ji, e-mail, orgId in zasebni URL-ji niso zapisani v runbook.
  • Testni workflow je bil uspešno preverjen: Claude read-only pregled repozitorija, lokalna sprememba, ročni diff pregled, ročni commit in kontroliran push v zasebni testni repozitorij.
  • Končno stanje: lokalni main se ujema z origin/main; zadnji testni commit je 8e7ae5a; reboot ni zahtevan.
  • Potrjen varen način dela: Claude pripravi spremembo lokalno → skrbnik pregleda diff → lokalno testiranje → ročni commit → ročni push.

2026-07-29 — Reboot + DIUN updates: BentoPDF, FileBrowser, Gitea

  • Controlled reboot performed after unattended-upgrade updated libc6 and created /var/run/reboot-required.
  • Post-reboot verification confirmed kernel 6.8.0-136-generic, REBOOT REQUIRED no, no pending APT upgrades, and core services healthy.
  • BentoPDF updated from image sha256:eaeea1e4... to sha256:165113f4....
  • BentoPDF compose path: /srv/bentopdf/docker-compose.yml.
  • BentoPDF backup created before change: /srv/backups/bentopdf-update-2026-07-29-074840.
  • BentoPDF rollback tag: bentopdfteam/bentopdf:rollback-2026-07-29-074840.
  • An earlier interrupted BentoPDF backup attempt created /srv/backups/bentopdf-update-2026-07-29-073652; it was not used for rollback.
  • FileBrowser updated from image sha256:b1d9980d... to sha256:a469ea07....
  • FileBrowser compose path: /var/lib/docker/volumes/portainer_data/_data/compose/2.
  • FileBrowser compose files: docker-compose.yml and docker-compose.healthcheck-override.yml.
  • FileBrowser backup created before change: /srv/backups/filebrowser-update-2026-07-29-082338.
  • FileBrowser config/database backup: /srv/backups/filebrowser-update-2026-07-29-082338/filebrowser-config-database.tar.gz.
  • FileBrowser rollback tag: filebrowser/filebrowser:rollback-2026-07-29-082338.
  • FileBrowser log after update showed a project notice: File Browser is being wound down and archived on 2026-09-01; replacement planning should be tracked separately.
  • Gitea updated from image sha256:7dff60d7... to sha256:34e3f6b7....
  • Gitea version changed from 1.27.0 to 1.27.1.
  • Gitea compose path: /srv/gitea/docker-compose.yml.
  • Gitea backup created before change: /srv/backups/gitea-update-2026-07-29-082611.
  • Gitea data backup: /srv/backups/gitea-update-2026-07-29-082611/gitea-data.tar.gz.
  • Gitea rollback tag: gitea/gitea:rollback-2026-07-29-082611.
  • Updates were completed with backup files, Docker inspect snapshots, rollback image tags, service-only recreates, and post-update HTTP checks.
  • Final verification passed: Runbook public HTTP 200, Gitea public/local HTTP 200, FileBrowser HTTP 200, BentoPDF HTTP 200, Vikunja HTTP 200, Immich HTTP 200, Vaultwarden HTTP 200, GLPI HTTP 200, osTicket HTTP 200, Navidrome HTTP 302, Stirling PDF HTTP 401 expected due login.
  • No reboot required after final verification.

2026-07-27 — DIUN update: FileBrowser + Vaultwarden

  • FileBrowser updated from image sha256:c4c627f6... to sha256:b1d9980d....
  • FileBrowser compose path: /var/lib/docker/volumes/portainer_data/_data/compose/2.
  • FileBrowser compose files: docker-compose.yml and docker-compose.healthcheck-override.yml.
  • FileBrowser backup created before change: /srv/backups/filebrowser-update-2026-07-27-124708.
  • FileBrowser config/database backup: /srv/backups/filebrowser-update-2026-07-27-124708/filebrowser-config-database.tar.gz.
  • FileBrowser rollback tag: filebrowser/filebrowser:rollback-2026-07-27-124708.
  • Vaultwarden updated from image sha256:9a8eec71... to sha256:e6443e3d....
  • Vaultwarden version after update: 1.37.0.
  • Vaultwarden compose path: /srv/vaultwarden/docker-compose.yml.
  • Vaultwarden backup created before change: /srv/backups/vaultwarden-update-2026-07-27-124936.
  • Vaultwarden data backup: /srv/backups/vaultwarden-update-2026-07-27-124936/vaultwarden-data.tar.gz. This archive contains vault data and must not be shared.
  • Vaultwarden rollback tag: vaultwarden/server:rollback-2026-07-27-124936.
  • Vaultwarden was stopped before creating the data backup to keep the backup consistent, then recreated with the new image.
  • Final verification passed: FileBrowser healthy + HTTP 200, Vaultwarden healthy + HTTP 200, Runbook HTTP 200, Gitea HTTP 200, Vikunja HTTP 200, Immich HTTP 200, BentoPDF HTTP 200, GLPI HTTP 200, osTicket HTTP 200, Navidrome HTTP 302, Stirling PDF HTTP 401 expected due login.
  • No reboot required after final verification.

2026-07-22 — DIUN update: Immich Valkey 9

  • Immich Valkey cache container updated from image sha256:8e8d64b4... to sha256:3acc0687....
  • Updated image reference in compose: docker.io/valkey/valkey:9@sha256:3acc0687f2a2e1091fae6450d7842dd658c941338cf0a873ddd9e14b9e4ea4dd.
  • Valkey version after update: 9.1.1.
  • Compose path: /srv/immich/app/docker-compose.yml.
  • Updated service: redis; container: immich_redis.
  • Only the Valkey/Redis cache service was recreated; immich_server, immich_postgres, and immich_machine_learning remained running and healthy.
  • Backup created before change: /srv/backups/immich-valkey9-update-2026-07-22-113612.
  • Backed up compose file, .env if present, and Docker inspect files. These backup files may contain sensitive configuration and must not be shared publicly.
  • Rollback tag: valkey/valkey:rollback-immich-2026-07-22-113612.
  • Safe update procedure used: verify pinned digest, backup configuration, create rollback image tag, patch compose digest, validate docker compose config, pull pinned image, and recreate only the redis service with --no-deps.
  • Initial immich_server logs showed temporary getaddrinfo ENOTFOUND redis messages during the Redis/Valkey recreate window.
  • Follow-up verification confirmed immich_redis healthy, immich_server healthy, Immich HTTP 200, and no new Redis/error lines in the last 2 minutes.
  • No reboot required after final verification.

2026-07-21 — DIUN update: RustDesk server

  • RustDesk server updated from image sha256:10818ec05... to sha256:8ecdab65....
  • Updated image: rustdesk/rustdesk-server:latest.
  • Updated containers: hbbs and hbbr.
  • Both containers use --network host, --restart unless-stopped, and mount /srv/rustdesk to /root.
  • Container commands confirmed before update: hbbs uses hbbs; hbbr uses hbbr.
  • Backup created before change: /srv/backups/rustdesk-server-update-2026-07-21-123315.
  • RustDesk data backup: /srv/backups/rustdesk-server-update-2026-07-21-123315/rustdesk-data.tar.gz. This archive contains RustDesk key material and must not be shared.
  • Rollback tag: rustdesk/rustdesk-server:rollback-2026-07-21-123315.
  • Final listener checks passed: 21115/tcp, 21116/tcp, 21116/udp, and 21117/tcp.
  • The new RustDesk server also listens locally on websocket ports 21118/tcp and 21119/tcp; these were not opened in UFW because the standard RustDesk setup currently uses 21115–21117.
  • UFW rules for 21115/tcp, 21116/tcp, 21116/udp, and 21117/tcp remained present.
  • Logs confirmed hbbs loaded its private key from id_ed25519; log key output was masked during final verification and should not be pasted publicly.
  • RustDesk client connection test passed after the update.
  • Other post-checks passed: Runbook public HTTP 200, Gitea public HTTP 200, Vikunja HTTP 200, Immich HTTP 200, FileBrowser HTTP 200, BentoPDF HTTP 200, GLPI HTTP 200, osTicket HTTP 200, Navidrome HTTP 302, Stirling PDF HTTP 401 expected due login.
  • No reboot required after final verification.

2026-07-20 — DIUN update: Vikunja app

  • Vikunja app updated from image sha256:f6b80393... to sha256:1a5dd2d4....
  • Vikunja version updated from v2.3.0 to v2.4.0.
  • Compose path: /var/lib/docker/volumes/portainer_data/_data/compose/8/docker-compose.yml.
  • Updated service: vikunja; container: vikunja.
  • Database service vikunja-db was left untouched and remained healthy on postgres:18 / PostgreSQL 18.4.
  • Backup created before change: /srv/backups/vikunja-app-update-2026-07-20-095134.
  • Logical DB dump before app update: /srv/backups/vikunja-app-update-2026-07-20-095134/vikunja-db-before-app-update.sql.gz.
  • Vikunja files backup: /srv/backups/vikunja-app-update-2026-07-20-095134/vikunja-files-before-app-update.tar.gz.
  • Rollback tag: vikunja/vikunja:rollback-2026-07-20-095134.
  • Safe app update procedure used: backup compose/inspect files, create rollback image tag, create fresh DB dump, pull the new app image, recreate only the vikunja app container with --no-deps.
  • Vikunja migrations ran successfully after the app update.
  • Log note: No license key configured. Pro features have been disabled. is expected when running without a Pro license.
  • Log note: schema link warnings were observed during startup, but HTTP checks and migrations passed.
  • Final post-checks passed: Runbook public HTTP 200, Gitea public HTTP 200, Vikunja HTTP 200, Immich HTTP 200, FileBrowser HTTP 200, BentoPDF HTTP 200, GLPI HTTP 200, osTicket HTTP 200, Navidrome HTTP 302, Stirling PDF HTTP 401 expected due login.
  • No reboot required after final verification; no APT packages were pending.

2026-07-20 — APT update, controlled reboot + Vikunja Postgres 18

  • APT upgrade completed successfully after pre-checks showed reboot required for linux-image-6.8.0-136-generic and linux-base.
  • APT upgrade log: /srv/backups/apt-upgrade-2026-07-20-075413.log.
  • Packages upgraded: docker-ce, docker-ce-cli, docker-ce-rootless-extras, and tailscale.
  • Docker server updated from 29.6.1 to 29.6.2.
  • Tailscale updated from 1.98.8 to 1.98.9.
  • Docker Compose remained on v5.3.1; containerd remained on 2.2.6.
  • Docker engine restart during the APT upgrade caused a short warmup period; Immich, GLPI and Stirling PDF initially returned HTTP 000 but were OK after warmup.
  • Controlled reboot completed after the kernel update.
  • Kernel before reboot: 6.8.0-134-generic.
  • Kernel after reboot: 6.8.0-136-generic.
  • /var/run/reboot-required cleared after reboot.
  • Weekly config backup before maintenance was present and verified: /srv/backups/weekly/2026-07-19-041855 (52M).
  • Vikunja database updated on postgres:18 from image sha256:48ebba8b... to sha256:3a82e1f5....
  • Vikunja DB is running PostgreSQL 18.4.
  • Vikunja compose service names confirmed: DB service db, app service vikunja; fixed container names vikunja-db and vikunja.
  • Vikunja DB persistent mount confirmed: /srv/vikunja/db/var/lib/postgresql.
  • Vikunja Postgres backup created: /srv/backups/vikunja-postgres18-update-2026-07-20-090121.
  • Logical DB dump: /srv/backups/vikunja-postgres18-update-2026-07-20-090121/vikunja-db-all-databases.sql.gz.
  • Bind mount backup: /srv/backups/vikunja-postgres18-update-2026-07-20-090121/vikunja-db-bind.tar.gz.
  • Vikunja Postgres rollback tag: postgres:rollback-vikunja-2026-07-20-090121.
  • Safe Vikunja procedure used: stop app, create logical dump and bind backup, remove/recreate only the DB container while keeping /srv/vikunja/db, then remove/recreate the app container to refresh Docker DNS/network resolution.
  • Final post-checks passed: Runbook public HTTP 200, Gitea public HTTP 200, Vikunja HTTP 200, Immich HTTP 200, FileBrowser HTTP 200, BentoPDF HTTP 200, GLPI HTTP 200, osTicket HTTP 200, Navidrome HTTP 302, Stirling PDF HTTP 401 expected due login.
  • APT state after maintenance: no upgradable packages and dpkg --audit clean.
  • No reboot required after final verification.

2026-07-15 — DIUN update: Immich Valkey 9

  • Immich Valkey updated from image sha256:e30fbdc8... to sha256:8e8d64b....
  • Valkey version after update: 9.1.0.
  • Compose path: /srv/immich/app/docker-compose.yml.
  • The Valkey image is pinned by digest in compose; digest was updated from sha256:e30fbdc8... to sha256:8e8d64b....
  • Updated service: redis; container: immich_redis.
  • No persistent Valkey mount was present; only the cache container was recreated.
  • Backup created before change: /srv/backups/immich-valkey9-update-2026-07-15-120505.
  • Backup compose file: /srv/backups/immich-valkey9-update-2026-07-15-120505/docker-compose.yml.before.
  • Rollback tag: valkey/valkey:rollback-immich-2026-07-15-120505.
  • docker compose config -q passed after the digest change.
  • Post-checks passed: immich_redis healthy, immich_server healthy, Immich HTTP 200.
  • Temporary Redis connection errors were seen in immich_server logs while Valkey was restarting; follow-up check showed no recent Redis/error lines in the last 5 minutes.
  • Other post-checks passed: Runbook public HTTP 200, Gitea public HTTP 200, Vikunja HTTP 200, FileBrowser HTTP 200, BentoPDF HTTP 200, GLPI HTTP 200, osTicket HTTP 200, Navidrome HTTP 302, Stirling PDF HTTP 401 expected due login.
  • No reboot required after this update.

2026-07-14 — Vikunja config cleanup: jwtsecret → secret

  • Resolved non-urgent Vikunja warning about deprecated service.jwtsecret.
  • Compose file updated at /var/lib/docker/volumes/portainer_data/_data/compose/8/docker-compose.yml.
  • Environment key renamed from VIKUNJA_SERVICE_JWTSECRET to VIKUNJA_SERVICE_SECRET.
  • The secret value was preserved and was not printed in terminal output or added to the runbook.
  • Backup created before change: /srv/backups/vikunja-jwtsecret-migration-2026-07-14-113353.
  • Backup compose file: /srv/backups/vikunja-jwtsecret-migration-2026-07-14-113353/docker-compose.yml.before.
  • docker compose config -q passed after the change.
  • Only the Vikunja app container was recreated; the PostgreSQL container and data were not changed.
  • Post-checks passed: Vikunja HTTP 200, Runbook public HTTP 200, Gitea public HTTP 200, FileBrowser HTTP 200, BentoPDF HTTP 200, GLPI HTTP 200, osTicket HTTP 200, Navidrome HTTP 302, Stirling PDF HTTP 401 expected due login.
  • Recent Vikunja logs no longer show the deprecated jwtsecret warning.
  • No reboot required after this configuration cleanup.

2026-07-14 — DIUN updates: Gitea + Vikunja Postgres 18

  • Gitea updated from image sha256:8e25c717... to sha256:7dff60d7....
  • Gitea version after update: 1.27.0.
  • Gitea compose path: /srv/gitea/docker-compose.yml.
  • Gitea persistent mount confirmed: /srv/gitea/data/data.
  • Gitea backup created: /srv/backups/gitea-update-2026-07-14-094022.
  • Gitea data backup: /srv/backups/gitea-update-2026-07-14-094022/gitea-data.tar.gz.
  • Gitea rollback tag: gitea/gitea:rollback-2026-07-14-094022.
  • Vikunja database updated on postgres:18 from image sha256:22c89fe0... to sha256:48ebba8b....
  • Vikunja DB is running PostgreSQL 18.4.
  • Vikunja compose services confirmed: DB service db, app service vikunja; fixed container names vikunja-db and vikunja.
  • Vikunja DB persistent mount confirmed: /srv/vikunja/db/var/lib/postgresql.
  • Vikunja Postgres backup created: /srv/backups/vikunja-postgres18-update-2026-07-14-095355.
  • Logical DB dump: /srv/backups/vikunja-postgres18-update-2026-07-14-095355/vikunja-db-all-databases.sql.gz.
  • Bind mount backup: /srv/backups/vikunja-postgres18-update-2026-07-14-095355/vikunja-db-bind.tar.gz.
  • Vikunja Postgres rollback tag: postgres:rollback-vikunja-2026-07-14-095355.
  • Safe Vikunja procedure used: stop app, create logical dump and bind backup, remove/recreate only the DB container while keeping /srv/vikunja/db, then remove/recreate the app container to refresh Docker DNS/network resolution.
  • Post-checks passed: Gitea local/public HTTP 200, Runbook public HTTP 200, Vikunja HTTP 200, FileBrowser HTTP 200, BentoPDF HTTP 200, GLPI HTTP 200, osTicket HTTP 200, Navidrome HTTP 302, Stirling PDF HTTP 401 expected due login.
  • Note: Vikunja logged a non-urgent warning that service.jwtsecret is deprecated because both service.secret and service.jwtsecret are set. No change was made during this update.

2026-07-13 — OS updates + controlled reboot

  • APT upgrade completed successfully: 16 packages upgraded, 0 remaining upgradable packages.
  • Upgrade log: /srv/backups/apt-upgrade-2026-07-13-071702.log.
  • Important package updates:
    • containerd.io updated to 2.2.6.
    • docker-compose-plugin updated to 5.3.1.
    • Docker server remained on 29.6.1.
  • Controlled reboot completed after kernel update.
  • Kernel before reboot: 6.8.0-124-generic.
  • Kernel after reboot: 6.8.0-134-generic.
  • /var/run/reboot-required cleared after reboot.
  • Docker containers restarted automatically after reboot; services became healthy after warmup.
  • Post-checks passed: FileBrowser HTTP 200, BentoPDF HTTP 200, GLPI HTTP 200, osTicket HTTP 200, Vikunja HTTP 200, Navidrome HTTP 302, Stirling PDF HTTP 401 expected due login, Runbook public HTTP 200.
  • Note: GLPI and Stirling PDF initially returned HTTP 000 immediately after reboot while containers were still starting; both were OK after warmup.

2026-07-10 — DIUN update: Navidrome

  • Navidrome updated from image sha256:60080f8... to sha256:7c43af9....
  • Navidrome version after update: 0.63.1.
  • Compose path: /srv/navidrome/docker-compose.yml.
  • Persistent mounts confirmed:
    • /srv/navidrome/data/data
    • /srv/navidrome/music/music
  • Backup created: /srv/backups/navidrome-update-2026-07-10-120726.
  • Data backup: /srv/backups/navidrome-update-2026-07-10-120726/navidrome-data.tar.gz.
  • Rollback tag: deluan/navidrome:rollback-2026-07-10-120726.
  • Post-checks passed: Navidrome local HTTP 302, server ready, scan completed, FileBrowser HTTP 200, osTicket HTTP 200, GLPI HTTP 200, BentoPDF HTTP 200, Vikunja HTTP 200, Stirling PDF HTTP 401 expected due login.

2026-07-09 — DIUN update: Navidrome

  • Navidrome updated from image sha256:c4b5cb36... to sha256:60080f8....
  • Compose path: /srv/navidrome/docker-compose.yml.
  • Persistent mounts confirmed:
    • /srv/navidrome/data/data
    • /srv/navidrome/music/music
  • Backup created: /srv/backups/navidrome-update-2026-07-09-092524.
  • Data backup: /srv/backups/navidrome-update-2026-07-09-092524/navidrome-data.tar.gz.
  • Rollback tag: deluan/navidrome:rollback-2026-07-09-092524.
  • Post-checks passed: Navidrome local HTTP 302, server ready, scan completed, FileBrowser HTTP 200, osTicket HTTP 200, GLPI HTTP 200, BentoPDF HTTP 200, Vikunja HTTP 200.
  • Related DIUN alert for Stirling PDF was checked; no update was needed because local and remote digest already matched sha256:7ed4d968....

2026-07-09 — DIUN updates: Stirling PDF + Vikunja Postgres 18

  • Stirling PDF updated from image sha256:a6c5e627... to sha256:7ed4d968....
  • Vikunja database updated on postgres:18 from image sha256:4efc78b... to sha256:22c89fe0....
  • Vikunja DB is running PostgreSQL 18.4; app migrations completed successfully.
  • Backups created:
    • /srv/backups/stirling-pdf-update-2026-07-08-132427
    • /srv/backups/vikunja-postgres18-update-retry-2026-07-08-135618
    • Logical DB dump: /srv/backups/vikunja-postgres18-update-retry-2026-07-08-135618/vikunja-db-all-databases.sql.gz
    • /srv/backups/vikunja-postgres18-container-recreate-2026-07-08-144726
    • Bind mount backup: /srv/backups/vikunja-postgres18-container-recreate-2026-07-08-144726/vikunja-db-bind.tar.gz
    • /srv/backups/vikunja-app-container-recreate-2026-07-09-075349
  • Rollback tags:
    • stirlingtools/stirling-pdf:rollback-2026-07-08-132427
    • postgres:rollback-vikunja-2026-07-08-135618
    • postgres:rollback-vikunja-before-container-recreate-2026-07-08-144727
  • Important Vikunja note: compose services are db and vikunja, but fixed container names are vikunja-db and vikunja. During this update, docker compose up --force-recreate hit container name conflicts. The safe working procedure was to stop the app, remove/recreate only the DB container while keeping /srv/vikunja/db, then remove/recreate only the app container to refresh Docker DNS/network resolution.
  • Post-checks passed: Vikunja HTTP 200, Stirling PDF Tailscale/Public HTTP 401 expected due login, FileBrowser HTTP 200, osTicket HTTP 200, GLPI HTTP 200, BentoPDF HTTP 200.

2026-07-06 — DIUN updates: FileBrowser + osTicket MariaDB

  • FileBrowser updated from image sha256:271ec822... to sha256:c4c627f....
  • osTicket database updated on mariadb:10.11 from image sha256:5a5c675... to sha256:be981e....
  • osTicket MariaDB version after update: 10.11.18-MariaDB-ubu2204.
  • Backups created:
    • /srv/backups/filebrowser-update-root-2026-07-06-074037
    • /srv/backups/osticket-mariadb-update-2026-07-06-074521
    • Logical DB dump: /srv/backups/osticket-mariadb-update-2026-07-06-074521/osticket-db-all-databases.sql.gz
  • Rollback tags:
    • filebrowser/filebrowser:rollback-2026-07-06-074037
    • mariadb:rollback-osticket-2026-07-06-074521
  • Post-checks passed: FileBrowser HTTP 200, osTicket HTTP 200, GLPI HTTP 200, BentoPDF HTTP 200, Stirling PDF HTTP 401 expected due login.

🔔 DIUN updates — FileBrowser + BentoPDF — 2026-06-29

DIUN file provider je javil nova image digesta za filebrowser/filebrowser:latest in bentopdfteam/bentopdf:latest. Oba servisa sta bila posodobljena z backupom, rollback tagom in HTTP preverjanjem.

ServisPodatekVrednost
FileBrowserCompose path/var/lib/docker/volumes/portainer_data/_data/compose/2
FileBrowserOld imagesha256:a6653eb79ecf8312f4f6bf0d0adf65d81016f17a92d64d5b2562340984e39405
FileBrowserNew imagesha256:271ec822a03112ee8d2fc7042e8434995dfa74421e6a48e031be68c88fcded1c
FileBrowserBackup/srv/backups/filebrowser-update-2026-06-29-071113
FileBrowserRollback tagfilebrowser/filebrowser:rollback-2026-06-29-071113
FileBrowserPost-checkrunning, healthy, HTTP 200
BentoPDFCompose path/srv/bentopdf/docker-compose.yml
BentoPDFOld imagesha256:2d867aacb8ab5b196d00ee86944b1899d09d72df355384c5e15cf974737963a0
BentoPDFNew imagesha256:eaeea1e447205a79cb61d7efdc6966f37311dc1bc9c36a3a5c897bf79107c2c3
BentoPDFBackup/srv/backups/bentopdf-update-2026-06-29-071716
BentoPDFRollback tagbentopdfteam/bentopdf:rollback-2026-06-29-071716
BentoPDFPost-checkrunning, HTTP 200
Rezultat: oba servisa sta po posodobitvi dosegljiva prek Tailscale naslovov: FileBrowser na http://100.74.84.18:8090 in BentoPDF na http://100.74.84.18:8097.
Opomba: pri FileBrowser updateu je prvi docker compose up --force-recreate naletel na conflict obstoječega container imena. Popravljeno je bilo s kontroliranim docker rm -f filebrowser in ponovnim ustvarjanjem iz Portainer compose datotek. Podatki so ostali varni, ker so na bind mountih /srv/filebrowser in /srv/navidrome/music, ne v containerju.
# FileBrowser quick check
docker inspect filebrowser --format 'IMAGE={{.Image}} STATUS={{.State.Status}} HEALTH={{if .State.Health}}{{.State.Health.Status}}{{else}}none{{end}}'
curl -sS -o /dev/null -w '%{http_code}\n' --max-time 10 http://100.74.84.18:8090

# FileBrowser rollback
cd /var/lib/docker/volumes/portainer_data/_data/compose/2
docker rm -f filebrowser
docker tag filebrowser/filebrowser:rollback-2026-06-29-071113 filebrowser/filebrowser:latest
docker compose -f docker-compose.yml -f docker-compose.healthcheck-override.yml up -d filebrowser

# BentoPDF quick check
docker inspect bentopdf --format 'IMAGE={{.Image}} STATUS={{.State.Status}}'
curl -sS -o /dev/null -w '%{http_code}\n' --max-time 10 http://100.74.84.18:8097

# BentoPDF rollback
cd /srv/bentopdf
docker rm -f bentopdf
docker tag bentopdfteam/bentopdf:rollback-2026-06-29-071716 bentopdfteam/bentopdf:latest
docker compose up -d bentopdf

🧹 Backup retention policy update — 2026-06-24

Urejena je bila politika čiščenja backupov, da se na strežniku ne nabira preveč ročnih update backup map. Weekly config/admin backupi in ročni *-update-* backupi se zdaj obravnavajo ločeno.

PostavkaVrednost
Weekly backup script/usr/local/sbin/nemac-weekly-backup
Weekly servicenemac-weekly-backup.service
Weekly timernemac-weekly-backup.timer
Weekly backup path/srv/backups/weekly
Weekly retention6 weekly backupov
Weekly override/etc/systemd/system/nemac-weekly-backup.service.d/override.conf
Manual update retention script/usr/local/sbin/nemac-manual-update-backup-retention
Manual update retention servicenemac-manual-update-backup-retention.service
Manual update retention timernemac-manual-update-backup-retention.timer
Manual retention log path/var/log/nemac-backup-retention
Systemd config backup/srv/backups/manual-update-retention-systemd-2026-06-24-111959
Weekly retention config backup/srv/backups/backup-retention-config-2026-06-24-110937
Manual *-update-* politika: backupi mlajši od 14 dni se obdržijo, najnovejši update backup po posamezni storitvi se obdrži, backupi starejši od 45 dni pa se izbrišejo tudi, če so zadnji za posamezni prefix.
Pomembno: manual update retention skripta namenoma čisti samo varni top-level pattern /srv/backups/*-update-YYYY-MM-DD*. Ne čisti /srv/backups/weekly, baseline backupov, GLPI before/after backupov, Minecraft dnevnih backupov ali drugih posebnih map.
# Weekly backup retention status
systemctl cat nemac-weekly-backup.service
systemctl status nemac-weekly-backup.timer --no-pager
RETENTION=6 /usr/local/sbin/nemac-weekly-backup --dry-run

# Manual update backup retention status
systemctl status nemac-manual-update-backup-retention.timer --no-pager
systemctl list-timers --all --no-pager | grep -E 'nemac-weekly-backup|nemac-manual-update-backup-retention'
sudo /usr/local/sbin/nemac-manual-update-backup-retention --dry-run

# Manual update retention rollback
sudo systemctl disable --now nemac-manual-update-backup-retention.timer
sudo rm -f /etc/systemd/system/nemac-manual-update-backup-retention.service
sudo rm -f /etc/systemd/system/nemac-manual-update-backup-retention.timer
sudo systemctl daemon-reload

# Weekly retention rollback na default iz skripte
sudo rm -f /etc/systemd/system/nemac-weekly-backup.service.d/override.conf
sudo systemctl daemon-reload
systemctl show nemac-weekly-backup.service -p Environment

🐘 Vikunja Postgres update — 2026-06-24

DIUN file provider je javil update za postgres:18. Ugotovljeno je bilo, da ta image uporablja vikunja-db, ne Immich. Update je bil izveden previdno z logičnim PostgreSQL dumpom, rollback tagom in kratkim restartom Vikunja stacka.

PostavkaVrednost
App containervikunja
DB containervikunja-db
Compose projectvikunja
DB servicedb
App servicevikunja
Portainer compose path/var/lib/docker/volumes/portainer_data/_data/compose/8
Compose filesdocker-compose.yml, docker-compose.healthcheck-override.yml
DB imagepostgres:18
Old DB imagesha256:65f70a152846cf504dff86e807007e9aeac98c3aeb7b62541b2c55ab9d264e56
New DB imagesha256:4efc78b0491e2d66547dc968c5fed5b0b805d79ed034fc632c4989f372722ea9
PostgreSQL versionPostgreSQL 18.4
DB bind mount/srv/vikunja/db -> /var/lib/postgresql
Vikunja local URLhttp://127.0.0.1:3456
Backup/srv/backups/vikunja-postgres18-update-2026-06-24-093455
Rollback tagpostgres:rollback-vikunja-2026-06-24-093455
Rezultat: Postgres image za vikunja-db je bil posodobljen. Baza je po updateu healthy, pg_isready vrača accepting connections, Vikunja lokalni endpoint http://127.0.0.1:3456 pa vrača HTTP 200.
Opomba: backup vsebuje logični PostgreSQL dump, compose datoteke in inspect podatke. Ker inspect/compose lahko vsebujeta okoljske vrednosti, mora backup ostati zaščiten.
# Preverjanje Vikunja stacka
cd /var/lib/docker/volumes/portainer_data/_data/compose/8
sudo docker compose -p vikunja -f docker-compose.yml -f docker-compose.healthcheck-override.yml ps
sudo docker exec vikunja-db sh -lc 'pg_isready'
curl -sS -o /dev/null -w "Vikunja_LOCAL_HTTP=%{http_code}\n" http://127.0.0.1:3456 --max-time 15

# Rollback po neuspešnem DB image updateu
cd /var/lib/docker/volumes/portainer_data/_data/compose/8
sudo docker tag postgres:rollback-vikunja-2026-06-24-093455 postgres:18
sudo docker compose -p vikunja -f docker-compose.yml -f docker-compose.healthcheck-override.yml up -d --no-deps --force-recreate db
sudo docker compose -p vikunja -f docker-compose.yml -f docker-compose.healthcheck-override.yml up -d --force-recreate vikunja

📁 FileBrowser update — 2026-06-24

DIUN file provider je javil update za filebrowser/filebrowser:latest. FileBrowser je nameščen kot Portainer stack in je dostopen samo preko Tailscale omrežja.

PostavkaVrednost
URLhttp://100.74.84.18:8090
Containerfilebrowser
Compose projectfilebrowser
Portainer compose path/var/lib/docker/volumes/portainer_data/_data/compose/2
Compose filesdocker-compose.yml, docker-compose.healthcheck-override.yml
Imagefilebrowser/filebrowser:latest
Old imagesha256:9805b21cf910f3ef6f4a1c8f441f1dd6cc4197136f9541fe2a1ab6d050706e4b
New imagesha256:a6653eb79ecf8312f4f6bf0d0adf65d81016f17a92d64d5b2562340984e39405
Port bind100.74.84.18:8090 -> 80/tcp
Backup/srv/backups/filebrowser-update-2026-06-24-091525
Rollback tagfilebrowser/filebrowser:rollback-2026-06-24-091525
Rezultat: FileBrowser je bil posodobljen preko Portainer compose stacka. Container je po posodobitvi postal healthy, endpoint http://100.74.84.18:8090 pa vrača HTTP 200.
# Preverjanje FileBrowser
sudo docker ps --filter name=filebrowser
curl -sS -o /dev/null -w "FileBrowser_HTTP=%{http_code}\n" http://100.74.84.18:8090 --max-time 15

# Compose / Portainer stack
cd /var/lib/docker/volumes/portainer_data/_data/compose/2
sudo docker compose -p filebrowser -f docker-compose.yml -f docker-compose.healthcheck-override.yml ps

# Rollback po neuspešnem updateu
cd /var/lib/docker/volumes/portainer_data/_data/compose/2
sudo docker tag filebrowser/filebrowser:rollback-2026-06-24-091525 filebrowser/filebrowser:latest
sudo docker compose -p filebrowser -f docker-compose.yml -f docker-compose.healthcheck-override.yml up -d --force-recreate filebrowser

🧾 GLPI lab install — 2026-06-23

Nameščen je bil testni/lab GLPI sistem za preverjanje asset managementa in helpdesk funkcij. Servis je dostopen samo preko Tailscale omrežja.

PostavkaVrednost
URLhttp://100.74.84.18:8099
Project path/srv/glpi
Compose/srv/glpi/docker-compose.yml
Compose projectglpi
App containerglpi
DB containerglpi-db
App imageglpi/glpi:latest / sha256:7e100562afe13cce132fe46c0a21ddb94f7ed2c06950da9c4b34ce734a1ad4ac
DB imagemysql:8.4 / sha256:563602a18ffd5be220968e8508d84c9dcd80fbffe69e28af51572db29e3285b2
RuntimeApache/2.4.67, PHP 8.5.7, MySQL 8.4.10
Port bind100.74.84.18:8099 -> 80/tcp
UFW8099/tcp on tailscale0
Tailscale ACL100.74.84.18:8099 dodan v ACL.
Volumesglpi_glpi_data, glpi_db_data
Baseline backup/srv/backups/glpi-baseline-2026-06-23-150643
Rezultat: GLPI se je uspešno namestil, auto-install je bil uspešen, default uporabniki so bili zavarovani, opozorilo za privzeta gesla je izginilo, endpoint http://100.74.84.18:8099 vrača HTTP 200, baza pa vrne mysqld is alive.
Opomba: datoteka /srv/glpi/.env vsebuje lokalno generirana gesla in se ne sme deliti. Backup glpi-project.tar.gz vsebuje tudi .env, zato mora ostati zaščiten.
# Preverjanje GLPI
sudo docker ps --filter name=glpi
curl -sS -o /dev/null -w "GLPI_HTTP=%{http_code}\n" http://100.74.84.18:8099 --max-time 20
sudo docker exec glpi-db sh -lc 'MYSQL_PWD="$MYSQL_ROOT_PASSWORD" mysqladmin ping -uroot --silent'

# Compose
cd /srv/glpi
sudo docker compose -p glpi --env-file .env -f docker-compose.yml ps

# Rollback, če se GLPI lab opusti
cd /srv/glpi && sudo docker compose -p glpi --env-file .env -f docker-compose.yml down -v
sudo rm -rf /srv/glpi
sudo ufw delete allow in on tailscale0 to any port 8099 proto tcp
# Tailscale ACL: odstrani 100.74.84.18:8099

📨 GLPI mail-to-ticket automation — 2026-06-24

Nastavljena je bila avtomatska obdelava e-mailov v GLPI lab okolju. Testni mailbox se pobira prek GLPI mail receiverja, mailgate pa se samodejno zaganja s systemd timerjem.

PostavkaVrednost
GLPI URLhttp://100.74.84.18:8099
Mail receiverGLPI Gmail test receiver
IMAP serverimap.gmail.com:993, IMAP, SSL, VALIDATE-CERT
Mail foldersINBOX, GLPI-accepted, GLPI-refused
Ticket routingMail receiver rule preusmeri nove tickete v Root entity > CPK Lab.
CPK domain mail rule — 2026-06-24Pravilo je omejeno na pošiljatelje z domeno @cpk.si. Kriterij: From email address, regular expression matches, regex /@cpk\.si([>\s]|$)/i.
Domain restriction testZunanji testni mail TEST external blocked je šel v GLPI-refused in ni ustvaril ticketa. Mail iz @cpk.si z zadevo TEST CPK allowed je šel v GLPI-accepted in ustvaril ticket.
Backup pred domeno/srv/backups/glpi-before-cpk-domain-mail-rule-2026-06-24-134805
Backup po domeni/srv/backups/glpi-after-cpk-domain-mail-rule-working-2026-06-24-135627
Anonymous receiver settingAllow anonymous ticket creation (receiver) = Yes; Allow anonymous followups (receiver) = No.
Automatic actionmailgate je nastavljen na CLI.
Systemd script/usr/local/sbin/glpi-mailgate-run
Systemd serviceglpi-mailgate.service
Systemd timerglpi-mailgate.timer
Timer scheduleOnCalendar=*:0/10, AccuracySec=30s, Persistent=true
Delujoč testTestni mail TEST GLPI timer auto je bil avtomatsko pobran, premaknjen v GLPI-accepted in ustvaril GLPI ticket.
Backup po receiver testu/srv/backups/glpi-after-mail-receiver-working-2026-06-24-131144
Backup po timer testu/srv/backups/glpi-after-mailgate-timer-working-2026-06-24-132324
Rezultat: e-mail-to-ticket tok deluje end-to-end: Gmail inbox → systemd timer → GLPI mailgate → GLPI-accepted → GLPI ticket.
Varnostna opomba: Gmail app password in druga gesla niso zapisana v runbooku. Nastavitev Allow anonymous ticket creation (receiver) je v lab okolju omogočena zato, da lahko GLPI sprejme e-mail tudi, če pošiljatelj še nima pravilno dodeljenega profila v entiteti. Sprejem ticketov je dodatno omejen z mail receiver pravilom na domeno @cpk.si. Pri produkcijski uvedbi je priporočeno uporabnike povezati z AD/LDAP in jim dodeliti ustrezne pravice v pravi entiteti.
# Preverjanje GLPI mailgate timerja
systemctl is-enabled glpi-mailgate.timer
systemctl is-active glpi-mailgate.timer
systemctl list-timers --all | grep -i glpi || true
sudo journalctl -u glpi-mailgate.service -n 30 --no-pager

# Ročni force test mailgate receiverja
sudo docker exec -u www-data glpi sh -lc 'cd /var/www/glpi && php front/cron.php --debug --force mailgate; echo "EXIT=$?"'

# Rollback CPK domain omejitve, če je treba začasno sprejeti vse pošiljatelje
# V GLPI mail assignment rule vrni kriterij:
# Subject email header / regular expression matches / .*/
# Action ostane: Entity = Root entity > CPK Lab

# Rollback timerja, če avtomatsko pobiranje mailov ni več zaželeno
sudo systemctl disable --now glpi-mailgate.timer
sudo rm -f /etc/systemd/system/glpi-mailgate.timer /etc/systemd/system/glpi-mailgate.service /usr/local/sbin/glpi-mailgate-run
sudo systemctl daemon-reload

🎫 osTicket update — 2026-06-22

DIUN file provider je javil update za rinkp/osticket-dockerized:latest. Preverjanje digestov je potrdilo, da je remote image novejši od lokalnega, zato je bil izveden varen update samo za osTicket app servis osticket. Podatkovni servis osticket-db ni bil posodobljen.

PostavkaVrednost
Prejšnji imagesha256:31724b51e74793bf5e47fb2af10cb71338221ac1e8b375075b28df4bdbe02513
Novi imagesha256:f8244c3fb27ad8d36125d2f705541a852af840819f2ab6a4c0f31b79273a2d2a
Runtime po update-uApache/2.4.67, PHP/8.4.22
Compose/srv/osticket/docker-compose.yml
Backup/srv/backups/osticket-update-2026-06-22-094620
Rollback tagrinkp/osticket-dockerized:rollback-2026-06-22-094620
Končno stanjeosticket in osticket-db sta healthy. Endpoint vrača 200, admin pot /scp/ vrača 302 na login.
Rezultat: update je uspel. Tailscale endpoint http://100.74.84.18:8098 vrača HTTP 200, /scp/ pravilno preusmeri na login, DB ping vrne mysqld is alive, backup arhiva za projekt in bazo pa prestaneta gzip -t.
# Preverjanje po update-u
sudo docker ps --filter name=osticket
curl -I http://100.74.84.18:8098 --max-time 20
curl -I http://100.74.84.18:8098/scp/ --max-time 20
sudo docker exec osticket-db sh -lc 'MYSQL_PWD="${MARIADB_ROOT_PASSWORD:-$MYSQL_ROOT_PASSWORD}" mariadb-admin ping -uroot --silent'

# Rollback image tag
rinkp/osticket-dockerized:rollback-2026-06-22-094620

🧩 Gitea update — 2026-06-22

DIUN file provider je javil update za gitea/gitea:latest. Preverjanje digestov je potrdilo, da je remote image novejši od lokalnega, zato je bil izveden varen update samo za servis gitea.

PostavkaVrednost
Prejšnji imagesha256:7d13848af12645600a5f9d93ee2560daa9c6fa6b5b859b7bff3a5e1c0b661031
Novi imagesha256:8e25c717b8f748445e15ec46e0390f577cb628101184cb0a150d1dae126c1f39
Nova verzijaGitea 1.26.4
Compose/srv/gitea/docker-compose.yml
Backup/srv/backups/gitea-update-2026-06-22-064651
Rollback taggitea/gitea:rollback-2026-06-22-064651
Končno stanjegitea teče, lokalni endpoint in public endpoint vračata 200.
Rezultat: update je uspel. https://git.nemac.si vrača HTTP/2 200, runbook repo je prestal git fsck, backup arhiv pa gzip -t.
# Preverjanje po update-u
sudo docker ps --filter name=gitea
sudo docker logs --since 10m gitea
curl -I http://127.0.0.1:3002 --max-time 20
curl -I https://git.nemac.si --max-time 20
sudo git --git-dir=/srv/gitea/data/git/repositories/nemacd/home-server.git fsck --no-progress

# Rollback image tag
gitea/gitea:rollback-2026-06-22-064651

📄 Stirling PDF update — 2026-06-19

DIUN file provider je javil update za stirlingtools/stirling-pdf:latest. Preverjanje je pokazalo, da je remote digest drugačen od lokalnega, zato je bil izveden varen update samo za servis stirling-pdf.

PostavkaVrednost
Prejšnji imagesha256:2bb9b67f3edbca7ecc80f6e851a02cd04a10d5ea1d69b3e80b1e1f615e97b7a2
Novi imagesha256:dc2d06bc68bb5a023d3635060ba0070381446bff02011143c7e46ea0c184755c
Nova verzijaStirling-PDF v2.13.0
Compose/srv/stirling-pdf/docker-compose.yml
Backup/srv/backups/stirling-pdf-update-2026-06-19-093144
Rollback tagstirlingtools/stirling-pdf:rollback-2026-06-19-093144
Končno stanjestirling-pdf je healthy, endpointa vračata 401, kar je pričakovano zaradi prijave.
Rezultat: update je uspel. Public endpoint https://pdf.nemac.si in Tailscale endpoint http://100.74.84.18:8095 vračata 401 Unauthorized, kar je normalen rezultat za zaščiten Stirling PDF.
Opomba: prvi poskus update skripte se je ustavil v backup koraku zaradi permission napake pri shell redirectionu. Pull/recreate se takrat ni izvedel. Prazna partial backup mapa je bila nato odstranjena, update pa je bil ponovljen v root shellu.
# Preverjanje po update-u
sudo docker ps --filter name=stirling-pdf
sudo docker logs --tail 120 stirling-pdf
curl -I http://100.74.84.18:8095 --max-time 20
curl -I https://pdf.nemac.si --max-time 20

# Rollback image tag
stirlingtools/stirling-pdf:rollback-2026-06-19-093144

⛏️ Minecraft image update — 2026-06-16

2026-06-16 je DIUN ponovno javil update za itzg/minecraft-server:latest. Preverjanje je pokazalo, da to ni bil samo ponovljen alert: remote digest se je spremenil, zato je bil izveden nov varen update Minecraft image-a.

PostavkaVrednost
Prejšnji imagesha256:d54e9c99dfc77b18c02b896772798884b430f8e65865e785a2f5a9780d566320
Novi imagesha256:9cd46375d0921e77784eabd88d67b4501eaf0b9af9de7d0ca71784d76d358ee4
Backup/srv/backups/minecraft-image-update-2026-06-16-092859
Rollback tagitzg/minecraft-server:rollback-2026-06-16-092859
Postopeksave-all flush, clean stop, offline backup mape /srv/minecraft/data, pull novega image-a, start.
Končno stanjeminecraft je healthy, igralcev je bilo 0/20, TPS je 20.0 / 20.0 / 20.0.
PluginiEssentials in EssentialsSpawn ostajata na stable verziji 2.22.0.
Rezultat: update je uspel, rollback ni potreben. Server je po nekaj minutah vrnil TPS 20.0 / 20.0 / 20.0.
Opomba: ker je bil 2026-06-15 že narejen Minecraft image update, je bil 2026-06-16 najprej preverjen remote digest brez pull ali restarta. Šele ko se je digest izkazal za novega, je bil izveden update.

Preverjanje po update-u

sudo docker ps --filter name=minecraft
sudo docker exec minecraft rcon-cli list
sudo docker exec minecraft rcon-cli tps
sudo docker exec minecraft rcon-cli "version Essentials"
sudo docker exec minecraft rcon-cli "version EssentialsSpawn"

🧩 Update batch — 2026-06-15

2026-06-15 so bili obdelani update alerti za File Browser in Minecraft. Dodatno je bil posodobljen Minecraft plugin paket EssentialsX iz dev builda na stable release.

KomponentaSpremembaPreverjanjeBackup / rollback
File Browser Posodobljen image filebrowser/filebrowser:latest. Container filebrowser je healthy. Browser test na http://100.74.84.18:8090 je bil uspešen. HTTP root lahko vrne 404, zato je browser test merodajen. /srv/backups/filebrowser-update-2026-06-15-070526
filebrowser/filebrowser:rollback-2026-06-15-070526
Minecraft image Posodobljen image itzg/minecraft-server:latest. Pred update-om je bil izveden save-all flush, nato clean stop in offline backup mape /srv/minecraft/data. Po update-u je container healthy, RCON deluje in TPS je 20.0 / 20.0 / 20.0. /srv/backups/minecraft-image-update-2026-06-15-071012
itzg/minecraft-server:rollback-2026-06-15-071012
EssentialsX plugini EssentialsX.jar in EssentialsXSpawn.jar sta bila posodobljena iz 2.22.0-dev+111-c38c925 na stable 2.22.0. Minecraft je po restartu healthy. RCON vrača Essentials version 2.22.0 in EssentialsSpawn version 2.22.0. Plugini so Essentials, EssentialsSpawn in NemacWelcome. /srv/backups/essentialsx-update-2026-06-15-073031
Rollback je prek shranjenih .jar.before datotek in arhiva Essentials-folder-before-update.tar.gz.
Končno stanje: filebrowser in minecraft sta healthy. Minecraft RCON deluje, igralcev med update-om ni bilo, TPS po update-u je 20.0 / 20.0 / 20.0.
Backup permissions: update backup mape so nastavljene na 700, datoteke pa na 600. Rollback tage in backupe pusti nekaj dni, nato jih počisti v ločenem cleanup koraku.

Preverjanje po update-u

sudo docker ps --filter name=filebrowser --filter name=minecraft
sudo docker exec minecraft rcon-cli "version Essentials"
sudo docker exec minecraft rcon-cli "version EssentialsSpawn"
sudo docker exec minecraft rcon-cli tps

Backup lokacije

/srv/backups/filebrowser-update-2026-06-15-070526
/srv/backups/minecraft-image-update-2026-06-15-071012
/srv/backups/essentialsx-update-2026-06-15-073031

🔔 DIUN update batch — 2026-06-12

Telegram/DIUN alerti so bili obdelani 2026-06-12. Posodobljeni so bili Navidrome, Stirling PDF in PostgreSQL image za Vikunja DB. Vsi update-i so bili narejeni postopno, z rollback tagi in backupi.

ServisImageRezultatBackup / rollback
Navidrome deluan/navidrome:latest Posodobljen. Teče kot network_mode: host, posluša na 127.0.0.1:4533, Caddy ga objavlja na https://ente.nemac.si/music/. Direktni 100.74.84.18:4533 ni pravilen test za to postavitev. /srv/backups/navidrome-update-2026-06-12-072926
deluan/navidrome:rollback-2026-06-12-072926
Stirling PDF stirlingtools/stirling-pdf:latest Posodobljen. Container je healthy, health endpoint javlja verzijo 2.12.0. 401 Unauthorized na https://pdf.nemac.si je pričakovan, ker je servis zaščiten z loginom. /srv/backups/stirling-pdf-update-2026-06-12-073721
stirlingtools/stirling-pdf:rollback-2026-06-12-073721
Vikunja DB postgres:18 Posodobljen po logičnem backupu baze. Compose service ime je db, container name je vikunja-db. Pri compose ukazih mora biti uporabljen project name -p vikunja, sicer lahko pride do konflikta container name-a. Po update-u je vikunja-db healthy, https://todo.nemac.si/ pa vrača 200 OK. /srv/backups/vikunja-postgres-update-2026-06-12-074812
postgres:rollback-vikunja-2026-06-12-075847
Končno stanje: Navidrome, Stirling PDF, vikunja in vikunja-db delujejo. Kritični servisi Caddy, Uptime Kuma, Portainer, File Browser, Jellyfin in Minecraft so ostali OK.
Varnostna opomba za DB dumpe: pg_dumpall lahko v headerju izpiše role in SCRAM password hash. To ni plain-text geslo, vendar se vseeno obravnava kot občutljiv podatek. Pri prihodnjih DB backupih se dump headerjev ne kopira v chat; preverja se samo gzip integrity in varni markerji brez role/password vrstic.

Preverjanje po update-u

curl -sS -o /dev/null -w "navidrome=%{http_code}\n" https://ente.nemac.si/music/ --max-time 20
curl -I https://pdf.nemac.si --max-time 15
curl -I https://todo.nemac.si/ --max-time 15
sudo docker ps --filter name=navidrome --filter name=stirling --filter name=vikunja

Vikunja Postgres posebnost

Portainer compose stack je v /var/lib/docker/volumes/portainer_data/_data/compose/8. Service za bazo je db, container pa vikunja-db. Za ukaze uporabljaš:

cd /var/lib/docker/volumes/portainer_data/_data/compose/8
docker compose -p vikunja -f docker-compose.yml -f docker-compose.healthcheck-override.yml config --services

Rollback opomba

Rollback tagi in backupi naj ostanejo nekaj dni. Čiščenje naredi šele, ko so storitve stabilne in ni novih DIUN alertov za iste image-e.

Kraken Telegram Crypto Simulator

Kraken Telegram Crypto Simulator je interni simulacijski crypto trading bot/portal na Contabo VPS. Namenjen je simulaciji strategije z realnimi Kraken public market podatki, Telegram obvestili in Streamlit portalom. Sistem trenutno ne trguje s pravim denarjem, ne uporablja Kraken private API ključev in uporablja samo public market podatke.

Osnovni podatki

  • Projekt: /srv/kraken-telegram-sim
  • Postavitev: Docker Compose
  • Portal: Streamlit, container kraken-sim-portal
  • Worker: Python background worker, container kraken-sim-worker
  • Baza: SQLite, /srv/kraken-telegram-sim/data/sim.db
  • Backupi baze: /srv/kraken-telegram-sim/backups
  • Skrivnosti: /srv/kraken-telegram-sim/.env; te datoteke ne izpisuj javno.
  • .env vsebuje TELEGRAM_BOT_TOKEN in TELEGRAM_CHAT_ID; v runbooku smejo biti zapisana samo imena ključev, nikoli vrednosti.

Containerji in dostop

  • kraken-sim-portal: Streamlit portal, bindan samo lokalno kot 127.0.0.1:8501->8501. Ni javno odprt na internetu.
  • kraken-sim-worker: background worker, vsakih 300 sekund preverja trg, izvaja samo simulirane BUY/SELL odločitve, pošilja Telegram obvestila in piše v SQLite bazo.
  • Dostop do portala je prek SSH tunnela. Če tunnel ni odprt, bot še vedno dela; nedosegljiv je samo portal iz lokalnega brskalnika.
ssh -L 8501:127.0.0.1:8501 nemacd@nemac
# potem lokalno odpri:
# http://127.0.0.1:8501

Trenutna aktivna strategija

Aktivna strategija je Strategy v3.2 — candle-based confirmation. Nastavitve v bazi so bile preverjene 2026-05-14:

  • strategy_version = v3.2_candle_based_confirmation
  • simulation_mode = OFFICIAL_STRATEGY_V3_2_CANDLE_CONFIRMATION
  • simulation_started_at = 2026-05-14T08:33:46+02:00
  • bot_enabled = true
  • Na dan preverjanja: trades=0, positions=0, decision_logs=9, bot_runs=4.

Glavna sprememba v3.2

Prej so se entry/exit potrditve štele po worker ciklih. Worker teče na 5 minut, signal engine pa uporablja zaprte 15m sveče, zato je lahko bot isto zaprto 15m svečo prebral večkrat. V v3.2 confirmation counter šteje samo različne zaprte 15m sveče.

  • BUY confirmation šteje različne zaprte 15m sveče.
  • AVOID SELL confirmation šteje različne zaprte 15m sveče.
  • Worker cikli sami po sebi ne povečajo confirmation counterja, če gre za isto 15m svečo.
  • Trenutni signal AVOID je lahko pričakovan, kadar 1h trend ni potrjen.

Audit stolpci v decision_logs

  • signal_candle: timestamp zaprte 15m sveče, na kateri je bil izračunan signal.
  • htf_candle: timestamp zaprte 1h sveče, uporabljene za higher-timeframe filter.

Exit logika

  • Hard take-profit se sproži takoj.
  • Hard stop-loss se sproži takoj.
  • Hard TP/SL ne čakata na confirmation in ne čakata na minimum hold.
  • AVOID izhod čaka confirmation po različnih zaprtih 15m svečah.

Glavna pravila strategije v3.2

  • 15-minutni signal engine + 1h higher-timeframe filter.
  • Pari: BTC/EUR, ETH/EUR, SOL/EUR.
  • BUY samo, če je 15m signal BUY WATCH in je 1h trend filter OK.
  • Za altcoine je dodatno pomemben BTC 1h režim.
  • Brez early reversal vstopov; low-frequency trend mode.
  • Trade znesek: 10 €.
  • Max odprtih pozicij: 2.
  • Max BUY na dan: 3.
  • Entry confirmation: 3 različne zaprte 15m sveče.
  • Exit confirmation: 3 različne zaprte 15m sveče.
  • Worker interval: 300 sekund.
  • Cooldown po prodaji: 90 minut.
  • Minimalno držanje: 60 minut za običajne izhode, ne pa za hard TP/SL.
  • Take profit: +3.0%.
  • Stop loss: -2.0%.
  • Dnevno Telegram poročilo: po 21:00.

Portal

Portal prikazuje tudi Signal candle / 15m sveča in 1h candle / 1h sveča v signal engine in decision log pogledu.

Pomembne datoteke

/srv/kraken-telegram-sim/docker-compose.yml
/srv/kraken-telegram-sim/Dockerfile
/srv/kraken-telegram-sim/requirements.txt
/srv/kraken-telegram-sim/app/main.py
/srv/kraken-telegram-sim/app/worker.py
/srv/kraken-telegram-sim/app/trading_core.py
/srv/kraken-telegram-sim/app/report_test.py
/srv/kraken-telegram-sim/app/telegram_test.py
/srv/kraken-telegram-sim/data/sim.db
/srv/kraken-telegram-sim/.env

Standardni status ukazi

cd /srv/kraken-telegram-sim
docker ps --filter name=kraken-sim
docker logs --tail 120 kraken-sim-worker
curl -I http://127.0.0.1:8501 --max-time 10

Preveri DB nastavitve, schema in zadnje odločitve

cd /srv/kraken-telegram-sim

docker compose run --rm -e PYTHONPATH=/app/app kraken-sim-worker python - <<'PY'
import sqlite3
from pathlib import Path

db = Path("/app/data/sim.db")
with sqlite3.connect(db) as conn:
    conn.row_factory = sqlite3.Row

    print("=== SETTINGS ===")
    for row in conn.execute(
        '''
        SELECT key, value
        FROM settings
        WHERE key IN ('cash_eur','simulation_started_at','strategy_version','simulation_mode','bot_enabled')
        ORDER BY key
        '''
    ):
        print(f"{row['key']}={row['value']}")

    print("
=== decision_logs columns ===")
    for row in conn.execute("PRAGMA table_info(decision_logs)"):
        print(row["name"])

    print("
=== latest decisions ===")
    for row in conn.execute(
        '''
        SELECT created_at, pair, signal, decision, signal_candle, htf_candle, reason
        FROM decision_logs
        ORDER BY id DESC
        LIMIT 20
        '''
    ):
        print(dict(row))
PY

Preveri trenutne signale

cd /srv/kraken-telegram-sim

docker compose run --rm -e PYTHONPATH=/app/app kraken-sim-worker python - <<'PY'
from trading_core import build_signal_table

df = build_signal_table()
cols = [
    "Par", "Signal", "Score", "Risk", "Trend", "RSI",
    "Signal candle", "1h OK", "1h Score", "1h Trend", "1h RSI", "1h candle", "Razlaga",
]
existing = [c for c in cols if c in df.columns]
print(df[existing].to_string(index=False))
PY

Restart / rebuild

cd /srv/kraken-telegram-sim
docker compose up -d --build
docker compose ps

Ročni backup baze

cd /srv/kraken-telegram-sim
mkdir -p backups
cp data/sim.db backups/sim-manual-$(date +%Y%m%d-%H%M%S).db
ls -lh backups | tail

Pause / resume bota

Pavziranje bota ne ustavi containerja; spremeni samo stanje v aplikaciji in pošlje Telegram obvestilo.

cd /srv/kraken-telegram-sim

docker compose run --rm -e PYTHONPATH=/app/app kraken-sim-worker python - <<'PY'
from trading_core import set_bot_enabled, send_telegram_message, log_bot

set_bot_enabled(False)
msg = "⏸️ Kraken Simulator pavziran ročno."
log_bot(msg)
send_telegram_message(msg)
print(msg)
PY
cd /srv/kraken-telegram-sim

docker compose run --rm -e PYTHONPATH=/app/app kraken-sim-worker python - <<'PY'
from trading_core import set_bot_enabled, send_telegram_message, log_bot

set_bot_enabled(True)
msg = "▶️ Kraken Simulator ponovno vklopljen ročno."
log_bot(msg)
send_telegram_message(msg)
print(msg)
PY

Kaj spremljati

  • V portalu: AUTO Performance / GO-NO-GO, signal engine, graf vrednosti portfelja, dnevnik odločitev, zgodovino simuliranih tradeov in odprte pozicije.
  • V Telegramu: AUTO BUY, AUTO SELL, dnevno poročilo in error obvestila.

Operativna opomba

Strategy v3.2 naj zdaj teče vsaj 24–48 ur ali do prvega Telegram BUY/SELL obvestila. Ne spreminjaj dodatnih pravil, dokler ni dovolj podatkov za oceno. Produkcija z realnim denarjem je trenutno NO-GO.

Sistemski update / reboot 2026-05-13

Po posodobitvi paketov z apt upgrade je bil izveden reboot za nov kernel 6.8.0-111-generic. Pred rebootom je bil narejen snapshot stanja containerjev in Caddy portov. Po rebootu je bilo preverjeno: ni več pending updateov, /var/run/reboot-required ne obstaja, zombie procesov ni več, Docker je aktiven, Caddy posluša na 80/443/2019, ključni HTTP endpointi so odzivni, container healthchecki pa so se po nekaj minutah stabilizirali.

uname -r
sudo apt update
apt list --upgradable
test -f /var/run/reboot-required && cat /var/run/reboot-required.pkgs || echo "No reboot required"
ps -eo stat,pid,ppid,etime,cmd | awk '$1 ~ /^Z/ {print}'
systemctl is-active docker
sudo docker ps
sudo ss -ltnp '( sport = :80 or sport = :443 or sport = :2019 )'

Caddy / Tailscale Serve opomba

Če Caddy po updateu javi listen tcp :443: bind: address already in use, preveri, ali port 443 drži tailscaled. To se lahko zgodi, če je aktiven Tailscale Serve/Funnel. Rešitev je resetirati samo Tailscale Serve/Funnel konfiguracijo, ne celotnega Tailscale VPN-ja, nato ponovno zagnati Caddy.

sudo ss -ltnp '( sport = :80 or sport = :443 or sport = :2019 )'
sudo tailscale serve status
sudo tailscale funnel status
# po potrebi reset samo serve/funnel konfiguracije, nato:
sudo docker restart caddy

Hitri pregled stanja

df -h
free -h
swapon --show
grep '^/swapfile ' /etc/fstab
sudo du -sh /srv/* 2>/dev/null | sort -h
sudo docker ps
sudo docker system df
sudo journalctl -p warning --since today
sudo docker stats --no-stream

Preverjanje Caddy domen

sudo grep -nE "^[a-zA-Z0-9.-]+\.nemac\.si[[:space:]]*\{" /srv/caddy/Caddyfile

Preverjanje compose datotek

sudo find /srv -maxdepth 4 \( -name "docker-compose.yml" -o -name "compose.yml" -o -name "docker-compose.yaml" \) -print

Posodobitev Docker aplikacije

cd /srv/IME_STORITVE
sudo docker compose pull
sudo docker compose up -d
sudo docker logs IME_CONTAINERJA --tail 100

Ne delaj brez razloga

  • Ne briši map v /srv, če ni jasno, kateri servis jih uporablja.
  • Ne briši Docker volume/data map brez backupov.
  • Ne izpostavljaj dodatnih portov na javni IP, če lahko uporabiš Caddy ali Tailscale.
  • Ne commitaj skrivnosti v Giteo.
📘 Prevzem serverja

Če nekdo prevzame upravljanje serverja, naj najprej preveri naslednje:

  1. Preberi ta dokument.
  2. Preveri dostop do VPS-ja prek SSH.
  3. Preveri /srv/caddy/Caddyfile.
  4. Preveri sudo docker ps.
  5. Preveri Uptime Kuma dashboard.
  6. Preveri root cron: sudo crontab -l.
  7. Preveri Minecraft backup log: /var/log/minecraft-backup.log.
  8. Preveri, da Gitea repo home-server vsebuje aktualno dokumentacijo.
  9. Preveri, katere storitve so javne in katere so samo prek Tailscale.

Minimalni recovery podatki

Element Kje je
Glavna konfiguracija domen/srv/caddy/Caddyfile
Objavljen runbook/srv/caddy/data/runbook/site/index.html
Izvor runbookaGitea repo home-server → site/index.html
Minecraft svet/srv/minecraft/data
Minecraft backupi/srv/backups
Gitea podatki/srv/gitea/data
Jellyfin media/srv/media
Telegram Minecraft config/etc/minecraft-telegram.env
Ta dokument naj se posodobi ob vsaki novi storitvi, domeni, backup skripti, spremembi portov ali spremembi dostopov.