Skip to content

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