Wie richte ich ein APT-Repository ein?

52

Ich möchte ein APT-Repository auf einem Server einrichten, der einige Pakete bereitstellt.

Gibt es eine Möglichkeit, eine einzurichten, ohne Software auf dem Server zu installieren?

Wie müssen die Dateien organisiert werden?


Edit: Ich muss etwas falsch machen ... kann mir bitte jemand helfen? Ich habe das Repository unter http://quickmediasolutions.com/apt/dists

Ich bin nicht sicher, wo oder was, aber etwas ist falsch konfiguriert. Ich habe derzeit nur ein Paket und es ist für alle Architekturen.

Folgendes wurde zu meinem hinzugefügt /etc/apt/sources.list:

deb http://quickmediasolutions.com/apt stable main
Nathan Osman
quelle
Können Sie bearbeiten und hinzufügen, in welcher Art von Lizenz sich die von Ihnen heruntergeladenen Anwendungen befinden? Ist dies für den privaten Gebrauch oder haben Sie vor, sie usw. zu vertreiben?
Jorge Castro
@Jorge: Was meinst du? Welche Anwendungen?
Nathan Osman
1
Ich habe versucht festzustellen, ob das Paket OSS ist. Sie können einfach das Launchpad verwenden.
Jorge Castro
@Jorge: Nein, es ist kein OSS. (In der Tat ist es so ziemlich die einzige App, die ich geschrieben habe, die es nicht ist.)
Nathan Osman

Antworten:

26

Das Einrichten eines trivialen Repositorys ist mit dpkg-scanpackages sehr einfach. Diese Seite wird erläutert , wie eine triviale Repo einzurichten, und dies wird erklärt , wie es zu benutzen (nach unten scrollen zu Beispiel 4).

Michael Crenshaw
quelle
Ich habe ein bisschen Probleme damit, es zum Laufen zu bringen. Bitte beachten Sie mein Update auf die Frage.
Nathan Osman
1
Sie versuchen anscheinend, ein "automatisches" Repo einzurichten. Für ein (oder mehrere) Paket (e) ist es viel besser, ein einfaches Repo zu verwenden. Versuchen Sie, Ihre Packages.gz zu verschieben und deb zu quickmediasolutions.com/apt/binary . Dann wird Ihre Quelle sein deb http://quickmediasolutions.com/apt binary/.
Michael Crenshaw
2
Triviale Repos bereiten Probleme beim Fixieren, aber ja, sie sind der schnellste / einfachste Weg, ein Repo für nur wenige Pakete einzurichten. Es wäre dumm, ein gepooltes Repo nur für 2-3 Pakete einzurichten.
Tim Post
George, warst du jemals in der Lage, diese Arbeit zu machen?
Michael Crenshaw
@mac: Nun ... ich hatte noch keine Zeit, es zu versuchen :) Am Ende habe ich einfach alles auf eine PPA hochgeladen.
Nathan Osman
40

Richten Sie einfach ein einfaches, aber signiertes Repository auf einem Webserver ein. Da die meisten anderen Tutorials etwas veraltet oder umständlich sind, werde ich versuchen, das Verfahren hier zu wiederholen. Die Erstkonfiguration ist etwas aufwändig, aber das einfache Build-Skript erleichtert die Verwaltung. Und Sie können einfach neue *.debDateien einfügen, aktualisieren oder einen Cron-Job damit beauftragen.

Generieren Sie einige Signaturschlüssel

Zuerst müssen Sie einen gpgSignaturschlüssel für Pakete und Ihr Repository erstellen . Legen Sie einen (4) RSA-Signaturschlüssel und kein Kennwort fest und geben Sie ihm eine eindeutige Bezeichnung, $KEYNAMEwenn Sie dazu aufgefordert werden. (Weitere Beispiele setzen " dpkg1" als Schlüsselnamen voraus.)

 gpg --gen-key
 gpg -a --export-secret-key dpkg1 > secret.gpg
 gpg -a --export dpkg1            > public.gpg

