Schon mal über ein eigenes Repository nachgedacht?

Wer Linux benutzt und immer mal wieder ein neues System einrichtet und konfiguriert, hat sich bestimmt schon mal die Frage gestellt… “wo habe ich denn diese eine Software damals gefunden … und musste man die nicht erst mal Compilieren??”.

Wenn man häufiger über diesen Punkt stolpert, wünscht man sich irgendwann ein eigenes kleines Repository. Sei es auf dem eigenen NAS, das sich im Heimnetzwerk befindet, oder vielleicht noch besser, auf einem Filehoster wie Dropbox oder Google-Drive wenn du dein Repository der ganzen Welt zugänglich machen willst!

Ich möchte hier kurz die Einrichtung eines eigenen PPAs erläutern und die notwendigen Schritte aufzeigen, um das Repository auch problemlos in (Debian-)Systeme ein zu binden (z.B. Ubuntu oder auch Raspbian, auf dem Raspberry Pi).

Was brauche ich alles?

  • Einen Speicherort der immer erreichbar ist
  • fertige Deb-Pakete (*.deb) welche ihr zur Verfügung stellen wollt

So einfach ist das?? Ja. … fast.

Wie gehe ich bei der Erstellung meines Repos vor?

Um nicht andauern Sicherheitswarnungen zu erhalten und den “nicht-vertrauenswürdigen Quellen” vertrauen zu müssen (sudo apt-get --allow-unauthenticated upgrade) benötigst du als erste einen “gpg-key”. Keine Angst der ist umsonst und tut nicht weh 🙂 .

  1. Öffne dazu ein Terminal und führe folgenden Befehl aus:
    gpg --gen-key
    und folge den Anweisungen. Du musst hierbei auch ein Passwort vergeben. Merke es dir gut, denn du benötigst es später zum signieren deiner Pakete.
  2. Nun exportiere den gerade erstellten Schlüssel in eine Datei, mittels
    gpg --output release.key --armor --export deine.emailadresse@hoster.de

Nun kannst du dir auf deinem NAS oder in einem Ordner welche auf einem deiner File-Hoster syncronisiert wird, eine Ordnerstruktur anlegen.(wichtig ist, dass der Ordner am Schluss “öffentlich” zugänglich ist, z.B. in dem Du diesen “Public” machst). Meine Ordnerstruktur im Public-Ordner sieht so aus:

.
├── release
│   ├── my-cool-first-deb
│   │   └── advanced-snipping-tool_0.1.2_all.deb
│___├── release.key

Ich habe einen Ordner Namens “release” und in diesem Ordner, ist ein Unterordner mit dem Namen meines Paketes (my-cool-first-deb) und darin liegt dann das tatsächliche deb-File. Außerdem habe ich das vorher erstellte File “release.key” schon mal in den Ordner release verschoben.

Um den nächsten Schritt zu vereinfachen, habe ich mir hierzu ein Script geschrieben, das die notwendigen Schritte für dich durchführt, da diese immer die gleichen sind und jedes mal wiederholt werden müssen, sobald sich der Inhalt deines Repository ändert!

  1. Du installierst dir erst einmal noch eine Abhängigkeit mittels sudo apt install dpkg-sig
  2. Du navigierst in deinen release Ordner (cd /wo/immer/er/auch/ist/release)
  3. Du erstellst eine leere Datei namens “update_repo.sh” (touch update_repo.sh)
  4. Du befüllst das Script mit:
#!/bin/bash
# call this script for releasing and signing deb-files
# signing and release have to be done at the computer where the gpg-key is...

# requirements:
# dpkg-sig

# this file will not be uploaded to the repository!
SCRIPT=`realpath $0`
SCRIPTPATH=`dirname $SCRIPT`

echo "Change operating folder to release"
cd $SCRIPTPATH
echo "Signing off deb-file"
for debfile in $(find . -name "*.deb")
    do
        echo "Check $debfile :"
        dpkg-sig --verify $debfile > /dev/null
        if [ $? -ne 0 ]
        then
            echo "Signing $debfile"
            dpkg-sig --sign=origin $debfile
        else
            echo "Package $debfile is already signed"
        fi
    done
echo "create 'Packages' File"
apt-ftparchive packages . > Packages
echo "create 'Packages.gz' File"
gzip -c Packages > Packages.gz
echo "create 'Release' File"
apt-ftparchive release . > Release
echo "create 'InRelease' File"
rm InRelease
gpg --clearsign -o InRelease Release
echo "Sign off 'Release' File"
rm Release.gpg
gpg -abs -o Release.gpg Release
echo "Build successfull, you can commit and push the changes :-)"
exit 0

Das Script speicherst du ab und machst es ausführbar (chmod +x update_repo.sh).

Bei der Ausführung des Scripts, werden alle enthaltenen Deb-Files “signiert” hierfür benötigst du nun das Passwort, das du ganz am Anfang festgelegt hast… außerdem werden einige Dateien erzeugt, die Du für ein vollwertiges Repository benötigst:

Was dir noch fehlt, ist die Datei “acer54_repository.list”, die du natürlich frei benennen darfst, wie du sie gerne hättest (z.B. own_repo.list).

In dieser Datei steht “deb”, die Adresse unter der das Repository liegt, also dein absoluter Pfad oder dein Weblink zum Ordner “release” und das Unterverzeichnis in dem die Daten liegen, die den Inhalt des Repos bezeichnen (./). Da mein Repository auf Github liegt, verlinke ich hier auf:
deb https://raw.githubusercontent.com/Acer54/repository/master/release ./

Es ist fast geschafft!

Alles was nun noch zu tun ist, ist dein neues Repository auf deinem Client-System zu registrieren!

  1. Du lädst dir die Datei “release.key” auf den Client herunter und fügst den Key zu deinen vertrauenswürdigen Schlüsseln hinzu: wget https://raw.githubusercontent.com/Acer54/repository/master/release/release.key && sudo apt-key add release.key && rm release.key
  2. Du fügst das Repository zu deinen Fremd-Quellen hinzu und lädst dazu deine *.list Datei herunter und verschiebst sie in den entsprechenden Ordner: wget "https://raw.githubusercontent.com/Acer54/repository/master/release/acer54_repository.list" && sudo mv acer54_repository.list /etc/apt/sources.list.d/
  3. Lese deine Paket-Systems mittels sudo apt update neu ein
  4. Und nun solltest du dein erstes, eigenes Deb-Paket installieren können sudo apt install my-deb-package

Nun kannst du mit der Befüllung deines eigenen Repository fortfahren. Denke jedoch daran, dass jedes mal wenn du einen neuen Ordner erstellst, oder ein Deb-File hinzufügst oder änderst erneut das Script “update_repo.sh” ausführen musst, um die neuen Inhalte auch verfügbar zu machen.

P.S.: Du kannst so auch “Updates” zur Verfügung stellen, die dann auch mittels “sudo apt dist-upgrade” installiert werden 😉

Du wirst es vielleicht auch schon einfach mal probiert haben, aber falls noch nicht, kannst du dir auch gerne mein Repository auf GitHub ansehen, falls dir etwas unklar war.

Selbiges sollte genauso auf Dropbox, Google-Drive oder anderen File-Clouds funktionieren… (solange der Ordner ohne Eingabe von irgendwelchen Zugangsdaten, unter einem eindeutigen Link, erreichbar ist)

Viel Erfolg beim Erstellen eures Repos!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.