From 3e2c7af0cbba8565e52220ce695b3deb4b29baa8 Mon Sep 17 00:00:00 2001 From: DragonSlayer_14 Date: Sun, 23 Aug 2026 00:39:09 +0200 Subject: [PATCH] =?UTF-8?q?Feat:=20F=C3=BCgt=20Paketdefinitionen=20f=C3=BC?= =?UTF-8?q?r=20Fedora/RPM=20und=20Arch/Makepkg=20hinzu=20und=20aktualisier?= =?UTF-8?q?t=20Dokumentation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/rust.xml | 6 + Cargo.toml | 29 ++++- README.md | 194 +++++++++++++++++++++++++++- packaging/arch/PKGBUILD | 40 ++++++ packaging/fedora/docker-update.spec | 42 ++++++ 5 files changed, 304 insertions(+), 7 deletions(-) create mode 100644 .idea/rust.xml create mode 100644 packaging/arch/PKGBUILD create mode 100644 packaging/fedora/docker-update.spec diff --git a/.idea/rust.xml b/.idea/rust.xml new file mode 100644 index 0000000..7bc91ea --- /dev/null +++ b/.idea/rust.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml index 33b80ef..2bb358d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,9 +4,9 @@ version = "0.1.0" edition = "2024" authors = ['DragonSlayer_14'] readme = "README.md" -license-file = "LICENSE" -repository = "https://gitea.creative-dragonslayer.de/Linuxapps/SmartMount" -description = "" +license = "GPL-3.0-or-later" +repository = "https://gitea.creative-dragonslayer.de/Linuxapps/DockerUpdate" +description = "Automatisches Aktualisieren von Docker-Compose-Anwendungen in /var/apps mit :latest-Images" [dependencies] time = { version="0.3.41", features = ["formatting", "macros", "local-offset"] } @@ -19,8 +19,27 @@ libc = "1.0.0-alpha.1" debug = "none" [package.metadata.deb] +name = "docker-update" +maintainer = "DragonSlayer_14" +copyright = "2026 Linuxapps" section = "utils" priority = "optional" +depends = "$auto, sudo, docker.io | docker-ce" +extended-description = """\ +DockerUpdate durchsucht Verzeichnisse (standardmäßig in /var/apps) nach +Docker-Compose-Dateien mit ':latest'-Images, prüft auf neuere Images, +lädt diese herunter und startet die betroffenen Container automatisch neu.\ +""" +assets = [ + ["target/release/docker-update", "usr/bin/docker-update", "755"], + ["README.md", "usr/share/doc/docker-update/README.md", "644"], + ["LICENSE", "usr/share/doc/docker-update/copyright", "644"], +] -provides = ["docker-update"] -depends = ["$auto"] +[package.metadata.generate-rpm] +assets = [ + { source = "target/release/docker-update", dest = "/usr/bin/docker-update", mode = "755" }, + { source = "README.md", dest = "/usr/share/doc/docker-update/README.md", mode = "644", doc = true }, + { source = "LICENSE", dest = "/usr/share/licenses/docker-update/LICENSE", mode = "644", license = true }, +] +requires = { "sudo" = "*", "docker" = "*" } diff --git a/README.md b/README.md index 1819c42..d1d7fe4 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,193 @@ -# DockerUpdater +# DockerUpdate (`docker-update`) -Hilft dabei installierte Anwendungen über docker-compose.yaml in /var/apps aktuell zu halten. \ No newline at end of file +`docker-update` ist ein schlankes CLI-Werkzeug für Linux-Server, das Docker-Compose-basierte Applikationen automatisch +auf neuere Versionen prüft, aktualisiert und neu startet. + +## Funktionsweise + +1. **Durchsuchen von Applikationsverzeichnissen**: + Standardmäßig scannt `docker-update` alle Unterverzeichnisse in `/var/apps/` (konfigurierbar) nach gültigen + Compose-Dateien (`docker-compose.yaml`, `docker-compose.yml`, `compose.yaml`, `compose.yml`). +2. **Erkennung von `:latest`-Images**: + Services in den Compose-Dateien werden analysiert. Es werden gezielt Services berücksichtigt, deren Image das + `:latest`-Tag nutzt oder implizit auf `latest` verweist (kein Tag angegeben). +3. **Prüfung auf neuere Images & Download**: + Das Programm führt für jedes betroffene Image einen `docker pull` durch und vergleicht die Image-IDs vor und nach dem + Pull. +4. **Automatischer Neustart**: + Wurde ein neues Image heruntergeladen, wird die Applikation im jeweiligen Verzeichnis über `docker compose up -d` + (mit Fallback auf `docker-compose up -d`) aktualisiert und neu gestartet. +5. **Bereinigung**: + Nach erfolgreichen Aktualisierungen werden ungenutzte Zwischen-Images automatisch mittels `docker image prune -f` + bereinigt. +6. **Berechtigungen & Logging**: + Wird das Programm ohne Root-Rechte gestartet, startet es sich automatisch über `sudo` mit erhöhten Rechten neu. + Ausgaben werden auf der Konsole formatiert und zusätzlich tagesbasiert im System-Temp-Verzeichnis protokolliert (z. + B. `/tmp/docker-update-.../log-YYYY-MM-DD.log`). + +--- + +## Voraussetzungen + +- **Betriebssystem**: Linux (x86_64, aarch64) +- **Laufzeit-Abhängigkeiten**: + - `docker` (inkl. Docker Compose Plugin `docker compose` oder Standalone `docker-compose`) + - `sudo` +- **Build-Abhängigkeiten** (nur zum Kompilieren/Paketieren): + - Rust & Cargo (Rust 2024 Edition / 1.85+) + +--- + +## Manuelle Installation (Build from Source) + +```bash +# Repository klonen +git clone https://gitea.creative-dragonslayer.de/Linuxapps/DockerUpdate.git +cd DockerUpdate + +# Release-Binary kompilieren +cargo build --release + +# Binary ins Systemverzeichnis installieren +sudo install -m 755 target/release/docker-update /usr/bin/docker-update +``` + +Anschließend kann das Programm direkt über `docker-update` ausgeführt werden: + +```bash +docker-update +``` + +--- + +## Konfiguration + +Die Konfigurationsdatei wird standardmäßig unter folgendem Pfad abgelegt: + +- **Root-Ausführung**: `/etc/docker-update/config.toml` +- **Benutzer-Ausführung**: `~/.config/docker-update/config.toml` + +Wird keine Datei gefunden, verwendet `docker-update` die Standardwerte. + +### Beispiel-Konfiguration (`config.toml`) + +```toml +[general] +# Verzeichnis, in dem sich die Applikationsordner mit Compose-Dateien befinden +apps_dir = "/var/apps" + +# Log-Level: "error", "warn", "info", "debug" +log_level = "info" +``` + +--- + +## Paketerstellung + +Für gängige Linux-Distributionen stehen vorbereitete Paketierungsdefinitionen zur Verfügung. + +### 1. Debian / Ubuntu (`.deb`) + +Das Debian-Paket kann mithilfe von [`cargo-deb`](https://github.com/kornelski/cargo-deb) erstellt werden: + +```bash +# cargo-deb installieren (falls noch nicht vorhanden) +cargo install cargo-deb + +# Release-Build und Debian-Paket erstellen +cargo deb + +# Installation des erstellten Pakets +sudo dpkg -i target/debian/docker-update_0.1.0-1_amd64.deb +``` + +Die Paketkonfiguration und Abhängigkeiten (`sudo`, `docker.io | docker-ce`) sind in `Cargo.toml` unter +`[package.metadata.deb]` definiert. + +--- + +### 2. Arch Linux (`PKGBUILD`) + +Für Arch Linux liegt ein `PKGBUILD` im Verzeichnis `packaging/arch/` bereit: + +```bash +cd packaging/arch + +# Paket bauen und installieren +makepkg -si +``` + +Alternativ kann das Binary auch manuell mit `pacman -U .pkg.tar.zst` installiert werden. + +--- + +### 3. Fedora / RHEL / CentOS (`.rpm`) + +Für RPM-basierte Distributionen gibt es zwei Möglichkeiten: + +#### Option A: Mit `cargo-generate-rpm` + +```bash +# cargo-generate-rpm installieren +cargo install cargo-generate-rpm + +# Release bauen und RPM erzeugen +cargo build --release +cargo generate-rpm + +# Installation des erstellten RPM-Pakets +sudo dnf install target/generate-rpm/docker-update-0.1.0-1.*.rpm +``` + +#### Option B: Mit `rpmbuild` und Spec-Datei + +Die RPM-Spec-Datei befindet sich in `packaging/fedora/docker-update.spec`: + +```bash +# Erforderliche Build-Werkzeuge installieren +sudo dnf install rpm-build + +# Paket über rpmbuild erstellen +rpmbuild -ba packaging/fedora/docker-update.spec +``` + +--- + +## Automatisierung (Cron) + +Um `docker-update` regelmäßig (z. B. täglich nachts um 03:30 Uhr) automatisch auszuführen, kann ein Cronjob eingerichtet +werden. Da `docker-update` Root-Rechte benötigt, sollte der Cronjob mit Root-Rechten ausgeführt werden. + +### Option A: Über `/etc/cron.d/docker-update` (Empfohlen für Server) + +Erstelle eine Datei `/etc/cron.d/docker-update`: + +```bash +sudo tee /etc/cron.d/docker-update << 'EOF' +# Täglich um 03:30 Uhr docker-update als root ausführen +30 3 * * * root /usr/bin/docker-update >/dev/null 2>&1 +EOF + +sudo chmod 644 /etc/cron.d/docker-update +``` + +### Option B: Über die Root-Crontab (`crontab -e`) + +Öffne die Crontab des Root-Benutzers: + +```bash +sudo crontab -e +``` + +Füge folgende Zeile ein: + +```cron +30 3 * * * /usr/bin/docker-update >/dev/null 2>&1 +``` + +--- + +## Lizenz + +Dieses Projekt ist unter der **GNU General Public License v3.0 or later (GPL-3.0-or-later)** lizenziert. Weitere +Informationen finden sich in der Datei [LICENSE](LICENSE). diff --git a/packaging/arch/PKGBUILD b/packaging/arch/PKGBUILD new file mode 100644 index 0000000..084ca28 --- /dev/null +++ b/packaging/arch/PKGBUILD @@ -0,0 +1,40 @@ +# Maintainer: DragonSlayer_14 + +pkgname=docker-update +pkgver=0.1.0 +pkgrel=1 +pkgdesc="Automatisches Aktualisieren von Docker-Compose-Anwendungen in /var/apps mit :latest-Images" +arch=('x86_64' 'aarch64') +url="https://gitea.creative-dragonslayer.de/Linuxapps/DockerUpdate" +license=('GPL-3.0-or-later') +depends=('gcc-libs' 'glibc' 'sudo' 'docker') +optdepends=('docker-compose: Unterstützung für Docker Compose v1') +makedepends=('cargo') +source=("$pkgname-$pkgver.tar.gz::$url/archive/v$pkgver.tar.gz") +sha256sums=('SKIP') + +prepare() { + cd "$srcdir/$pkgname-$pkgver" 2>/dev/null || cd "$srcdir/$pkgname" 2>/dev/null || cd "$srcdir" + export RUSTUP_TOOLCHAIN=stable + cargo fetch --locked --target "$(rustc -vV | sed -n 's/host: //p')" 2>/dev/null || cargo fetch || true +} + +build() { + cd "$srcdir/$pkgname-$pkgver" 2>/dev/null || cd "$srcdir/$pkgname" 2>/dev/null || cd "$srcdir" + export RUSTUP_TOOLCHAIN=stable + export CARGO_TARGET_DIR=target + cargo build --frozen --release --all-targets 2>/dev/null || cargo build --release +} + +check() { + cd "$srcdir/$pkgname-$pkgver" 2>/dev/null || cd "$srcdir/$pkgname" 2>/dev/null || cd "$srcdir" + export RUSTUP_TOOLCHAIN=stable + cargo test --frozen 2>/dev/null || cargo test +} + +package() { + cd "$srcdir/$pkgname-$pkgver" 2>/dev/null || cd "$srcdir/$pkgname" 2>/dev/null || cd "$srcdir" + install -Dm755 "target/release/$pkgname" "$pkgdir/usr/bin/$pkgname" + install -Dm644 "LICENSE" "$pkgdir/usr/share/licenses/$pkgname/LICENSE" + install -Dm644 "README.md" "$pkgdir/usr/share/doc/$pkgname/README.md" +} diff --git a/packaging/fedora/docker-update.spec b/packaging/fedora/docker-update.spec new file mode 100644 index 0000000..7db52ce --- /dev/null +++ b/packaging/fedora/docker-update.spec @@ -0,0 +1,42 @@ +Name: docker-update +Version: 0.1.0 +Release: 1%{?dist} +Summary: Automatisches Aktualisieren von Docker-Compose-Anwendungen in /var/apps mit :latest-Images + +License: GPL-3.0-or-later +URL: https://gitea.creative-dragonslayer.de/Linuxapps/DockerUpdate +Source0: %{name}-%{version}.tar.gz + +BuildRequires: cargo +BuildRequires: rust +Requires: sudo +Requires: (docker or moby-engine or docker-ce) +Suggests: (docker-compose or docker-compose-plugin) + +%description +DockerUpdate durchsucht Verzeichnisse (standardmäßig in /var/apps) nach +Docker-Compose-Dateien mit ':latest'-Images, prüft auf neuere Images, +lädt diese herunter und startet die betroffenen Container automatisch neu. + +%prep +%autosetup + +%build +cargo build --release + +%check +cargo test + +%install +install -D -p -m 0755 target/release/%{name} %{buildroot}%{_bindir}/%{name} +install -D -p -m 0644 README.md %{buildroot}%{_docdir}/%{name}/README.md +install -D -p -m 0644 LICENSE %{buildroot}%{_licensedir}/%{name}/LICENSE + +%files +%license LICENSE +%doc README.md +%{_bindir}/%{name} + +%changelog +* Sun Aug 23 2026 DragonSlayer_14 - 0.1.0-1 +- Erstveröffentlichung von docker-update