Server - cindy
užitečné příkazy
fbset -xres 1024 -yres 600 # změna rozlišení framebuffer textové konzole
aplikace
Vlastní aplikace.
výtvarnictví admin
Warning
Aktuálně vypnuto, již se nepoužívá. Po upgradu na Bookworm nebylo funkční (chyběly python knihovny) a nebyl důvod rozbíhat. Pokud by bylo znovu potřeba, raději rozběhat v kontejneru na k3s.
sudo su - appauto
nohup ~/app/admin-tools/api/va_api.py &
services
TODO (apache, samba, MongoDB...)
- syncthing
- miniDLNA
- tinyproxy (http proxy pro služební MAC aby mohl do netu i když je na VPN)
- ClamAV
- MariaDB + phpmyadmin
- apache2
WWW
TODO (apache2 + certbot)
Reverzní proxy pro věci v k3s
Warning
Používat pouze pro věci, které využívají Authelia forward auth middleware! Jinak by byl neautorizovaný přístup z internetu.
Aktuálně 3 virtual hosty, všechny používají wildcard certifikát z Let's Encrypt přes acme.sh:
- auth.mixi.cz
- grafana.mixi.cz
- ha.mixi.cz
ukázková konfigurace
<VirtualHost *:80>
ServerName ha.mixi.cz
Redirect permanent / https://ha.mixi.cz/
</VirtualHost>
<VirtualHost *:443>
ServerName ha.mixi.cz
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/mixi.cz/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mixi.cz/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/mixi.cz/fullchain.pem
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
ProxyPreserveHost On
ProxyRequests Off
# Pass real client IP to Traefik (important for Authelia IP detection)
RequestHeader unset X-Forwarded-For
RequestHeader unset X-Forwarded-Host
RequestHeader unset X-Real-IP
RequestHeader unset X-Forwarded-Proto
RequestHeader set X-Forwarded-For "%{REMOTE_ADDR}s"
RequestHeader set X-Real-IP "%{REMOTE_ADDR}s"
RequestHeader set X-Forwarded-Proto "https"
ProxyPass / https://piks01.intranet/
ProxyPassReverse / https://piks01.intranet/
# WebSocket support (important for Home Assistant)
RewriteEngine On
RewriteCond %{HTTP:Upgrade} =websocket [NC]
RewriteRule /(.*) wss://piks01.intranet/$1 [P,L]
RewriteCond %{HTTP:Upgrade} !=websocket [NC]
RewriteRule /(.*) https://piks01.intranet/$1 [P,L]
SSLProxyEngine On
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
ErrorLog ${APACHE_LOG_DIR}/sites/ha.mixi.cz-error.log
CustomLog ${APACHE_LOG_DIR}/sites/ha.mixi.cz-access.log combined
</VirtualHost>
SSL – Let's Encrypt
certbot
ACME klient k Let's encrypt (https://letsencrypt.org/). Pouští se týdně z cronu, viz /etc/cron.d/certbot
- domény: mrak.janna.cz, home.mixi.cz
acme.sh
Step 1: Install acme.sh
curl https://get.acme.sh | sh -s email=admin@mixi.cz
source ~/.acme.sh/acme.sh.env
Step 2: Configure Active24 credentials
# Use same credentials as Traefik
export Active24_ApiKey="your_active24_api_key"
export Active24_ApiSecret="your_active24_secret"
Step 3: Issue wildcard certificate
This also saves credentials for Active24, so they are not needed for refreshing certificates.
acme.sh --issue --dns dns_active24 -d "*.mixi.cz"
Step 4: Install certificate for Apache
# Create directory structure similar to certbot
sudo mkdir -p /etc/letsencrypt/live/mixi.cz
# Install certificate
acme.sh --install-cert -d "*.mixi.cz" \
--cert-file /etc/letsencrypt/live/mixi.cz/cert.pem \
--key-file /etc/letsencrypt/live/mixi.cz/privkey.pem \
--fullchain-file /etc/letsencrypt/live/mixi.cz/fullchain.pem \
--ca-file /etc/letsencrypt/live/mixi.cz/chain.pem \
--reloadcmd "systemctl reload apache2"
# Set permissions
sudo chown -R root:root /etc/letsencrypt/live/mixi.cz
sudo chmod 644 /etc/letsencrypt/live/mixi.cz/*.pem
sudo chmod 600 /etc/letsencrypt/live/mixi.cz/privkey.pem
Step 5: Update Apache VirtualHosts
Update all your Apache vhosts to use the wildcard certificate:
SSLCertificateFile /etc/letsencrypt/live/mixi.cz/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mixi.cz/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/mixi.cz/chain.pem
Step 6: Test and reload
# Test Apache config
sudo apache2ctl configtest
# Reload Apache
sudo systemctl reload apache2
# Test certificate
openssl s_client -connect grafana.mixi.cz:443 -servername grafana.mixi.cz < /dev/null | openssl x509 -noout -text | grep "DNS:"
Step 7: Verify automatic renewal
# Check cron job (acme.sh creates it automatically)
crontab -l | grep acme.sh
# Test renewal (dry run)
acme.sh --renew -d "*.mixi.cz" --force
TODO (postfix)
NAS
NFS
/etc/exports:
/home 192.168.1.2/16(rw,no_subtree_check,insecure)
/home/share 192.168.1.2/16(rw,all_squash,anonuid=1001,anongid=1001,no_subtree_check,insecure)
/srv/backup 192.168.1.2/16(rw,no_subtree_check)
/srv/kube 192.168.1.0/24(rw,no_subtree_check,no_root_squash)
/srv/mythtv 192.168.1.0/24(rw,no_subtree_check)
/srv/nas 192.168.1.0/24(rw,no_subtree_check)
Samba
TODO
NUT
Slouží pro řízení UPS.
Aktuálně má bug, že si nedokáže vytvořit sám adresář ve /var/run, takže po bootu sám nenastartuje.
storage
RAID
V serveru jsou aktuálně 3 disky, 2 SATA porty jsou volné:
- 240 GB M2 NVME – OS
- 2 × 12 TB (2025) – NAS
NAS je postavený na btrfs kam jsou připojené přímo celé disky (/dev/sd*) organizované v RAID1. Je připojený do /srv/nas a pro jednotlivé cílové svazky jsou použité subvolume.
# btrfs fi show
Label: 'NAS' uuid: 0ea6c9c5-72c4-4ff6-b230-d9400654bad4
Total devices 2 FS bytes used 7.46TiB
devid 1 size 10.91TiB used 8.27TiB path /dev/sda
devid 2 size 10.91TiB used 8.27TiB path /dev/sdb
deduplikace - bees
Počáteční deduplikace běží velmi dlouho (řádově desítky hodin), spouštět ideálně přes screen nebo nohup. Použitý nástroj je Bees: https://github.com/Zygo/bees
Pro ilustraci, úvodní deduplikace na novém 12TB poli ušetřila \(8679-7641=1038\) GB a běžela cca 16 hodin.
Kompilace
Na alfonsu, místo bookworm použít odpovídající název distribuce:
sudo aptitude update
sudo aptitude install debootstrap
sudo debootstrap bookworm /home/mixi/tmp/bees-build http://deb.debian.org/debian
Vytvořit bookworm-chroot-mount.sh:
#!/bin/bash
CHROOT_DIR="/home/mixi/tmp/bees-build"
function mount_chroot() {
sudo mount --types proc /proc "$CHROOT_DIR/proc"
sudo mount --rbind /sys "$CHROOT_DIR/sys"
sudo mount --rbind /dev "$CHROOT_DIR/dev"
sudo mount --bind /run "$CHROOT_DIR/run"
sudo cp /etc/resolv.conf "$CHROOT_DIR/etc/resolv.conf"
echo "Mounted necessary filesystems for chroot."
echo "To enter the chroot:"
echo " sudo chroot $CHROOT_DIR /bin/bash"
}
function umount_chroot() {
sudo umount -l "$CHROOT_DIR/proc"
sudo umount -R "$CHROOT_DIR/sys"
sudo umount -R "$CHROOT_DIR/dev"
sudo umount -l "$CHROOT_DIR/run"
echo "Unmounted filesystems from chroot."
}
case "$1" in
mount)
mount_chroot
;;
umount)
umount_chroot
;;
*)
echo "Usage: $0 {mount|umount}"
;;
esac
Vstoupit do chrootu:
./bookworm-chroot-mount.sh mount
sudo chroot /home/mixi/tmp/bees-build /bin/bash
Build bees:
apt -y install build-essential btrfs-progs markdown
mkdir -p /srv/build
cd /srv/build
git clone https://github.com/Zygo/bees.git
cd bees
make
Výsledná binárka je v bin/, podpůrné skripty ve scripts/, tam je ale potřeba upravit cesty, podle toho kam se bees nainstaluje.
Ruční spuštění
Warning
Bees by se nemělo pouštět ručně, je primárně určeno k běhu jako daemon. Hodí se to k úvodní deduplikaci, aby byla víc pod kontrolou, ale jinak je lepší používat bees jako daemon.
Příprava:
mkdir -p /srv/nas/.beeshome
truncate -s 4g /srv/nas/.beeshome/beeshash.dat
chmod 700 /srv/nas/.beeshome/beeshash.dat
Spuštění:
export BEESSTATUS=/run/bees-stats.txt
time bees --strip-paths /srv/nas
Monitoring průběhu lze dělat pomocí:
watch -n 5 cat "$BEESSTATUS"
daemon
Upravené skripty jsou v GITu: home.mixi.cz:/srv/git/repos/local/scripts.git /bees/. Je potřeba pod root@cindy provést:
mkdir -p /etc/bees/
cp bees.bookworm /usr/local/sbin/bees
cp beesd /usr/local/sbin/
cp beesd@.service /etc/systemd/system/
cp 0ea6c9c5-72c4-4ff6-b230-d9400654bad4.conf /etc/bees/
sudo systemctl daemon-reload
sudo systemctl enable --now beesd@UUID.service
užitečné příkazy
# stručné info o aktuálním využití disku (ale neukazuje volné místo)
btrfs fi df /srv/nas/
# podrobnější info o využití filesystemu
btrfs fi usage /srv/nas/
# obdoba příkazu `du`, ale s více podrobnostmi, specificky pro btrfs
btrfs fi du /srv/nas/
# zjištění aktuálního statusu nebo posledního výsledku scrubu
btrfs scrub status /srv/nas/
# vytvoření nového subvolume:
btrfs subvolume create /srv/nas/kube
maintenance NASu
Běžná údržba je pomocí balíku btrfsmaintenance. Ten obstará scrub, defragmentaci a balance (umí i trim pro SSD).
btrfsmaintenance
Konfigurace je v /etc/default/btrfsmaintenance
Po její změně je potřeba spustit:
systemctl start btrfsmaintenance-refresh.service
Pozor, nepoužívá cron, ale systemd timers:
systemctl list-timers | grep btrfs
deduplikace
Bees daemon, viz bees - daemon.
Antivirová kontrola
inkrementální
Z cronu pomocí skriptu /usr/local/bin/clamav-cron-daily.sh, který se pouští denně a kontroluje pouze soubory změněné za poslední 2 dny. Zdroj skriptu je v GITu: home.mixi.cz:/srv/git/repos/local/scripts.git /tools/.
Výsledek ukládá do /srv/www/local/clamav/ jako status.txt se statusem posledního scanu a report-YY-MM-DD.txt s výstupem scanu. To je pak monitorováno pomocí Uptime Kuma.
plná
Ručně pouštěné:
sudo clamdscan -mi --fdpass /opt /usr /var /etc /srv 2>/dev/null | tee -a clamscan-$(date '+%F').log
zálohování
Na samostatné stránce: servers-backup