Création d'un serveur de logs Seq sous CentOS 7

Dans cet article, je vais vous présenter l'installation d'un serveur de logs Seq sous Centos.

Le setup sera le suivant :

  • la VM sera chez Scaleway
  • l'OS sera CentOS 7
  • le reverse proxy sera Traefik
  • le certificat SSL sera fourni par Let's Encrypt
  • le serveur de logs sera donc Seq et tournera dans Docker

Création de la VM

Pour nos VM, nous allons la prendre chez Scaleway. Scaleway offre des VMs de qualité avec un prix très compétitif. Je vous laisse le soin de faire un tour sur leur site et découvrir leurs offres.

La documentation de Seq nous informe qu'il faut une machine avec les caractéristiques suivantes:

  • CPU avec 2 coeurs
  • 3GB de RAM
  • 50GB d'espace disque

Avec ces informations, nous pouvons donc démarrer avec une VM Start-1M

Au moment de la création, choisissez l'image CentOS pour le système d'exploitation.

Dès que la machine est prête, allez dans l'interface de détails et notez dans la valeur du Public DNS qui doit ressembler à ça :

6e4afa92-b46f-4cfd-9298-c655302c6cbd.pub.cloud.scaleway.com

Mise à jour des DNS

Pour pouvoir utiliser un certificat Let's Encrypt, vous devez créer une entrée CNAME qui pointe vers la valeur du Public DNS que vous avez notée juste avant.

Pour les besoin de cet article, le nom de domaine que nous utiliserons sera :

seq.mydomain.tld

Mise à jour de CentOS

Pendant que les DNS se mettent à jour, connectez-vous en SSH sur votre machine et tapez la commande suivante :

yum update -y

reboot

Installation de Docker

La machine est prête et à jour, nous pouvons maintenant installer Docker CE. Je vous conseille de lire la documentation, mais pour aller plus vite voici les commandes importantes :

On installe les paquets nécessaires pour faire tourner Docker :

yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

On ajoute le repository stable de Docker :

yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

On installe la dernière version de Docker :

yum install docker-ce docker-ce-cli containerd.io

On démarre Docker :

systemctl start docker

On vérifie que Docker fonctionne bien :

docker run hello-world

Si vous voyez un message d'information alors tout va bien.

Vous pouvez enregistrer Docker pour qu'il démarre automatiquement :

systemctl enable docker

Installation de Docker Compose

Nous allons maintenant installer Docker Compose avec les commandes suivantes :

curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

Installation de Traefik

Nous allons maintenant avoir besoin d'un reverse proxy pour pouvoir faire tourner plusieurs instances de Seq sur notre VM.

Nous allons donc utiliser Traefik qui fait très bien le job et qui offre une très bonne intégration avec Let's Encrypt

Avant de commencer à installer Traefik, nous devons d'abord créer un réseau virtuel avec Docker. Traefik fera le transfert des requêtes depuis internet vers les instances Seq qui seront connectées au réseau Docker.

Pour créer les réseau Docker voici la commande:

docker network create seqnet

Maintenant nous allons préparer le terrain pour Traefik, vous allez taper les commandes suivantes qui serviront à configurer Traefik, l'image Docker-Compose et Let's Encrypt :

mkdir -p /opt/traefik
touch /opt/traefik/docker-compose.yml
touch /opt/traefik/acme.json && chmod 600 /opt/traefik/acme.json
touch /opt/traefik/traefik.toml
cd /opt/traefik

Vous pouvez maintenant éditer le fichier /opt/traefik/traefik.toml :

# Par défaut, le frontend d'une image Seq n'écoutera que sur le port https
defaultEntryPoints = ["https"]

# On définit ici les points d'entrée activés
[entryPoints]
  # On active le port http
  [entryPoints.http]
    address = ":80"
    # On demande une redirection automatique sur https
    [entryPoints.http.redirect]
      entryPoint = "https"
  # On active le port https
  [entryPoints.https]
    address = ":443"
    # On s'assure que la version de TLS est au minimum 1.2
    [entryPoints.https.tls]
      minVersion = "VersionTLS12"
      cipherSuites = [
        "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305",
        "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
        "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
        "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256",
        "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
        "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA"
      ]

# On active le support de Docker
[docker]

# On active la gestion automatique des certificats Let's Encrypt
[acme]
email = "mymail@mydomain.tld"
storage = "acme.json"
entryPoint="https"
onHostRule = true
# On configure le challenge HTTP-01
[acme.httpChallenge]
  entryPoint = "http"

# On ajoute ici les domaines pour lesquels nous voulons un certificat
[[acme.domains]]
  main = "seq.mydomain.tld"