Ich sagte kein Passwort, weil Ihr Webserver keinen eingebauten Affen hat, der es wiederholt eintippen kann. Und die signierten Pakete und das Repository sollen nur die Beschwerden der Update-Manager befriedigen. Laden Sie einfach beide Schlüssel in das neue /apt/Repository-Verzeichnis auf Ihrem Webserver hoch, löschen Sie den secret.gpgSchlüssel jedoch nach der Initialisierung.

CGI-Skript aktualisieren

Dies ist das einfache Update-Shell / CGI-Skript dafür:

#!/bin/sh
echo Status: 200 Okay
echo Content-Type: text/plain
echo
echo Rebuilding APT repository:

{
  #-- settings
  export GNUPGHOME=/var/www/usr12345/files
  export KEYNAME=dpkg1
  #-- one-time setup
  if [ ! -e "$GNUPGHOME/secring.gpg" ] ; then
     gpg --import -v -v ./secret.gpg
     gpg --import -v -v ./public.gpg
     gpg --list-keys
  fi

  #-- symlink .deb files from adjacent sub-directories
  find .. -name '*.deb' -exec ln -s '{}' . \;

  #-- build Packages file
  apt-ftparchive packages . > Packages
  bzip2 -kf Packages

  #-- signed Release file
  apt-ftparchive release . > Release
  gpg --yes -abs -u $KEYNAME -o Release.gpg Release

} 2>&1

Die drei gpgZeilen müssen nur einmal ausgeführt werden, um das GPG-Setup in einem Verzeichnis $GNUPGHOME(oberhalb des Dokumentstamms) zu initialisieren . Löschen Sie nur die secret.gpgnach Erfolg.

Eine einzigartige Eigenschaft dieses kleinen Shell-Skripts ist, dass es alle *.debDateien akzeptiert , die Sie ablegen, aber auch rekursiv (ab einer Ebene) nach anderen sucht und diese mit Symbolen verknüpft. (Benötigt Options FollowSymLinkseventuell .htaccess .)

Sie können dieses Skript entweder manuell als CGI oder per Cron-Job ausführen. Aber verstecken Sie es, oder verschieben Sie es besser noch aus dem Dokumentenstamm.

Da es sich um ein "triviales" Apt-Repository handelt, muss der folgende apt-sources.listEintrag eingegeben werden:

deb http://example.org/deb/  ./    # Simple signed repo

Dies ist für Repositorys mit einer einzigen Architektur geeignet, und wenn Sie nicht mit Hunderten von Paketen rechnen.

Paketsignierung

Das Signieren Ihrer individuellen Pakete ist ebenfalls trivial, sobald Sie Ihre gpg-Schlüssel eingerichtet haben:

dpkg-sig -k dpkg1 -s builder *.deb

(Dies sollte auf der Workstation erfolgen, auf der Pakete erstellt werden, nicht auf dem Repository-Webserver.)

Nicht signiertes Repository

Wenn Sie keine signierten Pakete benötigen, können Sie das Update-Skript auf Folgendes reduzieren:

  dpkg-scanpackages . > Packages
  bzip2 -kf Packages

Was immer noch von durchschnittlichen Benutzern verwendet werden kann, aber ein benutzerdefiniertes Flag benötigt für apt.sources:

deb [trusted=yes] http://apt.example.org/deb/ ./

Verwenden Sie die trusted=yesFlagge jedoch nicht für alle Zwecke , oder wenn Sie sich über die Herkunft des Pakets nicht sicher sind.

Für die Benutzerfreundlichkeit

Legen Sie für Endbenutzer einfach a HEADER.htmlim Repository-Verzeichnis ab. Apachen mod_auto_indexwerden diesen Hinweis voranstellen:

<h1>http://example.org/apt/</h1>
<dl>
<dt>Add this repository to /etc/apt/sources.list as:
 <dd><kbd>deb http://example.org/apt/ ./  # example repo</kbd>
<dt>Import verification key with:
 <dd><kbd>wget -q http://http://example.org/apt/public.gpg -O- | sudo apt-key add -</kbd>
</dl>

Alternativen

