Devenez hébergeur web indépendant

Mis à jour le

Le contenu de cette page est en cours de création

Créez une infrastructure automatisée de A à Z pour héberger vos applications web open-source sur vos propres serveurs Linux afin de devenir indépendant numériquement.

Ce que vous allez apprendre

  • Hébergez votre toute première application avec Docker
  • Automatisez le cycle de vie de vos applications avec Docker Swarm
  • Stockez toutes les données de vos applications sur un espace de stockage distribué
  • (Ré)installez votre infrastructure en une ligne de commande avec Terraform
  • Gérez toute votre infrastructure depuis votre navigateur web avec Portainer

Le tout de manière 100% open-source.

Prérequis

  • Un serveur Linux (Ubuntu ou Debian)

Architecture de l'infrastructure

Backups
Serveurs
Navigateur web
Grafana, Portainer, etc...
Bucket S3
Load balancer
master
App 1
App 2
App x
worker-01
App 3
worker-02
worker-x
Visiteur
Administrateur

Docker

C'est quoi ?

Docker est un logiciel open-source qui permet de lancer facilement des applications dans des conteneurs logiciels.

C'est un outil qui peut d'empaqueter une application et ses dépendances dans un conteneur isolé, qui pourra être exécuté sur n'importe quel serveur.

Il ne s'agit pas de virtualisation, mais de conteneurisation, une forme beaucoup plus légère qui s'appuie sur certaines parties de la machine hôte pour son fonctionnement.

Installer docker

Pour installer docker sur votre serveur Linux (Ubuntu ou Debian), il vous suffit d'exécuter cette commande :

apt update && apt install -yq docker.io

Créer un conteneur Docker

Une fois Docker installé, vous pouvez démarrer une application (ex: Ghost) :

docker run --name ghost -p 2368:2368 ghost

Un conteneur docker sera démarré. Rendez-vous sur http://localhost:2368 pour accèder à l'application Ghost fraichement installé.

Si vous souhaitez supprimer votre conteneur, éxécutez la commande :

docker rm -f ghost

Docker Swarm

C'est quoi ?

Docker Swarm est un orchestrateur qui exécute, coordonne et gère automatiquement le cycle de vie de nos applications.

Il nous permet de répartir nos applications sur plusieurs serveurs selon leurs ressources CPU et RAM.

Initialisation

Pour initialiser Docker Swarm, exécutez cette commande :

docker swarm init

Pour lier d'autres serveurs à notre cluster, exécutez cette commande :

docker swarm join --token <token> <ip>:2377

Auto-scaling

Docker swarm auto add nodes when out of reservation based on use (Auto Horizontal Scaling)

  • +1 node if RAM or CPU usage is >80% for at least 5 minutes
  • -1 node if RAM or CPU usage is <40% for at least 5 minutes

Quorum, 3 managers and 5 workers

Espace de stockage distribué

Pour rendre accessible des données sur plusieurs serveur en même temps il existe glusterfs.

Pour ça on installe glusterfs sur un serveur master :

apt install -yq glusterfs-server
systemctl enable --now glusterd

On créer un volume de donnée /mnt/glusterfs :

IP_MASTER=<IP_INTERNE_DE_MON_SERVEUR_MASTER> # Ex: 10.12.180.210
gluster volume create vol01 transport tcp "$IP_MASTER:/mnt/glusterfs" force
gluster volume start vol01
echo "$IP_MASTER:/vol01 /mnt/data glusterfs defaults,_netdev 0 0" >> /etc/fstab
mount -a

On installe glusterfs sur les serveurs workers :

# Installation sur les workers
apt install -yq glusterfs-client
echo "$IP_MASTER:/vol01 /mnt/data glusterfs defaults,_netdev 0 0" >> /etc/fstab
mount -a

Et si on veux faire une sauvegarde, il suffit de sauvegarder les données du dossier /mnt/glusterfs/ avec n'importe quel outil de sauvegarde (restic, bord, duplicity, etc...).

Infrastructure as Code

Terraform

Ansible

Traefik en tant que reverse proxy

Pour rendre accessible toutes nos applications à partir d'un seul point d'entrée, il existe Traefik en tant que reverse proxy.

Grâce à Traefik, chaque requête HTTP provenant d'un client web (ex: Firefox) sera automatiquement redirger va la bonne application.

Installation

Avec Docker

Vous pouvez l'installer avec Docker :

docker run -p 80:80 \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
traefik:2.4.8 --providers.docker=true

Une fois installé vous pouvez relié une application à un nom de domaine (ex: ghost.localhost) :

docker run -l traefik.http.routers.container.rule='Host(`ghost.localhost`)' ghost

Vous pouvez accédez à votre application en vous rendant sur http://ghost.localhost.

Avec Docker Swarm

Pour installer Traefik avec Docker Swarm :

# traefik.yml
version: '3.8'

