Installer VestaCP sur VPS, en utilisant Docker pour rétrograder PHP

Bon temps!

Je vais laisser ici une solution pour mon hébergement sur VPS pour 5 euros, principalement dans le but de conserver la mise en place de la solution à mon problème.

Il y a quelques années, j'ai loué un serveur dédié pour plus de 20 sites, un service d'hébergement de fichiers, une base de données sur PostgreSQL pour 1C, un serveur de messagerie IMAP. J'ai utilisé ISPmanager avec une licence «perpétuelle» car le panneau de contrôle, CentOS 7 (ou même 6) a été utilisé comme OS, ce que je ne respecte pas vraiment, j'aime plus Debian / Ubuntu. À l'avenir, les projets sont allés sur les réseaux sociaux, les sites ont cessé d'être nécessaires, les noms de domaine ont été libérés.

En 2019, j'ai réalisé que mon site et deux sites clients tournaient vraiment, je n'avais besoin que d'IMAP avec le stockage des e-mails sur l'hébergement, les services de partage de fichiers sont également passés aux services cloud.



Que faire si un site d'hébergement ne fonctionne pas avec PHP au-dessus de 5.4

J'ai décidé d'essayer de nettoyer le projet et de le déployer sur un VPS moins cher avec un disque dur de 40 Go, 2 processeurs, 4 RAM contre 8 cœurs i7, 750 SSD, 24 RAM.

La base postgresql est passée à un mini-ordinateur i5 HP avec 16 Go de RAM sur une armoire à la maison, a installé RouterOS dans le nouveau VPS dans Docker, configuré L2TP et accédé via les bases de données du tunnel 1C à partir d'un autre VPS avec Windows 8.1 à bord. Il serait possible de déployer Windows OS sur une machine sur une armoire à ces fins, mais tous les scripts de service PostgreSQL sont affinés sous Linux, subjectivement, cela fonctionne plus rapidement sous Linux, il y a des clients en dehors de mes machines hébergeant la base de données.

