Este es uno de los capítulos del tutorial Self hosted, auto alojamiento y soberanía digital. Encontrarás los enlaces a todos los de capítulos, al final de este artículo.
Como no podía ser de otra forma, la primera pieza del puzzle de tus auto alojados es un proxy inverso. Aunque estoy ya te lo podías imaginar, por que lo anuncié en la introducción. Lo cierto es que para poder tener diferentes servicios alojados en un mismo servidor y saliendo por el mismo puerto es imprescindible hacer uso de un proxy, y en este caso, para mi, sin lugar a dudas la solución pasa por Traefik.
Así, en esta entrega, te mostraré como puedes levantar tu proxy inverso con Traefik en menos de 10 minutos y sin complicaciones.
Mil servicios con Traefik
¿Que es Traefik?
Aunque le he dedicado un tutorial a [Traefik]() es posible que no conozcas esta herramienta, y esta es la razón para esta breve introducción al mismo. Si quieres profundizar mas en esta herramienta, te recomiendo que le des un vistazo al tutorial, que seguro que le sacarás mas provecho.
En pocas palabras, Traefik es un proxy inverso. Aunque, realmente es mucho mas que un proxy inverso, en el sentido que tiene muchas mas opciones para poner en funcionamiento. Digamos, que se trataría de un proxy inverso supervitaminado y mineralizado.
Así, por ejemplo, no solo te permite conducir el tráfico habitual, sino que también te permite gestionar tráfico TCP y UDP, puedes utilizar middleware, para añadir capas extras como puede ser la autenticación. Igualmente puedes limitar las conexiones.
En fin, que como ves se trata de un proxy inverso con muchas capacidades y al que le puedes sacar mucho jugo.
¿Es muy difícil?
Una vez comprendes la filosofía de Traefik no es nada complejo, sin embargo, tienes que entenderla. Por otro, lado, y esto es un punto de vista personal, el cambio de versión de la 1.X a la 2.X, no le hizo ningún bien. Me refiero a que la configuración cambió tanto, que realmente fue contraproducente.
De cualquier forma, como verás, y siguiendo, la receta que he dejado preparada para este self-hosted, en menos de 10 minutos la puedes tener perfectamente funcionando.
Eso si, si quieres sacar todo el potencial de esta herramienta, tienes que dedicarle tiempo, para estudiarla y comprender como funciona.
Pre requisitos
Por supuesto, antes de comenzar con la receta self-hosted, lo primero es tenerlo todo instalado. Para esta, igual, que para el resto de recetas self-hosted, necesitarás docker
y docker-compose
. Estas dos herramientas son imprescindibles. Para instalarlas te recomiendo los siguientes artículos,
- Instalar docker del tutorial de Docker
- Instalar docker-compose del mismo tutorial que te indiqué anteriormente.
A parte de esto, en el caso de que quieras utilizar el middleware de autenticación, que es totalmente opcional, necesitarás instalar la siguiente herramienta,
sudo apt install apache2-utils
En este paquete es donde se encuentra htpasswd
.
La receta self-hosted
Allá vamos. Para tener tu servicio de proxy inverso funcionando con Traefik, simplemente tienes que seguir las instrucciones que detallo a continuación.
git clone https://github.com/atareao/self-hosted.git
cd self-hosted/traefik
cp sample.env .env
cp sample.traefik.yml traefik.yml
touch acme.json
chmod 600 acme.json
htpasswd -nb usuario contraseña >> users.txt
docker network create proxy
docker-compose up -d
docker-compose logs -f
Como ves los pasos son realmente sencillos.
git clone https://github.com/atareao/self-hosted.git
👉 clonas el repositoriocd self-hosted/traefik
👉 cambias al directorio de Traefikcp sample.env .env
👉 para personalizar la configuración. Aquí tienes que editar este archivo y cambiar el nombre de tuhostname
. Esto es fundamental.cp sample.traefik.yml traefik.yml
👉 aquí copias la configuración original de Traefik. Esto te va a permitir tener siempre una copia de la original, por si haces alguna barrabasada.touch acme.json
👉 esto te crea el archivo donde se guardarán los certificados.chmod 600 acme.json
👉 cambia los permisos. Esto es imprescindible para que funcione el protocolo seguro.htpasswd -nb usuario contraseña >> users.txt
👉 Añades una capa de autenticación. Cambiausuario
ycontraseña
por los credenciales que quieras utilizar.docker network create proxy
👉 Crea la redproxy
que utilizarás durante todo el procesodocker-compose up -d
👉 Levanta el servicio.docker-compose logs -f
👉 Este paso es prescindible, aunque totalmente recomendable, porque te servirá para encontrar posibles problemas de funcionamiento o mejor dicho de mal funcionamiento.
Y ya lo tienes funcionando.
El vídeo
Lo mismo pero en falso directo, además en este caso levanto también Nginx, para que se vea las ventajas de tener ese proxy inverso funcionando.
Buenas noches, Lorenzo.
Estoy intentando seguir el tutorial. Tengo un servidor de Ubuntu con LAMP y quiero implementar esto. A la hora de intentar levantar traefik con:
$ docker-compose up -d
Me aparece el siguiente error:
[+] Running 0/1
⠿ Container traefik Starting 0.2s
Error response from daemon: driver failed programming external connectivity on endpoint traefik (81092beb64ba8ec564f60fc055bff3f13f450885008bdcc6bb9c2a7837fb22c7): Error starting userland proxy: listen tcp4 0.0.0.0:80: bind: address already in use
¿Es por que tengo habilitado todo lo que monté con LAMP? ¿sabes como podría salir del error de una forma más o menos sencilla?
La idea que tengo es montar un servidor casero y poder acceder a él desde cualquier parte.
Eso es porque el lamp está escuchando en el 80… Deberías levantarlo en otro puerto o mejor con docker!
Gracias!!!
Por cierto, al publicar marca que hace 60 min al menos en mi respuesta anterior.
Hecho de menos que no se vea cómo usar otros providers el File por ejemplo o/y como ignorar un back con certificado incorrecto (miré en el otro tutorial y tampoco), logré solucionarlo pero a nivel de todos no solo de una ruta…
Pero muy buen trabajo anda que no saqué información del self-hosted.
Ahora me falta aprender un poco de volúmenes y como guardarlos/moverlos
Personalmente para servirles que están en una red local prefiero no usar lentes encrypt como servidor de certificados y proporcionarle certificados autofirmados y que puedo importar en el navegador o en trusthstore del programa que haga uso de esa conexión.
Yo me he rendido con el rocket.chat… me fue imposible ponerlo a funcionar, no lo veo en tu repositorio.
¿has pensado en ponerlo?
Si. Lo tengo levantado en el VPS… He estado probando distintas opciones alternativas a Discord, como Rocket Chat, Matrix y Mattermost…
Hola, he hecho la proueba del ejemplo y me ha funcionado. En primer lugar gracias por la aportación. En mi caso necessito levantar varios multi containers que funcionen a la vez. Entonces bastaria con confirgurar el docker-compose.traefik.yml en cada servicio y su .env correspondiente con distintos subdominios? Y ya por pedir podria mantener activo el apache que tengo en el servidor que usa los puertos 443 y 80? He probado de configurar traefik para otros puertos pero no funciona. Alguna idea? Muchas gracias. Gran trabajo!
Hola Lorenzo, otro valenciano por aqui 🙂
Gracias por la pagina, te dejo un comentario, por si tienes tiempo de aclararlo
Despues de hacer `docker compose -up`, veo lo siguiente
«`
ERROR: for traefik Cannot start service traefik: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error mounting «/home/kitesutra/self-hosted/traefik/traefik.yml» to rootfs at «/traefik.yml»: mount /home/kitesutra/self-hosted/traefik/traefik.yml:/traefik.yml (via /proc/self/fd/6), flags: 0x5001: not a directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type
«`
Si no hago el cp de sample.traefik.yml a traefik.yml, entonces el error es el siguiente:
«`
Attaching to traefik
traefik | 2023/01/22 11:17:14 command traefik error: read /traefik.yml: is a directory
«`
Diria que el volumen en el docker-compose.yml esta mal? Pero tambien veo otros archivos y no se queja … Asi que no se que pasa
Gracias
Hola Lorenzo,
Estaba intentando levantar un Vaultwarden y al ver que necesitaba un proxy inverso para la conexión HTTPS, seguí tu tutorial. Sin embargo, me encontré con un error de puertos al principio (ya que tenía Vaultwarden en el puerto 80) y luego, al intentar ejecutar el docker-compose nuevamente, se quedaba en «restarting(1)»…
Al revisar el registro de contenedores, vi el siguiente mensaje: «exec /entrypoint.sh: operation not permitted». Parece que necesito entrar en el contenedor, pero como esta configuración ha funcionado para otros, no estoy seguro de qué puede estar pasando. ¿Alguna idea o sugerencia?
Gracias por tu ayuda.
Buenas Lorenzo
He seguido el tutorial, para instalar traefik sin usar apache2-utils (siguiendo el README que esta un poco mas actualizado que el artículo dentro de self-hosted/traefik y cuando arranco el contenedor (sin errores perfecto)
Aquí va el log: time=»2023-10-27T19:01:49+02:00″ level=info msg=»Configuration loaded from file: /traefik.yml»
Al entrar al subdominio asociado a traefik me pide un usuario y contraseña desde el navegador
¿alguna pista?
Gracias por tu tiempo y aportes.
Tienes que configurar el usuario y contraseña tal y como indica en el archivo README.md
Un saludo.
Antes de nada, gracias por todo el trabajo que haces.
Estoy siguiendo tu manual, tanto este, como el video como el de github y me funciona correctamente, pero cuando quiero añadir otro servicio para acceder a el ( rss-funnel que lo he conocido gracias a uGeek ) me pone que no encuentra la pagina. Entro sin problemas al dashboard de traefik, pero a este servicio no.
Lo tengo ( en el docker-compose de la siguiente manera ):
rss-funnel:
image: ghcr.io/shouya/rss-funnel:latest
container_name: rss-funnel
restart: unless-stopped
networks:
– proxy
ports:
– 4080:4080
volumes:
– ${HOME}/config/rss-funnel/funnel.yaml:/funnel.yaml
environment:
RSS_FUNNEL_CONFIG: /funnel.yaml
RSS_FUNNEL_BIND: 0.0.0.0:4080
labels:
– traefik.http.services.rss-funnel.loadbalancer.server.port=4080
– traefik.http.routers.rss-funnel-secure.entrypoints=websecure
# PODCAST_SERVER = podcast.mi_web.duckdns.org y lo tengo configurado en el .env
– traefik.http.routers.rss-funnel-secure.rule=Host(`${PODCAST_SERVER}`)
– traefik.http.routers.rss-funnel-secure.tls=true
– traefik.http.routers.rss-funnel-secure.tls.certresolver=letsencrypt
Pero me dice todo el rato que «page not found» y ya no se me ocurre donde mirar.
Me puedes echar un cable, porque si consigo que este funcione, podre hacer otros servicios ( navidrome, etc… ) y poder seguir todos tus consejos con respecto a la seguridad de mi VPS ( que lo tengo gracias a ti que segui tu consejo ).