Servicios https://www.carloscarrascal.com/ es HTTPS con un certificado gratuito de letsencrypt.org y Certbot https://www.carloscarrascal.com/blog/https-con-un-certificado-gratuito-de-letsencryptorg-y-certbot <article data-history-node-id="16" class="node node--type-blog-post node--view-mode-rss group-one-column ds-2col-stacked-fluid clearfix"> <div class="group-header"> <div class="field field--name-node-title field--type-ds field--label-hidden field--item"><h1> HTTPS con un certificado gratuito de letsencrypt.org y Certbot </h1> </div> <div class="field field--name-node-post-date field--type-ds field--label-hidden field--item">Lunes, Febrero 27, 2017 - 22:03</div> </div> <div class="group-left"> <div class="field field--name-field-tags field--type-entity-reference field--label-hidden field--items"> <div class="field--item"><a href="/tags/linux" hreflang="es">Linux</a></div> <div class="field--item"><a href="/tags/debian" hreflang="es">Debian</a></div> <div class="field--item"><a href="/tags/servicios" hreflang="es">Servicios</a></div> <div class="field--item"><a href="/tags/ssl" hreflang="es">SSL</a></div> <div class="field--item"><a href="/tags/https" hreflang="es">HTTPS</a></div> </div> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p><em>Let’s Encrypt</em> es una autoridad certificadora (CA) abierta, gratuita, y libre. Llevan funcionando menos de un año, desde 2016, y se puede decir que es un servicio público, dirigido a promover y facilitar la obtención y configuración de certificados de seguridad para la web. Lo que ofrecen son certificados X.509 por dominio que podemos usar para TLS.</p> <p><a href="https://letsencrypt.org/" target="_blank">https://letsencrypt.org/</a></p> <p>Hay varias organizaciones involucradas en el proyecto, siendo la principal la <a href="https://en.wikipedia.org/wiki/Internet_Security_Research_Group" target="_blank">Internet Security Research Group (ISRG)</a>, junto a otras como <a href="https://es.wikipedia.org/wiki/Fundaci%C3%B3n_Linux" target="_blank">Linux Foundation</a> o <a href="https://es.wikipedia.org/wiki/Fundaci%C3%B3n_Mozilla" target="_blank">Mozilla Foundation</a>, pero también gigantes como Akamai o Cisco Systems. Es decir, que hay gente grande detrás, y el proyecto es bastante interesante, esperemos que dure.</p> <p>Hasta ahora conseguir un certificado de seguridad para configurar HTTPS como es debido era bastante engorroso, además de que solía ser bastante caro. Últimamente los precios habían comenzado a bajar, pero ahora podemos conseguir un certificado propio por la cara, y con una instalación muy sencilla.</p> <p>La principal ventaja del servicio se basa en la automatización de todo el proceso. El objetivo es configurar un servidor HTTPS y obtener un certificado de confianza para los navegadores sin intervención humana. Y dejarme deciros que me ha funcionado de verdad, y a la primera. </p> <p>Esta automatización es la clave de todo el asunto, primero porque los certificados que nos ofrecen solamente son válidos por 90 días, lo que nos va a obligar a configurar la renovación de forma automática si no queremos estar cada tres meses renovando el certificado de forma manual.</p> <p>Para esto han ideado un protocolo llamado ACME (<a href="https://en.wikipedia.org/wiki/Automated_Certificate_Management_Environment" target="_blank">Automated Certificate Management Environment</a>), y el truco consiste en instalar un agente que se encargue de realizar automáticamente la petición y renovación del certificado, validando el solito nuestros dominios. Tenemos unos cuantos disponibles, pero el que recomiendan desde letsencrypt.org es <em>Certbot</em>:</p> <p><a href="https://certbot.eff.org" target="_blank">https://certbot.eff.org</a></p> <p><em>Certbot</em> esta empaquetado en los repos de Debian, pero deberemos usar el repositorio de <a href="https://backports.debian.org/Instructions/" target="_blank">backports</a>. Para ello basta con incluir una línea en nuestro fichero <em>/etc/apt/sources.list</em>. Si estáis usando Jessie (Debian 8) será:</p> <pre> deb http://ftp.debian.org/debian jessie-backports main</pre> <p>Después actualizamos:</p> <pre> apt-get update</pre> <p>Ahora ya podemos instalar el cliente de <em>Certbot</em>:</p> <pre> $ sudo apt-get install python-certbot-apache -t jessie-backports </pre> <p>Una vez instalado, ya podemos ejecutarlo, si estamos usando Apache, así:</p> <pre> $ certbot --apache</pre> <p>Y ya está. Lo juro. El instalador nos hará una serie de preguntas sobre los certificados que queremos instalar y listo. En mi caso tenia un Apache2 con varios VirtualHosts con diferentes nombres de dominio y alias, todos por el puerto 80. El instalador hizo solito todo esto:</p> <ul> <li>Realizo una copia de cada fichero de configuración de VirtualHost, añadiendo -le-ssl.conf al nombre, y configuró en ellos el certificado.</li> <li>En cada VirtualHost original, añadió una redirección automática a su versión de HTTPS</li> <li>Configuró un servicio en Cron <em>/etc/cron.d/certbot</em> para realizar automáticamente la renovación de los certificados.</li> <li>Reinicio el servidor Apache para cargar la nueva configuración.</li> </ul> <p>Si no os hace mucha gracia que os toque la configuración, o tenéis algo realmente chungo montado, también podemos hacer que solamente consiga el certificado, y configurarlo nosotros a mano, así:</p> <pre> $ certbot --apache certonly</pre> <p>En mi caso, añadió las siguientes líneas a mis archivos de VirtualHost originales en el 80:</p> <pre> RewriteEngine on RewriteCond %{SERVER_NAME} =xxxxx.com [OR] RewriteCond %{SERVER_NAME} =www.xxxxx.com RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent] </pre> <p>Los nuevos ficheros para SSL que creó Certbot son copias de los que yo tenía, en los que se añade la configuración del certificado:</p> <pre> SSLCertificateFile /etc/letsencrypt/live/xxxxxxx/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/xxxxxxxx/privkey.pem Include /etc/letsencrypt/options-ssl-apache.conf</pre> <p>Y este es el archivo que añade al Cron en <em>/etc/cron.d/certbot</em> para automatizar la renovación de los certificados:</p> <pre> # /etc/cron.d/certbot: crontab entries for the certbot package # # Upstream recommends attempting renewal twice a day # # Eventually, this will be an opportunity to validate certificates # haven't been revoked, etc. Renewal will only occur if expiration # is within 30 days. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system &amp;&amp; perl -e 'sleep int(rand(3600))' &amp;&amp; certbot -q renew </pre> <p>Podemos hacer una simulación del proceso de renovación de los certificados con este comando:</p> <pre> certbot renew --dry-run </pre> <p>Esto nos dará una idea de si funcionará o no cuando lo tenga que hacer el solo.</p> <p>De momento, está funcionando perfectamente. Ya veremos cuando llegue la primera renovación...</p> <p> </p> <h2>Referencias</h2> <ul> <li>Proceso de como funciona completo: <a href="https://letsencrypt.org/how-it-works/" target="_blank">https://letsencrypt.org/how-it-works/</a></li> <li>Porque 90 días: <a href="https://letsencrypt.org/2015/11/09/why-90-days.html" target="_blank">https://letsencrypt.org/2015/11/09/why-90-days.html</a></li> <li>Lista de clientes soportados: <a href="https://community.letsencrypt.org/t/list-of-client-implementations/2103" target="_blank">https://community.letsencrypt.org/t/list-of-client-implementations/2103</a></li> <li><a href="https://es.wikipedia.org/wiki/Let%27s_encrypt" target="_blank">Let's Encrypt en Wikipedia</a></li> <li><a href="https://backports.debian.org/Instructions/" target="_blank">​Debian backports</a></li> <li><a href="https://certbot.eff.org/#debianjessie-apache" target="_blank">How to install Certbot</a></li> </ul> </div> </div> <div class="group-footer"> <section> <h2>Añadir nuevo comentario</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=16&amp;2=comment&amp;3=comment" token="EB6QcaYCufqwNDXs6N9Q8dAWj4FsozjpCPYWAbAx0pc"></drupal-render-placeholder> </section> </div> </article> Mon, 27 Feb 2017 21:03:16 +0000 root 16 at https://www.carloscarrascal.com Servidor de correo con Mailgun https://www.carloscarrascal.com/blog/servidor-de-correo-con-mailgun <article data-history-node-id="19" class="node node--type-blog-post node--view-mode-rss group-one-column ds-2col-stacked-fluid clearfix"> <div class="group-header"> <div class="field field--name-node-title field--type-ds field--label-hidden field--item"><h1> Servidor de correo con Mailgun </h1> </div> <div class="field field--name-node-post-date field--type-ds field--label-hidden field--item">Sábado, Febrero 25, 2017 - 18:11</div> </div> <div class="group-left"> <div class="field field--name-field-tags field--type-entity-reference field--label-hidden field--items"> <div class="field--item"><a href="/tags/mailgun" hreflang="es">Mailgun</a></div> <div class="field--item"><a href="/tags/servicios" hreflang="es">Servicios</a></div> <div class="field--item"><a href="/tags/email" hreflang="es">email</a></div> </div> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p><img alt="Mailgun logo" class="pull-left" data-entity-type="file" data-entity-uuid="eb57dbb1-ca84-4aef-b7a4-2fd824520ee0" src="/sites/default/files/inline-images/Mailgun_Primary_0.jpg" style="height: 95px; width: 300px;" />Yo creo que el servidor de correo ha sido el coñazo mas grande que yo he tenido que configurar nunca. Para ser justos, hace ya mas de 10 años desde que desmonte el dominio donde lo tenia con Postfix y desde entonces vengo usando Gmail, y por aquel entonces no tenia tanta experiencia con servidores y Linux, pero lo recuerdo como una locura constante: emails no entregados, spam por un tubo, relays chungos, blacklists, whitelists, suputamadrelists... vamos un horror.</p> <p>Por <a href="https://blog.codinghorror.com/so-youd-like-to-send-some-email-through-code/">aquí</a> y <a href="https://www.digitalocean.com/community/tutorials/why-you-may-not-want-to-run-your-own-mail-server">aquí</a> hay un par de artículos (en ingles) bastante interesantes al respecto.</p> <p>Pues ahora quería volver a configurar un servicio de correo electrónico para varios dominios, pero no tenia ninguna gana de instalar un MTA propio, así que busque algunas alternativas. Las premisas eran sencillas:</p> <ul> <li>Que pueda configurar en mi dominio y enviar y recibir correo como <a href="mailto:pepito@midominio.com">pepito@midominio.com</a>.</li> <li>Que pueda gestionar varias cuentas de correo.</li> <li>Que me permita recibir y enviar correos desde mi cuenta de Gmail, que es la que uso habitualmente.</li> <li>Que sea gratuito o de muy bajo coste.</li> <li>No voy a hacer un uso extensivo de el, pero quiero poder tener direcciones de email propias.</li> </ul> <p>Con esta idea en mente encontré <a href="https://www.mailgun.com/" target="_blank">Mailgun</a>. Ellos se definen como un servicio de correo electrónico para desarrolladores, y solo eso ya suena bastante bien, ¿no?</p> <p>Es un servicio bastante completo que provee de una API Rest para poder realizar operaciones en la recepción y envío, y básicamente nos va a gestionar hasta 10.000 mensajes al mes por la cara.</p> <p>Tienen cosas bastante interesantes, como un SDK para PHP en Github donde tenéis algunos ejemplos sobre como usar su API para gestionar el correo:</p> <p><a href="https://github.com/mailgun/mailgun-php">https://github.com/mailgun/mailgun-php</a></p> <h2>Que nos ofrece</h2> <p>Con Mailgun vamos a poder:</p> <ul> <li>Enviar correo desde nuestro dominio con un servidor SMTP externo.</li> <li>Redireccionar el correo entrante hacia otras cuentas de correo, por ejemplo, Gmail: <em><a href="mailto:admin@midominio.com">admin@midominio.com</a></em> -&gt; <em><a href="mailto:cuentadecorreodetodalavida@gmail.com">cuentadecorreodetodalavida@gmail.com</a></em></li> <li>Logs e informes</li> <li>Gestionar hasta 10.000 correos al mes de forma gratuita</li> </ul> <p>Solo hay un pero: con la cuenta gratuita solo podemos enviar/recibir correo de/a otras cuentas que han de ser validadas previamente. Tenemos que pasarnos a una cuenta de pago y dar nuestros datos bancarios, pero hasta 10.000 correos al mes, el servicio es gratuito, no nos cobrarán ni un duro. Recomiendo registrarse con una cuenta básica, configurarlo y probarlo con algunas direcciones controladas, y si os convence, actualizar a una cuenta de pago. Vamos, lo que hice yo.</p> <h2>La primera en la frente</h2> <p>Una vez registrados en Mailgun, tendremos que configurar nuestro dominio. Desde su panel de control, vamos a <em>Domains &gt; Add new domain</em> para hacerlo. Nos pedirá el nombre de nuestro dominio, y la primera recomendación es que utilicemos un subdominio para el correo del tipo mail.midominio.com y que mas tarde lo podremos configurar al gusto. Bueno, pues eso no es del todo cierto, y es una putada, porque me pasé un buen rato intentando configurarlo y no hubo forma. Si utilizamos mail.midominio.com, nuestras direcciones de correo van a ser siempre algo como <em><a href="mailto:pepito@mail.midominio.com">pepito@mail.midominio.com</a></em>, en lugar de <em><a href="mailto:pepito@midominio.com">pepito@midominio.com</a></em>, que es lo que la mayoría de personas (las normales, al menos) tiende a querer configurar.</p> <p>Así que nada de <em>mail.loquesea</em>, y al turrón. Yo lo he configurado en el dominio raíz y hasta ahora no he tenido ningún conflicto con ninguna otra cosa, claro esta, no tengo ningún otro servidor de correo en ese dominio.</p> <p>Si alguien lee esto y ha conseguido configurarlo correctamente con <em>mail.midominio.com</em>, que deje un comentario o algo, y le pago una cerveza.</p> <h2>Configuración de DNS</h2> <p>Para configurar el dominio, tendremos que hacer algunos cambios en nuestros DNS para poder enviar correos, configurando una serie de registros que servirán básicamente para validar que el dominio es efectivamente nuestro. Para hacer esto dependeremos de nuestro proveedor de DNS y será diferente en cada caso, así que no voy a meterme ahí. Mailgun tiene un servicio que permite comprobar al momento si nuestros cambios de DNS son correctos o no.</p> <p>Una configuración típica de DNS podría ser algo así, usando midominio.com como ejemplo:</p> <table border="0" cellpadding="10" cellspacing="10"> <tbody> <tr> <td>midominio.com</td> <td>A</td> <td>xxx.xxx.xxx.xxx</td> <td>Registro A básico del dominio</td> </tr> <tr> <td>midominio.com  </td> <td>MX 10</td> <td>mxa.mailgun.org</td> <td>Registro de correo MX principal</td> </tr> <tr> <td>midominio.com</td> <td>MX 10</td> <td>mxb.mailgun.org</td> <td>Registro de correo MX secundario</td> </tr> <tr> <td>pic._domainkey.midominio.com</td> <td>TXT</td> <td>k=rsa; p=XXXX</td> <td>Registro TXT con info de Mailgun</td> </tr> <tr> <td>midominio.com</td> <td>TXT</td> <td>v=spf1 include:mailgun.org ~all</td> <td>Registro TXT con info de Mailgun</td> </tr> <tr> <td>email.midominio.com</td> <td>CNAME</td> <td>mailgun.org</td> <td>Registro para rastreo de los correos</td> </tr> </tbody> </table> <p>Hay que tener en cuenta que los cambios de DNS tardan en propagarse, y dependiendo de los cambios que hagamos Mailgun puede tardar hasta 24 horas en comprobar el dominio.</p> <h2>Enviar correo: SMTP</h2> <p>En cuanto tengamos los DNS configurados y validados por Mailgun, ya podremos comenzar a enviar correos, pero ojo, tan solo a direcciones previamente autorizadas si tenemos la cuenta básica. Accediendo a la información de nuestro dominio en <em>Domains</em>, debajo de <em>Domain information</em> podremos ver la configuración del servidor SMTP, que siempre será el mismo: <em>smtp.mailgun.org</em>. Hay un enlace en <em>Manage STMP credentials</em>. desde donde podremos dar de alta buzones nuevos y gestionar las contraseñas. Por defecto, tendremos configurado un buzón <em><a href="mailto:postmaster@midominio.com">postmaster@midominio.com</a></em>, y una contraseña por defecto.</p> <p>Ahora lo que podemos hacer para comenzar a enviar correo es añadir la cuenta en cualquier otro servicio de correo (ejem, Gmail):</p> <table border="0" cellpadding="10" cellspacing="10" style="width:500px"> <tbody> <tr> <td>Usuario</td> <td><a href="mailto:postmaster@midominio.com">postmaster@midominio.com</a></td> </tr> <tr> <td>Contraseña</td> <td>La que hayamos configurado</td> </tr> <tr> <td>Servidor SMTP</td> <td>smtp.mailgun.org</td> </tr> <tr> <td>Puerto</td> <td>587</td> </tr> <tr> <td>Otros</td> <td>Activar opción de TLS</td> </tr> </tbody> </table> <h2>Recibir correos: Mailgun Routes</h2> <p>Para recibir correos solamente tendremos que definir una serie de rutas, ya que Mailgun va a recoger absolutamente todo el correo que llegue a nuestro dominio, y procesarlo según las rutas que configuremos. La opción mas básica es crear una ruta para recoger los mensajes de una cuenta y reenviarlos automáticamente a otra (ejem, Gmail otra vez?). Lo bueno es que podemos crear tantas rutas como necesitemos, por lo que podemos crear tantas cuentas de correo como queramos, y redirigir cada una de ellas.</p> <p>Para ello vamos a la opción de <em>Routes &gt; Create route</em>, usaremos los siguientes datos:</p> <table border="0" cellpadding="10" cellspacing="10" style="width:500px"> <tbody> <tr> <td>Expresion type</td> <td> Match recipient</td> <td>El tipo de regla</td> </tr> <tr> <td>Recipient</td> <td><a href="mailto:nuevacuenta@midominio.com">nuevacuenta@midominio.com</a></td> <td>Cuenta de correo que queremos configurar</td> </tr> <tr> <td>Actions</td> <td><a href="mailto:cuentadestino@servidor.com">cuentadestino@servidor.com</a></td> <td>Activar la opción Forward</td> </tr> <tr> <td>Description</td> <td>Nuestra descripción</td> <td>Algo para identificar la regla</td> </tr> </tbody> </table> <p>De este modo podemos ir creando las reglas que necesitemos para todos los buzones que queramos configurar. Como veis no es necesario configurar nada en nuestro cliente de correo, ya que no se usa un servidor POP3 o IMAP, sino que simplemente Mailgun se encargará de reenviar los correos a los recipientes adecuados.</p> <h2>Conclusiones</h2> <p>Cumple perfectamente lo que esperaba de el servicio, y a coste 0 patatero. Me ahorro el tedio de configurar mi propio MTA, y además tengo un plataforma que me va a permitir jugar con el correo si lo necesito. La configuración es muy sencilla y lleva poco tiempo, y el único problema que tuve fue el tema de poner el mail.* delante del dominio.</p> <p>Hay par de cosas a comentar:</p> <ul> <li>A veces los correos tardan un ratito en llegar, mas de lo usual con un servicio de correo 'normal', pero llegan.</li> <li>Si configuráis esto con Gmail, el muy cabrón no os va a mostrar el mensaje recibido, al enviar el correo desde la misma cuenta que lo va a recibir. Tenéis que usar una cuenta diferente para enviar y recibir.</li> </ul> <p>Aparte de este par de detalles, el servicio funciona bastante bien, y tiene mucha potencia si de verdad necesitamos realizar operaciones con estos correos, ya que podemos configurar una URL para recibirlos por medio de servicio web, por ejemplo. En mi caso, para lo que yo lo quería, me va perfecto.</p> <p>Ya me contaréis si lo utilizáis o no.</p> <p> </p> <h3>Referencias</h3> <ul> <li><a href="https://mailgun.com" target="_blank">https://mailgun.com</a></li> <li><a href="https://simplyian.com/2015/01/07/Hacking-GMail-to-use-custom-domains-for-free/" target="_blank">https://simplyian.com/2015/01/07/Hacking-GMail-to-use-custom-domains-for-free/</a></li> <li><a href="http://blog.codinghorror.com/so-youd-like-to-send-some-email-through-code/" target="_blank">blog.codinghorror.com/so-youd-like-to-send-some-email-through-code/</a></li> <li><a href="http://www.digitalocean.com/community/tutorials/why-you-may-not-want-to-run-your-own-mail-server" target="_blank">www.digitalocean.com/community/tutorials/why-you-may-not-want-to-run-your-own-mail-server</a></li> </ul> </div> </div> <div class="group-footer"> <section> <h2>Comments</h2> <article data-comment-user-id="0" id="comment-239" about="/en/comment/239" typeof="schema:Comment" class="js-comment"> <mark class="hidden" data-comment-timestamp="1619643742"></mark> <footer> <article typeof="schema:Person" about="/user/0"> </article> <p><span rel="schema:author">Subido por <span lang="" typeof="schema:Person" property="schema:name" datatype="">Sergio Rodriguez (no verificado)</span> el Sáb, 18/04/2020 - 02:53</span> <span property="schema:dateCreated" content="2020-04-18T00:53:01+00:00" class="hidden"></span> </p> <a href="/en/comment/239#comment-239" hreflang="en">Enlace permanente</a> </footer> <div> <h3 property="schema:name" datatype=""><a href="/en/comment/239#comment-239" class="permalink" rel="bookmark" hreflang="en">Error al realizar envio</a></h3> <div property="schema:text" class="field field--name-comment-body field--type-text-long field--label-hidden field--item"><p>No sirvio de nada esta informacion no me dijo como debo enviarlo, no me dice cual es la diferencia entre el usuario, la contraseña, el correo, etc muchas cosas, si uso el correo con el que me registre me dice que los subdominios algo, si uso el postmaster me da el mismo error, tengo una gran cantidad de log de mensajes rechazados</p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=239&amp;1=default&amp;2=en&amp;3=" token="iRTrDfGlQMKw8mZYv_2lyVcfDQM86X4Z_Dyr_BjhDyc"></drupal-render-placeholder> </div> </article> <article data-comment-user-id="0" id="comment-547" about="/en/comment/547" typeof="schema:Comment" class="js-comment"> <mark class="hidden" data-comment-timestamp="1619644926"></mark> <footer> <article typeof="schema:Person" about="/user/0"> </article> <p><span rel="schema:author">Subido por <span lang="" typeof="schema:Person" property="schema:name" datatype="">José Luis (no verificado)</span> el Vie, 25/09/2020 - 10:19</span> <span property="schema:dateCreated" content="2020-09-25T08:19:17+00:00" class="hidden"></span> </p> <a href="/en/comment/547#comment-547" hreflang="en">Enlace permanente</a> </footer> <div> <h3 property="schema:name" datatype=""><a href="/en/comment/547#comment-547" class="permalink" rel="bookmark" hreflang="en">Gran artículo!</a></h3> <div property="schema:text" class="field field--name-comment-body field--type-text-long field--label-hidden field--item"><p>Hola,<br /> he leído este artículo y me he sentido identificado puesto que he tenido los mismos problemas / ideas que tú. Lástima no haberlo encontrado antes y haberme ahorrado algo de tiempo (sobre todo con lo del subdominio).<br /> Muy bueno!</p> </div> <drupal-render-placeholder callback="comment.lazy_builders:renderLinks" arguments="0=547&amp;1=default&amp;2=en&amp;3=" token="UC-VqWiQNp_sfdDEkuvwWK_xd0aaqhOccVTNVRI71Gk"></drupal-render-placeholder> </div> </article> <h2>Añadir nuevo comentario</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=19&amp;2=comment&amp;3=comment" token="qxWv4qHZP5DVri8yNHVDOGyFO3855_xVgGs6v6Fkg1I"></drupal-render-placeholder> </section> </div> </article> Sat, 25 Feb 2017 17:11:38 +0000 root 19 at https://www.carloscarrascal.com Servidor de Git privado con Gogs https://www.carloscarrascal.com/blog/servidor-de-git-privado-con-gogs <article data-history-node-id="15" class="node node--type-blog-post node--view-mode-rss group-one-column ds-2col-stacked-fluid clearfix"> <div class="group-header"> <div class="field field--name-node-title field--type-ds field--label-hidden field--item"><h1> Servidor de Git privado con Gogs </h1> </div> <div class="field field--name-node-post-date field--type-ds field--label-hidden field--item">Domingo, Febrero 19, 2017 - 01:45</div> </div> <div class="group-left"> <div class="field field--name-field-tags field--type-entity-reference field--label-hidden field--items"> <div class="field--item"><a href="/tags/linux" hreflang="es">Linux</a></div> <div class="field--item"><a href="/tags/git" hreflang="es">Git</a></div> <div class="field--item"><a href="/tags/servicios" hreflang="es">Servicios</a></div> </div> <div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p><img alt="Gogs logo" class="pull-right" data-entity-type="file" data-entity-uuid="afc7ad21-f5cb-4185-a329-4b3437bf7c27" src="/sites/default/files/inline-images/gogs_logo.png" />El único problema que tengo con GitHub es que en su versión gratuita todos los repos tienen que ser públicos. Si queremos tener repositorios privados tenemos que pasar por caja, y creo que son unos 7$ al mes, que me parece cojonudo, pero en mi caso necesito minimizar al máximo el coste de mis sistemas, principalmente porque no me da dinero.</p> <p>Así que estuve investigando que alternativas tenia para instalar un servidor de Git privado. Lo primero que me vino a la cabeza fue <a href="https://about.gitlab.com/">GitLab</a>, porque lo he utilizado durante una buena temporada en el trabajo con equipos relativamente grandes y nos ha dado muy buen resultado. En mi actual empresa estamos usando <a href="https://es.atlassian.com/software/bitbucket">Bitbucket</a> de Atlasian, y prácticamente es lo mismo que teníamos con GitLab, pero al ser de pago no es una opción para mi.</p> <p>Una vez decidido a instalar GitLab, el problema está cuando te pones a mirar los <a href="https://docs.gitlab.com/ce/install/requirements.html#hardware-requirements">requisitos</a>:</p> <ul> <li>4GB de RAM es lo recomendado.</li> <li>2GB de RAM + 2GB de swap, ya te dicen que va a ir como el culo</li> <li>Se necesitan varios GB de espacio en disco solo para la instalación de GitLab</li> </ul> <p>Demasiada caña para mi pobre servidor, y mas si pienso servir desde la misma máquina un par de sitios o algún otro servicio, necesitaba algo mas ligero pero que al menos molase (ya que estamos...).</p> <p>Así que después de dar algunas vueltas e investigar un poco, acabé encontrando Gogs:</p> <p><a href="https://gogs.io/">https://gogs.io/</a></p> <p>Según ellos mismos, Gogs es:</p> <blockquote> <p>Gogs is a painless self-hosted Git service.</p> </blockquote> <p>Que viene a ser un servicio de Git que te alojas tu mismo e indoloro.</p> <p>Y la verdad es que no ha sido nada doloroso, llevo ya varios meses usándolo y ha sido una gran opción, y es que fue muy sencillo de instalar, viene con un montón de funcionalidades de serie, y tiene una interfaz muy pulida y que es calcada a GitHub.</p> <p>Entre las funcionalidades interesantes:</p> <ul> <li>Open Source</li> <li>Ligero, muy ligero. Esta ocupando menos de 500Mb en disco (con las sus fuentes y las de Go) y aun no lo he visto sobrecargar la máquina.</li> <li>Gravatar (venga va...)</li> <li>Pull request, funcionan igual que Github</li> <li>Webhooks !! (esto ya es lo mas, pero no los he probado aún)</li> <li>Notificaciones por correo</li> <li>Soporta SSH, tanto para servir la aplicación como para los repos</li> <li>Tickets para incidencias, sencillo pero útil.</li> <li>Wiki para cada proyecto</li> <li>Creación de cuentas de usuario: Con registro o manual</li> <li>Permite desactivar el registro de usuarios</li> <li>Permite configurar repositorios privados</li> <li>Webhooks, espera esto ya lo había dicho, ¿no?</li> </ul> <p> </p> <h2>Instalación</h2> <p>La ayuda oficial para la instalación la podéis encontrar aquí (todo en inglés):</p> <ul> <li>Instalación desde fuentes: <a href="https://gogs.io/docs/installation/install_from_source">https://gogs.io/docs/installation/install_from_source</a></li> <li>Ejecución: <a href="https://gogs.io/docs/installation/configuration_and_run">https://gogs.io/docs/installation/configuration_and_run</a></li> <li>Instalación avanzada: <a href="https://gogs.io/docs/advanced/configuration_for_source_builds">https://gogs.io/docs/advanced/configuration_for_source_builds</a></li> <li>Instalación desde binarios: <a href="https://gogs.io/docs/installation/install_from_binary">https://gogs.io/docs/installation/install_from_binary</a></li> </ul> <p>La instalación oficial la están haciendo con Ngnix y postgresql. Yo lo monté tirando de un viejo Apache2 y MySQL que ya tenia corriendo. Voy a hacer una traducción de la instalación que son los pasos que yo he seguido, y luego pongo mis archivos de configuración. Y ojo, que estos pasos son para instalarlo desde el fuente, que es lo que hice yo.</p> <p>Lo que queremos hacer es:</p> <ul> <li>Servir ‘Gogs’ desde un dominio midominio.com, por ejemplo como git.midominio.com</li> <li>Apache2 como servidor web</li> <li>MySQL como servidor de base de datos</li> </ul> <p>Primero creamos un usuario para que corra la aplicación:</p> <pre> $ sudo adduser --disabled-login --gecos 'Gogs' git</pre> <h3>Descarga e instalación de Go</h3> <p>Vamos a instalar Go dentro del home del usuario que acabamos de crear para no interferir con ninguna otra versión de la distribución que usemos. Usaremos</p> <pre> /home/git/local/go</pre> <p>Creamos un directorio:</p> <pre> $ sudo su - git $ cd ~ $ mkdir local </pre> <p>Bajamos la versión disponible:</p> <pre> $ wget https://storage.googleapis.com/golang/go1.7.3.linux-amd64.tar.gz $ tar -C /home/git/local -xzf go1.7.3.linux-amd64.tar.gz</pre> <p>Añadimos unas cuantas rutas al fichero bashrc de nuestro usuario git:</p> <pre> $ sudo su - git $ cd ~ $ echo 'export GOROOT=$HOME/local/go' &gt;&gt; $HOME/.bashrc $ echo 'export GOPATH=$HOME/go' &gt;&gt; $HOME/.bashrc $ echo 'export PATH=$PATH:$GOROOT/bin:$GOPATH/bin' &gt;&gt; $HOME/.bashrc $ source $HOME/.bashrc</pre> <h3>Instalar Gogs</h3> <p>La forma rápida de instalar Gogs parece ser esta:</p> <pre> $ go get -u github.com/gogits/gogs $ cd $GOPATH/src/github.com/gogits/gogs $ go build</pre> <p>Y una vez compilado, podemos probarlo con:</p> <pre> $ cd $GOPATH/src/github.com/gogits/gogs $ ./gogs web</pre> <h2>Configuración</h2> <p>La configuración por defecto está en conf/app.ini pero no vamos a editar ese fichero. En lugar de eso Gogs nos permite crear una copia que será donde pondremos nuestras modificaciones. Primero vamos a crear unos directorios:</p> <pre> mkdir -p $GOPATH/src/github.com/gogits/gogs/custom/conf mkdir -p ~/gogs-repositories sudo mkdir -p /var/log/gogs sudo chown git:git /var/log/gogs</pre> <p>Hacemos una copia del fichero de configuración original, en donde haremos nuestros cambios:</p> <pre> cd $GOPATH/src/github.com/gogits/gogs cp conf/app.ini custom/conf/</pre> <p>En teoría en nuestro fichero de configuración 'custom' solamente deberíamos tener la configuración especifica que necesitemos. Es decir, que podemos borrar todo lo que se quede por defecto. La principal razón de esto es que cuando actualicemos la versión de Gogs, nuestra configuración no se modificará, ya que tienen un .gitignore para este fichero local. Este es el fichero que yo tengo:</p> <pre> ; Change it if you run locally RUN_USER = git ; Either "dev", "prod" or "test", default is "dev" RUN_MODE = prod [repository] ROOT = /home/git/gogs-repositories [server] PROTOCOL = http DOMAIN = git.midominio.com ROOT_URL = http://git.midominio.com/ HTTP_ADDR = 0.0.0.0 HTTP_PORT = 3000 [database] ; Either "mysql", "postgres" or "sqlite3", it's your choice DB_TYPE = mysql HOST = 127.0.0.1:3306 NAME = gogs USER = gogs PASSWD = **CONTRASEÑA** [admin] [security] INSTALL_LOCK = true ; !!CHANGE THIS TO KEEP YOUR USER DATA SAFE!! #@FDEWREWR&amp;*( SECRET_KEY = *KEY* ; Auto-login remember days LOGIN_REMEMBER_DAYS = 7 COOKIE_USERNAME = gogs_awesome COOKIE_REMEMBER_NAME = gogs_incredible ; Reverse proxy authentication header name of user name REVERSE_PROXY_AUTHENTICATION_USER = X-WEBAUTH-USER [service] ACTIVE_CODE_LIVE_MINUTES = 180 RESET_PASSWD_CODE_LIVE_MINUTES = 180 ; User need to confirm e-mail for registration REGISTER_EMAIL_CONFIRM = false ; Does not allow register and admin create account only DISABLE_REGISTRATION = true ; User must sign in to view anything. REQUIRE_SIGNIN_VIEW = false ; Mail notification ENABLE_NOTIFY_MAIL = false [log] ROOT_PATH = /home/git/go/src/github.com/gogits/gogs/log ; Either "console", "file", "conn", "smtp" or "database", default is "console" ; Use comma to separate multiple modes, e.g. "console, file" MODE = file ; Buffer length of channel, keep it as it is if you don't know what it is. BUFFER_LEN = 10000 ; Either "Trace", "Debug", "Info", "Warn", "Error", "Critical", default is "Trace" LEVEL = Info </pre> <p> </p> <h2>Configurar Apache2 con Gogs</h2> <p>Si quereis usar Nginx en lugar de Apache, la ayuda oficial tiene la info <a href="https://gogs.io/docs/advanced/configuration_for_source_builds#setting-up-nginx-sever">necesaria</a>. En Debian podemos instalar Apache2 si no lo tenemos ya:</p> <pre> sudo apt-get install apache2</pre> <p>La instalación de Gogs que acabamos de hacer corre en el puerto 3000 por defecto. Lo que queremos hacer es utilizar un servidor web como proxy para poder servir Gogs desde el puerto 80, como un subdominio de nuestro dominio, por ejemplo en este caso:</p> <pre> http://git.midominio.com</pre> <p>La mejor forma de hacer esto es crear un fichero de configuración para hacer un VirtualHost y usar mod_proxy para poder servir Gogs en el puerto 80 con Apache.</p> <pre> vi /etc/apache2/sites-available/080-gogs.conf</pre> <p>El contenido del fichero puede ser tan simple como esto:</p> <pre> &lt;VirtualHost *:80&gt; ServerName git.midominio.com ProxyPreserveHost On ProxyPass / http://localhost:3000/ ProxyPassReverse / http://localhost:3000/ ErrorLog ${APACHE_LOG_DIR}/gogs-error.log CustomLog ${APACHE_LOG_DIR}/gogs-access.log combined &lt;/VirtualHost&gt;</pre> <p>El nombre del dominio que usemos aqui será el mismo que pondremos en la configuración de Gogs. Aún tenemos que activar este VirtualHost:</p> <pre> ln -s /etc/apache2/sites-available/080-gogs.conf /etc/apache2/sites-enabled/</pre> <p>Ahora activaremos el módulo mod_proxy de Apache. Podemos probar con a2enmod:</p> <pre> $ sudo a2enmod proxy</pre> <p>Esto debería crear los dos ficheros necesarios dentro de <em>/etc/apache2/mods-enabled/ : proxy.conf y proxy.load</em></p> <p>Reiniciar Apache y a correr. Con suerte no tendreis ningún error.</p> <pre> $ sudo service apache2 restart</pre> <p> </p> <h2>Configurar MySQL</h2> <p>No voy a entrar en detalles sobre la configuración inicial de MySQL, porque eso daría para un libro entero. En principio bastará con crear una base de datos nueva y asignar todos los permisos a un usuario para Gogs:</p> <pre> CREATE DATABASE gogs CHARACTER SET utf8 COLLATE utf8_general_ci; GRANT ALL PRIVILEGES ON gogs.* To 'gogs'@'localhost' IDENTIFIED BY 'password';</pre> <p>Lo suyo sería ahora verificar la conexión a la nueva base de datos para estar seguros de que funciona correctamente, por ejemplo, desde la linea de comandos:</p> <pre> mysql --user=gogs --password=password --host=localhost gogs</pre> <p> </p> <h2>Ejecutar el instalador</h2> <p>Llegado este punto deberíamos tener todo lo necesario para arrancar el dichoso Gogs. Lo arrancamos manualmente con:</p> <pre> $ cd $GOPATH/src/github.com/gogits/gogs $ ./gogs web</pre> <p>Si ahora usamos un navegador para acceder a la dirección que hayamos configurado en nuestro Apache, deberiamos acceder a la primera pantalla del instalador, que nos guiará por la configuración básica. En nuestro ejemplo seria:</p> <pre> http://git.midominio.com</pre> <p> </p> <h2>Añadir Gogs a init.d</h2> <p>Llegados a este punto todo deberia estar funcionando, sin embargo necesitamos arrancar Gogs a mano. Lo que necesitamos es poder levantar y parar Gogs como un servicio mas de nuestra máquina, y además, que este arranque automaticamente al levantar o reiniciar el servidor.</p> <p>Para esto los chavales de Gogs nos han preparado una plantilla que nos facilitará mucho las cosas (para Debian / Ubuntu). Esta aqui:</p> <pre> $GOPATH/src/github.com/gogits/gogs/scripts/init/debian/gogs</pre> <p>La copiamos al directorio de init.d:</p> <pre> $ sudo cp $GOPATH/src/github.com/gogits/gogs/scripts/init/debian/gogs /etc/init.d/gogs</pre> <p>Y ahora modificamos un par de cosas. Editaremos las dos primeras lineas:</p> <pre> # Required-Start: $syslog $network # Required-Stop: $syslog </pre> <p>De esta manera</p> <pre> # Required-Start: $syslog $network $local_fs apache2 mysql # Required-Stop: $syslog $local_fs </pre> <p>Y nos aseguramos de que la variable WORKINGDIR apunte al directorio correcto:</p> <pre> WORKINGDIR=/home/git/go/src/github.com/gogits/gogs</pre> <p>El script necesita permisos de ejecución, y lo añadimos a la configuración de inicio:</p> <pre> $ sudo chmod ug+x /etc/init.d/gogs $ sudo update-rc.d gogs defaults 30 70 </pre> <p>Ahora podemos probar nuestra configuración y levantar el servicio gogs:</p> <pre> $ sudo service gogs start</pre> <p>Y conectar con un navegador a la URL que hemos configurado</p> <pre> http://git.midominio.com</pre> <p>Listo, espero que disfrutéis tanto como yo montando este pollo. Ahora ya nadie podrá ver los WTF que tenéis en vuestro código.</p> <p> </p> <p> </p> </div> </div> <div class="group-footer"> <section> <h2>Añadir nuevo comentario</h2> <drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&amp;1=15&amp;2=comment&amp;3=comment" token="EQr7U62Ohq-jqYwGuQE5z60d5XQ-npXesPuXroqMZ3M"></drupal-render-placeholder> </section> </div> </article> Sun, 19 Feb 2017 00:45:21 +0000 root 15 at https://www.carloscarrascal.com