Bagaimana cara mengatur repositori APT?

52

Saya ingin mengatur repositori APT di server yang akan menyediakan beberapa paket.

Apakah ada cara untuk mengaturnya tanpa menginstal perangkat lunak apa pun di server?

Bagaimana cara mengatur file?


Sunting: Saya pasti melakukan kesalahan ... bisakah seseorang tolong saya? Saya memiliki repositori di http://quickmediasolutions.com/apt/dists

Saya tidak yakin di mana atau apa, tetapi ada yang salah konfigurasi. Saat ini saya hanya memiliki satu paket dan itu untuk semua arsitektur.

Inilah yang telah ditambahkan ke saya /etc/apt/sources.list:

deb http://quickmediasolutions.com/apt stable main
Nathan Osman
sumber
Bisakah Anda mengedit dan menambahkan lisensi seperti apa aplikasi yang Anda unduh? Apakah ini untuk penggunaan pribadi atau Anda berencana untuk mendistribusikannya, dll?
Jorge Castro
@Jorge: Apa maksudmu? Aplikasi apa?
Nathan Osman
1
Saya mencoba untuk menentukan apakah paket itu OSS Anda bisa menggunakan launchpad.
Jorge Castro
@ Jorge: Tidak, ini bukan OSS. (Faktanya, ini adalah satu-satunya aplikasi yang saya tulis tetapi tidak.)
Nathan Osman

Jawaban:

26

Menyiapkan repositori sepele sangat mudah menggunakan paket dpkg-scanpackage. Halaman ini menjelaskan cara mengatur repo yang sepele, dan yang ini menjelaskan cara menggunakannya (gulir ke bawah untuk contoh 4).

Michael Crenshaw
sumber
Memiliki sedikit kesulitan untuk membuatnya bekerja. Silakan lihat pembaruan saya untuk pertanyaan.
Nathan Osman
1
Sepertinya Anda mencoba menyiapkan repo "otomatis". Untuk satu (atau hanya beberapa) paket, Anda akan jauh lebih baik menggunakan repo yang sepele. Coba pindahkan Packages.gz Anda dan debet sepenuhnya ke quickmediasolutions.com/apt/binary . Maka sumber Anda akan deb http://quickmediasolutions.com/apt binary/.
Michael Crenshaw
2
Repo sepele menghadirkan masalah saat menyematkan, tetapi ya, mereka adalah cara tercepat / termudah untuk menyiapkan repo hanya untuk beberapa paket. Tampaknya konyol untuk membuat repo yang dikumpulkan hanya untuk 2 - 3 paket.
Pos Tim
George, apakah Anda pernah bisa membuat ini berhasil?
Michael Crenshaw
@ Mac: Ya .... Saya belum punya waktu untuk mencobanya :) Saya akhirnya hanya mengunggah semuanya ke PPA.
Nathan Osman
40

Hanya menyiapkan repositori yang sederhana namun bertanda tangan di server web. Karena kebanyakan tutorial lain agak ketinggalan jaman atau rumit, saya akan mencoba meniru prosedur di sini. Konfigurasi awal membutuhkan sedikit usaha, tetapi skrip build sederhana membuatnya mudah untuk dikelola. Dan Anda bisa *.debmemasukkan file baru , kemudian memperbarui, atau membiarkan pekerjaan cron mengatasinya.

Hasilkan beberapa kunci masuk

Pertama, Anda perlu membuat gpgkunci penandatanganan untuk paket dan repositori Anda. Jadikan (4) kunci penandatanganan RSA, tanpa kata sandi, dan berikan keunikan $KEYNAMEsaat diminta. (Contoh lebih lanjut menganggap " dpkg1" sebagai nama kunci.)

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

Saya bilang tidak ada kata sandi, karena server web Anda tidak memiliki monyet bawaan untuk mengetiknya berulang kali. Dan paket dan repositori yang telah ditandatangani hanya dimaksudkan untuk memuaskan keluhan manajer pembaruan tentang hal itu. Unggah kedua kunci ke /apt/direktori repositori baru di server web Anda, tetapi hapus secret.gpgkunci setelah inisialisasi.

Perbarui skrip CGI

Ini adalah skrip shell / CGI pembaruan sederhana untuknya:

#!/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

Tiga gpgbaris hanya perlu dijalankan sekali, untuk menginisialisasi pengaturan GPG di beberapa direktori $GNUPGHOME(di atas root dokumen). Hapus hanya secret.gpgsetelah sukses.

Salah satu fitur unik dari skrip shell kecil ini adalah ia menerima *.debfile apa pun yang Anda singgahi, tetapi juga mencari secara rekursif (mulai dari satu tingkat ke atas) untuk yang lain, dan menyinkronkannya. (Butuh .htaccess Options FollowSymLinksakhirnya.)

Anda dapat menjalankan skrip ini secara manual sebagai CGI atau per cron-job. Tapi sembunyikan, atau lebih baik pindahkan dari root dokumen.

