Etiqueta: gitlab

Mi nube, mis reglas: Los 8 servicios que mantengo en mi propio servidor con Docker

Como ya sabéis de posts anteriores, tengo una regla inquebrantable a la hora de montar cualquier cosa en mis máquinas: o se despliega en un contenedor de Docker, o directamente no se instala. Instalar servicios a pelo en el sistema operativo es comprar papeletas para que tu server se enguarrine con dependencias que no necesitas, o con miles de versiones de las mismas que luego se quedan huerfanas, y que son un dolor de cabeza, el día que toque migrar o restaurar copias de seguridad.

Llevo bastante tiempo dándole caña a mi propio servidor (no concibo depender de servicios de terceros para cosas críticas de mi día a día), y al final, tener tu propio self-hosted stack no solo te olvidas de la vigilancia de las big tech, sino que te ahorra un pastizal en suscripciones.

Actualmente tengo 8 servicios clave funcionando 24/7 sin despeinarse.

1. Wireguard: La llave de entrada a toda una red

Si tienes servicios en casa o en un VPS y los expones a lo loco a Internet mediante puertos abiertos sin control, estás jugando a la ruleta rusa.

Para mí, Wireguard es indispensable. Me permite crear un túnel VPN con mi servidor. Si estoy fuera de casa o conectado a una Wi-Fi pública, lo activo, y santas pascuas.

En mi servidor lo uso simplemente para poder cambiar la ubicación y evitar algunos bloqueos de determinado señor que empieza por Te y acaba por bas, que está obsesionado con que le roban el furgol. Pero en mi casa, también tengo instalado un servidor de Wireguard, y ahí si que me es imprescindible para poder acceder a todo lo que tengo en mis propios cacharros.

2. Nextcloud: La alternativa a las nubes big tech

Tener tus archivos importantes y copias de seguridad, desperdigados por nubes ajenas no me suena nada bien (Aunque lo siga haciendo para determinados casos: Redundancia y la paranoia de los informáticos). Nextcloud es la nube personal: sincronización en tiempo real entre el móvil, el portátil y el NAS, control de versiones, copia automatizada de las fotos del móvil, etc… Consume algo más de recursos que otros servicios más ligeros, pero bien configurado vuela.

Le puedes meter edición de documentos online en tu propio server mediante Collabora u Onlyoffice, y así ya huyes del todo de Google Docs, Office 365 o todos los demás editores. Y no solo eso, tiene plugins como para parar un tren, solo hay que echarle un rato para ver qué necesitas.

3. Poste.io: Servidor de correo sin complicaciones

Montar un servidor de correo tradicional desde cero puede ser una pesadilla que nadie en su sano juicio quiere repetir dos veces.

Poste.io lo resuelve de una patada metiendo toda la infraestructura de correo en un único contenedor de Docker con interfaz web de administración, webmail integrado y soporte TLS automático. Una pasada para tener cuentas de correo bajo mis propios dominios sin depender de proveedores externos.

4. GitLab: Mi repositorio de código

Aunque uso GitHub para cosas públicas y proyectos abiertos, mis propios desarrollos, scripts de mantenimiento y arquitecturas privadas viven en mi propio GitLab.

Tener el control del versionado, los repositorios y poder montar pipelines de CI/CD locales (Soy un apasionado de las pipelines, no me juzguéis por ello) con varios runners, me da todo lo que necesito.

Tengo que reconocer que antes usaba el GitLab «cloud», pero teniendo el server infra utilizado, dije… pues qué leches, me monto el mío propio. Y si, GitLab puede ser muy pesado a nivel de recursos para una sola persona. He visto alternativas también open source como Forgejo, pero sinceramente, me parecio un juguete al lado de GitLab, y prefiero quedarme con potencia a sencillez. Ojo, que si alguno de vosotros, tiene una máquina un poco limitada y no queréis la navaja suiza de GitLab, Forgejo es una opción muy muy buena.

5. Cap: Tu propio captcha

¿Cuántos de vosotros, que hayáis montado alguna web, no habéis tenido que añadir un captcha para registros/login, con el típico de reCaptcha? Bien, pues con esto os olvidáis de Google de una vez.

Cap es un captcha sencillito, con un interfaz de admin tambien bastante claro, y fácil de integrar.

Si os soy sincero, nunca pensé en tener un captcha autoalojado, hasta que me di de bruces con esto, y me alegro haberlo hecho.

6. Umami: Analítica web limpia y sin rastrear a nadie

Google Analytics es un monstruo pesado, intrusivo y un dolor de huevos en general.

