142 - Tus contenedores accesibles desde internet
Como tener todos tus contenedores accesibles desde internet de forma sencilla y fácil, para que puedas compartir archivos música o lo que tu quieras.
Este año, yo y seguramente tu, si me sigues los pasos, tengo intención de levantar una docena de servicios en la Raspberry. La idea, es montar todo tipo de servicios que me sean de utilidad. Así, recientemente publiqué un podcast relativo a una alternativa a Dropbox, o también como podías llevar la gestión del conocimiento con mkdocs o incluso la alternativa a ifttt o zapier. Pero, como te digo, esto solo es el principio de lo que tiene que llegar. Desde luego, desde la red local en la que tienes montado todos estos servicios, no tendrás problema de acceder a ellos. Pero ¿como tener tus servicios accesibles desde internet? Como tener tus archivos disponibles, o esa gestión del conocimiento. Ya has visto en otros episodios del podcast como podías acceder a tu Raspberry desde internet. Pero ¿como acceder a todos los servicios que vas a montar este año?.
Tus contenedores accesibles desde internet
En que ando metido
Como todos los jueves te cuento en que ando metido, para que sepas de primera mano, lo que encontrarás en las próximas días.
Artículos
Respecto a los artículos, indicarte que he publicado dos artículos. El primero de los artículos hace referencia a como gestionar pantallas externas en Linux. Se trata de una interesante solución si no quieres acceder al menú de las pantallas externas que tengas conectadas a tu portátil. Esto, por supuesto no se quedará aquí, porque llevará asociado una aplicación… aunque no quiero adelantarme a los acontecimientos.
El segundo de los artículos, es la continuación del tutorial sobre Vim. En este tutorial nos adentramos a la edición en Vim. Son los pasos previos. Este capítulo es un poco denso, porque trae consigo decenas de combinaciones de teclas. No es necesario que las aprendas, simplemente que las conozcas, porque son imprescindibles para el tercer capítulo, que seguro arrojará luz sobre todo esto.
Aplicaciones
Respecto a las aplicaciones, ando metido en varias. Por supuesto la primera es la que está relacionada con el artículo que he comentado anteriormente, sobre gestionar pantallas externas en Linux.
Pero no solo esto, sino que además estoy trabajando en la modificación de pomodoro-indicator, una herramienta que te ayudará a aplicar la técnica pomodoro para mejorar sensiblemente tu productividad. En este caso, la mejora consiste en añadir estadísticas. Una idea que parte de la aplicación Hábitos que te permite medir tus hábitos para ser mas productivo.
Como ves, este año el tema principal es la productividad.
Tus contenedores accesibles desde internet
Al turrón del podcast o como tener tus contenedores accesibles desde internet. Seguro que no te sorprendo si te indico que esto lo vas a hacer con un proxy inverso. Es posible que esto del proxy inverso te suene a chino. Pero esto no es mas que un enrutador. Un software que te permite ir desde el router de casa a un servicio concreto de tu Raspberry. Vamos, lo que normalmente decimos ir al grano.
Como te he indicado anteriormente, si tienes varios servicios instalados en tu Raspberry, y en este caso todos mediante docker, después de seguir el tutorial sobre docker, o como tu quieras, ¿como llegas desde internet a cada uno de ellos?
Partiendo de una ip dinámica
Como he comentado en mas de una ocasión, actualmente tengo IP dinámica. Esto implica que para llegar a la Raspberry tengo que utilizar por ejemplo algún servicio externo, como podría ser DuckDNS, que es el que actualmente estoy utilizando.
En este caso, tienes varios servicios, como puede ser Seafile o Grafana por citar algunos. Cada uno de estos servicos trabaja en un puerto concreto del host, el 3000, el 5000, por ejemplo.
Una solución sería apuntar el puerto del router al puerto de la Raspberry, y abrir el puerto del router. Sin embargo, cuantos mas puertos abiertos peor. Mas posibilidades de que alguien intente hacerte un estropicio.
Como redirigir el tráficos
Y entonoces, ¿como redirigir el tráfico al servicio correcto de la Raspberry?. Esto lo puedes hacer de varias maneras. Así por ejemplo, puedes utilizar un proxy inverso. ¿Como redirigir? Cuando busquemos por seafile.servicio.duckdns.org en internet que nos dirija al servicio de Seafile de la Raspberry.
Otra opción también podría ser servicio.duckns.org/seafile. Cualquiera de las dos opciones es tan válida como la otra. Esto va a gusto del consumidor. En mi caso me he decantado por la primera. De esta manera tengo diferentes servicios en la Raspberry todos accesibles desde internet. Por ejemplo,
- Safile
seafile.service.duckns.org
- mkdocs
mkdos.service.duckdns.org
Con esta solución no tienes problemas de que se solapen puertos, siempre puedes redirigirlos de forma sencilla.
La solución es Traefik
Traefik
Traefik es un enrutador que te permite redirigir el tráfico a cada uno de los servicios que definas. Al final, no es mas que un proxy inverso especializado en docker.
Tradicionalmente los proxy inverso se definen con su configuración, y cada una de las rutas hay que definirlas en la configuración del proxy.
Con Traefik no se hace de esta forma, sino que en cada uno de los servicios indicas la ruta a utilizar. Trafik funciona con autodescubrimiento, de ahí la razón para el punto anterior. De esta manera, cuando despliegas un nuevo contenedor, Traefik se encarga de su detección y enrutamiento. De la misma forma, cuando paras un contenedor, Traefik se encarga de eliminar ese enrutamiento.
Por supuesto y como no podía ser de otra forma, Traefik es un contenedor. A este contenedor tienes que dirigir el router y abrir los correspondientes puertos si quieres exponerlo a internet. Estos puertos son el 80 y el 443 para Let’s Encrypt y el 8080, para la gestión de Traefik. Eso si, no es necesario que tengas abierto el puerto 8080 en el router si no tienes que acceder desde internet, algo que no te aconsejo.
A partir de aquí defines cada uno de tus contenedores en forma de docker-compose. En este caso, por ejemplo, he montado un Grafana que puedes instalar desde DockerHub con imagen que he creado para ello.
Configuración
A continuación encontrarás los archivos de configuración, primero los correspondientes a Traefik y luego alguno de ejemplo. En las próximas semanas, añadiré mas contenedores, y dejaré en los correspondientes episodios del podcast su correspondiente configuración,
Traefik
docker-compose.yaml
version: '2' services: traefik: image: traefik:1.7.7 restart: always environment: - DUCKDNS_TOKEN=b57da145-ef3f-13af-1486-b3faee4212487241 ports: - 80:80 - 443:443 - 8080:8080 networks: - traefik_proxy volumes: # traefik needs the docker socket, to explore new container on your docker-host - /var/run/docker.sock:/var/run/docker.sock - $PWD/traefik.toml:/traefik.toml - $PWD/acme.json:/etc/traefik/acme/acme.json container_name: traefik networks: traefik_proxy: external: true
traefik.toml
debug = false logLevel = "ERROR" #DEBUG, INFO, WARN, ERROR, FATAL, PANIC InsecureSkipVerify = true defaultEntryPoints = ["https", "http"] WEB interface of Traefik - it will show web page with overview of frontend and backend configurations [api] entryPoint = "traefik" dashboard = true address = ":8080" Force HTTPS [entryPoints] [entryPoints.http] address = ":80" [entryPoints.http.redirect] entryPoint = "https" [entryPoints.https] address = ":443" [entryPoints.https.tls] [file] watch = true filename = "/etc/traefik/rules.toml" Let's encrypt configuration [acme] email = "microrreo@correo.es" #any email id will work storage="/etc/traefik/acme/acme.json" entryPoint = "https" acmeLogging=true onDemand = false #create certificate when container is created Use this for subdomains [acme.dnsChallenge] provider = "duckdns" delayBeforeCheck = 300 [[acme.domains]] main = "servidor.duckdns.org" [[acme.domains]] main = "*.servidor.duckdns.org" Use this for subfolders onHostRule = true # Use a HTTP-01 acme challenge rather than TLS-SNI-01 challenge [acme.httpChallenge] entryPoint = "http" Connection to docker host system (docker.sock) [docker] endpoint = "unix:///var/run/docker.sock" domain = "servidor.duckdns.org" watch = true This will hide all docker containers that don't have explicitly set label to "enable" exposedbydefault = false
Grafana
docker-compose.yaml
version: '3.5' services: grafana: image: atareao/grafana:rpi container_name: grafana restart: unless-stopped labels: - traefik.enable=true - traefik.frontend.rule=Host:grafana.servidor.duckdns.org - traefik.port=3000 - traefik.backend=grafana - traefik.docker.network=traefik_proxy networks: - traefik_proxy networks: traefik_proxy: external: true
Más información,