Karena itu adalah repositori apt "trivial" maka perlu apt-sources.listentri berikut :

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

Itu cocok untuk repositori arsitektur tunggal, dan jika Anda tidak mengharapkan ratusan paket.

Penandatanganan paket

Menandatangani paket individual Anda juga sepele, setelah Anda menyiapkan kunci gpg Anda:

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

(Ini harus dilakukan pada workstation tempat paket dibangun, bukan pada server web repositori.)

Repositori yang tidak ditandatangani

Jika Anda tidak perlu paket yang ditandatangani, maka Anda dapat memangkas skrip pembaruan menjadi hanya:

  dpkg-scanpackages . > Packages
  bzip2 -kf Packages

Yang masih dapat digunakan oleh pengguna biasa, tetapi membutuhkan bendera khusus untuk apt.sources:

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

Tapi tolong jangan gunakan trusted=yesbendera biasa untuk semuanya, atau jika Anda tidak benar-benar yakin tentang asal paket.

Untuk kegunaan

Untuk pengguna akhir, cukup masukkan a HEADER.htmlke dalam direktori repositori. Apache mod_auto_indexakan menambahkan catatan itu:

<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>

Alternatif

Ada beberapa alat untuk mengotomatisasi manajemen repositori hari ini. Dan bahkan ada hoster repositori online dan layanan pembuatan paket ( gemfury , packagecloud , bintray dll.)

  • Alternatif yang agak nyaman adalah prm . Ini adalah skrip Ruby, yang membangun repo APT dan YUM yang kompleks. (Tapi mari kita berharap RPM akhirnya mati dalam waktu dekat ..) - Lebih baik diinstal per gem install prm.

  • Dan saya juga telah menulis sebuah skrip kecil untuk mengotomatiskan ini dengan cara yang sama: http://apt.include-once.org/apt-phparchive - Tolong jangan bahwa itu tidak terlalu kuat dan ditulis dalam PHP (untuk sekali, ini kebetulan), dan pada awalnya dimaksudkan untuk DEB, dan bundel RPM-over-APT dan Phar.

Karena ini terkait erat dengan pertanyaan awal, ada juga alat untuk membuat paket Debian lebih mudah. Agak ketinggalan jaman: EPM . Jauh lebih kontemporer: FPM . Dan garpu pribadi saya: XPM (pendekatan yang lebih malas untuk pengemasan aplikasi bahasa scripting.)

mario
sumber
1
Bagaimana cara menambahkan kunci gpg ketika saya ingin menggunakan repo itu?
Bruce Sun
1
Biasanya sesuatu sepertiwget …/public.gpg -O- | apt-key add -
mario
Apa yang perlu saya ubah jika saya ingin mendukung banyak arsitektur?
starbeamrainbowlabs
1
@ starbeamrainbowlabs Tidak sepenuhnya yakin, tapi saya pikir dpkg-scanpackages -mmungkin cukup. Ini akan mencantumkan semua arsitektur dalam file Rilis yang sama. Tetapi selama masing-masing .deb memiliki nama unik / atau disimpan dalam subdirir yang berbeda (amd64 /, semua /) itu harus berhasil. Lain pergi untuk salah satu alat repositori yang lebih kompleks.
mario
7

Iya. Kamu bisa melakukan ini. Anda hanya perlu mengatur file dengan cara yang benar dan membuat file indeks. Jika Anda meletakkan struktur direktori di dalam root dokumen server web Anda, paket hanya dapat diakses melalui server web.

Berikut ini adalah uraian terperinci bagaimana file perlu diatur dan bagaimana file indeks dibuat.

Anda juga dapat menggunakan alat yang disebut reprepro jika Anda ingin menginstal satu paket itu. Ini akan membuat administrasi sedikit lebih nyaman.

txwikinger
sumber
@txwikinger: Alasan saya tidak dapat menginstal paket adalah karena server menjalankan centOS :)
Nathan Osman
Baik. kamu tidak perlu. Anda dapat membuat semuanya di komputer yang berbeda dan hanya men-rsync seluruh pohon ke server centos
txwikinger
Ya, saya pasti akan menggunakan reprepro kedua. Itu akan membuat hidup Anda jauh lebih mudah. Membuat repo di komputer yang berbeda bahkan mungkin menjadi fitur, jika itu memungkinkan Anda untuk melindungi kunci penandatanganan Anda dengan lebih baik.
andol
@andol & @txwikinger: Saya mencoba tetapi mengalami masalah. Silakan lihat pertanyaan saya yang diperbarui.
Nathan Osman
Untuk file dists Anda, Anda masih perlu ./binary-< lengkungan spesifik>.
andol
2

Anda mungkin juga dapat mempertimbangkan PPA Launchpad

UPS
sumber
0

Bagi siapa pun yang menghadapi kesalahan ini setelah mengikuti jawaban mario:

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

lakukan hal berikut:

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

Saya meletakkan *.debfile saya di debsfolder.

theeminence
sumber