Automatiser la création d’un virtual host sur Manjaro

Plutôt que d’éditer manuellement chaque fichier pour configurer un nouveau « virtual host » Apache, j’ai créé un script Bash me permettant d’automatiser la procédure. En l’état, le script ne fonctionne que pour Manjaro (et les distributions utilisant httpd plutôt que apache2 sûrement) ; vous pouvez le modifier.

Mise en garde

Je partage ce script, mais je vous conseille de savoir ce que vous faites avant de l’exécuter. Voici, plusieurs recommandations :

  • le script est destiné à un usage local, je vous déconseille de l’utiliser sur un serveur en production
  • apprenez à créer un vhost manuellement, de cette manière vous saurez comment supprimer votre « virtual host »
  • le script n’a été testé que sur Manjaro, je ne sais pas si les chemins spécifiés seront les mêmes sur votre distribution

Utilisation

Pour pouvoir accorder les droits nécessaires et éditer les fichiers de configuration, le script doit être exécuté avec les droits d’administrateurs.

sudo sh newvhost.sh

Le script va d’abord vérifier qu’Apache (httpd, et non apache2) et mkcert sont bien installés sur votre système. Puis, il va vous demander votre nom d’utilisateur. Ce dernier permet d’accorder les bons droits au répertoire créé. Ensuite, il va vous demander où vous souhaitez créer le dossier du « virtual host ». Par exemple, si vous avez un espace de travail ayant pour chemin /home/nomdutilisateur/Sites, c’est le chemin à indiquer. Enfin, il va vous demander le nom du « virtual host » à créer sous le format domain.tld (exemple : monsite.test).

Si toutes les informations ont correctement été saisies, le script va :

  • créer un fichier de configuration dans Apache pour ce vhost et l’inclure dans le fichier de configuration d’Apache
  • créer un dossier pour le vhost dans le dossier de travail que vous avez indiqué, ainsi que deux autres dossiers : htdocs (le dossier public) et logs (pour les logs d’accès et d’erreurs)
  • donner les droits pour votre utilisateur à ce dossier
  • créer un lien virtuel entre ce dossier et le répertoire Apache /srv/http
  • créer un dossier pour les certificats locaux s’il n’existe pas
  • générer un certificat pour votre « virtual host » (pour pouvoir y accéder en HTTPS)
  • ajouter une ligne dans le fichier /etc/hosts pour pouvoir accéder à votre site en saisissant le nom de domaine choisi.
  • redémarrer Apache s’il était déjà en cours d’exécution

Le script Bash

#! /bin/bash
# newvhost.sh
# Script to create a new vhost in Apache.
# Originally written by Armand Philippot <contact@armandphilippot.com>.

echo -e "Ce script permet de créer de manière automatisée un nouveau vhost dans Apache.\n"
echo -e "Le script doit être exécuté avec les droits d'administrateur (sudo).\n"
echo -e "Il est préférable d'utiliser ce script uniquement pour un environnement de développement local.\n"

# We are testing whether Apache is installed. If it is not, we stop the script.
if command -v httpd &>/dev/null; then
  echo -e "Apache est bien installé, poursuivons."
else
  echo -e "Apache n'est pas installé.\n"
  exit 2
fi

if command -v mkcert &>/dev/null; then
  echo -e "mkcert est bien installé, poursuivons.\n"
else
  echo -e "mkcert n'est pas installé. Il est nécessaire pour générer l'accès au site en https. Veuillez l'installer puis réessayer.\n"
  exit -2
fi

# We ask for the username to grant the correct permissions to the created folders.
read -p "Saisir votre nom d'utilisateur : " _username

read -p 'Saisir le chemin du dossier de travail : ' _basedir
if [ -d "$_basedir" ]; then
  echo -e "Le dossier existe, poursuivons.\n"
  [[ "${_basedir}" != */ ]] && _basedir="${_basedir}/"
else
  until [ -d "$_basedir" ]; do
    echo -e "Le dossier n'existe pas. Veuillez saisir un chemin valide.\n"
    read -p 'Saisir le chemin du dossier de travail : ' _basedir
  done
fi

# We ask for the name to use to create the virtual host (preferably with a TLD).
read -p 'Saisir le nom du vhost à créer : ' _vhost

# We create the configuration file for the virtual host then we create the working folders. We grand correct permissions and we create a symlink in Apache folder.
if command -v httpd &>/dev/null; then
  if [ -d "/etc/httpd/conf/vhosts/$_vhost" ]; then
    echo -e "Le vhost existe déjà.\n"
    exit 2
  else
    cat <<-EOF >/etc/httpd/conf/vhosts/${_vhost}
<VirtualHost *:80>
    ServerAdmin webmaster@${_vhost}
    DocumentRoot "/srv/http/${_vhost}/htdocs/"
    ServerName www.${_vhost}
    ServerAlias *.${_vhost}
    ErrorLog "/srv/http/${_vhost}/logs/error.log"
    CustomLog "/srv/http/${_vhost}/logs/access.log" combined
    <Directory /srv/http/${_vhost}/htdocs/>
        Options -Indexes +FollowSymLinks +MultiViews
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

<VirtualHost *:443>
    ServerAdmin webmaster@${_vhost}
    DocumentRoot "/srv/http/${_vhost}/htdocs/"
    ServerName www.${_vhost}:443
    ServerAlias *.${_vhost}:443
    SSLEngine on
    SSLCertificateFile "/home/${_username}/.local-certificates/${_vhost}.pem"
    SSLCertificateKeyFile "/home/${_username}/.local-certificates/${_vhost}-key.pem"
    ErrorLog "/srv/http/${_vhost}/logs/error.log"
    CustomLog "/srv/http/${_vhost}/logs/access.log" combined
    <Directory /srv/http/${_vhost}/htdocs/>
        Options -Indexes +FollowSymLinks +MultiViews
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
EOF
    mkdir -p "${_basedir}/${_vhost}/htdocs"
    mkdir -p "${_basedir}/${_vhost}/logs"
    chown -R ${_username}:${_username} ${_basedir}/${_vhost}
    chmod -R 755 ${_basedir}/${_vhost}
    ln -s ${_basedir}${_vhost}/ /srv/http/
    echo "Include conf/vhosts/${_vhost}" >>/etc/httpd/conf/httpd.conf
    mkdir -p "/home/${_username}/.local-certificates"
    mkcert -cert-file /home/${_username}/.local-certificates/${_vhost}.pem -key-file /home/${_username}/.local-certificates/${_vhost}-key.pem ${_vhost} *.${_vhost}
  fi
fi

# We add a line in the hosts file.
echo "127.0.0.1 www.${_vhost}" >>/etc/hosts
echo -e "Le vhost et les répertoires correspondants ont été créés.\n"

# We display the folders so that the user can verify the creation of the virtual host.
if command -v httpd &>/dev/null; then
  ls /srv/http/
fi
echo -e "\nVous pouvez y accéder en saisissant ${_vhost} ou www.${_vhost} dans votre navigateur.\n"

# If Apache is running, we restart it.
systemctl is-active --quiet httpd && echo -e "Nous redémarrons Apache.\n" && systemctl restart httpd

echo -e "Fin du script.\n"

Vous pouvez également le récupérer sur mon gist Github ou Gitlab.

Laisser un commentaire

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

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.