Installation d’un serveur Apache en docker sur un NAS ASUSTOR

Installation d’un serveur Apache en docker sur un NAS ASUSTOR

Un point très gênant de ce NAS, qui par ailleurs est très satisfaisant, c’est la gestion du serveur web natif d’ADM. En effet, c’est un serveur Apache qui est lancé à chaque démarrage, et qui est contrôlé par l’interface ADM :

Comme je l’ai expliqué dans un post précédent, il est impossible pour l’instant d’utiliser le serveur natif d’ADM car il empêche l’utilisation correcte de Traefik. Le problème, c’est qu’il mobilise les ports 80 et 443, et si on le désactive, ADM lance automatiquement un autre serveur lighttpd qui prend la main sur ces ports et empêche le lancement de Traefik :

J’ai donc créé un fichier de configuration pour déployer un docker Apache destiné à remplacer le serveur natif. Voici le fichier en question :

# Dockerfile
FROM php:7.4-apache
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/
RUN chmod +x /usr/local/bin/install-php-extensions && sync && \
install-php-extensions sockets bz2 mcrypt opcache mysqli gd xdebug zip pdo_mysql intl ldap imap bcmath gmp exif apcu memcached imagick pcntl redis smbclient
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
RUN a2enmod rewrite
RUN apt-get update
RUN apt-get upgrade -y
RUN apt-get install -y libimage-exiftool-perl imagemagick poppler-utils libjpeg-turbo-progs ffmpeg

L’image est créée à partir de l’image existante « php:7.4-apache », il s’agit en fait d’une image de PHP mais qui tourne évidemment sur Apache2. Là-dessus, j’ajoute les extensions php nécessaires au bon fonctionnement des applications/services que je souhaite utiliser, en particulier Nextcloud et Roundcubemail. C’est l’objet des lignes « ADD » et de la ligne :

RUN chmod +x /usr/local/bin/install-php-extensions && sync && \
install-php-extensions sockets bz2 mcrypt opcache mysqli gd xdebug zip pdo_mysql intl ldap imap bcmath gmp exif apcu memcached imagick pcntl redis smbclient

La ligne suivante permet d’activer la configuration d’Apache et de PHP du docker.

RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
RUN a2enmod rewrite

Enfin les lignes en fin de fichier permettent de finaliser l’installation avec des programmes à installer dans le système du docker :

RUN apt-get update
RUN apt-get upgrade -y
RUN apt-get install -y libimage-exiftool-perl imagemagick poppler-utils libjpeg-turbo-progs ffmpeg

Il suffit alors de lancer la commande suivante pour créer l’image Apache :

root@astorus:/volume1/Docker/Traefik# docker build -t apache .

Et pour lancer le container, la commande suivante permettra de …

root@astorus:/volume1/Docker/Traefik# docker run -d --name Apache --restart always --mount type=bind,source=/volume1/Web,target=/var/www/html --mount type=bind,source=/volume1/Docker/Apache2/php.ini,target=/usr/local/etc/php/php.ini --mount type=bind,source=/volume1/Docker/Apache2/000-default.conf,target=/etc/apache2/sites-available/000-default.conf -p 28800:80 apache:latest

Dans l’ordre, cette commande :

  • nomme le container « Apache »
  • établit la police de redémarrage à « always » (au cas où le serveur « tombe »)
  • monte le répertoire Web du NAS (/volume1/Web) dans le répertoire du container (/var/www/html)
  • lie le fichier /volume1/Docker/Apache2/php.ini au fichier du docker /usr/local/etc/php/php.ini, pour conserver les modifications qu’on peut faire dans ce fichier : si on l’édite dans le répertoire du NAS, il sera conservé et utilisé en lieu et place du fichier php.ini du docker à son lancement
  • lie pour les mêmes raisons que ci-dessus le fichier 000-default.conf à son homologue dans le container
  • lie le port interne du docker (80) à un port du système (j’ai choisi 28800)