Umami es todo lo contrario: una analítica web minimalista, de código abierto, respetuosa con la privacidad y ultraligera. Te da exactamente las métricas que necesitas saber (páginas vistas, dispositivos, procedencia) sin recopilar datos personales ni ralentizar la carga de las webs.

7. WordPress: El motor de publicaciones

No necesita mucha presentación. Aunque a veces sea criticado por su antigüedad, para un blog rápido y estructurado sigue siendo el estándar más fiable. Es más, si estás leyendo esto, spoiler: Esta página es un WordPress.

Te puedes crear un blog de dos patadas con Docker, y listo. Que lo dejes bonito y precioso, eso ya es otro cantar…

8. TeamSpeak: Comunicación por voz de baja latencia

Sí, existe Discord, pero para partidas online o charlas con amigos sin que una big tech monitorice canales ni meta publicidad, un servidor dedicado de TeamSpeak 3 (Las nuevas versiones tienen una licencia un poco rarurna, la v3 funciona a las mil maravillas) sigue siendo insuperable. Consume prácticamente cero recursos del servidor y ofrece un audio muy bueno con una latencia sorprendente (El servidor lo tengo en Alemania, y la latencia no se nota nada).

Epílogo: Un Nginx para gobernarlos a todos

Todo desplegado con docker precioso y muy bonito, pero… ¿Cómo leches accedes a todos estos servicios desplegados en la misma máquina, con distintos dominios? La respuesta es proxy inverso. Y al menos desde mi punto de vista Nginx es la elección.

Tengo metido Nginx y todos los servicios en la misma red de docker, exponiendo solo los puertos web en Nginx, y usándolo mediante reverse proxy a los distintos servicios de docker desplegados. Además con Nginx mantengo todos los certificados https mediante Let’s encrypt y no tengo que preocuparme de añadirlos a los propios servicios. Fácil, sencillo y para toda la familia.

Puede que no cuente como un servicio en sí mismo, pero es el anillo único en un despliegue de este tipo.

Conclusión

Mantener todos estos servicios funcionando a la vez no requiere data centers consumiendo luz y miles de bernabeus de agua (La medida estandar en Madrid para cantidades de agua), si se gestiona bien el servidor. Con una buena configuración en Docker, límites de memoria y copias de seguridad automáticas, tienes tu ecosistema digital completo, privado y bajo tu control.

Servicios básicos para startups con Ansible y Docker

Por anteriores post, habéis podido ver, que tengo una predilección enorme por Ansible y Docker, y todas sus posibilidades. Tanto es así que en mis servidores, ya no despliego nada que no vaya en contenedores, y si puedo, lo automatizo a través de Ansible.

Mi último descubrimiento fue Nextcloud: Un servicio de nube privada, que a su vez tiene mensajería instantánea, y videoconferencia integrada, que una vez instalado en tu servidor no necesitas depender de servicios de terceros. Si a eso se le añade la compatibilidad para poder editar documentos on-line gracias a Collabora y Onlyoffice, el potencial de este servicio se dispara hasta limites insospechables.

Teniendo un servidor infra utilizado, decidí instalarlo en el, para tener mis archivos sin que ninguno de los gigantes tecnológicos tuviera acceso a mis datos, pero me quedé prendado de la cantidad de posibilidades que presenta, y me di cuenta de algo tan obvio que no podia dejarlo pasar.

Nextcloud es el servicio perfecto para pequeñas empresas o startups que estén empezando, y no necesiten una infraestructura enorme, sin tener que depender de servicios de terceros, con una inversión mínima. Y ese es justo el punto en el que se me encendió la bombilla.

Servicios cloud

¿Por que no crear un instalador de servicios básicos para startups con Nextcloud? ¿Y si lo llevo un paso más allá, y no solo le añado un cloud privado, sino también un servidor propio de e-mail? Dos pájaros de un tiro, y los servicios básicos que toda empresa pequeña pueda necesitar, listos y preparados de forma sencilla. Encontré una solución integral de servidor de e-mail llamado Poste.io gratuito (Aunque con versión de pago con más características) que también se despliega con Docker, y es perfecto para el objetivo que tenía en mente.

Era el pequeño proyecto perfecto para poder usar Ansible y Docker unidos en todo su potencial.

Servicios para desarrollo de software

Una vez puesto al tema, y ver que todo iba viento en popa, la bombilla se volvió a encender, y lleve el instalador un paso más allá para crear el instalador definitivo para startups que se dediquen a desarrollo de software.

Ya tenía experiencia montando Gitlab, Jenkins y Nexus en mi empresa, así que… ¿Por qué no añadirlo al paquete? La combinación de nube privada, y servicios privados para entornos de desarrollo quedaba perfecta.


