Skip to content

Instantly share code, notes, and snippets.

@aliastim
Last active April 2, 2021 19:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aliastim/b5f38912248525a0dc21cab717361d7c to your computer and use it in GitHub Desktop.
Save aliastim/b5f38912248525a0dc21cab717361d7c to your computer and use it in GitHub Desktop.

Installer et déployer un site sur son propre serveur

Besoins

Besoins matériels

  • Carte Raspberry pi
  • Carte SD (au minimum 16Go)
  • Optionnel : Support de stockage pour le site web (Disque dur externe (SSD de préférence) ou clé USB)

Installations logiciels

  • OS : Raspberry Pi OS with desktop
  • Serveur Web : Nginx
  • PHP
  • Mysql/MariaDB

Gérer les risques

  • Un onduleur connecté à votre Raspberry permet d'éviter les risques de pertes et de dégâts dûs à des coupures de courant en programmant un arrêt propre et automatique du serveur
  • Demander à votre FAI (fournisseur d'accès à Internet) une adresse ip Fixe pour votre boxe internet. Dans le cas contraire, le lien entre le domaine et l'ip du serveur va se rompre, il faudra donc, le réindiquer à chaque changements, ce qui est contraignant.

Etape 1) Installer l'OS sur la carte SD

  • Télécharger l'image de l'OS sur Raspberrypi.org ( choisir 'Raspberry Pi OS with desktop' si l'on souhaite l'os avec interface graphique ou 'Raspberry Pi OS Lite' si l'on souhaite l'OS seul)
  • Télécharger le logiciel Etcher qui va nous permettre de flasher l'image de l'OS téléchargée au préalable sur la carte SD.
  • Sur Etcher, sélectionner l'image de l'OS téléchargée (que vous aurez décompressée au préalable), sélectionner ensuite la carte SD comme cible puis cliquer sur le bouton : 'Flash'.
  • Une fois le flash terminé, débrancher/rebrancher la carte SD, celle-ci va maintenant afficher 2 périphériques (un du nom de 'boot' et un second)
  • A partir d'un IDE (éditeur de texte), créer un fichier nommé 'ssh' sans extenstion et enregistrez-le dans le périphérique nommé 'boot'
  • Ejecter la carte SD
  • Insérer la carte SD dans la Raspberry Pi, raccorder cette dernière à internet avec un câble ethernet, puis brancher l'alimentation.

Etape 2) Initialiser la Raspberry Pi

  • Installer nginx :
sudo apt-get install nginx
  • Installer php et php-fpm (permet de faire la liaison entre php et nginx):
sudo apt-get install php php-fpm

Paramétrer votre site sur le raspberry

  • Créer un dossier pour le site à mettre en ligne :
sudo mkdir -p /var/www/nomdusite.domaine du site/

Exemple :

sudo mkdir -p /var/www/google.fr/
  • Entrer dans le répertoire :
cd /var/www/
  • Modifier les droits du dossier (voir pour créer un nouvel utilisateur plus bas) :
sudo chown -R nomdelutilisateur /var/www/nomdusite.domaine du site

Exemple (Pour donner accès à tous les utilisateurs sur la raspberry) :

sudo chown -R root:users /var/www/google.fr

Sur un logiciel ftp

  • Se connecter au serveur (protocole : sftp, hôte : adresse ip locale (ex : 192.168.1.27), port : 22, identifiant : l'utilisateur à qui on a donné les droits sur le dossier, mot de passe : celui de l'utilisateur)
  • Aller dans le dossier parent
  • Aller dans le dossier var puis le dossier www
  • Sélectionner le dossier du site
  • Créer un fichier index.php

Ajouter une entrée nginx vers le site (à faire pour chaque site)

  • Aller dans le dossier nginx :
cd /etc/nginx
  • Configurer le dossier sites-available
cd sites-available
  • Créer un nouveau fichier
sudo nano
  • Ecrire dans le fichier :
server {
    listen: 80;
    listen [::]:80;
    
    root /var/www/nomdusite.domaine du site;
    index index.php index.html index.html index.php;
    serveur_name nomdusite.domaine du site;
    
    location ~\.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
    }
    
    location / {
        try_files $uri $uri/ =404;
    }
    
    error_page 404 /404.php;
}

⚠️ ATTENTION à bien respecter les espaces et tabulations

  • Sauvegarder le fichier avec un ctrl + X
  • Revenir dans le dossier nginx :
cd /etc/nginx
  • Créer un lien symbolique dans sites-enabled (Permer de copier le fichier en le liant au premier, si on modifie un fichier, l'autre est automatiquement modifié) :
ln -s /etc/nginx/sites-available/nomdusite.domaine du site /etc/nginx/sites-enabled
  • Revenir à la racine avec cd

  • Recharger nginx pour qu'il prenne les changements en considération :

sudo systemctl reload nginx

Etape 3) Configurer l'IP de vos sites (à faire une seule fois par raspberry)

