Die nächste Evolutionsstufe nach Copy-Paste und rsync basiert auf dem inotify Kernel Subsystem und heisst (bei mir) lsyncd. Das ist ein Programm, das Dateisystemänderungen überwacht und ereignisgesteuert Dinge tun kann.

Die Konfiguration ist in lua geschrieben, was der eine oder andere vielleicht auch schon von OpenWRT oder anderen Projekten, bei denen es auf Datensparsamkeit und Geschwindigkeit ankommt, kennt.

Ich empfehle die sparsame aber dennoch lehrreiche Lsyncd-Dokumentation auf Github.

Mit lsyncd gehört das manuelle Synchronisieren von Config-Files der Vergangenheit an. Darüber hinaus können nach dem Ändern und Synchronisieren auch Skripte laufen, die dann zum Beispiel die betreffenden Programme neu starten. Bei manchen Kunden habe ich das so im Einsatz. Spart echt Zeit und verhindert Fehler.

Anwendungsbeispiel

Einfaches Anwendungsbeispiel: Ich synchronisiere das Intranet und meinen Wiki-Content mit lsyncd und das funktioniert erstaunlich gut. Dafür habe ich auf beiden Intranet/Wiki Systemen (selbstverständlich Debian 11 Container) neben Apache und Dokuwiki noch rsync und lsyncd installiert. Angesteuert wird der Webserver über einen haproxy Loadbalancer.

Aktuell hab ich das Ganze als Master/Slave Konstrukt gebaut.

Loadbalancer-Konfiguration

frontend fo-intra
        bind 192.168.12.13:80
        mode http
        default_backend intra

backend intra
        balance source
        hash-type consistent
	option forwardfor
        option httpchk
	http-check send meth GET uri /server-status
        option http-server-close
        server hopi 192.168.10.31:80 check
        server yuma 192.168.10.32:80 check backup

frontend fo-wiki
        bind 192.168.12.15:80
        mode http
	option accept-invalid-http-request
        acl is_wiki path_beg /dokuwiki/
        http-request redirect code 301 prefix /dokuwiki unless is_wiki
        default_backend wiki

backend wiki
        balance source
        hash-type consistent
	option forwardfor
	option httpchk
	http-check send meth GET uri /dokuwiki/doku.php
        option http-server-close
        server hopi 192.168.10.31:80 check
        server yuma 192.168.10.32:80 check backup

Später mal mache ich das Two-Way, da muss ich aber noch ein bisschen hirnen.

Die lsyncd Konfiguration muss man sich komplett selber bauen, das Paket bringt keine mit und auch keine Examples so wie ich das sehe. Aber wozu gibts das Internet. ;)

lsyncd Konfiguration (lsyncd.conf.lua)

settings {
        logfile = "/var/log/lsyncd.log",
        statusFile = "/var/log/lsyncd.stat",
        statusInterval = 1,
        maxProcesses = 1,
        maxDelays = 1,
        insist = false
}
targetList = {
        "yuma"
}

targetDirs = {
        "/etc/apache2/",
        "/var/www/",
        "/etc/dokuwiki/",
        "/var/lib/dokuwiki/"
}

for _, server in ipairs(targetList) do
        for _, dir in ipairs(targetDirs) do
                sync {
                        default.rsyncssh,
                        source=dir,
                        host=server,
                        targetdir=dir,
                        delete='startup',
                        exclude={ "*.*~", "*.swp", "*.tmp" },
                        excludeFrom = "/etc/lsyncd/lsyncd.exclude",
                rsync = {
                        owner = true,
                        group = true,
                        perms = true
                },
                ssh = {
                        port = 22
                }
                }
        end
end

Dann müssen noch ein paar Verzeichnisse ausgeschlossen werden, sonst passieren (in Dokuwiki) komische Dinge.

Exclude File (lsyncd.exclude)

/var/lib/dokuwiki/data/cache/
/var/lib/dokuwiki/data/index/
/var/lib/dokuwiki/data/locks/
/var/lib/dokuwiki/data/tmp/
/var/lib/dokuwiki//data/locks
/data/cache/
/data/index/
/data/locks/
/data/tmp/

Und eine Service Unit muss man auch noch selber machen. :-/

Systemd Service Unit (lsyncd.service)

[Unit]
Description=Lsyncd - Live Syncing (Mirror) Daemon
After=syslog.target network.target
ConditionPathExists=/etc/lsyncd/lsyncd.conf.lua

[Service]
Type=simple
ExecStart=/usr/bin/lsyncd -nodaemon /etc/lsyncd/lsyncd.conf.lua
Restart=on-failure

[Install]
WantedBy=multi-user.target