services:
  traefik:
    image: traefik:${VERSION:-2.4.8}
    command:
      - --providers.docker
      - --providers.docker.network=traefik-net
      - --providers.docker.exposedByDefault=false
      - --providers.docker.swarmMode=true
      - --providers.docker.endpoint=unix:///var/run/docker.sock
      - --entrypoints.http.address=:80
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
    ports:
      - {target: 80, published: 80, mode: host, protocol: tcp}

networks:
  default:
    external: true
    name: traefik-net
docker network create --driver=overlay traefik-net
docker stack deploy -c traefik.yml traefik
docker service create --network traefik-net \
-l traefik.enable=true \
-l traefik.http.routers.my-container.rule='Host(`ghost.localhost`)' \
-l traefik.http.services.my-service.loadbalancer.server.port=2368 ghost

Vous pouvez accédez à votre application en vous rendant sur http://ghost.localhost.

Généreration automatique de Certificats SSL avec Let's Encrypt

Pour générer des certificats SSL, rien de mieux que Let's Encrypt pour effectuer cette tâche.

En rendant publiquement accessible les ports 80 et 443, Traefik va automatiquement communiquer avec Let's Encrypt pour générer automatiquement nos certificats SSL à chaque fois qu'un nouveau nom de domaine est relié à une application.

version: '3.8'

services:
  traefik:
    image: traefik:${VERSION:-2.4.8}
    command:
      - --providers.docker
      - --providers.docker.network=traefik-net
      - --providers.docker.exposedByDefault=false
      - --providers.docker.swarmMode=true
      - --providers.docker.endpoint=unix:///var/run/docker.sock
      - --entrypoints.http.address=:80
      - --entrypoints.https.address=:443
      - --entrypoints.http.http.redirections.entryPoint.to=https
      - --entrypoints.http.http.redirections.entryPoint.scheme=https
      - --entrypoints.http.http.redirections.entrypoint.permanent=true
      - --certificatesresolvers.letsencrypt.acme.tlschallenge=true
      - --certificatesresolvers.letsencrypt.acme.email=${ACME_EMAIL:-noreply@ethibox.fr}
      - --certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json
    volumes:
      - ${VOLUME_PATH}letsencrypt:/letsencrypt
      - /var/run/docker.sock:/var/run/docker.sock:ro
    ports:
      - {target: 80, published: 80, mode: host, protocol: tcp}
      - {target: 443, published: 443, mode: host, protocol: tcp}

volumes:
  letsencrypt:

networks:
  default:
    external: true
    name: traefik-net

Avant de lancer Traefik, n'oubliez pas de vérifiez si vos ports 80 et 443 sont bien accessible depuis l'extérieur de votre réseau pour que Let's Encrypt puisse communiquer avec votre serveur Traefik.

Utilisez la commande curl https://ipv4.am.i.mullvad.net/port/80 ou https://canyouseeme.org/ pour vérifier.

Démarrez traefik :

docker stack deploy -c traefik.yml traefik

Créez une zone DNS de type A vers l'adresse IP publique de votre serveur, exemple : ghost.example.com -> IN A 9.9.9.9.

Pour ça, passez par le registraire de votre nom de domaine (ex: OVH, Gandi, GoDaddy ou 1&1).

Ensuite, vous pouvez créer une application avec le nom de domaine précédemment configuré :

# Exemple avec le nom de domaine ghost.example.com
docker service create --network traefik-net \
-l traefik.enable=true \
-l traefik.http.routers.my-container.rule='Host(`ghost.example.com`)' \
-l traefik.http.services.my-service.loadbalancer.server.port=2368 ghost

Un certificat est automatiquement généré et vous pouvez à présent accéder à votre application avec le protocole HTTPS : https://ghost.example.com.

Monitoring

Grafana & Prometheus

Alerting

Telegram

Logging

Sauvegardes

Pour sauvegarder toutes les données des applications, il existe restic.

apt update && apt install restic

Restic peut sauvegarder des données sur différent backends :

  • Buckets S3 (minio, scaleway, AWS, etc...)
  • SFTP
  • Local

Il est possible de coupler restic avec rclone pour avoir d'autres backends.

Voici un exemple avec un bucket S3 chez scaleway :

# /root/.restic
AWS_ACCESS_KEY_ID=<AWS_ACCESS_KEY_ID>
AWS_SECRET_ACCESS_KEY=<AWS_SECRET_ACCESS_KEY>
restic -r s3:s3.fr-par.scw.cloud/test init
restic -r s3:s3.fr-par.scw.cloud/test backup /home/$USER/

Il est possible d'automatiser la sauvegarde via une tâche cron :

# Sauvegarde du dossier /home/$USER/ chaque jour à minuit
0 0 * * * RESTIC_PASSWORD=PASS restic -r s3:s3.fr-par.scw.cloud/test backup /home/$USER/

Single Sign On

Sécurité

Fail2ban (IDS)

Firewall

IPS

Hardening

ClamAV

Mots de passe

  • masterpassword

Docker

  • docker bench
  • falco
  • user namespaces
  • Rootless mode
  • Docker secrets

Automatisation

Portainer


©2017-2021