Skip to content

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

mail

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"
Odhady ETA v průběhu počáteční deduplikace mohou být úplně mimo, při deduplikaci co trvala 16h, byly průběžné odhady i přes 8 měsíců.

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