Gitlab

Routage HTTP

Le routage HTTP ainsi que la gestion du nom de domaine public de l’application et la couche TLS sont gérés par un reverse-proxy. Celui que le workflow utilise est Træfik.

Træfik va se charger du routage HTTP, ainsi que de la répartition de charge, quand il y a plusieurs instances d’un même service avec les mêmes règles.

Les routes sont déclarées dans des labels du docker-compose avec la clef traefik.frontend.rule

De plus, TLS est déployé de manière systématique, c’est important pour la sécurité, et pour le gain en indexation (SEO), et ce, quelque soit l’environnement, dev ou prod.

Afin d’exposer publiquement une application dans le workflow, il faut ajouter les labels suivants dans le docker-compose qui décrit le service de l’application:

services:

    # our webapp.
    app:
    [...]
      labels:
        # traefik v1 configuration
        traefik.frontend.rule: Host:${CI_ENVIRONMENT_DOMAIN}
        traefik.enable: 'true'
        # headers STS
        traefik.frontend.headers.STSPreload: 'true'
        traefik.frontend.headers.STSSeconds: '63072000'

Et définir le service qui utilisera l’image du reverse-proxy:

services:
    [...]
    
    # enable Traefik for dev
    traefik:
        image: bearstech/traefik-dev:latest
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock
        ports:
            - "${TRAEFIK_UI_PORT:-8080}:8080"
            - "${TRAEFIK_HTTP_PORT:-80}:80"
        environment:
            MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD:-null}
        labels:
            traefik.frontend.rule: Host:traefik.myapp
            traefik.port: "8080"
            traefik.enable: 'true'
            traefik.tags: web

Notons que Traefik dispose d’une interface web qui récapitule tous les services exposés par Docker. Celui-ci est joignable sur le 8080 du domaine de l’application.

Si on définit la variable CI_ENVIRONMENT_DOMAIN avec la valeur “dev.myapp” dans le fichier .env du projet, alors l’application pourra être accessible en local sur l’url http://dev.myapp et l’interface web de Traefik sera joignable sur l’url http://dev.myapp:8080

Le routage HTTP est utile pour développer l’application en local, mais c’est aussi ce dont aura besoin le serveur de CI pour effectuer les tests sur l’application avant de la déployer sur les environnements de production.

Au final, le fichier docker-compose.yml de l’application qui permet de reproduire le fonctionnement du workflow ressemblera à ceci:

# this file is good to go for production
version: "3"

services:

    # our webapp. 
    app: 
        # use our image
        image: ${CI_REGISTRY_IMAGE}/app:${CI_COMMIT_SHA}
        # expose our server port
        expose: [9000]
        # link this container to the mysql service      
        depends_on:
            - mysql
        # define a volume where we can write uploads
        volumes:
            - ./data/uploads:/var/www/uploads
        # define some env vars available to our container
        environment:
            ENV: ${CI_ENVIRONMENT_NAME}
            CI_ENVIRONMENT_DOMAIN: ${CI_ENVIRONMENT_DOMAIN}
            # mysql database connection
            MYSQL_DATABASE: ${MYSQL_DATABASE}
            MYSQL_USER: ${MYSQL_USER}
            MYSQL_PASSWORD: ${MYSQL_PASSWORD}
        labels:
            # traefik v1 configuration
            traefik.frontend.rule: Host:${CI_ENVIRONMENT_DOMAIN}
            traefik.enable: 'true'
            # headers STS
            traefik.frontend.headers.STSPreload: 'true'
            traefik.frontend.headers.STSSeconds: '63072000'

    # mysql database service
    mysql:
        image: mariadb:10.1
        environment:
            MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD}
            MYSQL_DATABASE: ${MYSQL_DATABASE}
            MYSQL_USER: ${MYSQL_USER}
            MYSQL_PASSWORD: ${MYSQL_PASSWORD}
        volumes:
            - mysql_db_data:/var/lib/mysql

    # enable Traefik for dev at http://traefik.myapp
    traefik:
        image: bearstech/traefik-dev:latest
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock
        ports:
            - "${TRAEFIK_UI_PORT:-8080}:8080"
            - "${TRAEFIK_HTTP_PORT:-80}:80"
        environment:
            MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD:-null}
        labels:
            traefik.frontend.rule: Host:traefik.myapp
            traefik.port: "8080"
            traefik.enable: 'true'
            traefik.tags: web

# we uses this in dev mode to have some persistent volumes 
volumes:
     mysql_db_data:
Top