Todo comenzó cuando estaba buscando una solución para manejar notas y lista de tareas en mi computadora y a través de internet.

Probé Google Keep, Notion y Evernote. Mis problemas con estas herramientas son:

  • resulta complicado hacer un backup en la máquina local: ya sea que de plano no se pueda o que se haga a través de json dejando muy complicado extraer la información sin necesitar un proceso o programa para hacerlo
  • es imposible mantener información completamente privada (para las empresas que proveen el servicio)

tal vez estos problemas no lo son en realidad, pero son cosa que a mi me interesan o preocupan.

Encontré más soluciones que conocí a través de aplicaciones que usan Electron Framework y Markdown. Lo que me gustó es que utilizaran markdown para guardar la información; pero tengo mi problema con que utilizan chrome (conocido por su gran uso de RAM) y que la sincronización con la nube está limitado a servicios de terceros (desconozco si algunas de estas herramientas han agregado nuevas características que cubran mis necesidades). En la búsqueda de herramientas que utilizaran markdown para almacenar los textos encontré Roam Searh y que no probé debido a su costo (y lamento sentir que esas "pruebas" donde tienes que dar los datos de tu tarjeta no son en realidad gratuitas). Así que busqué soluciones de código abierto parecidas y encontré org-roam.

Org-mode

Yo me acostumbre a usar vim para trabajar con archivos de texto, pero tampoco usaba todas las capacidades de este editor. También conocía la discusión de qué editor de texto es mejor: ¿/vi/ o emacs? La verdad nunca me acerqué a emacs. Esto viene a que supe de org-mode a través de org-roam y este es un formato estructurado de texto plano (como lo es markdown). Comencé a usar emacs para utilizar org-mode y me enamoré de este porque puedes almacenar tu lista de tareas en archivos de texto y generar documentos en distintos formatos de tus archivos de texto (utilizando pandoc) y hasta manejar tu calendario. Todo esto con un sólo programa.

Aun sigo aprendiendo a usar emacs y org-mode y todavía no doy el paso a usar emacs para programar. Pero definitivamente es la solución que buscaba para guardar y crear textos (justo este texto lo estoy escribiendo desde con org-mode).

Entonces se presentaron los problemas:

  • ¿Cómo compartía estos archivos de texto plano entre mi computadora e internet?
  • ¿Cómo podía usar estos archivos con los dispositivos "inteligentes"?

Syncthing

Encontré una reseña a syncthing en algún blog técnologico. Esto perfectamente resolvía mi problema de mantener un respaldo en una computadora remota. Bien podría utilizar rsync para poder hacer este respaldo, sin embargo, para cada carpeta que quisiera sincronizar tendría que entrar al servidor remoto y crear lo que necesito (o automatizarlo con scripts). Lo que me pareció tedioso intentarlo.

Instalé syncthing en una raspberry para probar este software y me encantó debido a que podrías crear al vuelo las carpetas que necesitaras sincronizar. No sé si la interfaz gráfica en web es la más adecuada para este tipo de software, pero es fácil manejar las carpetas que quieras sincronizar y los dispositivos que comparten dichas carpetas.

Implementación

Ojalá y todo fuera como

Azúcar, flores, y muchos colores. Estos fueron los ingredientes elegidos para crear a la niñita perfecta, pero el profesor Utonio agregó accidentalmente otro ingrediente a la fórmula: la sustancia X. ¡Y así nacieron las Chicas Superpoderosas! – Las chicas superpoderosas

pero lamentablemente no hay tanta magia con esto, sólo paciencia e intentarlo. Si quieren conocer la implementación pueden visitar el repositorio de este sitio.

Este proyecto es más la implementación de la infraestructura para lograr mantener los distintos servicios con la información requerida.

Infraestructura

Bien podría instalar en el servidor todas las herramientas y configurar el servidor web que diera acceso a estas herramientas. Para mi, el problema es que complica la reproducción de esta estructura en otro servidor (justo eliminé la instancia del servidor que tenía antes y terminé volviendo a darme de topes en la cabeza porque no sabía cómo iniciar procesos en el inicio del sistema operativo). Igual y existe forma sencilla de reproducir todo lo necesario para los servicios, pero por el momento la desconozco.

Lo que sí he podido hacer es describir la infraestructura de contenedores docker con terraform. Esto me ha permitido crear una instancia de cada servicio con docker y darles la configuración necesaria de las carpetas requeridas en cada servicio.

Hugo

Para manejar la información de este sitio, agregué Hugo para crearlo. Lo que me gusta de esta solución es que puedo crear los archivos en org-mode y generar los archivos html estáticos. Así el contenido se encuentra almacenado en archivos de texto en lugar de la base de datos.

La imagen base es klakegg/hugo:0.93.2-pandoc que ya está listo para transformar los archivos org-mode.

Syncthing

Este contenedor se encarga de dar el servicio de sincronización de datos.

La imagen base es alpine:3.15.4 debido a que los contenedores directos de syncthing tenían una configuración por defecto. Yo preferí darle una configuración personal.

Acá sólo tuve que mantener la configuración del servicio en el host y hacer el cambio de la dirección en el host.

Webdav

Inicialmente había usado la extensión webdav de nginx, pero no pude configurarlo adecuadamente para la creación de archivos de forma remota. Así que decidí usar una solución de webdav distinta. Inicialmente utilicé PyWebDAV3, pero para esta implementación decidí usar una solución escrita con Go y encontré Simple Go WebDAV server.

La imagen base es alpine:3.15.4 y se descarga el ejecutable de Simple Go WebDAV server.

¿Qué cosa comparten?

Lo único que comparten todos estos servicios son las carpetas donde se guardan los archivos que se necesitan.

Archivos sincronizados

El servicio de syncthing se encarga de mantener los archivos sincronizados. Este servicio pone los archivos sincronizados en un directorio en el host. Así se podrían agregar más carpetas a sincronizar bajo demanda del usuario.

Sitio

Dentro de la carpeta de archivos sincronizados existe el lugar donde se sincroniza el contenido de este sitio. Cuando se inicia el servicio de hugo se le agrega la carpeta del sitio dentro de un directorio del contenedor. También se requiere configurar hugo para que el contenido para generar el sitio sea tomado de esta carpeta.

Webdav

Al igual que el sitio, existe una carpeta dentro de los archivos sincronizados que es el contenido que va a mostrar este servicio.

Conclusión

La verdad es que inicialmente fue muy complicado manejar la sincronización de las carpetas. Por esta razón describí toda la infraestructura con terraform. Para mayor detalle de esto, pueden visitar el repositorio de este sitio.

Al terminar de escribir esto siento que todo este proceso es bastante engorroso. Sin embargo, me ha servido para explorar el uso de terraform y darle una solución a mis necisidades que no utilizar servicios de terceros para mantener mis notas, lista de tareas y textos.

Saludos.