Siempre que veo a ingenieros escribiendo sobre su stack, tengo curiosidad por aprender sobre nuevas herramientas. Especialmente cuando trabajas solo, siempre estás buscando aprender de la experiencia de otros.
En 2015, estaba frustrado con el nivel actual de los gestores de contraseñas, especialmente porque no había nada decente para personas que manejaban servidores privados. Comencé a trabajar en Psono, un gestor de contraseñas de código abierto con un buen nivel de cifrado y opciones de compartición seguras. Psono nunca fue diseñado para funcionar como SaaS, de lo contrario, probablemente habría incluido soporte para múltiples inquilinos desde el principio.
Para que tengas una idea de la escala de Psono, actualmente está instalado localmente en aproximadamente 70 países, con más de 4000 instalaciones. Psono SaaS solo es utilizado actualmente por más de 15.000 personas, la mayoría de ellas usando nuestra edición comunitaria gratuita de Psono que funciona con la misma tecnología que nuestro producto empresarial de pago.
El stack de una instalación típica de Psono consiste en una base de datos, un servidor, dos clientes web (uno para usuarios regulares y otro para administradores), aplicaciones para iOS y Android, extensiones de navegador para Chrome y Firefox. Un cliente puede instalar una pasarela LDAP o un servidor de archivos además de eso.
Además, tengo muchas más infraestructuras en funcionamiento. Empezando por el sitio web para impulsar la página de la empresa y la página del producto, tengo un servidor de licencias para nuestro producto empresarial, un sistema ERP central para manejar cotizaciones y facturas, una tienda donde la gente puede comprar Psono SaaS y gestionar su instalación y un servicio de autenticación con OIDC.
A lo largo del artículo verás que prefiero la tecnología "vieja y aburrida".
Lenguajes
- Python: Todo el código backend está escrito en Python. El mayor beneficio de Python es su rico ecosistema. La falta de tipos (que muchas personas consideran una desventaja) hace que sea extremadamente rápido escribir tu servicio web, lo cual, como startup, es uno de los aspectos clave que debes considerar en un lenguaje de programación.
- Javascript: Oh no... ¿quién lo habría pensado? Es simplemente imposible crear cualquier sitio web sin Javascript, incluso en 2015. ;)
Python es mi lenguaje favorito para servicios web. (Dejaré de lado mis pensamientos sobre por qué no XY es mejor que Python. Eso llenaría otro artículo de blog). Solo hay un inconveniente que debes contrarrestar y es la posibilidad de enviar código con todas las dependencias de manera confiable, lo cual es especialmente crucial si las personas instalan tu software localmente y solicitan soporte si encuentran problemas. (En cuanto a la velocidad, que otras personas podrían mencionar aquí, no importa. Python es lo suficientemente rápido).
Frameworks
- Django: "Es como un superpoder para desarrolladores solitarios" (si puedo citar a Anthony N. Simons aquí). Junto con el ecosistema, resuelve casi todos los problemas que puedas encontrar. Autenticación, plantillas, correo electrónico, migraciones de bases de datos, TOTP... solo por nombrar algunos.
- Django Rest Framework: Actualmente impulsa todas las API y hace un gran trabajo. Las diferentes capas (serialización, autenticación, permisos, vistas) mantienen tu código extremadamente limpio.
- React: Recientemente migré el cliente web regular a React. El cliente web antiguo (recuerda que se inició en 2015) estaba escrito en AngularJS y fue todo un desafío mantener la compatibilidad con el cliente antiguo, por ejemplo, todas las rutas al usuario no debían cambiar, ya que podrían haber guardado enlaces a secretos en su documentación o estar utilizando lo que se llaman enlaces compartidos. Además, la gente usaba marcas personalizadas con sus propios logotipos y demás, donde las rutas en el sistema no debían cambiar.
- webpack: Quería mencionarlo aquí, ya que actualmente es la única parte con la que no estoy satisfecho. Es lento, frustrante, difícil de aprender... la única ventaja es que nunca te quedas atascado. Cualquier problema que puedas experimentar, ya fue preguntado en Stackoverflow y encontrarás una solución.
- Gatsby: Impulsa nuestros sitios web estáticos para la empresa y el producto. En tiempos anteriores usaba WordPress, pero el esfuerzo de gestión con actualizaciones y el miedo constante de que el sitio web fuera comprometido (y la posible publicidad negativa) nos hicieron cambiar a Gatsby. Hasta ahora, nunca he mirado atrás.
- Vuepress: El sistema de gestión de documentación más decente que pude encontrar. Compila en sitios web estáticos, se ve moderno y actualmente impulsa la documentación de Psono.
- Material UI: La biblioteca principal que impulsa el frontend. Es rica en funciones, funciona bien con React y se ve bastante moderna, en contraste con los temas más antiguos basados en Bootstrap.
Seguramente hay muchos otros que merecerían ser mencionados aquí, pero estos son los "más importantes" según mi opinión.
Bases de Datos
Aunque Django admite múltiples bases de datos, muy pronto me encontré con la pregunta de si quería admitir todas las bases de datos de Django o solo una en particular. La raíz de esta pregunta fue que estaba almacenando estructuras de árbol anidadas en la base de datos. Árboles con múltiples raíces y ramas compartidas. Consultar estos de manera eficiente era crucial, así que después de explorar todas las opciones disponibles, decidí ir con la extensión ltree de Postgre.
Si planeas desarrollar algo y manejarlo solo, necesita funcionar en la nube de manera confiable, gestionado por el proveedor de la nube. Probablemente tampoco querrás estar bloqueado a un proveedor, así que nada específico de la nube, lo que limita bastante tus opciones.
Mi decisión:
- Postgres: Hay dos bases de datos de código abierto entre las que puedes elegir. MariaDB o Postgres. Siempre planeé ir con Maria (principalmente debido al Cluster Galera de Maria DB, una de esas historias equivocadas de "desarrolladores jóvenes que necesitan planificar un crecimiento hiper"), pero debido a la falta de extensiones ltree, mis manos estaban atadas. Hoy en día, con todo el desarrollo que se está llevando a cabo en las opciones de sharding de Postgres, nunca me he arrepentido de esa decisión.
- Redis: Planeado para ser utilizado como caché para instalaciones más grandes. También aquí puedes elegir entre Redis o Memcache. Ambos son excelentes, pero principalmente debido a que el protocolo de Redis es hoy en día el estándar de facto para el almacenamiento en caché, opté por Redis. El único inconveniente que he experimentado con Redis es que es monohilo.
Infraestructura
Solo una pequeña visión general de la infraestructura en la que confía Psono:
- Gitlab: Gitlab impulsa toda la automatización de Psono. Es importante destacar que todo en Psono está automatizado, lo cual es uno de los aspectos clave de cómo puedo gestionar lanzamientos y mantener todo el ecosistema de Psono. En 2015, todos los proyectos de código abierto estaban en GitHub, pero Gitlab era (y sigue siendo) tan poderoso y superior en cuanto a funciones (con la excepción de la funcionalidad de búsqueda de GitHub). Gitlab impulsa compilaciones, lanzamientos, escaneos de vulnerabilidades de CADA pieza de software que usamos.
- Cloudflare: Probablemente la empresa más innovadora que conozco y que me ha influenciado en los últimos 10 años. Es justo decir que Cloudflare impulsa internet hoy en día. Me proporciona servidores de nombres confiables, TLS, un CDN decente y funciones avanzadas como su edge worker. La protección DDoS y la funcionalidad WAF proporcionan un extra importante, que como gestor de contraseñas es bastante importante. Me encantaría usar su función de SSL como servicio para permitir a los clientes de SaaS configurar sus propios dominios, pero el muro de pago del nivel Enterprise de Cloudflare es demasiado alto. Todavía espero que lo lancen en algún lugar como un complemento independiente que uno pueda comprar.
- namecheap: Mi solución preferida para dominios y certificados SSL.
- Google Cloud Run: Todos los servidores backend se ejecutan en Google Cloud Run, que es extremadamente rentable y confiable cuando deseas desplegar una flota de servicios. Una vez que tienes tu stack en funcionamiento, hace un gran trabajo. Su integración de API/CLI de primer nivel es un absoluto plus aquí. Hay algunos inconvenientes, como la falta de soporte de Google o la amenaza de que Google podría decidir en algún momento que ser el #3 como proveedor de servicios en la nube podría no valer la pena y cancelar el producto.
- Artifactory: Protege mi canal de
compilación contra las caídas de npm y almacena mis artefactos de compilación (que no estaban incluidos en Gitlab en 2015).
- Docker Hub: Almacena todos los contenedores de Docker y realiza algunos análisis de seguridad adicionales y la distribución de mis contenedores.
- Mailgun: Maneja todos los correos electrónicos. A diferencia de la mayoría de los proveedores de soluciones de correo electrónico, Mailgun tiene funcionalidades de registro y análisis decentes. Su soporte es de primera categoría. El único problema es que sus correos electrónicos a veces se envían a la bandeja de spam (incluso con SPF, DMARC y todo lo demás en su lugar), pero aparte de eso, están haciendo un gran trabajo.
- Poeditor: Maneja todas las traducciones. Lo bueno es que los contribuyentes pueden solicitar acceso, lo cual es crucial si quieres que externos te ayuden a traducir tu proyecto. Su soporte es increíble y recibes respuestas extremadamente rápidas.
- Docker: Una de las mejores decisiones para todo el proyecto. Especialmente porque uso Python y enviar código Python funcionando con todas las dependencias de bibliotecas Python/OS es difícil. Si las cosas deben ejecutarse con un cliente local y el requisito de que pueda actualizar y mantener el sistema. Docker nos permite hacer todo eso y me da control total sobre los paquetes instalados, lo cual resuelve al menos el 70% de todos los problemas de soporte (mientras que introduce un 20% de nuevos problemas, ya que la gente no está acostumbrada a Docker ;D).
Monitoreo
Las cosas pueden salir mal y necesitas saber cuándo sucede eso y obtener información sobre el problema. Ahí es donde estas herramientas son útiles:
- Google Cloud logging: Si estás en Google, tu solución natural.
- Sentry: Mi solución número uno para reportes de errores. Una vez que lo pruebes, no querrás prescindir de él. Me da la información necesaria sobre todos los errores.
- Uptimerobot: Llama al healthcheck de mis diversos servicios y me alerta si algo falla. La página de estado público de Psono, por cierto, se puede encontrar aquí https://stats.psono.com/, que es solo una pequeña fracción de los servicios que este sistema monitorea para mí, pero que espero demuestre un poco la confiabilidad del sistema.
Infraestructura de Desarrollo
Una pequeña visión general de cómo se ve mi stack de desarrollo local:
- Windows with WSL: Probablemente recibiré muchas críticas por esto, pero sí, estoy en Windows. En los últimos años siempre he tenido en algún lugar una VM con Linux a la que me conectaba para desarrollar, pero hoy en día, está impulsada por WSL. Estoy obteniendo lo mejor de ambos mundos.
- Pycharm / Webstorm: Estoy usando las IDEs de Jetbrains. La funcionalidad de desarrollo remoto es crucial para mi flujo de trabajo de desarrollo y esta filosofía de "baterías incluidas" me viene muy bien. A veces tengo unos 20 proyectos abiertos, lo que requiere un hardware decente con suficiente RAM. VSCode parece ser una buena alternativa hoy en día, pero a lo largo de los últimos años me he acostumbrado a Jetbrains y aprender algo nuevo siempre requiere cierta fortaleza mental que actualmente no estoy dispuesto a invertir en esto. Diría que cada uno debería usar algo con lo que esté familiarizado.
Soporte
Hay ciertas herramientas necesarias para manejar el soporte para las personas que usan el producto:
- Freshdesk: Un típico software de tickets por correo electrónico. Me ayuda a llevar un seguimiento de las diversas solicitudes de los clientes. En los primeros tiempos, ofrecía un nivel gratuito decente, lo cual es crucial especialmente en la etapa inicial.
- Discord: Algunas personas pueden preferir chatear o requerir una conversación/ayuda más directa. Ahí es donde Discord es útil.
Otros
Hay otras herramientas que quería mencionar que pueden ser útiles para otros. Especialmente los bancos para personas que quieren manejar su negocio en Alemania:
- Odoo: El mejor sistema ERP. Su edición de código abierto es gratuita y se puede ampliar fácilmente con Python y algunos conocimientos de XML. Sus opciones de personalización e integración con APIs personalizadas son de primera categoría.
- Holvi: Nuestra cuenta bancaria principal. En Alemania, necesitas un banco que te permita configurar una Cuenta de Fundador, en alemán "Gründerkonto", por lo que una cuenta bancaria que esté vinculada a una empresa que aún no esté completamente registrada y donde puedas transferir el capital inicial que se requiere para registrar la empresa. Un pequeño problema de "qué fue primero, el huevo o la gallina". Y los grandes bancos que permiten eso generalmente cuestan un ojo de la cara. El proceso de registro también funcionó bastante bien. El único inconveniente es la falta de soporte para pagos internacionales, pero ahí es donde entra en juego el siguiente servicio.
- Wise: Nuestra segunda cuenta bancaria. Sus tarifas son extremadamente bajas (por ejemplo, sin tarifas mensuales), el proceso de configuración funciona sin problemas, están bien conectados y permiten transferencias bancarias internacionales, y las transferencias se realizan rápidamente, por lo que no tienes que esperar semanas o algo similar.
Seguridad
Supongo que esto podría ser una publicación de blog aparte sobre cómo estructuramos las cuentas de usuario, la infraestructura y los derechos de acceso. Como este es uno de los aspectos más cruciales para la seguridad de Psono, no voy a entrar en detalles aquí y trataré de ser lo suficientemente vago. Usamos servicios tanto de Google Cloud como de Azure. Ambos con usuarios y grupos completamente separados. Hay usuarios dedicados para tareas de administración y cuentas de usuario para el "trabajo diario". Existen diferentes sistemas físicos y virtuales que utilizo para acceder/soportar/gestionar/administrar Psono. Las tareas de administración solo se realizan en un dispositivo físico separado, especialmente endurecido, que se utiliza exclusivamente para estas tareas. Todas las cuentas están protegidas con tokens de hardware. Todos los sistemas están gestionados de forma centralizada y las políticas de seguridad están en su lugar para garantizar que todos los dispositivos sigan los estándares de seguridad que normalmente se encuentran en los bancos.
Créditos
Este artículo fue fuertemente inspirado por el artículo de Anthony N. Simon sobre Panelbear.