Jak skonfigurować repozytorium APT?

52

Chciałbym skonfigurować repozytorium APT na serwerze, które dostarczy kilka pakietów.

Czy istnieje sposób na skonfigurowanie go bez instalowania oprogramowania na serwerze?

Jak należy uporządkować pliki?


Edycja: Muszę robić coś złego ... czy ktoś może mi pomóc? Mam repozytorium na stronie http://quickmediasolutions.com/apt/dists

Nie jestem pewien, gdzie i co, ale coś jest źle skonfigurowane. Obecnie mam tylko jeden pakiet i jest przeznaczony dla wszystkich architektur.

Oto, co zostało dodane do mojego /etc/apt/sources.list:

deb http://quickmediasolutions.com/apt stable main
Nathan Osman
źródło
Czy możesz edytować i dodawać, w jakiej licencji są pobrane aplikacje? Czy jest to do użytku prywatnego, czy planujesz je rozpowszechniać itp.?
Jorge Castro,
@Jorge: Co masz na myśli? Jakie aplikacje?
Nathan Osman
1
Próbowałem ustalić, czy pakiet to OSS, którego można użyć po prostu startera.
Jorge Castro
@Jorge: Nie, to nie jest OSS. (W rzeczywistości jest to prawie jedyna aplikacja, którą napisałem, ale nie jest.)
Nathan Osman

Odpowiedzi:

26

Konfigurowanie trywialnego repozytorium jest bardzo łatwe przy użyciu pakietów dpkg-scan. Ta strona wyjaśnia, jak skonfigurować banalne repozytorium, a ta wyjaśnia, jak z niego korzystać (przewiń w dół do przykładu 4).

Michael Crenshaw
źródło
Mam problem z uruchomieniem go. Proszę zobaczyć moją aktualizację pytania.
Nathan Osman
1
Wygląda na to, że próbujesz skonfigurować „automatyczne” repozytorium. W przypadku jednego (lub tylko kilku) pakietów lepiej będzie skorzystać z trywialnego repozytorium. Spróbuj przenieść swój pakiet Packages.gz i deb aż do strony quickmediasolutions.com/apt/binary . Wtedy twoje źródło będzie deb http://quickmediasolutions.com/apt binary/.
Michael Crenshaw
2
Trywialne repozytoria powodują problemy podczas przypinania, ale tak, są najszybszym / najłatwiejszym sposobem na skonfigurowanie repozytorium tylko dla kilku pakietów. Wydaje się głupotą, aby zestawiać repozytorium tylko dla 2-3 pakietów.
Tim Post
George, czy kiedykolwiek byłeś w stanie sprawić, by to zadziałało?
Michael Crenshaw,
@mac: Cóż ... Nie miałem jeszcze czasu, aby tego spróbować :) Skończyło się na tym, że przesłałem wszystko do PPA.
Nathan Osman
40

Wystarczy skonfigurować proste, ale podpisane repozytorium na serwerze internetowym. Ponieważ większość innych samouczków jest nieco przestarzała lub uciążliwa, postaram się tutaj powtórzyć procedurę. Początkowa konfiguracja wymaga trochę wysiłku, ale prosty skrypt kompilacji ułatwia zarządzanie. Możesz po prostu dodać nowe *.debpliki, a następnie zaktualizować lub pozwolić, aby zadanie CRON sobie z tym poradziło.

Wygeneruj klucze do podpisywania

Najpierw musisz utworzyć gpgklucz do podpisywania dla pakietów i repozytorium. Zrób z niego (4) klucz do podpisywania RSA, bez hasła, i nadaj mu unikat, $KEYNAMEgdy zostaniesz o to poproszony. (Dalsze przykłady zakładają „ dpkg1” jako keyname).

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

Nie powiedziałem hasła, ponieważ twój serwer nie ma wbudowanej małpy, aby wpisać go wielokrotnie. A podpisane pakiety i repozytorium mają na celu wyłącznie zaspokojenie skarg menedżerów aktualizacji na ten temat. Po prostu prześlij oba klucze do nowego /apt/katalogu repozytorium na swoim serwerze, ale usuń secret.gpgklucz po inicjalizacji.

Zaktualizuj skrypt CGI

Oto prosty skrypt powłoki / CGI aktualizacji:

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

Trzy gpglinie muszą zostać wykonane tylko raz, aby zainicjować konfigurację GPG w jakimś katalogu $GNUPGHOME(powyżej katalogu głównego dokumentu). Usuń tylko secret.gpgpo sukcesie.

Jedną z unikalnych cech tego skryptu powłoki jest to, że akceptuje wszystkie *.debupuszczane pliki, ale także rekurencyjnie wyszukuje inne pliki (zaczynając od jednego poziomu w górę) i umieszcza w nich dowiązania symboliczne. (W Options FollowSymLinkskońcu potrzebuje .htaccess .)

Możesz wykonać ten skrypt ręcznie jako CGI lub na zadanie cron. Ale ukryj go, a najlepiej przenieś go poza katalog główny dokumentu.

