{"id":2453,"date":"2017-11-24T10:02:34","date_gmt":"2017-11-24T10:02:34","guid":{"rendered":"https:\/\/esferas.org\/msqlu\/?p=2453"},"modified":"2017-11-24T10:03:46","modified_gmt":"2017-11-24T10:03:46","slug":"reprepro-git-y-rsync-un-repositorio-debian-bajo-control-local","status":"publish","type":"post","link":"https:\/\/esferas.org\/msqlu\/2017\/11\/24\/reprepro-git-y-rsync-un-repositorio-debian-bajo-control-local\/","title":{"rendered":"reprepro, git y rsync: un repositorio Debian bajo control local"},"content":{"rendered":"<p>Pues s\u00ed, tras varios a\u00f1os empleando mini-dinstall para gestionar los dos repositorios de paquetes Debian de los que soy responsable (el m\u00edo y el de la empresa donde trabajo) le voy a dar la vuelta al concepto por completo.<\/p>\n<p><!--more--><\/p>\n<p>\u00bf Cu\u00e1l es el problema con <em>mini-dinstall<\/em> ? Que me exige mantener una configuraci\u00f3n bastante completa en el lado del servidor y para ese viaje no necesitamos tanta alforja. Que estoy solo, oiga, y que no es necesario tanto mecanismo de env\u00edo remoto -con su seguridad extra- para cuatro paquetes que creo y mantengo al mes.<\/p>\n<p>Con <em>mini-dinstall<\/em> el trabajo diario con los paquetes consiste en crearlos primero (obvio) y luego transferirlos al servidor remoto en un directorio concreto. En el otro lado se est\u00e1 vigilando dicho directorio as\u00ed que se toman los paquetes, se incluyen en el sitio correspondiente del \u00e1rbol y se firman con la clave del mismo.<\/p>\n<p>Dicho as\u00ed no parece que la cosa sea muy compleja, \u00bf no ? Pues no, porque en el otro lado hay que instalar <a href=\"https:\/\/esferas.org\/msqlu\/2014\/01\/06\/mi-propio-repositorio-debian\/\">varios programas<\/a> que interact\u00faan entre s\u00ed con mucho cuidado para que la clave privada con la que se firma no quede expuesta, y siempre termina por existir alg\u00fan detalle que hace que tenga que entrar como administrador y realizar ajustes a mano. Son varias las claves que proteger\u00a0 -y demasiados los pasos a vigilar- para que al final un servidor web de acceso simple y pel\u00f3n a unos archivos.<\/p>\n<p>Ahora que tengo bastante ma\u00f1a con los repositorios <em>git<\/em> y que he podido reducir los lugares de desarrollo a dos (mi casa y mi trabajo), veo que es mucho m\u00e1s sencillo utilizar un repositorio local para mantener los paquetes y enviar al servidor remoto s\u00f3lo lo que tiene que presentar al mundo.<\/p>\n<h3>reprepro<\/h3>\n<p>Ya llevaba un tiempo intentando ver qu\u00e9 otras opciones exist\u00edan para gestionar un repositorio Debian y este programa ha encajado muy bien. Es sencillo de emplear y lo bastante extensible como para afrontar disposiciones complejas.<\/p>\n<p>Hay muchas referencias y tutoriales para ponerlo en marcha. No tiene mucho misterio y lo mejor de todo es que crea toda la estructura donde le digas sin protestar y luego es muy f\u00e1cil subirla al servidor para que sea s\u00f3lo eso lo que se publique.<\/p>\n<p>Las referencias con las que he trabajado son:<\/p>\n<ul>\n<li><a href=\"https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-use-reprepro-for-a-secure-package-repository-on-ubuntu-14-04\">How to Use Reprepro for a Secure Package Repository on Ubuntu 14.04<\/a><\/li>\n<li><a href=\"https:\/\/mirrorer.alioth.debian.org\/reprepro.1.html\">REPREPRO<\/a><\/li>\n<li><a href=\"https:\/\/bugs.debian.org\/cgi-bin\/bugreport.cgi?bug=769981\">Debian Bug report logs &#8211; #769981 reprepro complaining about &#8216;all&#8217; architecture<\/a><\/li>\n<\/ul>\n<p>Y, por resumir mucho, lo que he hecho ha sido:<\/p>\n<ol>\n<li>Crear una clave PGP para firmar los paquetes y la distribuci\u00f3n.<\/li>\n<li>Crear un repositorio <em>git. <\/em><\/li>\n<li>Dentro de \u00e9l a\u00f1adir una ruta <em>repos\/conf<\/em> con un archivo en su interior llamado <em>distributions<\/em>.<\/li>\n<li>Rellenar ese archivo con la informaci\u00f3n correspondiente a mi repositorio e<\/li>\n<li>Indicar al programa que construya el \u00e1rbol inicial: <code>reprepro -b repos export<\/code><\/li>\n<\/ol>\n<p>Si he configurado el repositorio de la siguiente forma:<\/p>\n<pre class=\"lang:default decode:true \">Origin: http:\/\/debian.example.net\r\nLabel: example\r\nCodename: debian\r\nSuite: stable\r\nComponents: main \r\nArchitectures: source amd64 i386\r\nDescription: Mi repositorio de paquetes\r\n#SignWith: root@example.net\r\n<\/pre>\n<p>Y sigo estos pasos:<\/p>\n<pre class=\"lang:sh decode:true\">victor@gladius:~$ cd tmp\r\nvictor@gladius:~\/tmp$ mkdir myrepo\r\nvictor@gladius:~\/tmp$ cd myrepo\r\nvictor@gladius:~\/tmp\/myrepo$ git init .\r\nInitialized empty Git repository in \/home\/victor\/tmp\/myrepo\/.git\/\r\nvictor@gladius:~\/tmp\/myrepo$ mkdir -p repos\/conf\r\nvictor@gladius:~\/tmp\/myrepo$ vim repos\/conf\/distributions\r\nvictor@gladius:~\/tmp\/myrepo$ reprepro -b repos export\r\n<\/pre>\n<p>Obtengo lo siguiente:<\/p>\n<pre class=\"lang:default decode:true \">victor@gladius:~\/tmp\/myrepo$ tree -puag repos\r\nrepos\r\n\u251c\u2500\u2500 [drwxrwxr-x victor   victor  ]  conf\r\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 [-rw-rw-r-- victor   victor  ]  distributions\r\n\u251c\u2500\u2500 [drwxrwxr-x victor   victor  ]  db\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 [-rw-rw-r-- victor   victor  ]  checksums.db\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 [-rw-rw-r-- victor   victor  ]  contents.cache.db\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 [-rw-rw-r-- victor   victor  ]  packages.db\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 [-rw-rw-r-- victor   victor  ]  references.db\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 [-rw-rw-r-- victor   victor  ]  release.caches.db\r\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 [-rw-rw-r-- victor   victor  ]  version\r\n\u2514\u2500\u2500 [drwxrwxr-x victor   victor  ]  dists\r\n    \u2514\u2500\u2500 [drwxrwxr-x victor   victor  ]  debian\r\n        \u251c\u2500\u2500 [drwxrwxr-x victor   victor  ]  main\r\n        \u2502\u00a0\u00a0 \u251c\u2500\u2500 [drwxrwxr-x victor   victor  ]  binary-amd64\r\n        \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 [-rw-rw-r-- victor   victor  ]  Packages\r\n        \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 [-rw-rw-r-- victor   victor  ]  Packages.gz\r\n        \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 [-rw-rw-r-- victor   victor  ]  Release\r\n        \u2502\u00a0\u00a0 \u251c\u2500\u2500 [drwxrwxr-x victor   victor  ]  binary-i386\r\n        \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 [-rw-rw-r-- victor   victor  ]  Packages\r\n        \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 [-rw-rw-r-- victor   victor  ]  Packages.gz\r\n        \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 [-rw-rw-r-- victor   victor  ]  Release\r\n        \u2502\u00a0\u00a0 \u2514\u2500\u2500 [drwxrwxr-x victor   victor  ]  source\r\n        \u2502\u00a0\u00a0     \u251c\u2500\u2500 [-rw-rw-r-- victor   victor  ]  Release\r\n        \u2502\u00a0\u00a0     \u2514\u2500\u2500 [-rw-rw-r-- victor   victor  ]  Sources.gz\r\n        \u2514\u2500\u2500 [-rw-rw-r-- victor   victor  ]  Release\r\n\r\n8 directories, 16 files\r\n<\/pre>\n<p>He obviado lo de la firma por no complicar m\u00e1s el ejemplo pero una vez que le das la clave de la misma cualquier cambio es firmado con total normalidad.<\/p>\n<h3>A\u00f1adiendo paquetes<\/h3>\n<p>En los dos repositorios que controlo tengo paquetes Debian nativos y paquetes bajados de cualquier lado y en condiciones extra\u00f1as.<\/p>\n<p>Los nativos son los que hago yo porque la mayor parte de mis desarrollos son para este sistema operativo. S\u00e9 que el canon Debian insiste mucho en no hacerlo as\u00ed pero, mira, ya que no voy a distribuirlos oficialmente no veo ventaja alguna en seguirlo en este aspecto.<\/p>\n<p>Aquellos cuyo origen menciono tan a la ligera son principalmente paquetes que proporcionan fabricantes de hardware y similares, en formato Debian, pero sin mucho rigor. As\u00ed que me limito a descargarlos y a guardarlos en el repositorio para poder reutilizarlos con facilidad.<\/p>\n<p style=\"padding-left: 30px;\">Por ejemplo, si muevo de m\u00e1quina una impresora o la recupero del trastero, no me gusta jug\u00e1rmela con nuevas y emocionantes versiones del fabricante si con las versiones antiguas estaba funcionando. Demasiados disgustos me he llevado ya.<\/p>\n<p>As\u00ed que, una vez que tenemos los paquetes Debian para a\u00f1adir, basta con indicarle al programa que los importe:<\/p>\n<pre class=\"lang:sh decode:true\">victor@gladius:~\/tmp\/myrepo$ reprepro -b repos includedeb stable ~\/Descargas\/Rambox_0.5.13-x64.deb\r\nExporting indices...\r\nvictor@gladius:~\/tmp\/myrepo$ tree repos\/pool\/\r\nrepos\/pool\/\r\n\u2514\u2500\u2500 main\r\n    \u2514\u2500\u2500 r\r\n        \u2514\u2500\u2500 rambox\r\n            \u2514\u2500\u2500 rambox_0.5.13-108_amd64.deb\r\n\r\n3 directories, 1 file\r\n\r\n<\/pre>\n<p>Listo. No hay m\u00e1s que hacer. Ahora basta con transferir <a href=\"https:\/\/esferas.org\/msqlu\/2017\/11\/24\/reprepro-preparando-el-servidor\/\">al servidor<\/a> los archivos necesarios y el repositorio estar\u00e1 disponible.<\/p>\n<pre class=\"lang:sh decode:true\">$ sudo rsync -avl repos\/dists repos\/pool debrepo@example.net:\r\n<\/pre>\n<p>Con esos dos basta. La base de datos del repositorio queda bajo nuestra custodia local, la clave de firma tambi\u00e9n, y como a su vez est\u00e1 gestionado bajo <em>git<\/em> es f\u00e1cil de transportar a otra m\u00e1quina y seguir manteni\u00e9ndolo.<\/p>\n<p>Hay detalles pr\u00e1cticos que faltan, claro, pero eso da para otra entrada &#8230;<\/p>\n<p style=\"padding-left: 30px;\">\n","protected":false},"excerpt":{"rendered":"<p>Pues s\u00ed, tras varios a\u00f1os empleando mini-dinstall para gestionar los dos repositorios de paquetes Debian de los que soy responsable (el m\u00edo y el de la empresa donde trabajo) le voy a dar la vuelta al concepto por completo.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","webmentions_disabled_pings":false,"webmentions_disabled":false,"footnotes":""},"categories":[6],"tags":[73,730],"class_list":["post-2453","post","type-post","status-publish","format-standard","hentry","category-debian","tag-git","tag-reprepro"],"_links":{"self":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/2453","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/comments?post=2453"}],"version-history":[{"count":0,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/2453\/revisions"}],"wp:attachment":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/media?parent=2453"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/categories?post=2453"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/tags?post=2453"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}