Instalando o VestaCP no VPS, usando o docker para fazer o downgrade do PHP

Bom tempo!

Deixarei aqui uma solução para minha hospedagem no VPS por 5 euros, principalmente com o objetivo de preservar a implementação da solução para o meu problema.

Há alguns anos, aluguei um servidor dedicado para mais de 20 sites, um serviço de hospedagem de arquivos, um banco de dados no PostgreSQL para 1C, um servidor de email IMAP. Eu usei o ISPmanager com uma licença “perpétua” como painel de controle, o CentOS 7 (ou mesmo 6) foi usado como sistema operacional, o que eu realmente não respeito, gosto mais do Debian / Ubuntu. No futuro, os projetos foram para as redes sociais, os sites deixaram de ser necessários e os nomes de domínio foram liberados.

Em 2019, percebi que meu site e dois sites clientes estavam realmente girando, eu só precisava do IMAP para armazenar e-mails na hospedagem, os serviços de compartilhamento de arquivos também foram para os serviços em nuvem.



O que fazer se um site de hospedagem não funcionar com o PHP acima de 5.4

Decidi tentar limpar o projeto e implantá-lo em um VPS mais barato, com 40 GB de disco rígido, 2 CPUs, 4 RAM versus 8 núcleos i7, 750 SSD, 24 RAM.

A base do postgresql mudou-se para um mini computador i5 HP com 16 GB de RAM em um guarda-roupa em casa, criou o RouterOS no novo VPS no docker, configurou o L2TP e acessou através dos bancos de dados do túnel 1C a partir de outro VPS com o Windows 8.1 a bordo. Seria possível implantar o sistema operacional Windows em uma máquina em um guarda-roupa para esses fins, mas todos os scripts de serviço do PostgreSQL são aprimorados no Linux; subjetivamente, ele funciona mais rápido no Linux; existem clientes fora das minhas máquinas que hospedam o banco de dados.

Tão introdutório:

  1. O tamanho total de uma hospedagem de 30 GB, juntamente com o SO, sites e correio;
  2. Dados de backup na nuvem;
  3. Um site auto-escrito, dois no WP;
  4. Bancos de dados no MySQL;
  5. A capacidade de adicionar sites, conforme necessário;
  6. Controle mínimo no console ssh (precisa de um painel de controle do site);
  7. A capacidade de implantar um projeto em uma hospedagem (espaço livre e capacidade livre).

Depois de estudar as ofertas de painéis de controle gratuitos, decidi parar no VestaCP, embora fiquei um pouco surpreso que o CP não suporte as versões mais recentes das populares distribuições RedHat / Debian. Aqui está uma captura de tela no momento em que escrevo.Pelo



mínimo dos requisitos do sistema, tudo está ótimo com meu VPS.

Então, hetzner.cloud, crie um projeto, crie uma máquina CX21 nele.

O VestaCP coloca o proxy nginx no apache2, uma configuração é criada para cada site / usuário.

Não vou descrever todas as tentativas, apenas a final é o Debian 9.

Obtendo uma chave RSH SSH-2 usando o PuTTY
PuTTY puttygen SSH-2 RSA , Dropbox.

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

Atualizando o sistema:

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

Colocamos o VestaCP no Debian 9
.
Debian , exim - , «y» exim. - , :

/bin/bash vst-install-debian.sh

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


Depois de instalar o painel, fui imediatamente verificar o Firewall e fiquei surpreso ao saber que uma das regras permite acesso externo ao MySQL (o MariaDB está instalado).



Recomendo desabilitar imediatamente o acesso a esses serviços, minhas senhas bruteforce passaram cerca de 5 minutos após a instalação.