Manos a la obra…

Os explicaré brevemente los pasos que da el instalador, para tener todo listo simplemente con cambiar 2 variables, ponerle los datos de acceso de la máquina destino, configurar DNS para que apunten a tu máquina, y si no es un servidor que esté directamente en Internet, un mapeo de puertos.

1 – Instalación de dependencias

Para poder lanzar los servicios, se necesita tener instalado en la máquina docker, y docker-compose para un manejo mas simple de los contenedores. Además se le instalan dependencias de Python necesarias para que Ansible ejecute correctamente algunas tareas de Docker.

Se le da permisos al usuario para poder ejecutar contenedores de Docker si no es root, y listo: Máquina preparada para empezar

2 – Comprobación de DNS

Dado que van a ser unos servicios que tengan acceso desde Internet, compruebo mediante unas consultas de DNS si las IPs de los sub-dominios donde se van a desplegar los servicios, concuerdan con la IP pública del servidor.

3 – Instalación de proxy base

Para poder manejar todos los servicios desde una misma máquina, y además con Docker, es necesario ponerle delante un proxy para poder tratar las peticiones, y lo más importante, usar https sin tener que configurarlo en todos y cada uno de los servicios. En este caso he usado Nginx ya que tengo experiencia con el, y siempre me ha funcionado bien.

En este punto cabe destacar, que los certificados https pueden llevar un coste asociado, que no cuadra mucho con la filosofía de este instalador (Aunque al final se pueden añadir manualmente en la instalación si ya los tienes). ¿Solución? Let’s Encrypt: Con esto siempre que tengas configurado tu servidor web de una forma específica, puedes generar certificados https de forma gratuita, y además incluso renovarlos de forma automática para desentenderte de todo.

En este punto, le añado opcionalmente un servidor web con https al dominio raíz, por si en el futuro se quiere desplegar algo aquí.

4 – Instalación de proxy para servicios

Cada servicio lleva asociado un subdominio para su despliegue (Los despliegues en subdirectorios de un dominio, generan muchos dolores de cabeza, e incompatibilidades que no son recomendables), y por supuesto su certificado https, por lo cual, aplicando el mismo procedimiento que en el anterior punto, se genera certificados para los subdominios de Nextcloud, Poste.io, Collabora, Onlyoffice, Gitlab, Jenkins y Nexus, dejándolos preparados para el despliegue de cada uno de ellos

5 – Instalación de todos los servicios

Cada servicio tiene sus configuraciones específicas, redirecciones, restricciones de seguridad, triquiñuelas, etc… , que requieren muchas horas de investigación en base a documentación y prueba y error.

Al final de cada despliegue hecho a base de ficheros docker compose que agrupan todas las dependencias de un posible servicio, se le añade la configuración específica al proxy, para que sea capaz de redirigir las peticiones correctamente mediante https con el certificado generado anteriormente.

Sin duda este es el paso más laborioso, ya que todos los servicios son completamente distintos y requieren de laboriosas configuraciones que lleva su tiempo entender.

5 – Obtención de passwords de admin

Los servicios de Jenkins y Nexus, al arrancar generan una password de administrador, que solo se puede ver a través de la consulta de determinados ficheros generados tras completar la instalación. Yo quería que la instalación fuera lo menos dolorosa posible, así que al finalizar, saco por pantalla las passwords de administrador iniciales de estos servicios, para que puedan usarse de forma inmediata.


Con este proceso te queda un servidor listo para poder acceder a el, y crear usuarios y configuraciones ya especificas para cada servicio, pero sin haberte preocupado de toda su instalación, que ha durado poco más de 10 minutos.

Toda la codificación en scripts de Ansible me ha llevado unas 40 horas, pero me lo he pasado en grande combinando todas estas herramientas para poder tener un instalador muy completo. Algunas personas se divierten viendo la tele, otras haciendo deporte, y los que tenemos alma de programador, haciendo cosas como esta.

ACTUALIZACIÓN: Pues la cuarentena del corona virus, me ha dejado tiempo, y ahora también incluye un servidor de OpenLDAP y su administrador web.

ACTUALIZACIÓN 2: Y para seguir pasando la cuarentena, se incluye un Sonar.

Github

¿Que sentido tiene aprovechar unas herramientas gratuitas, si luego otra gente no puede aprovecharlas de la misma forma? Así que toca compartirlo con todo el mundo, y si alguno se decide a mejorarlo, los pull request son bienvenidos 😉

Ansible Web Tools installer