¿Cómo configurar un repositorio APT?


52

Me gustaría configurar un repositorio APT en un servidor que proporcione un par de paquetes.

¿Hay alguna manera de configurar uno sin instalar ningún software en el servidor?

¿Cómo deben organizarse los archivos?


Editar: Debo estar haciendo algo mal ... ¿alguien puede ayudarme? Tengo el repositorio en http://quickmediasolutions.com/apt/dists

No estoy seguro de dónde o qué, pero algo está mal configurado. Actualmente solo tengo un paquete y es para todas las arquitecturas.

Esto es lo que se ha agregado a mi /etc/apt/sources.list:

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

¿Puedes editar y agregar en qué tipo de licencia están las aplicaciones que descargaste? ¿Es para uso privado o planea distribuirlos, etc.?
Jorge Castro

@Jorge: ¿Qué quieres decir? Que aplicaciones
Nathan Osman

1
Estaba tratando de determinar si el paquete era OSS, solo podía usar launchpad.
Jorge Castro

@Jorge: No, no es OSS. (De hecho, es prácticamente la única aplicación que he escrito que no es).
Nathan Osman

Respuestas:


26

Configurar un repositorio trivial es muy fácil usando dpkg-scanpackages. Esta página explica cómo configurar un repositorio trivial, y este explica cómo usarlo (desplácese hacia abajo hasta el ejemplo 4).


Tener algunos problemas para que funcione. Por favor, vea mi actualización de la pregunta.
Nathan Osman el

1
Parece que estás intentando configurar un repositorio "automático". Para uno (o solo varios) paquete (s), será mucho mejor usar un repositorio trivial. Intente mover sus Packages.gz y deb hasta llegar a quickmediasolutions.com/apt/binary . Entonces tu fuente será deb http://quickmediasolutions.com/apt binary/.
Michael Crenshaw

2
Los repositorios triviales presentan problemas cuando se fijan, pero sí, son la forma más rápida / fácil de configurar un repositorio para unos pocos paquetes. Parecería una tontería configurar un repositorio agrupado solo para 2 a 3 paquetes.
Tim Post

George, ¿alguna vez pudiste hacer que esto funcionara?
Michael Crenshaw

@mac: Bueno ... todavía no he tenido tiempo de probarlo :) Terminé subiendo todo a un PPA.
Nathan Osman el

40

Simplemente configure un repositorio simple pero firmado en un servidor web. Como la mayoría de los otros tutoriales son algo anticuados o engorrosos, intentaré replicar el procedimiento aquí. La configuración inicial requiere un poco de esfuerzo, pero el script de compilación simple lo hace fácil de administrar. Y simplemente puede colocar nuevos *.debarchivos, luego actualizar o dejar que un trabajo cron se encargue de eso.

Generar algunas claves de firma

Primero debe crear una gpgclave de firma para los paquetes y su repositorio. Conviértalo en una (4) clave de firma RSA, sin contraseña, y dele una única $KEYNAMEcuando se le solicite. (Otros ejemplos suponen " dpkg1" como nombre clave).

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

Le dije que no tenía contraseña, porque su servidor web no tiene un mono incorporado para escribirlo repetidamente. Y los paquetes y el repositorio firmados solo están destinados a satisfacer las quejas de los administradores de actualizaciones al respecto. Simplemente cargue ambas claves en el nuevo /apt/directorio del repositorio en su servidor web, pero elimine la secret.gpgclave después de la inicialización.

Actualizar script CGI

Este es el script simple de shell / CGI de actualización para él:

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

Las tres gpglíneas solo necesitan ejecutarse una vez, para inicializar la configuración de GPG en algún directorio $GNUPGHOME(arriba de la raíz del documento). Eliminar solo el secret.gpgdespués del éxito.

Una característica única de este pequeño script de shell es que acepta cualquier *.debarchivo que coloque, pero también busca de forma recursiva (a partir de un nivel superior) para otros, y los vincula simbólicamente. (Necesita .htaccess Options FollowSymLinkseventualmente).

Puede ejecutar este script manualmente como CGI o por cron-job. Pero escóndelo, o mejor aún, muévelo fuera de la raíz del documento.

