Come impostare un repository APT?


52

Vorrei impostare un repository APT su un server che fornirà un paio di pacchetti.

C'è un modo per configurarne uno senza installare alcun software sul server?

Come devono essere organizzati i file?


Modifica: devo fare qualcosa di sbagliato ... qualcuno può aiutarmi per favore? Ho il repository su http://quickmediasolutions.com/apt/dists

Non sono sicuro di dove o cosa, ma qualcosa non è configurato correttamente. Al momento ho solo un pacchetto ed è per tutte le architetture.

Ecco cosa è stato aggiunto al mio /etc/apt/sources.list:

deb http://quickmediasolutions.com/apt stable main

È possibile modificare e aggiungere in quale tipo di licenza si trovano le applicazioni scaricate? È per uso privato o prevedi di distribuirli, ecc.?
Jorge Castro,

@Jorge: che vuoi dire? Quali applicazioni?
Nathan Osman,

1
Stavo cercando di determinare se il pacchetto fosse OSS che potevi semplicemente usare launchpad.
Jorge Castro,

@Jorge: No, non è OSS. (In effetti, è praticamente l'unica app che ho scritto che non lo è.)
Nathan Osman,

Risposte:


26

Configurare un repository banale è molto semplice usando dpkg-scanpackages. Questa pagina spiega come impostare un repository banale e questo spiega come usarlo (scorrere fino all'esempio 4).


Avere un po 'di problemi a farlo funzionare. Si prega di consultare il mio aggiornamento alla domanda.
Nathan Osman,

1
Sembra che tu stia cercando di impostare un repository "automatico". Per uno (o solo più) pacchetto / i, starai molto meglio usando un repository banale. Prova a spostare il tuo Packages.gz ed esegui il deb fino a quickmediasolutions.com/apt/binary . Allora la tua fonte sarà deb http://quickmediasolutions.com/apt binary/.
Michael Crenshaw,

2
I repository trivial presentano problemi durante il pinning, ma sì, sono il modo più rapido / semplice per impostare un repository per pochi pacchetti. Sembrerebbe sciocco impostare un repository in pool solo per 2 - 3 pacchetti.
Tim Post

George, sei mai stato in grado di farlo funzionare?
Michael Crenshaw,

@mac: Beh .... non ho ancora avuto il tempo di provarlo :) Ho finito per caricare tutto su un PPA.
Nathan Osman,

40

Basta impostare un repository semplice ma firmato su un server web. Poiché la maggior parte degli altri tutorial è in qualche modo datata o ingombrante, proverò a replicare la procedura qui. La configurazione iniziale richiede un po 'di sforzo, ma il semplice script di build ne semplifica la gestione. E puoi semplicemente inserire nuovi *.debfile, quindi aggiornare o lasciare che un processo cron lo gestisca.

Genera alcune chiavi di firma

Per prima cosa devi creare una gpgchiave di firma per i pacchetti e il tuo repository. Renderlo un (4) chiave di firma RSA, nessuna password e dargli un unico $KEYNAMEquando richiesto. (Altri esempi assumono " dpkg1" come nome chiave.)

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

Ho detto nessuna password, perché il tuo server web non ha una scimmia integrata per digitarla ripetutamente. E i pacchetti firmati e il repository sono pensati solo per soddisfare i reclami dei gestori degli aggiornamenti. Carica entrambe le chiavi nella nuova /apt/directory del repository sul tuo server web, ma elimina la secret.gpgchiave dopo l' inizializzazione.

Aggiorna script CGI

Questo è il semplice script di shell / CGI di aggiornamento per esso:

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

Le tre gpgrighe devono essere eseguite una sola volta, per inizializzare la configurazione GPG in alcune directory $GNUPGHOME(sopra la radice del documento). Elimina solo il secret.gpgsuccesso successivo.

Una caratteristica unica di questo piccolo script di shell è che accetta tutti i *.debfile in cui ci si lancia, ma cerca anche in modo ricorsivo (a partire da un livello superiore) per gli altri e li collega simbolicamente. (Richiede .htaccess Options FollowSymLinksalla fine.)

È possibile eseguire questo script manualmente come CGI o per cron-job. Ma nascondilo, o meglio ancora spostalo fuori dalla radice del documento.

Perché è un repository apt "banale" ha bisogno della seguente apt-sources.listvoce:

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

È adatto per repository a architettura singola e se non ti aspetti centinaia di pacchetti.

Firma del pacchetto

Anche la firma dei singoli pacchetti è banale, una volta configurate le chiavi gpg:

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

(Questo dovrebbe essere fatto sulla workstation in cui sono creati i pacchetti, non sul server web del repository.)

Repository non firmato

Se non hai bisogno di pacchetti firmati, puoi ridurre lo script di aggiornamento a solo:

  dpkg-scanpackages . > Packages
  bzip2 -kf Packages

Che può ancora essere utilizzato da utenti medi, ma necessita di un flag personalizzato per apt.sources:

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

Ma per favore non usare la trusted=yesbandiera abitualmente per tutto, o se in realtà non sei sicuro dell'origine del pacchetto.

Per usabilità

Per gli utenti finali, rilasciare a HEADER.htmlnella directory del repository. Apache mod_auto_indexanticiperà quella nota:

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

alternative

Al giorno d'oggi ci sono alcuni strumenti per automatizzare la gestione dei repository. E ci sono persino repository online hoster e servizi di creazione di pacchetti ( gemfury , packagecloud , bintray ecc.)

  • Un'alternativa piuttosto conveniente è prm . È uno script Ruby, che crea repository APT e YUM complessi. (Ma speriamo solo che RPM finisca presto prima o poi ..) - È meglio installato per gem install prm.

  • E ho anche scritto una piccola sceneggiatura per automatizzare questo in modo simile: http://apt.include-once.org/apt-phparchive - Per favore, non che sia eccessivamente robusto e scritto in PHP (per una volta, questo è un caso), ed era originariamente pensato per DEB e bundle RPM-over-APT e Phar.

Poiché questo è strettamente correlato alla domanda originale, ci sono anche strumenti per costruire pacchetti Debian più facilmente. Un po 'obsoleto: EPM . Molto più contemporaneo: FPM . E il mio personale fork di ciò: XPM (approccio più pigro per impacchettare le app del linguaggio di scripting.)


1
Come faccio ad aggiungere la chiave gpg quando voglio usare quel repository?
Bruce Sun,

1
Di solito qualcosa del generewget …/public.gpg -O- | apt-key add -
mario

Cosa avrei bisogno di cambiare se volessi supportare più architetture?
starbeamrainbowlabs

1
@starbeamrainbowlabs Non del tutto sicuro, ma penso dpkg-scanpackages -mche basti. Elencherà comunque tutte le architetture nello stesso file di rilascio. Ma fintanto che ogni .deb ha un nome univoco / o è memorizzato in sottodir distinti (amd64 /, all /) dovrebbe funzionare. Altrimenti scegli uno degli strumenti di repository più complessi.
Mario,

7

Sì. Puoi farlo. Hai solo bisogno di organizzare i file nel modo giusto e creare i file di indice. Se si inserisce la struttura della directory nella radice del documento del server Web, è possibile accedere ai pacchetti tramite il server Web.

Ecco una descrizione dettagliata di come i file devono essere organizzati e come vengono creati i file di indice.

Puoi anche usare uno strumento chiamato reprepro se sei disposto a installare quel pacchetto. Ciò renderà l'amministrazione un po 'più comoda.


@txwikinger: Il motivo per cui non riesco a installare i pacchetti è perché il server esegue centOS :)
Nathan Osman

Bene. non è necessario. Puoi creare tutto su un altro computer e sincronizzare l'intero albero con il server
centos

Sì, farei sicuramente il secondo uso di reprepro. Renderà la tua vita molto più semplice. La creazione del repository su un altro computer potrebbe anche essere una funzione, nel caso in cui ti consenta di proteggere meglio la tua chiave di firma.
andol

@andol & @txwikinger: ci sto provando ma ho dei problemi. Si prega di consultare la mia domanda aggiornata.
Nathan Osman,

Per il tuo file dists avrai ancora bisogno ./binary-<specific arch>.
andol


0

Per chiunque si trovi ad affrontare questo errore dopo aver seguito la risposta di Mario:

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

Fai quanto segue:

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

Ho messo i miei *.debfile nella debscartella.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.