644 - Un editor online, Traefik y self hosted
rustpad es un estupendo servicio #selfhosted para alojar en tu #vps o en un servidor #linux con #docker y que te permite editar un documento entre varios
Esta última semana asistí a un curso muy interesante sobre Kibana. En el curso se utilizó una herramienta que desconocía por completo y que era, ni mas ni menos, que un editor colaborativo. Una herramienta que permitía compartir con otras personas de forma sencilla texto. Y esto, como te puedes imaginar, me llamó mucho la atención y me hizo buscar una alternativa que pudiera hospedar en mi propio servidor. Y te preguntarás para que quiero esto, pues muy sencillo, algo que seguro que tu has hecho en mas de una ocasión, para copiar texto entre diferentes dispositivos de forma sencilla. Por ejemplo, pasar una contraseña, el nombre de un usuario, o cualquier cosa. Esto me llevó a revisar algunos de otros servicios similares que tengo, como puede ser pastebin
o opengist
de los que te hablaré también en este episodio.
Un editor online, Traefik y otros servicios self hosted
Algunas recomendaciones
En referencia a la DANA y a las inundaciones y riadas en Valencia, quiero recomendarte que escuches un episodio del podcast Historia Tarik, en concreto el episodio 3 de la segunda temporada titulado Historia de las riadas en Valencia.
Por otro lado, y aunque no tiene mucha relación, hace ya algún tiempo que estoy escuchando el podcast El parche de Odín. Se trata del relato personal de un oftalmólogo español en Suecia, en el que trata de las diferencias de cultura, sociedad, experiencias personales y otros temas. Algunos de los episodios son sesudos y al menos a mi, me han hecho reflexionar. En concreto el último Disciplina y libertad me ha resultado un punto de vista muy acertado.
Apuntes a episodios anteriores
Sobre la sincronización de Obsidian
Desde el episodio 642 titulado Sincronizar Obsidian hasta el día de hoy llevo utilizando la sincronización de Obsidian vía CouchDB y tengo que decir que es la solución que andaba buscando. Funciona a las mil maravillas, es muy rápido y nada intrusivo. He añadido el docker-compose.yml
de CouchDB al repositorio de self-hosted
Sobre el resolutor de DNS
En el episodio 643 titulado Un resolutor de DNS y Traefik con certificados autofirmados comenté que iba a dejar la configuración de unbound
en el repositorio de GitHub. Menos mal que me lo recordaisteis porque se me había pasado. Ya está disponible en el repositorio de Self Hosted.
Sobre Neovim
Atajos de teclado
En Neovim estoy utilizando un complemento que se llama which-key
que me muestra los atajos de teclado que tengo disponibles en cada momento. Es muy útil para recordar los atajos de teclado. La cuestión es que hasta la fecha tenía definidos esos atajos de teclado directamente en el complemento, pero en una actualización del complemento, me dejó de funcionar. Así decidí separar los atajos de teclado de este complemento, y utilizar este complemento única y exclusivamente para mostrar los atajos de teclado relacionados.
Sincronización
Viendo los problemas que estaba teniendo con la sincronización de Obsididan, decidí ver si existían opciones para realizar sincronizaciones con Neovim, y efectivamente las hay. Se trata de un complemento llamado transfer
que permite mediante rsync
sincronizar con un directorio local o remoto. Lo estoy probando para ver que resultado da y tener mas opciones para el futuro.
Algunos cambios en Traefik
Con la llegada de Traefik 3.2, he estado revisando y modificando la configuración de algunas de las opciones y servicios que actualmente tengo alojados en mis servidores. A continuación te detallo algunos de estos cambios para que si así lo consideras los puedas aplicar tu también, o simplemente los tengas en cuanta por si en algún momento los necesitas.
Sobre la configuración dinámica
En Traefik, tienes la opción de definir parte de la configuración como dinámica. Esto tiene la ventaja de que dependiendo de como lo tengas configurado, en el caso de cambiar esta configuración se actualiza al instante, sin necesidad de reiniciar el contenedor. Además puedes hacer esa configuración dinámica en un archivo o en un directorio.
Anteriormente la tenía en un archivo y la he modificado para que sea en un directorio. Para hacer esto en la configuración estática, en el archivo traefik.yml
, tienes que definir un provider
del tipo file
tal y como te indico a continuación,
providers:
file:
directory: /conf
watch: true
Reglas por defecto
Es posible definir una rule
por defecto utilizando la opción defaultRule
en el provider
docker
de la siguiente forma,
defaultRule: "Host(`{{ index .Labels\"com.docker.compose.service\"}}.tuservidor.es`)"
De esta manera, ya no es necesario ni siquiera definir la regla para enrutar las llamadas. Dependiendo de como tengas configurado Traefik, es posible que no tengas que indicar ni una sola etiqueta.
Middlewares
Dentro de los middlewares
de Traefik, he añadido uno nuevo para todos los routers
que utilizan en entrypoint
websecure
, que es una cadena de middlewares
. En concreto la definición es la siguiente,
default:
chain:
middlewares:
- default-security-headers
- gzip
gzip:
compress: {}
default-security-headers:
headers:
browserXssFilter: true # X-XSS-Protection=1; mode=block
contentTypeNosniff: true # X-Content-Type-Options=nosniff
forceSTSHeader: true # Add the Strict-Transport-Security header even when the connection is HTTP
frameDeny: true # X-Frame-Options=deny
referrerPolicy: "strict-origin-when-cross-origin"
sslRedirect: true # Allow only https requests
stsIncludeSubdomains: true # Add includeSubdomains to the Strict-Transport-Security header
stsPreload: true # Add preload flag appended to the Strict-Transport-Security header
stsSeconds: 63072000
Con esto he añadido la compresión por defecto, así como algunas cabeceras de seguridad, que siempre vienen bien para mejorar la seguridad de los servicios.
¿Que es un editor colaborativo?
Un editor colaborativo es una herramienta que permite a varias personas editar un documento de forma simultánea. Es decir, que varias personas pueden editar un documento a la vez. En este caso se trata de un documento en texto plano. Evidentemente, siendo plano, puede ser markdown, con lo que varias personas pueden trabajar de forma simultánea sobre el mismo documento.
Sin embargo, lo que yo estoy haciendo es utilizar de forma simultánea en varios dispositivos a la vez. En este caso lo estoy utilizando entre la tablet y el ordenador de escritorio.
Rustpad
El editor colaborativo que estoy utilizando se llama Rustpad. Es un editor de texto Open Source, eficiente y minimalista basado en el algoritmo de Transformación Operationa, Operation Transformation. Esta herramienta permite a varios usuarios colaborar en tiempo real mientras escriben código en su navegador.
El servidor está escrito en Rust utilizando el framework warp
y la librería operational-transform
. Además se utiliza WebAssemby para compilar la logíca operacional que corre en el navegador. Por otro lado, el frontend
está escrito en TypeScript utiliando React
y Monaco
que es el editor de texto que utiliza Visual Studio Code
.
La configuración es realmente muy sencilla, y básicamente tiene cuatro variables de entorno para definir en numero de días que se mantienen vivos
los documentos compartidos. Por defecto está establecido a un día. Otra de las variables es la dirección de la base de datos que se utiliza para la persistencia de los documentos. Y por último está el puerto, que por defecto es el 3030
y el nivel de log que quieres.
El docker-compose que estoy utilizando es el siguiente,
services:
rustpad:
image: ekzhang/rustpad
container_name: rustpad
init: true
restart: unless-stopped
environment:
RUST_LOG: DEBUG
EXPIRY_DAYS: 1
SQLITE_URI: file:///data/rustpad.db
volumes:
- ./data:/data
networks:
- proxy
labels:
- traefik.enable=true
- traefik.http.services.rustpad.loadbalancer.server.port=3030
- traefik.http.routers.rustpad.rule=Host(`rustpad.tuservidor.es`)
- traefik.http.routers.rustpad.entrypoints=https
networks:
proxy:
external: true
Servicios Self Hosted
A raíz de este servicio me acordé de otros dos que tengo levantados en mi servidor a modo de pruebas, y un tercero que no tiene que ver directamente con esto pero que podría servirnos para enviarnos información al móvil de forma sencilla mediante un código QR.
Pastebin
Un pastebin es una aplicación web que permite compartir pequeños textos, generalmente código fuente, para que pueda ser visualizado por cualquier persona con acceso a la URL. Los pastebins son muy útiles para compartir fragmentos de código, logs, o cualquier texto que queramos compartir de forma rápida y sencilla.
OpenGist
OpenGist es una aplicación web que permite compartir fragmentos de código de forma sencilla. Se trata de un pastebin, pero con algunas características adicionales. Todos los snippets
o fragmentos de código se almacenan en un repositorio git que puedes leer y modificar directamente utilizando comandos git o a través de la interfaz web. Básicamente sería un clon de GitHub Gist pero Open Source y que puedes instalar en tu propio servidor. Algunas de las características de este pastebin son las siguientes,
- Crear fragmentos públicos, no listados o privados
- Inicializar / Clonar / Descargar / Subir fragmentos mediante Git sobre HTTP o SSH
- Resaltado de sintaxis; soporte para markdown y CSV
- Buscar código en los fragmentos; explorar fragmentos de usuarios, gustos y bifurcaciones
- Incrustar fragmentos en otros sitios web
- Historial de revisiones
- Dar me gusta / Bifurcar fragmentos
- Descargar archivos originales o como un archivo ZIP
- Inicio de sesión OAuth2 con GitHub, GitLab, Gitea y OpenID Connect
- Restringir o desbloquear la visibilidad de los fragmentos para usuarios anónimos
Microbin
MicroBin es un pastebin extremadamente ligera, con interesantes características, configurable, autónoma y autohospedada. Es muy fácil de configurar y usar, y solo requerirá unos pocos megabytes de memoria y espacio en disco. Solo toma un par de minutos configurarlo. Algunas de las características de esta herramienta son las siguientes,
- Totalmente autónomo y ejecutable, ¡MicroBin es un solo archivo!
- Cifrado del lado del servidor y del cliente.
- Subida de archivos (por ejemplo, server.com/file/pig-dog-cat).
- Servicio de texto en bruto (por ejemplo, server.com/raw/pig-dog-cat).
- Soporte para códigos QR. Te permite acceder fácilmente a los
snippet
utilizando códigos QR. Esto va fantástico para pasar los enlaces. - Acortamiento de URL y redirección.
- Nombres de animales en lugar de números aleatorios para los identificadores de subida (64 animales).
- Soporte para bases de datos SQLite y JSON.
- Subidas privadas y públicas, editables y no editables, con caducidad automática o nunca expiran.
- Soporte para modo oscuro automático y personalización del estilo con muy poco CSS y solo JavaScript nativo (ver water.css).
QR Code Generator
Por último, te quiero hablar de una herramienta que te permite generar códigos QR de forma sencilla. Se trata de QR Code Generator. Este es un contendor Docker super sencillo y ligero, que te permite generar códigos QR con la tranquilidad de que todo queda en casa.
Conclusión
Como ves, se trata de varios servicios que puedes instalar en tu propio servidor y que te pueden ser de utilidad en tu día a día. Y es que, cada vez más, la privacidad y la seguridad de nuestros datos es algo que nos preocupa a todos. Por eso, tener tus propios servicios en tu propio servidor es una ventaja que no deberías desaprovechar.
Todos estos servicios están pensados para compartir texto o documentos de forma sencilla y efímera. Es decir, simplemente se trata de compartir un texto o un fragmento de código durante un tiempo para que otra persona lo pueda ver. En el caso de los códigos QR, simplemente se trata de compartir un enlace o un texto de forma sencilla.
Más información,
What security protocols should be followed when exposing services like Un-Editor to the internet? How do you ensure secure communication using Traefik, including setting up SSL certificates and enabling secure HTTP connections? Regard Teknologi Telekomunikasi