54 points par xguru 2022-09-26 | 8 commentaires | Partager sur WhatsApp
  • J’exploite plusieurs applis SaaS sur un gros serveur chez OVHcloud
    • Environ 6 millions de requêtes non mises en cache traitées par jour
    • Backend : Django/Python + MySQL + Redis + WebSocket (Pub/Sub)
    • Mon secret, c’est OpenResty (plateforme web dynamique basée sur NGINX et LuaJIT)
      • J’utilise des scripts Lua pour gérer un cache de pages complexe, bloquer les DDoS, traiter les WebSocket et déporter les requêtes longues
      • Un « Cloudflare du pauvre » composé de 1 500 lignes de code Lua
    • Ces applis ont été créées avant Docker, donc elles tournent simplement comme des processus (systemd)
    • Au début, j’utilisais uwsgi, mais gunicorn est bien plus efficace, donc j’ai complètement migré
    • Mon SPOF, c’est le DNS. J’étais en bons termes avec DNSMadeEasy donc je ne craignais pas les bannissements automatiques, mais maintenant DigiCert les a rachetés, donc ça devient un problème
    • Les paiements passent par Stripe et PayPal. J’ai ajouté PayPal malgré le fait que je ne l’aime pas, parce qu’on ne sait jamais quand Stripe peut bloquer un compte sans prévenir
    • Les uploads utilisateurs passent par un serveur Python aiohttp qui envoie les fichiers vers Wasabi et Backblaze, puis nginx les met en cache. Résultat : 0 frais de bande passante cloud
    • La couche WebSocket est un peu instable. Au départ, je gérais tout avec une bibliothèque Python WebSocket asyncio, et ça marchait à peu près, mais quand j’ai voulu passer au multi-processus, ça s’est mis à consommer énormément de ressources
    • J’ai donc décidé d’utiliser les WebSocket d’OpenResty, mais je ne voulais pas écrire une logique complexe en Lua
      • J’ai changé l’architecture pour utiliser Redis Pub/Sub afin de transmettre les messages aux processus Python
    • Mais je ne donnerai pas le nom de mon service (je n’ai pas envie d’avoir encore plus de concurrents !)
  • J’ai tendance à choisir des options peu connues, mais je pense que c’est productif pour un développeur solo
    • PostgreSQL + SQLite
    • Langage principal : Rust
    • Frontend : htmx + tailwindcss
    • Hébergement : CloudFlare + Vultr
    • nginx + NixOS + CircleCI
  • Certains détesteront peut-être ça, mais choisir WordPress a été la meilleure décision pour moi
    • Forum : bbPress
    • Communauté où les membres publient : buddyPress
    • Newsletter : le plugin abordable mailster.co (avec Critsend.com) au lieu d’un SaaS hors de prix
    • Presque toutes les fonctionnalités que je voulais existaient déjà en plugin : FAQ avec recherche, captcha, publicité, publication sur Discord, système de signalement utilisateur, etc.
    • J’exploite https://rpgplayground.com/
  • J’exploite https://text-generator.io, un service qui concurrence OpenAI
    • Avant, j’utilisais Kubernetes sur GCP, mais maintenant je fais tourner le service chez moi sur mes propres GPU via un tunnel Cloudflare. Ça rend le coût GPU 10 fois moins cher.
    • Le service analyse les liens ou images fournis avec Tesseract / Unified IO / OFA / Beautiful Soup, et répond à des questions sur les images ou les reçus
    • Le site lui-même tourne sur AppEngine avec Python + Stripe + Firebase UI, donc le coût hebdomadaire reste faible
  • Hébergé sur Render
  • J’exploite https://allaboutberlin.com
    • Le site tourne avec Craft CMS dans Docker chez DigitalOcean
    • Craft permet de créer facilement des types de contenu personnalisés avec des champs personnalisés, ce qui est difficile à faire dans WordPress
    • Mais comme ce n’est pas WordPress, il n’y a pas autant de plugins disponibles
    • nginx gère le cache et beaucoup d’autres choses
  • Si vous voulez être productif, essayez PETAL
    • Phoenix + Elixir + Tailwind + Alpine.js + LiveView
  • Rails + Postgres + Redis + SideKiq
    • Hébergé sur Heroku, suivi des erreurs avec Sentry, monitoring des performances avec New Relic, emails avec SendGrid
    • J’ai récemment remplacé Google Analytics par Plausible et j’utilise Ahoy (middleware Rails) pour faire des analyses internes détaillées
    • Pour le support client / chat, j’utilise Intercom mais je prévois de passer à Chatwoot
    • Je prévois de quitter Heroku, mais Render, l’alternative la plus connue, n’a pas encore d’option HA Postgres avec basculement automatique
    • Un push sur la branche master de GitHub déclenche un déploiement automatique en production
      • Les merges vers la branche master ne sont possibles que via PR, et seulement si le linter (Rubocop) + les tests (Rspec sur CircleCI) + 100 % de couverture (codecov.io) sont au vert
    • L’UI est en Bootstrap et je fais du rendu côté serveur avec JavaScript
      • Pour les UI demandant plus d’interactions, j’hésite entre Hotwire/Turbo vs. Alpine vs. Stimulus vs. React
  • Je développe une plateforme agtech
    • Backend : Rust, Rocket, sqlx, Postgres, un peu d’Ansible
    • Frontend : ReScript + React. J’utilise pas mal de Rust/WASM, mais c’était une erreur. J’essaie de revenir en arrière

8 commentaires

 
qkreoaksn 2022-09-29

Waouh, comment vous gérez tout ça tout seul ? impressionnant

 
galadbran 2022-09-27

Je me demande vraiment ce que signifie le fait de déporter les requêtes web qui prennent longtemps à être traitées ; il n’y a pas vraiment beaucoup d’explications à ce sujet ^^;

 
bohblue23 2022-09-26

Dammm

 
yshrust 2022-09-26

Waouh, vous utilisez vraiment des choses très variées,, c’est la première fois que je vois une combinaison comme PETAL, bien joué

 
kandk 2022-09-26

👍

 
jujumilk3 2022-09-26

Article vraiment très utile, merci beaucoup !