54 Punkte von xguru 2022-09-26 | 8 Kommentare | Auf WhatsApp teilen
  • Ich betreibe mehrere SaaS-Apps auf einem großen Server in der OVH-Cloud
    • Verarbeitet pro Tag etwa 6 Millionen nicht gecachte Requests
    • Backend ist Django/Python + MySQL + Redis + WebSocket (Pub/Sub)
    • Mein Geheimnis ist OpenResty (dynamische Webplattform auf Basis von NGINX und LuaJIT)
      • Mit Lua-Skripten erledige ich komplexes Page-Caching, wehre DDoS ab, verarbeite WebSockets und lagere lang laufende Requests aus
      • Ein „Cloudflare für Arme“ aus 1500 Zeilen Lua-Code
    • Diese Apps wurden vor Docker gebaut und laufen daher einfach als Prozesse (systemd)
    • Anfangs habe ich uwsgi verwendet, aber gunicorn ist deutlich effizienter, daher bin ich komplett umgestiegen
    • Mein SPOF ist DNS. Ich hatte ein gutes Verhältnis zu DNSMadeEasy und machte mir keine Sorgen über automatische Sperren, aber jetzt hat DigiCert sie übernommen, was problematisch ist
    • Zahlungen laufen über Stripe und PayPal. Obwohl ich PayPal nicht mag, habe ich es ergänzt, weil man nie weiß, wann Stripe einen ohne Vorwarnung sperrt
    • User-Uploads gehen über einen aiohttp-Python-Server an Wasabi und Backblaze und werden in nginx gecacht. Deshalb betragen die Cloud-Transferkosten 0
    • Die WebSocket-Schicht ist etwas instabil. Anfangs habe ich alles mit einer Python-WebSocket-asyncio-Bibliothek verarbeitet; das funktionierte bis zu einem gewissen Grad, aber als ich später auf Multiprozess-Verarbeitung umstellen wollte, begann es enorme Ressourcen zu verbrauchen
    • Deshalb entschied ich mich für die WebSockets von OpenResty, wollte aber keine komplexe Logik in Lua schreiben
      • Also habe ich es so geändert, dass Nachrichten über Redis Pub/Sub an Python-Prozesse weitergereicht werden
    • Aber ich werde den Namen meines Dienstes nicht verraten (ich möchte keine zusätzliche Konkurrenz!)
  • Ich neige dazu, weniger bekannte Optionen zu wählen, und halte das für produktiv für Solo-Entwickler
    • PostgreSQL + SQLite
    • Hauptsprache Rust
    • Frontend ist htmx + tailwindcss
    • CloudFlare + Vultr-Hosting
    • nginx + nixos + circle ci
  • Manche werden es hassen, aber WordPress zu wählen war für mich die beste Entscheidung
    • Forum ist bbPress
    • Community, in der Mitglieder posten, ist buddyPress
    • Newsletter laufen statt über extrem teures SaaS über das günstige Plugin mailster.co (mit Critsend.com)
    • Die meisten Funktionen, die ich wollte, gibt es als Plugins: durchsuchbare FAQ, Captcha, Werbung, auf Discord posten, System für Nutzer-Meldungen usw.
    • Ich betreibe https://rpgplayground.com/
  • Ich betreibe https://text-generator.io, einen Dienst, der mit OpenAI konkurriert
    • Früher lief er auf Kubernetes in GCP, inzwischen betreibe ich ihn über einen Cloudflare-Tunnel mit meinen GPUs zu Hause. So sind die GPU-Kosten zehnmal günstiger
    • Analysiert eingegebene Links oder Bilder mit Tesseract / Unified IO / OFA / Beautiful Soup usw. und beantwortet Fragen zu Bildern/Belegen
    • Die Website selbst läuft auf AppEngine mit Python + Stripe + Firebase UI und verursacht daher nur geringe wöchentliche Kosten
  • Gehostet auf Render
  • Ich betreibe https://allaboutberlin.com
    • Läuft mit Craft CMS in Docker auf DigitalOcean
    • Mit Craft kann man benutzerdefinierte Beitragstypen mit benutzerdefinierten Feldern leicht erstellen, was in WordPress schwerer umzusetzen ist
    • Aber weil es nicht WordPress ist, gibt es nicht viele Plugins, die ich brauche
    • nginx übernimmt Caching und viele andere Dinge
  • Wenn du produktiver werden willst, probier PETAL aus
    • Phoenix + Elixir + Tailwind + Alpine.js + LiveView
  • Rails + Postgres + Redis + SideKiq
    • Gehostet auf Heroku, Error-Tracking mit Sentry, Performance-Monitoring mit New Relic, E-Mail mit Send Grid
    • Kürzlich Google Analytics durch Plausible ersetzt und intern tiefgehende Analysen mit Ahoy (Rails Middleware) eingeführt
    • Für Kundensupport/Chat nutze ich Intercom, plane aber den Wechsel zu Chatwoot
    • Ich will von Heroku weg, aber die naheliegende Alternative Render bietet noch keine HA-Postgres-Option mit automatischem Failover
    • Ein Push auf den GitHub-Master-Branch deployt automatisch in Produktion
      • Merges in den Master-Branch sind nur per PR möglich und nur dann, wenn Linter (Rubocop) + Tests (Rspec auf CircleCI) + 100-%-Abdeckung (codecov.io) grün sind
    • Die UI ist Bootstrap, und ich rendere serverseitig mit JavaScript
      • Für UIs, die mehr Interaktion brauchen, überlege ich zwischen Hotwire/Turbo vs. Alpine vs. Stimulus vs. React
  • Ich entwickle eine Agtech-Plattform
    • Backend: Rust, Rocket, sqlx, Postgres, ein wenig Ansible
    • Frontend: Rescript + React. Ich nutze ziemlich viel Rust/WASM, aber das war ein Fehler. Ich versuche, das rückgängig zu machen

8 Kommentare

 
qkreoaksn 2022-09-29

Wow, wie verwalten Sie das alles ganz allein? zitter

 
galadbran 2022-09-27

Mich würde wirklich interessieren, was es eigentlich bedeutet, lang laufende Webanfragen auszulagern — dazu gibt es erstaunlich wenig konkrete Erklärungen. ^^;

 
bohblue23 2022-09-26

Dammm

 
yshrust 2022-09-26

Wow, ihr nutzt wirklich ganz unterschiedliche Sachen,, so eine Kombination wie PETAL sehe ich zum ersten Mal, gut

 
kandk 2022-09-26

👍

 
jujumilk3 2022-09-26

Wirklich ein sehr nützlicher Artikel, vielen Dank!