Verificamos a versão do PHP: 7.0.33 pronta para uso. Prossigo com o problema de fazer o downgrade do PHP para a versão 5.4.16 (foi decidido implantá-lo no antigo CentOS 7 hosting, 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

(Se você ainda não se registrou, é necessário se registrar no Docker Hub.

Primeiro, preencha o script do site no VestaCP e o banco de dados do site. O script está localizado por padrão: /home/site1/wev/site1.ru/public_html

No docker, criamos nossa própria versão do CentOS com base em centos padrão: 7. Trarei meu 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

Portanto, o que estou fazendo:

FROM centos: 7 - seleciono a instalação do docker hub
VOLUME / home / site1 - encaminho o diretório do SO para a máquina convidada do
EXPOSE 8082 - abro a porta httpd - 8082
RUN - executo o comando na máquina sem o console
RUN e limpe tudo - limpe tudo cache para que a máquina ocupe menos espaço.

Estou começando a criar minha própria imagem de janela de encaixe para o 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

e chegamos ao console (-it switch) da instância do docker criado.

Para chegar ao console da instância no futuro, eu uso o ID da máquina, que pode ser obtido com o comando
docker ps -a
tipo de "e8b6d6ef6c1a".

docker exec -it e8b6d6ef6c1a /bin/bash


e eu estou dentro.

No futuro, abandonei EXPOSE - não preciso abrir a porta do lado de fora, pois o nginx vê o site dentro da rede 172.17.0.0/24, na porta 8082 da instância do docker.

Chave

--restart always

diz à máquina para reiniciar sempre que o serviço Docker for reiniciado; se você esquecer, poderá fazer o seguinte:

docker update --restart always e8b6d6ef6c1a

Verifique se o encaminhamento do diretório do host está conectado:

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

Aqui estão as principais configurações da instância httpd enquanto estamos no 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>


Cada site VestaCP terá seu próprio diretório pessoal, site1.ru - test, por exemplo.

Em seguida, trataremos da execução automática do docker e da máquina nele, além disso, o systemctl comete um erro ao tentar iniciar o serviço httpd dentro da instância, partindo do 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é- crie um serviço para iniciar a inicialização do rc.local .

Devo dizer que todas as manipulações com as configurações do site são feitas a partir do VestaCP ou VPS, com uma ressalva: editando o nginx.conf para acessar o 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*;
}

Além disso, é uma questão técnica - conectamos o MySQL, configurando o arquivo de site correspondente contendo as configurações de conexão, indicando o endereço interno 172.17.0.1 do VPS principal, é claro, o banco de dados já deve estar implantado e o acesso a ele está configurado.

Como resultado, ao acessar o site site1.ru, tudo deve funcionar corretamente, caso contrário, em algum lugar do erro de configuração, verifique novamente.

Como todos os outros sites funcionam corretamente com o PHP 7.0, não descreverei a configuração do próprio VestaCP.

Assim, realizei as tarefas que estabeleci para mim. Deixarei fora do escopo deste artigo para descobrir o endereço IP da instância do docker 172.17.0.xxx, pings e outras coisas, eles não estão no DockerFile, instalei os pacotes correspondentes por meio do yum.

PS Ao longo do caminho, decidi implantar o RouterOS também no Docker, fiz um backup do arquivo de configuração do servidor L2TP do meu roteador doméstico, portanto, apenas o processo:

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

Adicionaremos o acesso ao winbox ao iptables via iptables.lst (adicionaremos uma porta de acesso semelhante à encaminhada ao criar 8728 e 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

e aplicável em VPS:

iptables-restore < iptables.lst

Encaminhar portas para instâncias que o docker faz ao inicializar a máquina, durante a atualização do docker ou você mesmo pode inseri-las através do firewall do iptables - é tudo sobre o gosto.

Em seguida, implantei a configuração do RouterOS, encaminhei as portas para acesso ao docker RouterOS, tudo funciona.

Não darei medições de desempenho, no momento tudo combina comigo e com os clientes. Se necessário, tomarei o próximo VPS com maior potência e RAM.

Obrigado por sua atenção, espero que alguém ajude o artigo a lidar rapidamente com o docker, e eu possa retornar depois de um tempo e relembrar todo o processo de instalação.

All Articles