Installation application Symfony 3.4 et environnement LAPP avec Docker et Ansible sur macOS 10.15

Mise en place d'un environnement de développement Symfony 3.4 LAPP et publication de l'image sur Docker Hub.

Publié le 18/09/2020

Pour ce tutoriel, on devra disposer d'une application Symfony 3.4 hébergée sur un dépôt git. Cette dernière aura pour environnement système et applicatif :

  • - Linux Debian 9
  • - PostgreSQL 9
  • - PHP 7.4
  • - Apache 2.4
  • Le poste de développement est sur macOS 10.15 .

    Installer Docker Desktop : https://www.docker.com/products/docker-desktop

    1 - Création de l'image de base Linux Debian 9

    Sur notre poste de travail, on va créer le fichier Dockerfile dans un dossier :

    
    mkdir deb9-lapp74
    cd deb9-lapp74
    nano Dockerfile
    
    

    Dans le fichier Dockerfile, on ajoute la directive suivante pour obtenir un conteneur avec une base de Linux Debian 9.

    
    FROM debian:9
    
    

    On va créer un conteneur à partir d'une image à partir de l'image générée par le Dockerfile :

    
    docker build -t deb9/lapp74 .
    
    

    On va pouvoir maintenant démarrer notre conteneur :

    
    docker run -ti deb9/lapp74 /bin/bash
    
    

    Installation de nano et openssh :

    
    apt-get update && apt-get upgrade
    apt-get install nano ssh
    
    

    Configuration du fuseau horaire :

    
    dpkg-reconfigure tzdata
    
    

    Autorisation de connexion du root par ssh :

    
    nano /etc/ssh/sshd_config
    PermitRootLogin yes
    
    

    Démarrer sshd :

    
    service ssh restart
    
    

    Note : ssh ne démarre pas automatiquement par défaut.

    2 - Installation d'Ansible et git

    Installation d'Ansible et git:

    
    apt-get install ansible sshpass git
    
    

    Attribution d’un mot de passe à l'utilisateur root :

    
    passwd root
    
    

    Génération d’une paire de clés rsa pour l'utilisateur root :

    
    ssh-keygen -t rsa
    cat /root/.ssh/id_rsa.pub
    
    

    Si vous disposer d'un dépôt Gitlab : récupérer la clé ssh publique pour autoriser à télécharger le projet gitlab.

    On part du principe que le dossier de configuration Ansible se trouve à la racine de l'application Symfony dans un dossier "ansible/prod" :

    Le playbook d'installation Ansible va installer la pile logicielle nécessaire au fonctionnement de Symfony 3.4 :

    • Apache 2.4
    • PHP 7.4
    • PostgreSQL 9
    • Git
    • Utilitaires : curl, zip, acl, htop, zip

    Il va aussi configurer le php.ini et créer le vhost pour notre application.

    Contenu du dossier Ansible :

    • ansible.cfg
    • hosts
    • playbook-lapp74.yml
    • virtualhost.conf

    Contenu du fichier ansible.cfg :

    
    [defaults]
    hostfile = ./hosts
    host_key_checking = False
    
    

    Contenu du fichier hosts

    
    [127.0.0.1]
    127.0.0.1 ansible_ssh_host=127.0.0.1 ansible_ssh_user=root ansible_ssh_pass=CONTAINER_USER_ROOT_PWD host_key_checking=false
    
    

    Contenu du fichier playbook-lapp74.yml :

    
    ---
    - hosts: all
      sudo: true
      vars:
        domain: application-sf.local
        admin: contact@application-sf.local
        directory: application-sf/web
      handlers:
          - name: restart apache2
            service: name=apache2 state=restarted
          - name: restart postgresql
            service: name=postgresql state=restarted
          - name: restart rsync
            service: name=rsync state=restarted
      tasks:
        - name: Mise à jour de l'apt cache
          apt: update_cache=yes
    
        - name: installer aptitude
          apt: name=aptitude state=present
    
        - name: Mise à jour système
          apt: upgrade=full
    
        - name: installer acl
          apt: name=acl state=present
    
        - name: installer curl
          apt: name=curl state=present
    
        - name: installer htop
          apt: name=htop state=present
    
        - name: installer zip
          apt: name=zip state=present
    
        - name: installer unzip
          apt: name=unzip state=present
    
        - name: installer git
          apt: name=git state=present
    
        - name: installer apache2
          apt: name=apache2 state=present
    
        - name: installer apache2-doc
          apt: name=apache2-doc state=present
    
        - name: installer apache2-utils
          apt: name=apache2-utils state=present
    
        - name: installer libexpat1
          apt: name=libexpat1 state=present
    
        - name: installer libxrender1
          apt: name=libxrender1 state=present
    
        - name: installer libfontconfig
          apt: name=libfontconfig state=present
    
        - name: installer ssl-cert
          apt: name=ssl-cert state=present
    
        - name: a2disconf apache2-doc
          command: a2disconf apache2-doc
          notify:
            - restart apache2
    
        - name: create vhost
          template: src=virtualhost.conf dest=/etc/apache2/sites-available/{{ domain }}.conf
    
        - name: a2ensite
          command: a2ensite {{ domain }}.conf
          args:
            creates: /etc/apache2/site-enabled/{{ domain }}.conf
          notify:
            - restart apache2
    
        - name: activation mod-rewrite
          apache2_module: name=rewrite state=present
          notify:
            - restart apache2
    
        - name: activation mod-headers
          apache2_module: name=headers state=present
          notify:
            - restart apache2
    
        - name: activation mod-headers
          apache2_module: name=headers state=present
          notify:
            - restart apache2
    
        - name: installer ca-certificates
          apt: name=ca-certificates state=present
    
        - name: installer lsb-release
          apt: name=lsb-release state=present
    
        - name: installer apt-transport-https
          apt: name=apt-transport-https state=present
    
        - name: Add an Apt signing key, uses whichever key is at the URL
          apt_key:
              url: https://packages.sury.org/php/apt.gpg
              state: present
              validate_certs: no
    
        - apt_repository:
            repo: deb https://packages.sury.org/php/ stretch main
            state: present
    
        - name: Mise à jour de l'apt cache
          apt: update_cache=yes
    
        # PHP 7.4
        - name: installer php7.4
          apt: name=php7.4 state=present
    
        - name: installer php7.4-common
          apt: name=php7.4-common state=present
    
        - name: php7.4-cli
          apt: name=php7.4-cli state=present
    
        - name: php7.4-dom
          apt: name=php7.4-dom state=present
    
        - name: php7.4-xmlrpc
          apt: name=php7.4-xmlrpc state=present
    
        - name: php7.4-mbstring
          apt: name=php7.4-mbstring state=present
    
        - name: php7.4-intl
          apt: name=php7.4-intl state=present
    
        - name: php7.4-pgsql
          apt: name=php7.4-pgsql state=present
    
        - name: installer php7.4-curl
          apt: name=php7.4-curl state=present
    
        - name: installer php7.4-zip
          apt: name=php7.4-zip state=present
    
        - name: Modify date.time zone php.ini apache
          replace:
            dest=/etc/php/7.4/apache2/php.ini
            regexp=';date.timezone ='
            replace='date.time = Europe/Paris'
            backup=yes
    
        - name: Modify date.time zone php.ini cli
          replace:
            dest=/etc/php/7.4/cli/php.ini
            regexp=';date.timezone ='
            replace='date.time = Europe/Paris'
            backup=yes
    
        - name: Modify memory limit php.ini apache
          replace:
            dest=/etc/php/7.4/apache2/php.ini
            regexp='memory_limit = 128M'
            replace='memory_limit = 256M'
            backup=yes
    
        - name: Modify max execution time php.ini apache
          replace:
            dest=/etc/php/7.4/apache2/php.ini
            regexp='max_execution_time = 30'
            replace='max_execution_time = 360'
            backup=yes
    
        - name: Modify max upload file php.ini apache
          replace:
            dest=/etc/php/7.4/apache2/php.ini
            regexp='upload_max_filesize = 2M'
            replace='upload_max_filesize = 20M'
            backup=yes
    
        - name: Modify max execution time php.ini cli
          replace:
            dest=/etc/php/7.4/cli/php.ini
            regexp='max_execution_time = 30'
            replace='max_execution_time = 360'
            backup=yes
    
        - name: Modify max upload file php.ini cli
          replace:
            dest=/etc/php/7.4/cli/php.ini
            regexp='upload_max_filesize = 2M'
            replace='upload_max_filesize = 20M'
            backup=yes
    
        # PostgreSQL 9.x
        - name: installer postgresql
          apt: name=postgresql state=present
    
        - name: installer postgresql-contrib-9*
          apt: name=postgresql-contrib-9* state=present
    
        - name: installer postgresql utils
          apt:
            name: "{{item}}"
            state: present
          with_items:
            - postgresql-plperl
            - postgresql-plpython
            - postgresql-pltcl
            - python-psycopg2
    
        - name: Start PostgreSQL and enable at boot
          service:
            name=postgresql
            enabled=yes
            state=started
    
    

    Contenu du fichier virtualhost.conf :

    
    <VirtualHost *:80>
            ServerName {{ domain }}
            ServerAdmin {{ admin }}
    
            DocumentRoot /var/www/{{ directory }}
            <Directory />
                    Options FollowSymLinks
                    AllowOverride All
            </Directory>
            <Directory /var/www/{{ directory }}/>
                    DirectoryIndex app.php
                    Options Indexes FollowSymLinks MultiViews
                    AllowOverride All
                    Order allow,deny
                    allow from all
            </Directory>
    
            ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
            <Directory "/usr/lib/cgi-bin">
                    AllowOverride None
                    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                    Order allow,deny
                    Allow from all
            </Directory>
    
            ErrorLog ${APACHE_LOG_DIR}/error.log
    
            # Possible values include: debug, info, notice, warn, error, crit,
            # alert, emerg.
            LogLevel warn
    
            CustomLog ${APACHE_LOG_DIR}/access.log combined
    
    </VirtualHost>
    
    

    3 - Déploiement des sources de l'application avec git

    Cloner le projet dans le dossier de l'utilisateur root :

    
    cd /root
    git clone ssh://git@gitlab.domain.tld:/user/application-sf
    
    

    4 - Installations des paquets applicatifs avec Ansible

    Ajouter le mot de passe root dans le paramètre "ansible_ssh_pass" :

    
    cd application-sf/ansible/prod/
    nano hosts
    
    

    Exécution le playbook Ansible :

    
    ansible-playbook playbook-lapp74.yml
    
    

    Déplacer le projet dans le dossier public d’Apache :

    
    cd /root
    mv application-sf /var/www
    
    

    5 - Installation de l'application Symfony

    Par défaut, le application Apache et PostgreSQL ne vont pas démarrer automatiquement.

    Démarrer Apache et PostgreSQL :

    
    service apache2 start
    service postgresql start
    
    

    Création de la base de donnée :

    
    su postgres
    createuser -d -P application-sf
    createdb -O application-sf application-sf
    
    

    Quitter le shell postgres :

    ctrl + d

    Installation de l’application Symfony :

    
    cd /var/www/application-sf
    curl -s https://getcomposer.org/installer | php
    php composer.phar install
    ./clean.sh
    
    

    6 - Sauvegarde et exécution du conteneur

    Quitter le conteneur et le sauvegarder :

    ctrl + d

    Récupérer l'id du conteneur :

    
    docker ps -a
    
    

    Sauvegarde du conteneur :

    
    docker commit ID_CONTAINER debian9/lapp74-application-sf
    
    

    Le conteneur va être historisé lors de sa sauvegarde.

    Exécution du conteneur :

    Exécuter le conteneur avec le dossier public d'Apache partagé :

    IMPORTANT : Si l'application est déployé dans le dossier partagé, ce dernier est vidé lors du démarrage du conteneur avec le point de montage.

    
    docker run -ti -v ~/path/to/deb9-lapp74/www-data:/var/www -p 80:80 debian9/lapp74-application-sf /bin/bash
    
    

    Le conteneur est exécuté avec un shell bash, une exposition du port 80 redirigé vers le port 80 de la machine hôte et un partage du dossier Apache avec cette dernière.

    Exécuter le conteneur sans partage :

    
    docker run -ti -p 80:80 debian9/lapp74-application-sf /bin/bash
    
    

    Démarrer apache et postgresql :

    
    service apache2 start
    service postgresql start
    
    

    Pour accéder à l'application depuis la machine hôte, créer une entrée dans le fichier hosts qui associe la FQDN de l'application au localhost de la machine hôte.

    
    sudo nano /etc/hosts
    127.0.0.1 application-sf.local
    
    

    Connexion à l'application Symfony :

    
    http://application-sf.local
    
    

    7 - Publication d'une image du conteneur sur Docker Hub

    Créer un compte sur Docker Hub [https://hub.docker.com], afin de pouvoir héberger l'image.

    Une fois le compte crée, se connecter depuis le shell :

    
    docker login
    
    

    Tagger l'image :

    
    docker tag debian9/lapp74-application-sf docker-user/debian9-lapp74-application-sf:v1
    
    

    Upload de l'image sur le dépôt Docker Hub :

    
    docker push docker-user/debian9-lapp74-application-sf:v1
    
    

    8 - Déploiement du conteneur depuis l'image Docker Hub

    Pull de l'image depuis le dépôt :

    
    docker login
    docker pull docker-user/debian9-lapp74-application-sf:v1
    
    

    Suppression de l'image locale :

    
    docker rmi docker-user/debian9-lapp74-application-sf:v1