Debido a que es un repositorio apt "trivial", necesita la siguiente apt-sources.listentrada:

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

Eso es adecuado para repositorios de arquitectura única, y si no espera cientos de paquetes.

Firma del paquete

Firmar sus paquetes individuales también es trivial, una vez que haya configurado sus claves gpg:

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

(Esto debe hacerse en la estación de trabajo donde se crean los paquetes, no en el servidor web del repositorio).

Repositorio sin firmar

Si no necesita paquetes firmados, puede reducir el script de actualización a solo:

  dpkg-scanpackages . > Packages
  bzip2 -kf Packages

Que aún pueden usar los usuarios promedio, pero necesita un indicador personalizado para apt.sources:

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

Pero no use la trusted=yesbandera habitualmente para todo, o si no está seguro del origen del paquete.

Por usabilidad

Para los usuarios finales, simplemente suelte un HEADER.htmlen el directorio del repositorio. Apaches mod_auto_indexantepondrá esa 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>

Alternativas

Hay algunas herramientas para automatizar la gestión de repositorios en estos días. E incluso hay repositorios en línea y servicios de creación de paquetes ( gemfury , packagecloud , bintray , etc.)

  • Una alternativa bastante conveniente es prm . Es un script Ruby, que construye complejos APT y YUM repos. (Pero esperemos que RPM finalmente desaparezca pronto ...) - Se instala mejor por gem install prm.

  • Y también he escrito un pequeño script para automatizar esto de manera similar: http://apt.include-once.org/apt-phparchive - Por favor, no es que no sea demasiado robusto y esté escrito en PHP (por una vez, esto es una coincidencia), y originalmente estaba destinado a DEB y RPM-over-APT y Phar.

Dado que esto está estrechamente relacionado con la pregunta original, también hay herramientas para construir paquetes Debian más fácilmente. Algo anticuado: EPM . Mucho más contemporáneo: FPM . Y mi bifurcación personal: XPM (enfoque más vago para empaquetar aplicaciones de lenguaje de scripting).


1
¿Cómo agrego la clave gpg cuando quiero usar ese repositorio?
Bruce Sun

1
Por lo general, algo así comowget …/public.gpg -O- | apt-key add -
Mario

¿Qué necesitaría cambiar si quisiera soportar múltiples arquitecturas?
starbeamrainbowlabs

1
@starbeamrainbowlabs No estoy completamente seguro, pero creo que dpkg-scanpackages -mpodría ser suficiente. Enumerará todas las arquitecturas en el mismo archivo de lanzamiento. Pero siempre que cada .deb tenga un nombre único / o esté almacenado en subdirecciones distintas (amd64 /, all /) debería funcionar. De lo contrario, elija una de las herramientas de repositorio más complejas.
mario

7

Si. Puedes hacerlo. Solo necesita organizar los archivos de la manera correcta y crear los archivos de índice. Si coloca la estructura del directorio dentro de la raíz del documento de su servidor web, se puede acceder a los paquetes a través del servidor web.

Aquí hay una descripción detallada de cómo deben organizarse los archivos y cómo se crean los archivos de índice.

También puede usar una herramienta llamada reprepro si está dispuesto a instalar ese paquete. Esto hará que la administración sea un poco más conveniente.


@txwikinger: La razón por la que no puedo instalar paquetes es porque el servidor ejecuta centOS :)
Nathan Osman

Bien. No necesitas hacerlo. Puede crear todo en una computadora diferente y simplemente sincronizar todo el árbol al servidor centos
txwikinger

Sí, definitivamente apoyaría el uso de reprepro. Hará tu vida mucho más fácil. La creación del repositorio en una computadora diferente podría incluso ser una característica, en caso de que le permita proteger mejor su clave de firma.
andol

@andol & @txwikinger: Estoy intentando pero tengo problemas. Por favor vea mi pregunta actualizada.
Nathan Osman el

Para su archivo de discos aún necesitará ./binary-<specific arch>.
andol


0

Para cualquiera que se enfrente a este error después de seguir la respuesta de Mario:

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

Haz lo siguiente:

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

Puse mis *.debarchivos en la debscarpeta.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.