Como configurar um repositório APT?

52

Gostaria de configurar um repositório APT em um servidor que fornecerá alguns pacotes.

Existe uma maneira de configurar uma sem instalar nenhum software no servidor?

Como os arquivos precisam ser organizados?


Edit: Eu devo estar fazendo algo errado ... alguém pode me ajudar? Eu tenho o repositório em http://quickmediasolutions.com/apt/dists

Não sei onde ou o quê, mas algo está mal configurado. Atualmente, só tenho um pacote e é para todas as arquiteturas.

Aqui está o que foi adicionado ao meu /etc/apt/sources.list:

deb http://quickmediasolutions.com/apt stable main
Nathan Osman
fonte
Você pode editar e adicionar em que tipo de licença os aplicativos baixados estão? É para uso privado ou você planeja distribuí-los, etc.?
Jorge Castro
@Jorge: Como assim? Quais aplicações?
Nathan Osman
11
Eu estava tentando determinar se o pacote era OSS, você poderia apenas usar a barra de ativação.
Jorge Castro
@Jorge: Não, não é OSS. (Na verdade, é praticamente o único aplicativo que eu escrevi que não é.)
Nathan Osman

Respostas:

26

Configurar um repositório trivial é muito fácil usando o dpkg-scanpackages. Esta página explica como configurar um repositório trivial, e este explica como usá-lo (role para baixo até o exemplo 4).

Michael Crenshaw
fonte
Tendo um pouco de dificuldade para fazê-lo funcionar. Por favor, veja minha atualização para a pergunta.
Nathan Osman
11
Parece que você está tentando configurar um repositório "automático". Para um (ou apenas vários) pacotes, você será muito melhor usando um repositório trivial. Tente mover o Packages.gz e deb até o quickmediasolutions.com/apt/binary . Então sua fonte será deb http://quickmediasolutions.com/apt binary/.
Michael Crenshaw
2
Os repositórios triviais apresentam problemas ao fixar, mas sim, são a maneira mais rápida / fácil de configurar um repositório para apenas alguns pacotes. Pareceria tolo configurar um repositório em pool apenas para 2 - 3 pacotes.
Tim Post
George, você já conseguiu fazer isso funcionar?
Michael Crenshaw
@mac: Bem .... ainda não tive tempo de experimentar :) Acabei de enviar tudo para um PPA.
Nathan Osman
40

Basta configurar um repositório simples, mas assinado, em um servidor da web. Como a maioria dos outros tutoriais é um tanto antiga ou complicada, tentarei replicar o procedimento aqui. A configuração inicial exige um pouco de esforço, mas o script de compilação simples facilita o gerenciamento. E você pode simplesmente inserir novos *.debarquivos, atualizar ou deixar um trabalho cron lidar com isso.

Gere algumas chaves de assinatura

Primeiro, você precisa criar uma gpgchave de assinatura para pacotes e seu repositório. Crie uma (4) chave de assinatura RSA, sem senha, e dê uma chave única $KEYNAMEquando solicitada. (Outros exemplos assumem " dpkg1" como nome da chave.)

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

Eu disse que não havia senha, porque seu servidor da web não possui um macaco incorporado para digitá-lo repetidamente. E os pacotes e repositórios assinados têm como objetivo apenas satisfazer as reclamações dos gerentes de atualização sobre isso. Faça o upload das duas chaves para o novo /apt/diretório do repositório no servidor da web, mas exclua a secret.gpgchave após a inicialização.

Atualizar script CGI

Este é o script shell / CGI de atualização simples para ele:

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

As três gpglinhas precisam ser executadas apenas uma vez, para inicializar a configuração do GPG em algum diretório $GNUPGHOME(acima da raiz do documento). Exclua apenas o secret.gpgsucesso posterior.

Uma característica exclusiva desse pequeno script de shell é que ele aceita todos os *.debarquivos que você solta, mas também procura recursivamente (a partir de um nível acima) por outros, e os vincula simbolicamente. (Precisa de .htaccess Options FollowSymLinkseventualmente.)

Você pode executar esse script manualmente como CGI ou por tarefa cron. Mas esconda-o ou, melhor ainda, mova-o para fora da raiz do documento.

Por ser um repositório apt "trivial", ele precisa da seguinte apt-sources.listentrada:

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