Et normalement, on doit voir apparaître le docker dans Portainer :

4 Comments

  1. Rémi

    Bonjour,

    Merci beaucoup pour les 2 tutos sur Apache et Traefik, qui m’ont permis de pas mal avancer et de voir que je n’étais pas le seul à être franchement ennuyé avec le serveur web et le reverse proxy par défaut d’Asustor.

    J’ai en revanche encore un problème avec Nextcloud : pour l’utiliser en standard (càd sans passer par Docker, juste en dézippant l’archive officielle), j’ai un problème de droits d’écriture sur un fichier config.php, ce qui fait que je ne peux rien faire (ni installer, ni utiliser un ancien site nextcloud).

    Ca marche avec le serveur web par défaut d’Asustor, mais pas le serveur Apache/PHP dockerisé. J’ai essayé pas mal de trucs mais je ne comprends pas.

    Est-ce que vous auriez un tuyau pour me débloquer.

    Par ailleurs, sauf erreur, dans votre script Dockerfile, il me semble qu’il y a un « /php » en trop dans la ligne :
    RUN mv « $PHP_INI_DIR/php.ini-production » « $PHP_INI_DIR/php/php.ini »

    1. Bonjour, de rien, ça fait plaisir de voir que mes galères peuvent servir à d’autres 🙂 .
      Concernant ton problème, il se pourrait que ça vienne des droits qui sont différents. Dans le docker, www-data a pour uid et gid respectivement 33 et 33. Or, dans le répertoire « nextcloud » dans /volume1/Web, les droits par défaut sont admin:administrators; soit 999:999. Du coup, Apache (docker) n’y a pas accès. Il faut, dans le répertoire /volume1/Web, faire un :
      « chown -R 33:33 nextcloud », et c’est vrai pour tous les autres répertoires d’applications bien entendu.
      Pourquoi ne veux-tu pas utiliser nextcloud en docker ? C’est finalement très pratique, et tu peux y accéder avec un sous-domaine facilement. Personnellement je ne mets dans /volume1/Web que les applications pour lesquelles je ne souhaite pas accéder particulièrement par un sous-domaine.
      Merci pour l’erreur dans le script, je vais modifier ça.

      1. Rémi

        Merci pour l’info sur les droits et le retour rapide. Ca marche !

        Pour la question d’éviter de passer par Docker pour Nextcloud, c’est sans doute que je suis de la vieille école : Docker est pour moi avant tout fait pour du développement, pour tester des trucs un peu vite fait sans trop se prendre la tête sur les ressources. Mais en production, j’essaie autant que faire se peut d’éviter de lancer 25 serveurs web en parallèle, alors qu’un seul suffit (pour Nextcloud, pour plusieurs sites sous Drupal, etc).

        Docker est effectivement assez pratique quand on a réussi à le comprendre à peu près (non sans mal, c’est assez touffu), et la seule solution pour étendre les capacités d’un NAS, mais n’est pas optimal en termes de sobriété d’utilisation des ressources.

  2. Content de savoir que tu as résolu ton problème.
    J’avais la même vision que toi concernant Docker, et je réalise que finalement, c’est plutôt frugal en termes de ressources. Me concernant, il s’agit d’un AS6602T auquel j’ai ajouté 4 Go, soit 8 Go de RAM au total. J’ai 16 dockers qui tournent sur la machine, tournant avec les services natifs du NAS que j’ai activés (NFS, CIFS, ssh etc.). Dans ces conditions, seulement 25 à 30% de la RAM sont utilisées, donc ça consomme peu de ressources (idem pour l’utilisation du processeur qui est minime). Tiens, je ferai un petit post pour détailler un peu ça et « dédramatiser » l’utilisation de Docker 🙂 .
    Pour moi, le bénéfice obtenu / utilisation des ressources est clairement en faveur de Docker.
    J’ai aussi configuré l’abonnement aux post/commentaires, j’avais oublié de le faire, merci encore de me l’avoir fait remarquer.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *