54 puntos por xguru 2022-09-26 | 8 comentarios | Compartir por WhatsApp
  • Opero varias apps SaaS en un gran servidor de OVHcloud
    • Procesa alrededor de 6 millones de requests sin caché al día
    • El backend es Django/Python + MySQL + Redis + WebSocket (Pub/Sub)
    • Mi secreto es OpenResty (Dynamic web platform based on NGINX and LuaJIT)
      • Uso scripts en Lua para manejar caché compleja de páginas, bloquear DDoS, procesar WebSockets y hacer offloading de requests de larga duración
      • Un "Cloudflare para pobres" compuesto por 1500 líneas de código Lua
    • Estas apps fueron creadas antes de Docker, así que simplemente corren como procesos (systemd)
    • Al principio usaba uwsgi, pero gunicorn era mucho más eficiente, así que ya hice el cambio por completo
    • Mi SPOF es el DNS. Tenía buena relación con DNSMadeEasy, así que no me preocupaban los baneos automáticos, pero ahora DigiCert los adquirió y eso es un problema
    • Los pagos se procesan con Stripe y PayPal. Aunque no me gusta PayPal, lo agregué porque no sabes cuándo Stripe puede bloquearte sin aviso
    • Las subidas de usuarios van a un servidor Python con aiohttp, que envía los archivos a Wasabi y Backblaze y luego nginx los cachea. Así que el costo de transferencia en la nube es 0
    • La capa de WebSocket es un poco inestable. Al principio manejaba todo con una librería asyncio de WebSocket en Python, y funcionaba hasta cierto punto, pero cuando después intenté manejarlo en multiproceso empezó a consumir una cantidad enorme de recursos
    • Así que decidí usar el WebSocket de OpenResty, pero no quería escribir lógica compleja en Lua
      • Lo cambié para que entregara los mensajes a procesos de Python usando Redis Pub/Sub
    • Pero no voy a decir el nombre de mi servicio (¡no quiero más competencia!)
  • Tengo tendencia a elegir opciones poco conocidas, pero creo que son productivas para un desarrollador solitario
    • PostgreSQL + SQLite
    • Lenguaje principal: Rust
    • Frontend: htmx + tailwindcss
    • Hosting en Cloudflare + Vultr
    • nginx + nixos + circle ci
  • A algunos no les gustará, pero elegir Wordpress fue lo mejor para mí
    • El foro es bbPress
    • La comunidad donde los miembros publican es buddyPress
    • Para newsletters, en vez de un SaaS carísimo, uso el plugin barato de mailster.co (con Critsend.com)
    • La mayoría de las funciones que quería existen en plugins: FAQ con búsqueda, Captcha, anuncios, publicar en Discord, sistema de reportes de usuarios, etc.
    • Opero https://rpgplayground.com/
  • Opero https://text-generator.io , un servicio que compite con OpenAI
    • Antes usaba Kubernetes en GCP, pero ahora lo opero desde mi casa con mis GPUs a través de túneles de Cloudflare. Así el costo de GPU es 10 veces menor.
    • Analiza links o imágenes ingresadas usando Tesseract / Unified IO / OFA / Beautiful Soup, etc., y responde sobre imágenes/recibos
    • El sitio en sí está hecho con AppEngine + Python + Stripe + Firebase UI, así que lo opero semanalmente con bajo costo
  • Hospedado en Render
  • Opero https://allaboutberlin.com
    • Corre con Craft CMS en Docker de DigitalOcean
    • Craft permite crear fácilmente tipos de contenido personalizados con campos personalizados, algo difícil de hacer en WordPress
    • Pero como no es WordPress, no hay tantos plugins disponibles como se necesitan
    • Uso nginx para el caché y muchas otras cosas
  • Si quieres ser más productivo, prueba PETAL
    • Phoenix + Elixir + Tailwind + Alpine.js + LiveView
  • Rails + Postgres + Redis + SideKiq
    • Hospedado en Heroku, seguimiento de errores con Sentry, monitoreo de rendimiento con New Relic, correo con Send Grid
    • Hace poco cambié Google Analytics por Plausible, y uso Ahoy (Rails Middleware) para análisis internos más profundos
    • Para soporte/chat con clientes uso Intercom, pero planeo cambiar a Chatwoot
    • Pienso salir de Heroku, pero Render, que es la alternativa más conocida, todavía no tiene una opción de HA Postgres con failover automático
    • Si hago push a la rama master de GitHub, se despliega automáticamente a producción
      • Solo se puede hacer merge a master mediante PR, y únicamente si Linter (Rubocop) + Tests (Rspec en CircleCI) + 100% de cobertura (codecov.io) están en verde
    • La UI es Bootstrap, y estoy renderizando del lado del servidor con JavaScript
      • Para las UIs que necesitan más interacción, estoy evaluando Hotwire/Turbo vs. Alpine vs. Stimulus vs. React
  • Desarrollando una plataforma agtech
    • Backend: Rust, Rocket, sqlx, Postgres, un poco de Ansible
    • Frontend: Rescript + React. Estoy usando bastante Rust/WASM, pero eso fue un error. Estoy intentando revertirlo

8 comentarios

 
qkreoaksn 2022-09-29

Guau, ¿cómo haces para gestionar todo esto tú solo? uf

 
galadbran 2022-09-27

La verdad me da mucha curiosidad qué significa exactamente eso de descargar las solicitudes web que tardan mucho en procesarse; no se comenta mucho al respecto ^^;

 
bohblue23 2022-09-26

Dammm

 
yshrust 2022-09-26

Vaya, de verdad usan una gran variedad,, es la primera vez que veo una combinación como PETAL, buenísimo

 
kandk 2022-09-26

👍

 
jujumilk3 2022-09-26

De verdad es un artículo muy útil, ¡muchas gracias!