Cette étape permet d'ouvrir une passerelle entre internet et un appareil du réseau privé, ici la raspberry

  • Se connecter aux paramètres de votre box internet (en général accessible en tapant l'ip locale de la box)
  • Puis copiez votre ip publique (chez orange dans 'Informations système' > onglet 'Internet' > 'IPv4 WAN'), celle-ci correspond à l'adresse qui va menez à la box sur laquelle sont reliés vos sites.
  • Reliez votre domaine à votre adresse publique IPv4.
  • Mettre le TTL à la durée la plus courte.
  • Sur les paramètres de votre box, ajoutez une passerelle extérieure vers la Raspberry. (Chez orange, dans 'Réseau' > 'NAT/PAT' > Créer une nouvelle règle).
  • Sur cette nouvelle règle, sélectionnez 'http', laisser les ports 80 80 indiqués par défaut, sélectionnez 'TCP' puis sélectionnez la raspberry.

(Résumé) Pour créer un nouveau site sur la raspberry

    1. Créer un dossier pour le site à mettre en ligne :
sudo mkdir -p /var/www/nomdusite.domaine du site/

Exemple :

sudo mkdir -p /var/www/google.fr/
  • Entrer dans le répertoire :
cd /var/www/
    1. Modifier les droits du dossier (voir pour créer un nouvel utilisateur plus bas) :
sudo chown -R nomdelutilisateur /var/www/nomdusite.domaine du site
    1. Aller dans le dossier dossier sites-available de nginx :
cd /etc/nginx/sites-available
    1. Créer un nouveau fichier (qui sera nommé ensuite nomdusite.domaine du site) :
sudo nano
    1. Ecrire dans le fichier :
server {
    listen: 80;
    listen [::]:80;
    
    root /var/www/nomdusite.domaine du site;
    index index.php index.html index.html index.php;
    serveur_name nomdusite.domaine du site;
    
    location ~\.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
    }
    
    location / {
        try_files $uri $uri/ =404;
    }
    
    error_page 404 /404.php;
}

⚠️ ATTENTION à bien respecter les espaces et tabulations

  • Sauvegarder le fichier avec un ctrl + X
  • Revenir dans le dossier nginx :
cd /etc/nginx
    1. Créer un lien symbolique dans sites-enabled (Permer de copier le fichier en le liant au premier, si on modifie un fichier, l'autre est automatiquement modifié) :
ln -s /etc/nginx/sites-available/nomdusite.domaine du site /etc/nginx/sites-enabled
  • Revenir à la racine avec cd

    1. Recharger nginx pour qu'il prenne les changements en considération :
sudo systemctl reload nginx

Pour sécuriser son site :

Sur les paramètres de sa box internet, ouvrir une passerelle https vers la raspberry.

Créer la clé ssl :

cd /etc/nginx/certificate
openssl req -new -newkey rsa:4096 -x509 -sha256 -days 365 -nodes -out nginx-certificate.crt -keyout nginx.key

Ajouter dans le fichier server du site les lignes :

server {
        listen 443 ssl;
        listen [::]:443 ssl;
        ssl_certificate /etc/nginx/certificate/nginx-certificate.crt;
        ssl_certificate_key /etc/nginx/certificate/nginx.key;
        root /var/www/nomdusite.domaine du site;
        index index.php index.html index.htm;
        serveur_name nomdusite.domaine du site;
        
        location ~\.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
        }
        
        location / {
                try_files $uri $uri/ =404;
        }
        
        error_page 404 /404.php;
}

Configurer mysql et créer des bases de données

Pour installer mysql (NE PAS INSTALLER PHP, APACHE ET PHPMYADMIN): Suivre ces étapes

Pour configurer mysql Suivre ces étapes

Créer une nouvelle table

  • Se connecter à mysql
mysql -u root -p
  • Créer la table
CREATE DATABASE nomdelatable;
  • Donner les droits à un utilisateur pour cette table :
GRANT ALL PRIVILEGES ON nomdelatable.* TO nomdelutilisateur@'%' IDENTIFIED BY 'motdepassedelutilisateur';

⁉️ A savoir que si l'utilisateur n'existe pas, il sera automatiquement créé.

  • Demander à mysql de prendre en compte les changements de privilèges :
flush privileges;

Bonus

Pour vérifier la mémoire utilisée et restante :

df -h

Pour se mettre en sudo sur toutes les prochaines commandes :

sudo su root

Pour créer un nouvel utilisateur (On ne peut normalement pas se connecter au serveur avec un logiciel ftp, si le nom de l'utilisateur est 'root') :

sudo adduser nomdutilisateur
sudo passwd nomdutilisateur

Pour se connecter avec ce nom d'utilisateur :

su nomdutilisateur

L'utilisateur administrateur par défaut sur raspberry est 'pi', pour se reconnecter comme 'pi' :

su pi

Pour détecter les appareils conncectés à la raspberry :

fdisk -l 
  • Pour affecter un appareil externe à un dossier sur la raspberry :

Créer le dossier qui pointera vers l'appareil sur la raspberry

mkdir /home/shares/public/usb

Relier l'appareil au dossier

mount cheminverslappareil cheminversledossierraspberry

Exemple :

mount /dev/sda1 /home/shares/public/usb

Donner les droits du dossier à un propriétaire :

sudo chown -R nomdelutilisateur /home/shares/public/usb

Pour donner tous les droits d'administrateur à un utilisateur :

Accéder au fichier de configuration de sudo

sudo visudo

Ajouter les deux lignes suivantes :

pi ALL=(ALL) NOPASSWD: ALL
nomdelutilisateur ALL=(ALL) NOPASSWD: ALL

Pour supprimer un utilisateur et son dossier sur le raspberry :

sudo deluser --remove-home nomdelutilisateur

Toutes les commandes sur les utilisateurs

Relier le nom de domaine (côté hébergeur) à l'adresse IP de la raspberry (côté serveur)

Pour connaitre son adresse IP Publique : Site ou alors sur les paramètres de sa box :prendre l'IPV4 wan.

Rafrîchir le cache :

  • Vérifier que la ligne "sendfile" de nginx.conf soit à 'off'
  • Si ce n'est pas le cas, le mettre à off et lancer un sudo systemctl reload nginx
  • Puis sur la page du site web sur le navigateur du serveur, faire un ctrl+ shift= R

sources :

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment