{
    "version": "https://jsonfeed.org/version/1.1",
    "title": "faresweb.net Labs",
    "home_page_url": "https://labs.faresweb.net/",
    "feed_url": "https://labs.faresweb.net/feed.json",
    "items": [
        {
            "id": "124",
            "url": "https://labs.faresweb.net/guides-playbooks/124-architecture-cible-production-ovh",
            "title": "De z\u00e9ro \u00e0 production : l\u2019architecture cible sur OVH",
            "content_html": "<p>Avant de provisionner une instance ou d\u2019installer Docker, il faut savoir ce que l\u2019on construit. Sinon, l\u2019infrastructure devient vite une accumulation de commandes : une VM, quelques ports ouverts, un reverse proxy bricol\u00e9, des conteneurs lanc\u00e9s \u00e0 la main, puis des d\u00e9cisions impossibles \u00e0 expliquer six mois plus tard.</p>\r\n<p>Cet article pose l\u2019architecture cible de la s\u00e9rie : un mono-serveur OVHcloud s\u00e9rieux, automatis\u00e9 et exploitable, con\u00e7u pour h\u00e9berger plusieurs applications sans pr\u00e9tendre \u00eatre une plateforme haute disponibilit\u00e9. C\u2019est une base volontairement pragmatique : assez simple pour \u00eatre comprise et op\u00e9r\u00e9e \u00e0 la main, mais assez structur\u00e9e pour servir de socle \u00e0 des projets r\u00e9els.</p>\r\n<h2>Objectif</h2>\r\n<p>\u00c0 la fin de cet article, le lecteur doit pouvoir expliquer :</p>\r\n<ul>\r\n<li>pourquoi le mono-serveur est choisi au d\u00e9part ;</li>\r\n<li>quelles briques composent la plateforme ;</li>\r\n<li>quels flux r\u00e9seau sont publics ou internes ;</li>\r\n<li>quelles limites sont accept\u00e9es ;</li>\r\n<li>quelle trajectoire permet de grandir sans tout r\u00e9\u00e9crire.</li>\r\n</ul>\r\n<p>L\u2019enjeu n\u2019est pas de vendre une architecture universelle. L\u2019enjeu est de rendre les choix explicites, v\u00e9rifiables et r\u00e9versibles.</p>\r\n<h2>D\u00e9cision technique</h2>\r\n<p>Le point de d\u00e9part de la s\u00e9rie est le suivant :</p>\r\n<ul>\r\n<li>OVHcloud Public Cloud comme fournisseur d\u2019infrastructure ;</li>\r\n<li>Ubuntu Server 24.04 LTS comme syst\u00e8me d\u2019exploitation ;</li>\r\n<li>une instance principale pour d\u00e9marrer ;</li>\r\n<li>Docker Engine et Docker Compose pour empaqueter les services ;</li>\r\n<li>Nginx en reverse proxy frontal ;</li>\r\n<li>Let\u2019s Encrypt pour les certificats TLS ;</li>\r\n<li>MariaDB pour Joomla ;</li>\r\n<li>PostgreSQL pour les applications m\u00e9tier ;</li>\r\n<li>GitHub Actions et GHCR pour construire et distribuer les images ;</li>\r\n<li>Ansible pour configurer, d\u00e9ployer et op\u00e9rer le serveur.</li>\r\n</ul>\r\n<p>Ce n\u2019est pas la seule stack possible. C\u2019est une stack lisible, document\u00e9e, reproductible et adapt\u00e9e \u00e0 un contexte o\u00f9 l\u2019on veut comprendre ce que l\u2019on fait avant d\u2019automatiser davantage.</p>\r\n<h2>Architecture logique</h2>\r\n<p>La plateforme se lit comme une cha\u00eene de responsabilit\u00e9 simple.</p>\r\n<ol>\r\n<li>Le code applicatif et l\u2019infrastructure d\u00e9clarative vivent dans GitHub.</li>\r\n<li>GitHub Actions v\u00e9rifie le d\u00e9p\u00f4t, construit les images Docker et les pousse dans GHCR.</li>\r\n<li>Terraform provisionne les ressources OVHcloud n\u00e9cessaires, notamment l\u2019instance et les \u00e9l\u00e9ments r\u00e9seau.</li>\r\n<li>Ansible configure Ubuntu, durcit le syst\u00e8me, installe Docker, pr\u00e9pare les r\u00e9pertoires et d\u00e9ploie la stack.</li>\r\n<li>Docker Compose lance Joomla, les applications, les bases de donn\u00e9es, le monitoring et les services d\u2019exploitation.</li>\r\n<li>Nginx re\u00e7oit le trafic web public et route vers les conteneurs internes.</li>\r\n<li>Les sauvegardes, les logs, les smoke tests et les runbooks permettent d\u2019op\u00e9rer la plateforme dans la dur\u00e9e.</li>\r\n</ol>\r\n<p>La logique importante est la s\u00e9paration des responsabilit\u00e9s. Terraform ne configure pas l\u2019application. Ansible ne remplace pas Docker Compose. Docker Compose ne doit pas d\u00e9cider des r\u00e8gles r\u00e9seau publiques. Nginx n\u2019est pas une base de donn\u00e9es. Chaque brique a un r\u00f4le clair.</p>\r\n<h2>Flux r\u00e9seau</h2>\r\n<h3>Flux publics</h3>\r\n<ul>\r\n<li><code>80/tcp</code> pour HTTP et les challenges Let\u2019s Encrypt HTTP-01 ;</li>\r\n<li><code>443/tcp</code> pour HTTPS ;</li>\r\n<li><code>22/tcp</code> pour SSH administrateur, id\u00e9alement restreint par adresse IP ou par r\u00e8gle de s\u00e9curit\u00e9.</li>\r\n</ul>\r\n<h3>Flux internes</h3>\r\n<ul>\r\n<li>Joomla communique avec MariaDB sur le r\u00e9seau Docker interne ;</li>\r\n<li>les applications m\u00e9tier communiquent avec PostgreSQL sans exposition publique ;</li>\r\n<li>Nginx route vers les conteneurs applicatifs via des upstreams internes ;</li>\r\n<li>les outils de monitoring lisent des m\u00e9triques locales ;</li>\r\n<li>les jobs de backup exportent les sauvegardes vers un stockage externe.</li>\r\n</ul>\r\n<h3>Flux interdits par d\u00e9faut</h3>\r\n<ul>\r\n<li>PostgreSQL public ;</li>\r\n<li>MariaDB public ;</li>\r\n<li>MongoDB public ;</li>\r\n<li>phpMyAdmin public ;</li>\r\n<li>Portainer public ;</li>\r\n<li>Grafana public sans authentification forte ;</li>\r\n<li>ports applicatifs publi\u00e9s directement sur l\u2019h\u00f4te sans passer par Nginx.</li>\r\n</ul>\r\n<p>Le principe est simple : le serveur peut h\u00e9berger plusieurs services, mais le web public ne doit voir qu\u2019une fa\u00e7ade ma\u00eetris\u00e9e.</p>\r\n<h2>Convention de domaines</h2>\r\n<p>Pour la s\u00e9rie, on utilise une convention de lab :</p>\r\n<ul>\r\n<li><code>example.faresweb.dev</code> : domaine de base ;</li>\r\n<li><code>cms.example.faresweb.dev</code> : Joomla ;</li>\r\n<li><code>app.example.faresweb.dev</code> : frontend ;</li>\r\n<li><code>api.example.faresweb.dev</code> : API Java ;</li>\r\n<li><code>worker.example.faresweb.dev</code> : API Python ou worker expos\u00e9 si besoin ;</li>\r\n<li><code>monitoring.example.faresweb.dev</code> : monitoring prot\u00e9g\u00e9.</li>\r\n</ul>\r\n<p>Ces valeurs sont des exemples. Le d\u00e9p\u00f4t associ\u00e9 refuse certaines actions si le domaine reste sur une valeur de d\u00e9monstration, afin d\u2019\u00e9viter de lancer un d\u00e9ploiement en pensant \u00eatre d\u00e9j\u00e0 en configuration r\u00e9elle.</p>\r\n<h2>Pourquoi Nginx d\u2019abord</h2>\r\n<p>Nginx rend visibles les concepts importants d\u2019une plateforme web :</p>\r\n<ul>\r\n<li>serveur virtuel ;</li>\r\n<li>upstream applicatif ;</li>\r\n<li>headers ;</li>\r\n<li>timeouts ;</li>\r\n<li>taille d\u2019upload ;</li>\r\n<li>logs d\u2019acc\u00e8s et d\u2019erreur ;</li>\r\n<li>diagnostic des erreurs <code>502</code> ;</li>\r\n<li>interaction avec Certbot.</li>\r\n</ul>\r\n<p>Traefik et Caddy sont des alternatives modernes cr\u00e9dibles. Elles peuvent \u00eatre tr\u00e8s pertinentes. Le parcours principal reste Nginx parce qu\u2019il oblige \u00e0 comprendre le routage HTTP, les certificats, les proxys et les responsabilit\u00e9s r\u00e9seau. Cette compr\u00e9hension reste utile m\u00eame si l\u2019on migre ensuite vers un outil plus automatis\u00e9.</p>\r\n<h2>Pourquoi Docker Compose d\u2019abord</h2>\r\n<p>Docker Compose est suffisant pour de nombreux cas de d\u00e9part :</p>\r\n<ul>\r\n<li>MVP ;</li>\r\n<li>backoffice interne ;</li>\r\n<li>blog ou CMS ;</li>\r\n<li>SaaS early-stage ;</li>\r\n<li>environnement d\u2019apprentissage s\u00e9rieux ;</li>\r\n<li>prototype client maintenable.</li>\r\n</ul>\r\n<p>Kubernetes devient pertinent quand plusieurs limites apparaissent ensemble : scheduling, haute disponibilit\u00e9, autoscaling, rollouts complexes, multi-noeuds, politiques r\u00e9seau avanc\u00e9es, s\u00e9paration forte des responsabilit\u00e9s et besoin d\u2019une plateforme op\u00e9r\u00e9e par plusieurs \u00e9quipes. L\u2019introduire trop t\u00f4t masque souvent les probl\u00e8mes de base : sauvegardes, observabilit\u00e9, s\u00e9curit\u00e9, secrets, restauration, discipline de d\u00e9ploiement.</p>\r\n<h2>Limites accept\u00e9es</h2>\r\n<p>Le mono-serveur accepte explicitement :</p>\r\n<ul>\r\n<li>pas de haute disponibilit\u00e9 ;</li>\r\n<li>downtime possible pendant maintenance ;</li>\r\n<li>d\u00e9pendance forte \u00e0 la restauration ;</li>\r\n<li>capacit\u00e9 verticale limit\u00e9e ;</li>\r\n<li>risque concentr\u00e9 sur une VM ;</li>\r\n<li>besoin de discipline sur les backups et mises \u00e0 jour.</li>\r\n</ul>\r\n<p>Ces limites ne sont pas des d\u00e9tails. Elles doivent \u00eatre annonc\u00e9es avant le premier <code>terraform apply</code>. Une architecture simple n\u2019est acceptable que si ses risques sont connus et compens\u00e9s par des proc\u00e9dures concr\u00e8tes.</p>\r\n<h2>Trajectoire d\u2019\u00e9volution</h2>\r\n<p>La trajectoire naturelle est progressive :</p>\r\n<ol>\r\n<li>mono-serveur propre ;</li>\r\n<li>environnement de staging s\u00e9par\u00e9 ;</li>\r\n<li>base de donn\u00e9es s\u00e9par\u00e9e ou manag\u00e9e ;</li>\r\n<li>Object Storage pour fichiers et backups ;</li>\r\n<li>monitoring externe ;</li>\r\n<li>load balancer ;</li>\r\n<li>orchestration avanc\u00e9e si le besoin est r\u00e9el.</li>\r\n</ol>\r\n<p>Une bonne architecture de d\u00e9part ne pr\u00e9tend pas \u00eatre finale. Elle \u00e9vite surtout de bloquer la suite. Le but est de pouvoir \u00e9voluer sans renier les choix initiaux.</p>\r\n<h2>V\u00e9rification locale</h2>\r\n<p>\u00c0 ce stade, rien n\u2019est encore provisionn\u00e9. La v\u00e9rification consiste \u00e0 contr\u00f4ler que le d\u00e9p\u00f4t contient les bons garde-fous :</p>\r\n<pre><code>make doctor</code></pre>\r\n<p>R\u00e9sultat attendu :</p>\r\n<ul>\r\n<li>les outils manquants sont list\u00e9s clairement ;</li>\r\n<li>aucun secret \u00e9vident n\u2019est pr\u00e9sent ;</li>\r\n<li>les fichiers d\u2019exemple sont pr\u00e9sents ;</li>\r\n<li>les commandes dangereuses ne s\u2019ex\u00e9cutent pas sans confirmation.</li>\r\n</ul>\r\n<p>Le d\u00e9p\u00f4t associ\u00e9 est disponible ici : <a href=\"https://github.com/fareswebnet/ovh-production-server-from-scratch\">github.com/fareswebnet/ovh-production-server-from-scratch</a>.</p>\r\n<h2>S\u00e9curit\u00e9</h2>\r\n<p>Les d\u00e9cisions de s\u00e9curit\u00e9 sont d\u00e9j\u00e0 pr\u00e9sentes dans l\u2019architecture :</p>\r\n<ul>\r\n<li>Nginx est le seul point d\u2019entr\u00e9e web public ;</li>\r\n<li>les bases restent internes ;</li>\r\n<li>les outils d\u2019administration sont restreints ;</li>\r\n<li>les secrets restent hors Git ;</li>\r\n<li>les sauvegardes sont externes ;</li>\r\n<li>les smoke tests sont lanc\u00e9s apr\u00e8s d\u00e9ploiement ;</li>\r\n<li>les runbooks d\u00e9crivent les actions d\u2019incident et de restauration.</li>\r\n</ul>\r\n<p>Ce n\u2019est pas encore une plateforme certifi\u00e9e ni un environnement haute s\u00e9curit\u00e9. C\u2019est un socle propre, explicite, testable, et beaucoup plus sain qu\u2019un serveur construit par copier-coller de commandes non reli\u00e9es entre elles.</p>\r\n<h2>O\u00f9 on en est</h2>\r\n<p>On a maintenant une carte. L\u2019article suivant explique pourquoi le mono-serveur est un choix pragmatique, o\u00f9 il devient insuffisant, et comment pr\u00e9parer la sortie sans surconcevoir d\u00e8s le d\u00e9part.</p>\r\n<h2>Sources et versions</h2>\r\n<p>Date de v\u00e9rification : 2026-08-04.</p>\r\n<p>Sources primaires utilis\u00e9es pour cadrer cette s\u00e9rie :</p>\r\n<ul>\r\n<li>documentation OVHcloud Public Cloud ;</li>\r\n<li>Terraform Registry pour les providers OVH et OpenStack ;</li>\r\n<li>documentation Docker Engine Ubuntu ;</li>\r\n<li>documentation Certbot avec Nginx ;</li>\r\n<li>documentation Ansible.</li>\r\n</ul>\r\n<p>Le d\u00e9p\u00f4t contient aussi un fichier de r\u00e9f\u00e9rences : <code>docs/references/official-sources.md</code>.</p>",
            "date_published": "2026-08-04T16:26:32+00:00"
        },
        {
            "id": "123",
            "url": "https://labs.faresweb.net/guides-playbooks/123-serveur-ovh-production-terraform-ansible-docker",
            "title": "D\u00e9velopper et d\u00e9ployer un serveur OVH de A \u00e0 Z : la m\u00e9thode compl\u00e8te",
            "content_html": "<p>Une application ne devient pas s\u00e9rieuse parce qu\u2019elle tourne dans un conteneur. Elle devient exploitable quand l\u2019infrastructure est compr\u00e9hensible, reproductible, s\u00e9curis\u00e9e, surveill\u00e9e, sauvegard\u00e9e et d\u00e9ployable sans improvisation.</p>\r\n<p>Cette s\u00e9rie part d\u2019un cas volontairement concret : un serveur OVHcloud neuf, un domaine, une stack Docker, un CMS Joomla, une API Java, une API Python, une app frontend, des bases de donn\u00e9es, un reverse proxy, du HTTPS, du CI/CD, du monitoring, des backups et des proc\u00e9dures de rollback.</p>\r\n<p>L\u2019objectif n\u2019est pas de cr\u00e9er une usine complexe. L\u2019objectif est de construire une plateforme pragmatique que l\u2019on peut comprendre, refaire et maintenir.</p>\r\n<h2>Le probl\u00e8me</h2>\r\n<p>Beaucoup de d\u00e9ploiements commencent par une succession de commandes copi\u00e9es depuis plusieurs tutoriels :</p>\r\n<ul>\r\n<li>une r\u00e8gle firewall ajout\u00e9e ici ;</li>\r\n<li>un conteneur lanc\u00e9 \u00e0 la main l\u00e0 ;</li>\r\n<li>un certificat g\u00e9n\u00e9r\u00e9 avec une option oubli\u00e9e ;</li>\r\n<li>une base expos\u00e9e temporairement, puis jamais referm\u00e9e ;</li>\r\n<li>un fichier <code>.env</code> qui tra\u00eene ;</li>\r\n<li>un backup que personne n\u2019a jamais restaur\u00e9.</li>\r\n</ul>\r\n<p>Le syst\u00e8me finit par fonctionner, mais personne ne sait exactement pourquoi. Le jour o\u00f9 il faut migrer, restaurer, auditer ou corriger un incident, l\u2019\u00e9quipe d\u00e9couvre que le vrai risque n\u2019\u00e9tait pas Docker, Nginx ou OVH. Le vrai risque \u00e9tait l\u2019absence de m\u00e9thode.</p>\r\n<h2>La posture</h2>\r\n<blockquote>\r\n<p>On apprend \u00e0 le faire \u00e0 la main pour comprendre. On l\u2019automatise pour ne plus d\u00e9pendre de la m\u00e9moire humaine.</p>\r\n</blockquote>\r\n<p>Chaque brique est donc pr\u00e9sent\u00e9e en trois temps : la d\u00e9cision technique, la version manuelle minimale, puis la version automatis\u00e9e dans le repo. La p\u00e9dagogie ne remplace pas l\u2019exploitation. Elle la pr\u00e9pare.</p>\r\n<h2>L\u2019architecture cible</h2>\r\n<p>Le premier palier est un mono-serveur OVHcloud sous Ubuntu Server 24.04 LTS. Il h\u00e9berge plusieurs services, mais un seul point d\u2019entr\u00e9e public : Nginx.</p>\r\n<ul>\r\n<li>DNS OVH vers l\u2019IP publique du serveur ;</li>\r\n<li>Nginx en reverse proxy HTTPS ;</li>\r\n<li>Joomla derri\u00e8re Nginx, avec MariaDB en r\u00e9seau interne ;</li>\r\n<li>une API Java Spring Boot derri\u00e8re Nginx, avec PostgreSQL en r\u00e9seau interne ;</li>\r\n<li>une API Python FastAPI ou un worker expos\u00e9 uniquement si n\u00e9cessaire ;</li>\r\n<li>une app frontend Vue/Nuxt servie derri\u00e8re Nginx ;</li>\r\n<li>des sauvegardes chiffr\u00e9es vers un stockage externe ;</li>\r\n<li>des healthchecks, logs, alertes et runbooks d\u2019exploitation.</li>\r\n</ul>\r\n<p>Ce choix est assum\u00e9. Un mono-serveur n\u2019est pas de la haute disponibilit\u00e9. Il concentre le risque, peut avoir des fen\u00eatres de maintenance et exige des backups test\u00e9s. Mais il est lisible, \u00e9conomique, rapide \u00e0 mettre en place et pertinent pour un MVP, un blog s\u00e9rieux, un backoffice, une API m\u00e9tier ou un SaaS early-stage.</p>\r\n<p>La s\u00e9rie explique aussi quand sortir de ce mod\u00e8le : base de donn\u00e9es s\u00e9par\u00e9e, Object Storage, staging d\u00e9di\u00e9, load balancer, Kubernetes ou services manag\u00e9s.</p>\r\n<h2>Le fil rouge technique</h2>\r\n<p>La plateforme est construite avec :</p>\r\n<ul>\r\n<li>Terraform pour provisionner l\u2019instance OVHcloud et les records DNS ;</li>\r\n<li>Ansible pour configurer Ubuntu, SSH, UFW, Docker, Nginx et les apps ;</li>\r\n<li>Docker Engine et Docker Compose pour ex\u00e9cuter les services ;</li>\r\n<li>Nginx comme reverse proxy principal ;</li>\r\n<li>Let\u2019s Encrypt et Certbot pour le HTTPS ;</li>\r\n<li>MariaDB pour Joomla ;</li>\r\n<li>PostgreSQL pour les apps m\u00e9tier ;</li>\r\n<li>MongoDB en module optionnel ;</li>\r\n<li>GitHub Actions et GHCR pour builder et publier les images ;</li>\r\n<li>SSH/Ansible pour d\u00e9ployer ;</li>\r\n<li>scripts de smoke test, backup, restore-check et rollback.</li>\r\n</ul>\r\n<h2>Le craftsmanship dans le processus</h2>\r\n<p>D\u00e9ployer proprement ne suffit pas si le code est produit sans discipline. La s\u00e9rie int\u00e8gre donc le craftsmanship dans le cycle applicatif :</p>\r\n<ul>\r\n<li>BDD en amont pour clarifier le comportement attendu ;</li>\r\n<li>TDD quand une r\u00e8gle m\u00e9tier m\u00e9rite un test avant code ;</li>\r\n<li>red-green-refactor pour \u00e9viter les changements non d\u00e9montr\u00e9s ;</li>\r\n<li>feature flags pour d\u00e9ployer sans activer ;</li>\r\n<li>migrations de base versionn\u00e9es ;</li>\r\n<li>Definition of Ready avant d\u00e9veloppement ;</li>\r\n<li>Definition of Done avant d\u00e9ploiement ;</li>\r\n<li>quality gates CI ;</li>\r\n<li>smoke tests apr\u00e8s release ;</li>\r\n<li>rollback document\u00e9.</li>\r\n</ul>\r\n<p>Le but n\u2019est pas de r\u00e9citer des bonnes pratiques. Le but est de les rendre ex\u00e9cutables.</p>\r\n<h2>S\u00e9curit\u00e9 et exploitation</h2>\r\n<p>La s\u00e9curit\u00e9 n\u2019est pas un article final. Elle appara\u00eet d\u00e8s le bootstrap :</p>\r\n<ul>\r\n<li>SSH par cl\u00e9 uniquement ;</li>\r\n<li>pas de login root ;</li>\r\n<li>ports publics limit\u00e9s \u00e0 <code>22</code>, <code>80</code>, <code>443</code> ;</li>\r\n<li>bases et apps non expos\u00e9es directement ;</li>\r\n<li>secrets hors Git ;</li>\r\n<li>admin tools non publics par d\u00e9faut ;</li>\r\n<li>TLS v\u00e9rifi\u00e9 et renouvellement test\u00e9 ;</li>\r\n<li>backups chiffr\u00e9s hors serveur ;</li>\r\n<li>restauration test\u00e9e ;</li>\r\n<li>logs et alertes.</li>\r\n</ul>\r\n<p>Un point m\u00e9rite d\u2019\u00eatre clair : Docker et UFW peuvent surprendre. Publier un port Docker revient souvent \u00e0 contourner l\u2019intention initiale du firewall. Le parcours principal n\u2019expose donc publiquement que Nginx. Les bases et services restent sur des r\u00e9seaux Docker internes.</p>\r\n<h2>Pourquoi OVHcloud</h2>\r\n<p>OVHcloud donne un terrain int\u00e9ressant pour apprendre : Public Cloud, API, OpenStack, DNS, Object Storage, snapshots, r\u00e9gions, co\u00fbts ma\u00eetrisables. Le tutoriel est adapt\u00e9 \u00e0 OVH, mais les principes restent portables.</p>\r\n<p>Alternatives cr\u00e9dibles :</p>\r\n<ul>\r\n<li>Hetzner pour des VPS simples et \u00e9conomiques ;</li>\r\n<li>Scaleway pour un environnement europ\u00e9en proche ;</li>\r\n<li>AWS, GCP ou Azure pour les services manag\u00e9s et l\u2019\u00e9cosyst\u00e8me enterprise ;</li>\r\n<li>Render, Railway, Fly.io ou Heroku-like pour r\u00e9duire l\u2019exploitation.</li>\r\n</ul>\r\n<p>Ici, le choix est volontaire : apprendre le socle serveur, pas d\u00e9l\u00e9guer toute la plateforme.</p>\r\n<h2>Ce que la s\u00e9rie ne promet pas</h2>\r\n<p>Cette s\u00e9rie ne promet pas une production invincible. Elle ne promet pas de haute disponibilit\u00e9. Elle ne remplace pas une \u00e9quipe SRE, un audit de s\u00e9curit\u00e9 ou une architecture r\u00e9glementaire.</p>\r\n<p>Elle fournit une base propre pour comprendre et ma\u00eetriser :</p>\r\n<ul>\r\n<li>ce qui tourne ;</li>\r\n<li>o\u00f9 sont les donn\u00e9es ;</li>\r\n<li>comment d\u00e9ployer ;</li>\r\n<li>comment v\u00e9rifier ;</li>\r\n<li>comment revenir en arri\u00e8re ;</li>\r\n<li>comment restaurer ;</li>\r\n<li>quand changer d\u2019architecture.</li>\r\n</ul>\r\n<h2>Le repo</h2>\r\n<p>Le repo GitHub associ\u00e9 est la source de v\u00e9rit\u00e9 :</p>\r\n<p><a href=\"https://github.com/fareswebnet/ovh-production-server-from-scratch\">https://github.com/fareswebnet/ovh-production-server-from-scratch</a></p>\r\n<p>Les articles sont versionn\u00e9s en Markdown dans <code>articles/</code>. Les exports Joomla vivent dans <code>exports/joomla/</code>. Les fichiers Terraform, Ansible, Compose, scripts, runbooks et exemples applicatifs sont dans le m\u00eame d\u00e9p\u00f4t.</p>\r\n<h2>D\u00e9roul\u00e9 de la s\u00e9rie</h2>\r\n<ol>\r\n<li>Architecture cible ;</li>\r\n<li>Mono-serveur, limites et trajectoire ;</li>\r\n<li>Poste local et secrets ;</li>\r\n<li>Terraform OVH ;</li>\r\n<li>DNS et sous-domaines ;</li>\r\n<li>Bootstrap Ubuntu avec Ansible ;</li>\r\n<li>Docker Engine et firewall ;</li>\r\n<li>Docker Compose multi-apps ;</li>\r\n<li>Nginx reverse proxy ;</li>\r\n<li>HTTPS Let\u2019s Encrypt ;</li>\r\n<li>Joomla ;</li>\r\n<li>API Java ;</li>\r\n<li>API Python ;</li>\r\n<li>Frontend Vue/Nuxt ;</li>\r\n<li>Bases de donn\u00e9es ;</li>\r\n<li>CI/CD et rollback ;</li>\r\n<li>Monitoring et logs ;</li>\r\n<li>Backups, restauration et PRA minimal.</li>\r\n</ol>\r\n<h2>Conclusion</h2>\r\n<p>Le vrai sujet n\u2019est pas d\u2019installer Docker sur un VPS. Le vrai sujet est de construire une cha\u00eene coh\u00e9rente entre d\u00e9cision, code, infrastructure, s\u00e9curit\u00e9, exploitation et retour arri\u00e8re.</p>\r\n<p>Une bonne plateforme de d\u00e9part doit \u00eatre suffisamment simple pour \u00eatre comprise, suffisamment automatis\u00e9e pour \u00eatre r\u00e9p\u00e9table, et suffisamment honn\u00eate pour documenter ses limites.</p>\r\n<p>Ce sera le fil conducteur de toute la s\u00e9rie.</p>",
            "date_published": "2026-08-04T16:17:20+00:00"
        },
        {
            "id": "121",
            "url": "https://labs.faresweb.net/gaming/121-nintendo-will-allow-smartphone-apps-on-the-wii-u",
            "title": "Nintendo will allow smartphone apps on the Wii U",
            "content_html": "<p>Nintendo is trying to increase sales of the new Wii U.</p>\r\n<p>According to current sales the Wii U does not sell well.&nbsp;Japanese game giant hopes that porting applications on smartphones game console home will attract buyers. Thus we can play for example Angry Birds or Fruit Ninja on the Nintendo console.</p>\r\n",
            "date_published": "2013-05-11T15:12:34+00:00"
        },
        {
            "id": "120",
            "url": "https://labs.faresweb.net/web/120-marketing-the-big-data",
            "title": "Marketing the Big Data",
            "content_html": "<p>This article aims to analyze how it is now possible to treat the informational deluge in terms of marketing.</p>\r\n",
            "date_published": "2013-03-02T15:18:36+00:00"
        },
        {
            "id": "119",
            "url": "https://labs.faresweb.net/web/119-game-of-thrones-director-claims-illegal-downloads-doesn-t-matter",
            "title": "Game of Thrones' director claims illegal downloads doesn't matter",
            "content_html": "<p>A television director who has helmed Game of Thrones' episodes recently claimed that although Game of Thrones was the most pirated show of 2012, it survives thanks to \"cultural buzz.\"</p>\r\n",
            "date_published": "2013-02-26T09:49:23+00:00"
        },
        {
            "id": "117",
            "url": "https://labs.faresweb.net/web/117-seo-how-to-take-full-advantage-of-the-tag-author",
            "title": "SEO | how to take full advantage of the author tag",
            "content_html": "<p>How to display a picture of a content author in the results pages of Google? What sites are eligible for this possibility and its limits?<span> Zoom on SEO technique which can improve visibility and traffic.</span></p>\r\n<p>&nbsp;</p>\r\n",
            "date_published": "2012-11-25T14:46:09+00:00"
        },
        {
            "id": "113",
            "url": "https://labs.faresweb.net/web/113-knowledge-graph-the-semantic-web-or-the-web-30",
            "title": "Knowledge Graph, the semantic web or the web 3.0",
            "content_html": "<p><span id=\"result_box\"><span title=\"En une petite phrase : \u00ab Nous sommes au d\u00e9but d'une transformation qui va nous faire passer d'un moteur d'information \u00e0 un moteur de savoir.\">\"We are at the beginning of a transformation that will take us from a search engine to a knowledge engine.</span><span title=\"\u00bb, Johanna Wright, chef de produit chez Google, r\u00e9sume bien ce que souhaite faire le g\u00e9ant de la recherche avec son nouveau b\u00e9b\u00e9, Knowledge Graph.\">\" Google's product manager, summed it that way to present the new Google baby: <strong>Knowledge Graph</strong>.</span></span></p>\r\n<p><span id=\"result_box\"><span title=\"Knowledge Graph, c'est un premier pas vers le r\u00eave de l'inventeur du Web, Tim Berners-Lee : l'\u00e9mergence d'un \u00ab web s\u00e9mantique \u00bb qui ne connecterait pas simplement des pages de documents par des liens, mais aussi des\">Knowledge Graph is a first step towards the dream of Web inventor Tim Berners-Lee: the emergence of a \"semantic web\" which would connect not just pages of documents by links, but also </span><span title=\"concepts, des id\u00e9es, des faits.\">concepts, ideas and facts.</span></span></p>\r\n",
            "date_published": "2012-05-20T08:45:59+00:00"
        },
        {
            "id": "110",
            "url": "https://labs.faresweb.net/gaming/110-snes9x-ex-a-wiimote-emulator-for-android",
            "title": "Snes9x EX, a Wiimote emulator for Android",
            "content_html": "<p>The opening of the <em>Android</em> system offers many possibilities.The possibilities of the operating system only limit the power of the developpers imagination.Thus, as many emulators applications were removed from the <em>Android Market, </em>fortunately, <em>Android</em> can not install any application from Google's download platform without any software changes. <strong>Snes9x EX</strong> port of the famous<em>Snes9x</em> emulator is one of those applications.</p>\r\n",
            "date_published": "2012-02-06T20:23:09+00:00"
        },
        {
            "id": "107",
            "url": "https://labs.faresweb.net/smartphone/107-we-are-the-network",
            "title": "We are the network",
            "content_html": "<p>Ericsson's CEO made a remarkable demonstration at a press conference at CES in Las Vegas on January 11, 2012. His body was used as a driver to transfer a picture from a smartphone in one hand to a TV in another hand&nbsp; without cables or radio signal of any kind.</p>\r\n",
            "date_published": "2012-01-14T16:42:08+00:00"
        },
        {
            "id": "106",
            "url": "https://labs.faresweb.net/guides-playbooks/106-joomla-extension-fw-sitemap-component",
            "title": "Joomla Extension - fwSitemap component",
            "content_html": "<p>Sitemap is used to tell search engines about the pages in your site, their relative importance to each other, and how often they are updated. HTML sitemaps are designed for the user to help them find content on the page. It is a mean to help visitors and <span class=\"mw-redirect\">search engine</span> bots find pages on the site.</p>\r\n<p>fwSitemap Component is a Joomla! 1.5 and 2.5 component that lets you create such sitemaps for Joomla based sites.</p>\r\n",
            "date_published": "2012-01-09T20:28:23+00:00"
        },
        {
            "id": "104",
            "url": "https://labs.faresweb.net/guides-playbooks/104-web-site-optimization-optimize-cookie-management",
            "title": "Web Site Optimization - Optimize cookie management",
            "content_html": "<p>HTTP cookies are used for a variety of reasons such as authentication and personalization. Information about cookies is exchanged in the HTTP headers between web servers and browsers. It's important to keep the size of cookies as low as possible to minimize the impact on the user's response time.</p>\r\n",
            "date_published": "2011-11-26T14:56:25+00:00"
        },
        {
            "id": "103",
            "url": "https://labs.faresweb.net/guides-playbooks/103-web-site-optimization-reduce-dom-elements",
            "title": "Web Site Optimization - Reduce DOM elements",
            "content_html": "<p>A complex page means more bytes to download and it also means slower DOM access in JavaScript. It makes a difference if you loop through 500 or 5000 DOM elements on the page when you want to add an event handler for example.</p>\r\n",
            "date_published": "2011-11-26T14:55:26+00:00"
        },
        {
            "id": "102",
            "url": "https://labs.faresweb.net/guides-playbooks/102-web-site-optimization-make-ajax-cacheable",
            "title": "Web Site Optimization - Make Ajax cacheable",
            "content_html": "<p>One of the cited benefits of Ajax is that it provides instantaneous feedback to the user because it requests information asynchronously from the backend web server. However, using Ajax is no guarantee that the user won't be twiddling his thumbs waiting for those asynchronous JavaScript and XML responses to return. In many applications, whether or not the user is kept waiting depends on how Ajax is used. For example, in a web-based email client the user will be kept waiting for the results of an Ajax request to find all the email messages that match their search criteria. It's important to remember that \"asynchronous\" does not imply \"instantaneous\".</p>\r\n",
            "date_published": "2011-11-26T14:51:02+00:00"
        },
        {
            "id": "101",
            "url": "https://labs.faresweb.net/guides-playbooks/101-web-site-optimization-specify-etags",
            "title": "Web Site Optimization - Specify ETags",
            "content_html": "<p>Entity tags (ETags) are a mechanism that web servers and browsers use to determine whether the component in the browser's cache matches the one on the origin server. (An \"entity\" is another word a \"component\": images, scripts, stylesheets, etc.) ETags were added to provide a mechanism for validating entities that is more flexible than the last-modified date. An ETag is a string that uniquely identifies a specific version of a component. The only format constraints are that the string be quoted. The origin server specifies the component's ETag using the <code>ETag</code> response header.</p>\r\n",
            "date_published": "2011-11-26T14:49:39+00:00"
        },
        {
            "id": "100",
            "url": "https://labs.faresweb.net/guides-playbooks/100-web-site-optimization-remove-duplicates-css-and-javascript",
            "title": "Web Site Optimization - Remove duplicates CSS and Javascript",
            "content_html": "<p>It hurts performance to include the same JavaScript file twice in one page. This isn't as unusual as you might think. A review of the ten top U.S. web sites shows that two of them contain a duplicated script. Two main factors increase the odds of a script being duplicated in a single web page: team size and number of scripts. When it does happen, duplicate scripts hurt performance by creating unnecessary HTTP requests and wasted JavaScript execution.</p>\r\n",
            "date_published": "2011-11-26T14:48:04+00:00"
        },
        {
            "id": "99",
            "url": "https://labs.faresweb.net/guides-playbooks/99-web-site-optimization-minify-css-html-and-javascript",
            "title": "Web Site Optimization - Minify CSS, HTML and Javascript",
            "content_html": "<p>Minification is the practice of removing unnecessary characters from code to reduce its size thereby improving load times. When code is minified all comments are removed, as well as unneeded white space characters (space, newline, and tab). In the case of JavaScript, this improves response time performance because the size of the downloaded file is reduced. Two popular tools for minifying JavaScript code are <a href=\"http://crockford.com/javascript/jsmin\">JSMin</a> and <a href=\"http://developer.yahoo.com/yui/compressor/\">YUI Compressor</a>. The YUI compressor can also minify CSS.</p>\r\n",
            "date_published": "2011-11-26T14:46:59+00:00"
        },
        {
            "id": "98",
            "url": "https://labs.faresweb.net/guides-playbooks/98-web-site-optimization-reduce-dns-lookups",
            "title": "Web Site Optimization - Reduce DNS lookups",
            "content_html": "<p>The Domain Name System (DNS) maps hostnames to IP addresses, just as phonebooks map people's names to their phone numbers. When you type www.yahoo.com into your browser, a DNS resolver contacted by the browser returns that server's IP address. DNS has a cost. It typically takes 20-120 milliseconds for DNS to lookup the IP address for a given hostname. The browser can't download anything from this hostname until the DNS lookup is completed.</p>\r\n",
            "date_published": "2011-11-26T14:45:46+00:00"
        },
        {
            "id": "97",
            "url": "https://labs.faresweb.net/guides-playbooks/97-web-site-optimization-avoid-css-expressions",
            "title": "Web Site Optimization - Avoid CSS expressions",
            "content_html": "<p>CSS expressions are a powerful (and dangerous) way to set CSS properties dynamically. They were supported in Internet Explorer starting with version 5, but were deprecated starting with IE8.</p>\r\n",
            "date_published": "2011-11-26T14:44:28+00:00"
        },
        {
            "id": "96",
            "url": "https://labs.faresweb.net/guides-playbooks/96-web-site-optimization-specify-an-expires-header",
            "title": "Web Site Optimization - Specify an expires header",
            "content_html": "<p>Web page designs are getting richer and richer, which means more scripts, stylesheets, images, and Flash in the page. A first-time visitor to your page may have to make several HTTP requests, but by using the Expires header you make those components cacheable. This avoids unnecessary HTTP requests on subsequent page views. Expires headers are most often used with images, but they should be used on <em>all</em> components including scripts, stylesheets, and Flash components.</p>\r\n",
            "date_published": "2011-11-26T14:42:31+00:00"
        },
        {
            "id": "95",
            "url": "https://labs.faresweb.net/guides-playbooks/95-web-site-optimization-avoid-empty-src",
            "title": "Web Site Optimization - Avoid empty src",
            "content_html": "<p>Image with empty string <strong>src</strong> attribute occurs more than one will expect. It appears in different form causing the same effect: browser making requests to your server.</p>\r\n",
            "date_published": "2011-11-26T14:39:11+00:00"
        }
    ]
}