Erstellung eines Debian-Pakets und Veröffentlichung auf einem Debian Repository
Dieser Leitfaden beschreibt, wie man ein Debian-Paket erstellt und es anschließend auf einem Debian-Repository veröffentlicht. Es werden die notwendigen Schritte zur Strukturierung eines Debian-Pakets, zur Erstellung einer Paketdatei und zur Einfügung des Pakets in ein Repository erläutert.
In diesem realen Beispiel erstellen wir aus dem Skript dyndns unser eigenes Debian Paket.
Voraussetzungen:
- Ein Debian-basiertes System (z.B. Ubuntu, Debian).
dpkg
,reprepro
sollte installiert sein, um das Repository zu verwalten.
Struktur des Pakets
Dein Paketverzeichnis sollte wie folgt aussehen:
dyndns/
├── DEBIAN/
│ ├── control # Paketbeschreibung und Metadaten
│ └── postinst # Post-Installations-Skript
├── usr/
│ ├── local/
│ │ └── share/
│ │ └── dyndns/
│ │ ├── bin/
│ │ │ └── dyndns.sh # Hauptskript
│ │ ├── lib/
│ │ │ ├── Logger.class.sh
│ │ │ ├── Crypto.class.sh
│ │ │ ├── Bootstrap.inc.sh
│ │ │ ├── Cloudflare.class.sh
│ │ │ └── DynDNS.inc.sh
│ │ └── etc/
│ │ └── Config.inc.sh # Konfigurationsdatei
└── dyndns.deb # das fertige Debian-Paket (nach der Erstellung)
Erstellung des Debian-Pakets
Als erstes erstellen wir die Struktur.
mkdir dyndns/DEBIAN && mkdir dyndns/usr/local/share/dyndns/{etc,lib,log}
Dann kopieren wir alle relevanten Dateien (.sh
, .class.sh
, .inc.sh
) in das Verzeichnis usr/local/share/dyndns/
.
Als nächsten Schritt erstellen wir die DEBIAN/control
Datei.
Package: dyndns
Version: 0.0.1-0
Section: misc
Priority: optional
Architecture: all
Depends: awk, perl, grep, curl, jq, base64, mail, bash, hostname, sed
Installed-Size: 44
Maintainer: Marko Schulz <info@tuxnet24.de>
Homepage: https://deb.tuxnet24.de/
Description: A shell script that performs dynamic DNS updates via the Cloudflare API. It checks the current public IP address of the server and automatically updates it on the specified DynDNS domain when it changes.
Die Installed-Size ermitteln wir mit folgendem Befehl. Die Größe wird in KB angegeben. Dabei werden die Dateien aus dem DEBIAN Verzeichnis ausgelassen.
find . -type f ! -path "./DEBIAN/*" -exec du -k {} + | awk '{sum += $1} END {print sum}'
Dann erstellen wir noch ein DEBIAN/postinst
Skript. In unserem Skript müssen wir nur zusehen, dass das eigentliche Skript ausführbar ist und alles dem Benutzer root zuweisen.
#!/bin/sh
set -e
if [ -d /usr/local/share/dyndns ]; then
chown -R root:root /usr/local/share/dyndns && \
chmod 755 /usr/local/share/dyndns/bin/dyndns.sh
fi
Das Skript DEBIAN/postinst
muss natürlich auch ausführbar gemacht werden.
chmod 755 DEBIAN/postinst
Das Paket erstellen wir mit dpkg -b
. Die Option -b
steht für build.
dpkg -b ./dyndns dyndns.deb
Veröffentlichen des Pakets auf unserer Debian Repository
Unser Debian Repository befindet sich unter /var/www/deb/debian
. In der Datei debian/conf/distributions
werden die Relases Codename
und die Architektur Architectures
definiert. In unserem Fall haben wir die Releases buster
, bullseye
und bookworm
. Als Architectures verwenden wir i386
, amd64
und arm64
.
Wir setzen die Environment Variable REPREPRO_BASE_DIR
auf das /var/www/deb/debian
Verzeichnis.
export REPREPRO_BASE_DIR=/var/www/deb/debian
Dann kopieren und veröffentlichen wir das erstellte Debian Paket für die drei Releases.
reprepro --ask-passphrase -V includedeb bookworm ./dyndns.deb
reprepro --ask-passphrase -V includedeb bullseye ./dyndns.deb
reprepro --ask-passphrase -V includedeb buster ./dyndns.deb
Nun haben wir aus dem Skript dyndns, ein Debian Paket erstellt und es in unserem Debian Repository https://deb.tuxnet24.de/ veröffentlicht.
Zu Vollständigkeit der Dokumentation, hier noch der Befehl, wie man ein Paket aus dem Debian Repository wieder entfernt.
reprepro -Vb /var/www/deb/debian remove bookworm dyndns