Maintenant vous pouvez éditer le fichier /opt/traefik/docker-compose.yml :

version: '3'

services:
  reverse-proxy:
    # L'image docker de Traefik qui nous intéresse
    image: traefik:1.7.9-alpine
    restart: unless-stopped
    # On active le dashboard avec --api
    # Vous pouvez désactiver le dashboard en supprimant la ligne ci-dessous
    command: --api
    # On connecte l'image à notre réseau docker créé plus haut
    networks:
      - seqnet
    # On écoute les ports http et https sur internet
    ports:
      - "80:80"
      - "443:443"
    # On map vers nos fichiers créés plus haut
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /opt/traefik/traefik.toml:/traefik.toml
      - /opt/traefik/acme.json:/acme.json
    # La section labels sert à configurer le dashboard
    # Si vous désactivez le --api plus haut, vous pouvez supprimer toute la section labels
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=seq"
      - "traefik.port=8080"
      - "traefik.backend=traefik"
      - "traefik.frontend.rule=PathPrefixStrip:/traefik;PathPrefix:/traefik"
      # Nous protégeons le dashboard avec un mot de :
      # login: admin
      # password: 1234
      # Le mot de passe peut être généré dans plusieurs formats
      # https://docs.traefik.io/configuration/entrypoints/#basic-authentication
      # Ici le mot de passe est en BCrypt
      - "traefik.frontend.auth.basic=admin:$$2y$$12$$WpLCLJFqnamjm3cDuamW9eSoUbJMZ/q8oYdmhxt0RLEObRlb3Xvru"
networks:
  seqnet:
    external: true

Le fichier acme.json sert pour le stockage des informations Let's Encrypt.

Vous avez terminé de configurer Traefik, lancer l'image avec la commande suivante :

docker-compose up -d

Vous pouvez maintenant vous connecter au dashboard avec les identifiants du fichier docker-compose sur l'adresse de votre VM :

https://seq.mydomain.tld/traefik

Je vous conseille de laisser le dashboard ouvert dans un onglet pour tout à l'heure.

Installation d'une instance nommé Seq

Pour les logs, nous allons donc installer Seq.

Pour chaque instance de Seq, nous écouterons sur les urls suivantes :

# Notre première instance de Seq pour l'application 1
https://seq.mydomain.tld/app1
# Notre deuxième instance de Seq pour l'application 2
https://seq.mydomain.tld/app2

Nous allons créer la première instance de Seq. Cette instance se nommera app1.

On prépare le terrain pour notre instance :

# On crée le répertoire pour le stockage des logs de notre instance
mkdir -p /var/log/seq/app1

# On prépare le répertoire pour configurer l'instance Seq
mkdir -p /opt/app1
touch /opt/app1/docker-compose.yml
cd /opt/app1

On édite maintenant le fichier /opt/app1/docker-compose.yml :

version: '3'

services:
  app1:
    # On utilise la dernière image de Seq
    image: datalust/seq:latest
    restart: unless-stopped
    # On lui donne le nom de notre instance
    container_name: app1
    # On la connecte sur notre réseau Docker
    networks:
      - seqnet
    environment:
      - ACCEPT_EULA=Y
      # On donne l'adresse externe de notre instance Seq
      - BASE_URI=https://seq.mydomain.tld/app1
    # On map notre répertoire pour les logs sur /data
    volumes:
      - /var/log/seq/app1:/data
    # On configure ici notre instance avec Traefik
    labels:
      # On active notre image
      - "traefik.enable=true"
      # On la connecte sur le réseau seqnet
      - "traefik.docker.network=seqnet"
      # On écoute sur le port 80
      - "traefik.port=80"
      # Les trois lignes ci dessous servent à rediriger le traffic si on utilise les urls suivantes :
      # https://seq.mydomain.tld/app1 ou https://seq.mydomain.tld/app1/
      - "traefik.frontend.redirect.regex=^(.*)/app1$$"
      - "traefik.frontend.redirect.replacement=$$1/app1/"
      - "traefik.frontend.rule=PathPrefix:/app1;ReplacePathRegex: ^/app1/(.*) /$$1"
networks:
  seqnet:
    external: true

Vous pouvez démarrer votre image avec la commande suivante et retourner sur le dashboard :

docker-compose up -d

Attendez quelques secondes, si tout s'est bien passé, vous devez voir deux nouveaux blocs bleus dans le dashboard de Traefik.

Vous pouvez naviguer vers https://seq.mydomain.tld/app1 et normalement vous arrivez sur l'interface de Seq.

Si vous souhaitez faire la deuxième instance, il suffit de refaire la procédure en remplaçant app1 par app2 dans les commandes shell et le fichier de configuration docker-compose.yml.