Ponieważ jest to „trywialne” repozytorium apt, potrzebuje następującego apt-sources.listwpisu:

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

Jest to odpowiednie dla repozytoriów z pojedynczą architekturą, a jeśli nie oczekujesz setek pakietów.

Podpisywanie paczek

Podpisywanie indywidualnych paczek jest również banalne, po skonfigurowaniu kluczy gpg:

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

(Należy to zrobić na stacji roboczej, na której budowane są pakiety, a nie na serwerze WWW repozytorium).

Repozytorium niepodpisane

Jeśli nie potrzebujesz podpisanych pakietów, możesz obniżyć skrypt aktualizacji, aby po prostu:

  dpkg-scanpackages . > Packages
  bzip2 -kf Packages

Które nadal mogą być używane przez przeciętnych użytkowników, ale wymagają niestandardowej flagi dla apt.sources:

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

Ale proszę, nie używaj trusted=yesflagi zwykle do wszystkiego, lub jeśli nie masz pewności co do pochodzenia paczki.

Dla użyteczności

Użytkownicy końcowi po prostu upuść a HEADER.htmldo katalogu repozytorium. Apache mod_auto_indexprzygotują tę notatkę:

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

Alternatywy

Obecnie dostępnych jest kilka narzędzi do automatyzacji zarządzania repozytoriami. Są nawet hostingi online repozytoriów i usługi budowania pakietów ( gemfury , packagecloud , bintray itp.)

  • Dość wygodną alternatywą jest prm . Jest to skrypt Ruby, który tworzy złożone repozytorium APT i YUM. (Ale miejmy nadzieję, że RPM w końcu wkrótce się skończy ...) - Najlepiej zainstalować na gem install prm.

  • Napisałem również mały skrypt, aby zautomatyzować to w podobny sposób: http://apt.include-once.org/apt-phparchive - Proszę nie, że nie jest on zbyt niezawodny i napisany w PHP (chociaż raz jest to przypadek), i pierwotnie był przeznaczony dla pakietów DEB oraz RPM-over-APT i Phar.

Ponieważ jest to ściśle związane z pierwotnym pytaniem, istnieją również narzędzia do łatwiejszego budowania pakietów Debiana. Nieco przestarzałe: EPM . Znacznie więcej współczesnych: FPM . I moje osobiste rozwidlenie: XPM (bardziej leniwe podejście do pakowania aplikacji w języku skryptowym).

Mario
źródło
1
Jak dodać klucz gpg, kiedy chcę korzystać z tego repozytorium?
Bruce Sun
1
Zwykle coś w styluwget …/public.gpg -O- | apt-key add -
Mario,
Co musiałbym zmienić, gdybym chciał obsługiwać wiele architektur?
starbeamrainbowlabs
1
@starbeamrainbowlabs Nie do końca pewny, ale myślę, że dpkg-scanpackages -mmoże wystarczyć. Będzie nadal wyświetlać listę wszystkich architektur w tym samym pliku Release. Ale tak długo, jak każdy .deb ma unikalną nazwę / lub jest przechowywany w odrębnych podkatalogach (amd64 /, all /), powinien działać. W innym przypadku skorzystaj z jednego z bardziej złożonych narzędzi repozytorium.
Mario
7

Tak. Możesz to zrobić. Musisz tylko odpowiednio uporządkować pliki i utworzyć pliki indeksu. Jeśli umieścisz strukturę katalogów w katalogu głównym swojego serwera WWW, do pakietów będzie można uzyskać dostęp za pośrednictwem serwera WWW.

Oto szczegółowy opis, w jaki sposób pliki muszą być zorganizowane i jak tworzone są pliki indeksu.

Możesz także użyć narzędzia o nazwie reprezentpro, jeśli chcesz zainstalować ten pakiet. Uczyni to administrację nieco wygodniejszą.

txwikinger
źródło
@txwikinger: Nie mogę zainstalować pakietów, ponieważ na serwerze działa centOS :)
Nathan Osman
Dobrze. nie musisz. Możesz stworzyć wszystko na innym komputerze i po prostu zsynchronizować całe drzewo z serwerem
centos
Tak, zdecydowanie poparłbym użycie reprezentpro. Ułatwi ci to życie. Tworzenie repozytorium na innym komputerze może nawet być funkcją, na wypadek, gdyby lepiej chroniła klucz do podpisywania.
andol
@andol & @txwikinger: Próbuję, ale mam problemy. Zobacz moje zaktualizowane pytanie.
Nathan Osman
Do pliku dists nadal potrzebujesz ./binary-<specific arch>.
andol
2

Być może możesz rozważyć Launchpad PPA

UPS
źródło
0

Dla każdego, kto napotka ten błąd po udzieleniu odpowiedzi przez Mario:

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

wykonaj następujące czynności:

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

Moje *.debpliki umieszczam w debsfolderze.

theeminence
źródło