Aptly Paketverwaltung

Es kann sinnvoll sein, eine eigene Repository (Repo) zu erstellen und die darin enthaltenen Pakete selber zu verwalten. Dadurch kann sichergestellt werden, dass alle Systeme stets die selbe Softwareversion nutzen. Das alles wird mit Aptly möglich.

Konfiguration

Die Konfiguration wird nur einmalig beim Start geladen. Eine Überschreibung von Konfigurationsparametern existiert nicht. Daher muss jede Konfigurationsdatei alle notwendigen Parametern enthalten.

Die Aptly Konfiguration wird im JSON-Format erzeugt, sofern die Dateien ~/.aptly.conf oder /etc/aptly.conf nicht existieren. Die aktuelle Konfiguration kann wie folgt eingesehen werden:

aptly config show

Die Default Konfiguration sieht wie folgt aus:

{
  "rootDir": "$HOME/.aptly",
  "downloadConcurrency": 4,
  "downloadSpeedLimit": 0,
  "architectures": [],
  "dependencyFollowSuggests": false,
  "dependencyFollowRecommends": false,
  "dependencyFollowAllVariants": false,
  "dependencyFollowSource": false,
  "dependencyVerboseResolve": false,
  "gpgDisableSign": false,
  "gpgDisableVerify": false,
  "gpgProvider": "gpg",
  "downloadSourcePackages": false,
  "skipLegacyPool": true,
  "ppaDistributorID": "ubuntu",
  "ppaCodename": "",
  "FileSystemPublishEndpoints": {
    "test": {
      "rootDir": "/opt/aptly-publish",
      "linkMethod": "copy",
      "verifyMethod": "md5"
    }
  },
  "S3PublishEndpoints": {
    "test": {
      "region": "us-east-1",
      "bucket": "repo",
      "endpoint": "",
      "awsAccessKeyID": "",
      "awsSecretAccessKey": "",
      "prefix": "",
      "acl": "public-read",
      "storageClass": "",
      "encryptionMethod": "",
      "plusWorkaround": false,
      "disableMultiDel": false,
      "forceSigV2": false,
      "debug": false
    }
  },
  "SwiftPublishEndpoints": {
    "test": {
      "container": "repo",
      "osname": "",
      "password": "",
      "prefix": "",
      "authurl": "",
      "tenant": "",
      "tenantid": "",
      "domain": "",
      "domainid": "",
      "tenantdomain": "",
      "tenantdomainid": ""
    }
  },
  "enableMetricsEndpoint": false,
  "logLevel": "debug",
  "logFormat": "default",
  "serveInAPIMode": false
}

Repo

Repo Erzeugen

Es kann ein lokaler Repo erzeugt werden mittels:

aptly repo create <repo_name> [-comment="Kommentar" -component="main" -distribution="distro_name" -uploaders-file="uploaders.json"]

Sofern ein Snapshot die Basis der lokalen Repo bilden soll:

aptly repo create <repo_name> from snapshot <snapshot_name>

Lokale Repos Auflisten

aptly repo list [-raw]

Bzw. für Details zu einem spezifischen Repo:

aptly repo show <repo_name>

Ins Repo Importieren

Es ist möglich, Pakete von einem Mirror in ein lokales Repo zu importieren (bzw. mit -dry-run nur anzuzeigen, was importiert werden würde):

aptly repo import <src-mirror> <dst-repo> <package-query> [-dry-run -with-deps]

Mehr zum Package-Query in der Dokumentation: https://www.aptly.info/doc/feature/query/

Repo Löschen

Dabei werden die Metadaten gelöscht, da die Paketdaten von einem anderen Repo, Mirror oder Snapshot genutzt werden könnten. Falls ein Snapshot der Repo existiert, kann das -force

Flag gesetzt werden, um das Repositorium trotzdem zu löschen.

 aptly mirror drop <mirror_name> [-force]

Der Hinweis zum Löschen der Paketdaten gilt auch beim Löschen von Mirrors & Snapshots.

Um auch nicht mehr referenzierte Pakete zu löschen:

aptly db cleanup

Pakete im Repo verwalten

Es ist auch möglich, einzelne Pakete im Repo zu verwalten

Paket Hinzufügen

Paket entfernen

Pakete zwischen Repos kopieren / verschieben

Pakete im Repo suchen / anzeigen

Ist kein <package_query> angegeben, werden alle Pakete angezeigt

aptly repo search <repo_name> [<package_query>] [-format="{{.Package}}_{{.Version}}_{{.Architecture}}"] [-with-deps]

Mirroring & Snapshots

Beim Mirroring werden die Metadaten, die Auflistung der Pakete sowie die Pakete im Quell-Repo gespiegelt. Beim Snapshot hingegen wird eine unveränderliche Auflistung der Pakete erzeugt. Das Snapshot eines Mirrors hält somit den aktuellen Stand des Mirrors fest, wobei das Snapshot bei einem Update des Mirrors unverändert bleibt.

Mirroring

Ein via HTTP, HTTPS oder FTP geliefertes Repo kann gespiegelt werden. Dabei wird die Gültigkeit der SIgnatur der Release-Datei überprüft.

Mirror Erstellen

Mirror eines Debian Repos:

aptly mirror create <mirror_name> <archive_url> <distribution> [<component1> ...]

Mirror eines Ubuntu PPA Repos:

aptly mirror create <mirror_name> <ppa:user/project>
  • mirror_name ist der Name das im Aptly zur Referenzierung des Mirrors verwendet wird
  • archive_url die Quelle des zu spiegelnden Archivs, z.B. http://ftp.de.debian.org/debian/
  • distribution ist die Distro Bezeichnung (z.B. squeeze, bookworm, ...) bzw. ./ für Flat Repositories
  • component1 ist eine optionale Liste von Komponenten zum herunterladen (default: alle Komponenten werden geladen)

Mirror Aktualisieren

Nach dem Erstellen eines Mirrors sollte der Inhalt auch aktualisiert werden, damit der Inhalt zur Verfügung steht

aptly mirror update <mirror_name> [-force -download-limit=0 -ignore-checksums -ignore-signatures -keyring=trustedkeys.gpg -max-tries=1 -skip-existing-packages]

Mirrors Auflisten

aptly mirror list [-raw]

Bzw. für Details zu einem spezifischen Mirror:

aptly mirror show <mirror_name>

Mirror Löschen

siehe Hinweis zum Löschen von Repos. Selbiges gilt hier analog.

 aptly mirror drop <mirror_name> [-force]

Snapshots

Snapshot erstellen

aptly snapshot create <snapshot_name> from mirror <mirror_name>

Man kann auch ein leeres Snapshot erstellen, um testweise etwas veröffentlichen kann. Da Snapshots immutable sind, reicht ein einzelnes empty snapshot für alle repos aus.

aptly snapshot create <snapshot_name> empty

Pakete Hinzufügen

aptly repo add <repo_name> <package file | directory> [-force-replace -remove-files]

Veröffentlichung

Mit aptly publish wird ein Snapshot oder eine (loakel) Repo veröffentlicht. Die Repository ist somit mit apt nutzbar.

Veröffentlichte Repos können via dem eingebetteten Webserver wie folgt bereitgestellt werden:

aptly serve -listen=:<port_no>

bzw. alternativ:

aptly serve -listen=<ip>:<port_no> 

Dabei wird der Inhalt des public/ Unterordners via HTTP geliefert.