Es gibt heutzutage einige Tools zur Automatisierung der Repository-Verwaltung. Und es gibt sogar Repository-Online-Hoster und Paket-Build-Services ( gemfury , packagecloud , bintray usw.).

  • Eine recht bequeme Alternative ist prm . Es ist ein Ruby-Skript, das komplexe APT- und YUM-Repos erstellt. (Aber hoffen wir einfach, dass RPM irgendwann bald aussterben wird.) - Es ist am besten per installiert gem install prm.

  • Und ich habe auch ein kleines Skript geschrieben, um dies auf ähnliche Weise zu automatisieren: http://apt.include-once.org/apt-phparchive - Bitte nicht, dass es nicht übermäßig robust und in PHP geschrieben ist (dies ist ausnahmsweise zufällig), und war ursprünglich für DEB-, RPM-over-APT- und Phar-Bundles gedacht.

Da dies eng mit der ursprünglichen Frage zusammenhängt, gibt es auch Werkzeuge, um Debian-Pakete einfacher zu erstellen. Etwas veraltet: EPM . Viel zeitgemäßer: FPM . Und meine persönliche Seite: XPM (faulerer Ansatz zum Packen von Skriptsprachen-Apps.)

Mario
quelle
1
Wie füge ich den GPG-Schlüssel hinzu, wenn ich dieses Repo verwenden möchte?
Bruce Sun
1
Normalerweise so etwas wiewget …/public.gpg -O- | apt-key add -
Mario
Was müsste ich ändern, wenn ich mehrere Architekturen unterstützen möchte?
Starbeamrainbowlabs
1
@starbeamrainbowlabs Nicht ganz sicher, aber ich denke, dpkg-scanpackages -mkönnte ausreichen. Es werden weiterhin alle Architekturen in derselben Release-Datei aufgelistet. Aber solange jede .deb einen eindeutigen Namen hat / oder in verschiedenen Unterverzeichnissen (amd64 /, all /) gespeichert ist, sollte es funktionieren. Andernfalls entscheiden Sie sich für eines der komplexeren Repository-Tools.
Mario
7

Ja. Du kannst das. Sie müssen nur die Dateien richtig organisieren und die Indexdateien erstellen. Wenn Sie die Verzeichnisstruktur im Dokumentenstamm Ihres Webservers ablegen, können die Pakete nur über den Webserver aufgerufen werden.

Hier finden Sie eine detaillierte Beschreibung, wie die Dateien organisiert werden müssen und wie die Indexdateien erstellt werden.

Sie können auch ein Tool namens reprepro verwenden, wenn Sie bereit sind, dieses eine Paket zu installieren. Dadurch wird die Administration etwas komfortabler.

txwikinger
quelle
@txwikinger: Der Grund, warum ich keine Pakete installieren kann, ist, dass auf dem Server centOS ausgeführt wird :)
Nathan Osman
Gut. das brauchst du nicht. Sie können alles auf einem anderen Computer erstellen und den gesamten Baum mit dem Centos-Server
synchronisieren
Ja, ich würde definitiv die Verwendung von reprepro unterstützen. Es wird dein Leben so viel einfacher machen. Das Erstellen des Repos auf einem anderen Computer kann sogar eine Funktion sein, wenn Sie damit Ihren Signaturschlüssel besser schützen können.
Andol
@andol & @txwikinger: Ich versuche es aber stoße auf Probleme. Bitte sehen Sie meine aktualisierte Frage.
Nathan Osman
Für Ihre DIST-Datei benötigen Sie noch ./binary-<specific arch>.
Andol
2

Sie können vielleicht auch ein Launchpad-PPA in Betracht ziehen

UPS
quelle
0

Für alle, die mit diesem Fehler konfrontiert sind, nachdem sie die Antwort von Mario befolgt haben:

Unable to find expected entry 'Packages' in Release file (Wrong sources.list entry or malformed file)

Mach Folgendes:

dpkg-scanpackages debs /dev/null > Packages
gzip -k Packages
apt-ftparchive release . > Release
gpg --default-key $KEYID -abs -o Release.gpg Release

Ich habe meine *.debDateien in einem debsOrdner abgelegt .

theeminence
quelle