Alors introduction:

  1. La taille totale sur un hébergement de 30 Go avec OS, sites et courrier;
  2. Sauvegarder les données dans le cloud;
  3. Un site auto-écrit, deux sur WP;
  4. Bases de données dans MySQL;
  5. La possibilité d'ajouter des sites au besoin;
  6. Contrôle minimum dans la console ssh (besoin d'un panneau de contrôle de site);
  7. La possibilité de déployer un projet sur un hébergement (espace libre et capacité libre).

Après avoir étudié les offres de panneaux de contrôle gratuits, j'ai décidé de m'arrêter à VestaCP, bien que j'étais quelque peu surpris que CP ne prenne pas en charge les dernières versions des distributions RedHat / Debian populaires. Voici une capture d'écran au moment de la rédaction.



Par la configuration minimale requise, tout va bien avec mon VPS.

Alors, hetzner.cloud, créez un projet, créez une machine CX21 dedans.

VestaCP met le proxy nginx à apache2, une configuration est créée pour chaque site / utilisateur.

Je ne décrirai pas toutes les tentatives, seule la dernière est Debian 9.

Obtention d'une clé RSA SSH-2 à l'aide de PuTTY
PuTTY puttygen SSH-2 RSA , Dropbox.

Acess hetzner.cloud RSA, PuTTY SSH-> ( PuTTY RUS) Dropbox. .

Mise à jour du système:

apt-get update -y
apt-get upgrade -y 
apt-get install mc -y
reboot

Nous avons mis VestaCP sur Debian 9
.
Debian , exim - , «y» exim. - , :

/bin/bash vst-install-debian.sh

— VestaCP http://:8083/ admin password, .


Après avoir installé le panneau, je suis immédiatement allé vérifier le pare-feu et j'ai été surpris qu'une des règles autorise l'accès externe à MySQL (MariaDB est installé).



Je recommande de désactiver immédiatement l'accès à ces services, mes mots de passe de force brute sont allés environ 5 minutes après l'installation.

Nous vérifions la version de PHP: 7.0.33 hors de la boîte. Je procède à la résolution du problème de rétrogradation de PHP vers 5.4.16 (il a été décidé de le déployer sur l'ancien hébergement CentOS 7, epel, httpd + php:

wget https://download.docker.com/linux/debian/gpg
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
echo "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee -a /etc/apt/sources.list.d/docker.list
apt-get install docker-ce
systemctl enable docker
docker login

(Si vous n'êtes pas encore inscrit, vous devez vous inscrire dans le Docker Hub.

Tout d'abord, remplissez le script du site dans VestaCP et la base de données du site. Le script se trouve par défaut: /home/site1/wev/site1.ru/public_html

Dans docker, nous créons notre propre version CentOS basée sur centos par défaut: 7. J'apporterai mon DockerFile:

FROM centos:7
MAINTAINER Dmitry Luponos <info@adm55.ru>
VOLUME /home/site1
EXPOSE 8082
RUN yum update -y && yum install mc -y
RUN yum install epel-release -y
RUN yum install yum-utils -y
RUN yum-config-manager --disable remi-safe
RUN yum-config-manager --enable remi
RUN yum-config-manager --enable remi-php54
RUN yum install -y httpd
RUN yum install php-fpm php-cli php-mysqlnd php-gd php-ldap php-odbc php-pdo php-pecl-memcache php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap php-zip php-opcache php-imap php php-cli php-fpm php-mysqlnd php-zip php-devel php-gd php-mcrypt php-mbstring php-curl php-xml php-pear php-bcmath php-json -y
RUN yum clean all

Alors, que fais-je:

FROM centos: 7 - Je sélectionne l'installation du docker hub
VOLUME / home / site1 - Je transfère le répertoire du système d'exploitation vers la machine invitée
EXPOSE 8082 - J'ouvre le port httpd - 8082
RUN - J'exécute la commande dans la machine sans la console
RUN yum clean all - Je désactive cache pour que la machine occupe moins d'espace.

Je commence à créer ma propre image docker pour CentOS 7:

docker pull centos:7
cd /<  Dockerfile>
docker build -t bessome/centos:7 . 
docker run -it --name centphp54 --expose 8082 --restart always -v /home/site1:/home/site1 bessome/centos7:php54 /bin/bash

et nous arrivons à la console (-it switch) de l'instance de docker créée.

Pour accéder à la console d'instance à l'avenir, j'utilise l'ID de la machine, qui peut être obtenu avec la commande
docker ps -a
sorte de "e8b6d6ef6c1a".

docker exec -it e8b6d6ef6c1a /bin/bash


et je suis à l'intérieur.

À l'avenir, j'ai refusé EXPOSE - Je n'ai pas besoin d'ouvrir le port à l'extérieur, il convient que nginx voit le site à l'intérieur du réseau 172.17.0.0/24, sur le port 8082 de l'instance de docker.

Clé

--restart always

indique à la machine de redémarrer toujours lorsque le service Docker est redémarré, si vous oubliez, vous pouvez le faire:

docker update --restart always e8b6d6ef6c1a

Vérifiez si la redirection du répertoire hôte est accrochée:

ls /home/site1
[root@e8b6d6ef6c1a centos.docker]# cd /home/site1
[root@e8b6d6ef6c1a centos.docker]# ls
conf  mail  tmp  web
du -sh
418M    .

Voici les paramètres clés de l'instance httpd lorsque nous sommes dans la console:
httpd.conf:
Listen 8082
IncludeOptional conf.d/*.conf

/home/site1/conf /etc/httpd/conf.d/site1.conf:

<VirtualHost *:8082>

    ServerName site1.ru
    ServerAlias www.site1.ru
    ServerAdmin info@site1.ru
    AddDefaultCharset off
    DocumentRoot /home/site1/web/site1.ru/public_html
    ScriptAlias /cgi-bin/ /home/site1/web/site1.ru/cgi-bin/
    Alias /vstats/ /home/site1/web/site1.ru/stats/
    Alias /error/ /home/site1/web/site1.ru/document_errors/
    <FilesMatch "\.ph(p[3-5]?|tml)$">
        SetHandler application/x-httpd-php
    </FilesMatch>
    DirectoryIndex index.html index.php
    <FilesMatch "\.phps$">
        SetHandler application/x-httpd-php-source
    </FilesMatch>
    <Directory /home/site1/web/site1.ru/public_html>
        AllowOverride All
        Require all granted
        Options +Includes -Indexes +ExecCGI
        php_admin_value open_basedir /home/tehnolit/web/site1.ru/public_html:/home/site1/tmp
        php_admin_value upload_tmp_dir /home/site1/tmp
        php_admin_value session.save_path /home/site1/tmp
        php_admin_flag engine on
    </Directory>
    <Directory /home/site1/web/site1.ru/stats>
        AllowOverride All
    </Directory>

    IncludeOptional /home/site1/conf/web/apache2.site1.ru.conf*

</VirtualHost>


Chaque site VestaCP aura son propre répertoire personnel, site1.ru - test, par exemple.

Ensuite, nous traiterons de l'exécution automatique de docker et de la machine, en outre, systemctl donne une erreur lors de la tentative de démarrage du service httpd à l'intérieur de l'instance, nous partons de rc.local VPS:

 cat rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

docker exec 5473051a7b3c /usr/sbin/httpd
/opt/mpr-start
iptables-restore < /usr/src/iptables.lst

exit 0

Pré- créez un service pour démarrer le démarrage rc.local .

Je dois dire que toutes les manipulations avec les paramètres du site sont faites à partir de VestaCP ou VPS, avec une mise en garde: éditer nginx.conf pour accéder à httpd CentOS7:

server {
    listen      <IP-VPS>:80;
    server_name site1.ru www.site1.ru;
    error_log  /var/log/apache2/domains/site1.ru.error.log error;

    location / {
#   docker : 
        proxy_pass      http://172.17.0.2:8082;
        location ~* ^.+\.(jpeg|jpg|png|gif|bmp|ico|svg|tif|tiff|css|js|htm|html|ttf|otf|webp|woff|txt|csv|rtf|doc|docx|xls|xlsx|ppt|pptx|odf|odp|ods|odt|pdf|psd|ai|eot|eps|ps|zip|tar|tgz|gz|rar|bz2|7z|aac|m4a|mp3|mp4|ogg|wav|wma|3gp|avi|flv|m4v|mkv|mov|mpeg|mpg|wmv|exe|iso|dmg|swf)$ {
            root           /home/site1/web/site1.ru/public_html;
            access_log     /var/log/apache2/domains/site1.ru.log combined;
            access_log     /var/log/apache2/domains/site1.ru.bytes bytes;
            expires        max;
            try_files      $uri @fallback;
        }
    }

    location /error/ {
        alias   /home/site1/web/site1.ru/document_errors/;
    }

    location @fallback {
#   docker : 
        proxy_pass      http://172.17.0.2:8082;
    }

    location ~ /\.ht    {return 404;}
    location ~ /\.svn/  {return 404;}
    location ~ /\.git/  {return 404;}
    location ~ /\.hg/   {return 404;}
    location ~ /\.bzr/  {return 404;}

    include /home/site1/conf/web/nginx.site1.ru.conf*;
}

De plus, c'est une question technique - nous nous connectons à MySQL, configurant le fichier de site correspondant contenant les paramètres de connexion, indiquant l'adresse interne 172.17.0.1 du VPS principal, bien sûr, la base de données doit déjà être déployée et l'accès y est configuré.

Par conséquent, lors de l'accès au site site1.ru, tout devrait fonctionner correctement, sinon, quelque part l'erreur de configuration s'est glissée, vérifiez à nouveau.

Tous les autres sites fonctionnent correctement avec PHP 7.0, donc je ne décrirai pas la configuration de VestaCP lui-même.

J'ai ainsi réalisé les tâches que je m'étais fixées. Je vais laisser en dehors du champ d'application de cet article pour trouver l'adresse IP de l'instance de docker 172.17.0.xxx, des pings et d'autres choses, ils ne sont pas dans le DockerFile, j'ai installé les packages correspondants via yum.

PS En cours de route, j'ai décidé de déployer RouterOS dans Docker également, j'avais une sauvegarde du fichier de configuration du serveur L2TP à partir de mon routeur domestique, donc seul le processus:

docker pull evilfreelancer/docker-routeros
docker run -d -p 22202:22 -p 8728:8728 -p 8729:8729 -p 5900:5900 --restart always -ti evilfreelancer/docker-routeros

iptables-save > iptables.lst

Nous ajouterons l'accès à winbox à iptables via iptables.lst (nous ajouterons un port d'accès similaire à ceux transmis lors de la création des 8728 et 5900):

-A INPUT -p tcp -m tcp --dport 8291 -j ACCEPT
-A DOCKER -d 172.17.0.3/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 8291 -j ACCEPT
-A POSTROUTING -s 172.17.0.3/32 -d 172.17.0.3/32 -p tcp -m tcp --dport 8291 -j MASQUERADE
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 8291 -j DNAT --to-destination 172.17.0.3:8291

et applicable en VPS:

iptables-restore < iptables.lst

Transférer les ports aux instances que docker crée lors de l'initialisation de la machine, lors de la mise à jour du docker, ou vous pouvez les saisir vous-même via le pare-feu iptables - tout est une question de goût.

Ensuite, j'ai déployé la configuration RouterOS, transféré les ports pour l'accès à l'intérieur du docker RouterOS, tout fonctionne.

Je ne donnerai pas de mesure de performance, pour le moment tout me convient, moi et les clients. Si nécessaire, je prendrai le prochain VPS avec une augmentation de puissance et de RAM.

Merci de votre attention, j'espère que quelqu'un pourra aider l'article à traiter rapidement Docker, et je pourrai y revenir après un certain temps et rappeler l'ensemble du processus d'installation.

All Articles