Isso é adequado para repositórios de arquitetura única, e se você não espera centenas de pacotes.

Assinatura de pacote

A assinatura de seus pacotes individuais também é trivial, depois de configurar suas chaves gpg:

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

(Isso deve ser feito na estação de trabalho em que os pacotes são criados, não no servidor da web do repositório.)

Repositório não assinado

Se você não precisar de pacotes assinados, poderá reduzir o script de atualização para apenas:

  dpkg-scanpackages . > Packages
  bzip2 -kf Packages

Que ainda pode ser usado por usuários médios, mas precisa de um sinalizador personalizado para apt.sources:

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

Mas por favor, não use a trusted=yesflag habitualmente para tudo, ou se você não tiver certeza sobre a origem do pacote.

Para usabilidade

Para usuários finais, basta soltar um HEADER.htmlno diretório do repositório. O Apaches mod_auto_indexanexará essa 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

Atualmente, existem algumas ferramentas para automatizar o gerenciamento de repositório. E ainda existem hosters online de repositório e serviços de criação de pacotes ( gemfury , packagecloud , bintray etc.)

  • Uma alternativa bastante conveniente é prm . É um script Ruby, que cria repositórios APT e YUM complexos. (Mas vamos apenas torcer para que o RPM finalmente acabe em breve ..) - É melhor instalado por gem install prm.

  • E também escrevi um pequeno script para automatizar isso da mesma forma: http://apt.include-once.org/apt-phparchive - Por favor, não que não seja excessivamente robusto e escrito em PHP (pela primeira vez, isso é coincidência), e foi originalmente concebido para os pacotes DEB e RPM-over-APT e Phar.

Como isso está intimamente relacionado à pergunta original, também existem ferramentas para criar pacotes Debian mais facilmente. Um pouco desatualizado: EPM . Muito mais contemporâneo: FPM . E minha bifurcação pessoal: XPM (abordagem mais preguiçosa para empacotar aplicativos da linguagem de script).

mario
fonte
11
Como adiciono a chave gpg quando quero usar esse repositório?
Bruce Sun
11
Geralmente algo comowget …/public.gpg -O- | apt-key add -
mario
O que eu precisaria mudar se quisesse suportar várias arquiteturas?
starbeamrainbowlabs
11
@starbeamrainbowlabs Não tenho muita certeza, mas acho que dpkg-scanpackages -mpode ser suficiente. Ainda listará todas as arquiteturas no mesmo arquivo da versão. Mas desde que cada .deb tenha um nome exclusivo / ou seja armazenado em subdiretórios distintos (amd64 /, all /), ele deve funcionar. Caso contrário, escolha uma das ferramentas de repositório mais complexas.
mario
7

Sim. Você consegue fazer isso. Você só precisa organizar os arquivos da maneira correta e criar os arquivos de índice. Se você colocar a estrutura de diretórios na raiz do documento do servidor da Web, os pacotes poderão ser acessados ​​apenas através do servidor da Web.

Aqui está uma descrição detalhada de como os arquivos precisam ser organizados e como os arquivos de índice são criados.

Você também pode usar uma ferramenta chamada reprepro se estiver disposto a instalar esse pacote. Isso tornará a administração um pouco mais conveniente.

txwikinger
fonte
@txwikinger: A razão pela qual eu não posso instalar pacotes é porque o servidor está executando centOS :)
Nathan Osman
Bem. você não precisa. Você pode criar tudo em um computador diferente e apenas rsync a árvore inteira ao centos servidor
txwikinger
Sim, eu definitivamente recomendaria o uso do reprepro. Isso tornará sua vida muito mais fácil. Criar o repositório em um computador diferente pode até ser um recurso, caso permita proteger melhor sua chave de assinatura.
andol 31/07/10
@andol & @txwikinger: Estou tentando, mas estou tendo problemas. Por favor, veja minha pergunta atualizada.
Nathan Osman
Para o seu arquivo dists, você ainda precisará de ./binary-<especific arch>.
andol 31/07/10
2

Talvez você também possa considerar um PPA do Launchpad

ups
fonte
0

Para quem enfrenta esse erro depois de seguir a resposta de mario:

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

faça o seguinte:

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

Coloquei meus *.debarquivos na debspasta

theeminence
fonte