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.
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
}
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>
aptly repo list [-raw]
Bzw. für Details zu einem spezifischen Repo:
aptly repo show <repo_name>
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/
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
Es ist auch möglich, einzelne Pakete im Repo zu verwalten
Ist kein <package_query> angegeben, werden alle Pakete angezeigt
aptly repo search <repo_name> [<package_query>] [-format="{{.Package}}_{{.Version}}_{{.Architecture}}"] [-with-deps]
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.
Ein via HTTP, HTTPS oder FTP geliefertes Repo kann gespiegelt werden. Dabei wird die Gültigkeit der SIgnatur der Release-Datei überprüft.
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 wirdarchive_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 Repositoriescomponent1 ist eine optionale Liste von Komponenten zum herunterladen (default: alle Komponenten werden geladen)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]
aptly mirror list [-raw]
Bzw. für Details zu einem spezifischen Mirror:
aptly mirror show <mirror_name>
siehe Hinweis zum Löschen von Repos. Selbiges gilt hier analog.
aptly mirror drop <mirror_name> [-force]
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
aptly repo add <repo_name> <package file | directory> [-force-replace -remove-files]
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.