Оставлю тут решение для своего хостинга на VPS за 5 евро, в основном с целью сохранить реализацию решения по своей проблеме.
Несколько лет назад я арендовал выделенный сервер под 20+ сайтов, файлообменник, базу даных на PostgreSQL для 1С, почтовый сервер IMAP. В качестве панели управления использовал ISPmanager с «вечной» лицензией, в качестве ОС был использован изначально CentOS 7 (или даже 6), который я не очень уважаю, больше нравится Debian/Ubuntu. В дальнейшем проекты уходили в соцсети, сайты переставали быть необходимыми, доменные имена освобождались.
В 2019 году я понял, что реально крутится мой сайт и два сайта клиентов, потребность в IMAP с хранением писем на хостинге только у меня, файлообменники так же ушли в облачные сервисы.
Что делать, если один сайт на хостинге не работает с PHP выше 5.4
Решил попробовать почистить проект и развернуть его на более дешевом VPS с 40Гб hdd, 2 CPU, 4ОЗУ против 8 ядер i7, 750 SSD, 24ОЗУ.
База postgresql переехала на i5 HP мини компьютер с 16Гб ОЗУ на платяной шкаф дома, в новом VPS в docker завел RouterOS, настроил L2TP и получаю доступ через туннель к базам данных 1С из другого VPS с Windows 8.1 на борту. Можно было бы развернуть ОС Windows на машине на платяном шкафу под эти цели, но все скрипты обслуживания PostgreSQL заточены под Linux, субъективно он быстрее отрабатывает под Linux, есть клиенты вне моих машин на хостинг базы данных.
Итак вводная:
- Итоговый размер на хостинге 30Гб вместе с ОС, сайтами и почтой;
- Бекап данных в облако;
- Один сайт самописный, два на WP;
- Базы в MySQL;
- Возможность добавлять сайты по необходимости;
- Минимально управлять в консоли ssh (нужна панель управления сайтами);
- Возможность развернуть какой-либо проект на хостинге (свободное место и свободная мощность).
После изучения предложений по бесплатным панелям управления решил остановиться на VestaCP, хотя несколько удивлен, что CP не поддерживает последние версии популярных RedHat/Debian дистрибутивов. Привожу скриншот на момент написания статьи
По минимальным требованиям к системе с моей VPS все здорово.
Итак, hetzner.cloud, создаю проект (project), в нем машина CX21, создать.
VestaCP ставит nginx proxy к apache2, конфиг создается для каждого сайта/пользователя.
Не буду описывать все попытки, только финальная — Debian 9.
В разделе Acess проекта hetzner.cloud добавляю отпечаток ключа RSA, указываю в самом PuTTY в настройках доступа в разделе SSH->Аутентификация (у меня PuTTY RUS) файл с ключом идентификации из Dropbox. В результате получаю доступ к консоли машины.
Обновляем систему:
apt-get update -y
apt-get upgrade -y
apt-get install mc -y
reboot
В Debian установщик ругнулся на то, что exim по-умолчанию имеет конфигурацию, выбрал «y» в пункте продолжать с модификацией exim. Правда сначала почему-то меня выкинуло из установщика, пришлось скрипт запускать еще раз:
/bin/bash vst-install-debian.sh
Второй момент — в конце установки VestaCP дала табличку с настройкой доступа http://:8083/ admin password, нужно сохранить эти данные.
После инсталляции панели сразу пошел проверять Firewall и был удивлен, что одно из правил разрешает доступ извне к MySQL (ставится MariaDB).
Рекомендую сразу отключать доступы к таким сервисам, у меня брутфорс паролей пошел минут через 5 после инсталляции.
Проверяем версию PHP: 7.0.33 из коробки. Перехожу к решению задачи по понижению версии PHP до 5.4.16(решено было развернуть как на старом хостинге CentOS 7, epel, httpd + php:
wget https://download.docker.com/linux/debian/gpg
sudo apt-key add gpg
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
(если еще не зарегистрированы, то нужно зарегистрироваться в Докер Хаб
Предварительно заливаем скрипт сайта в VestaCP и базу данных для сайта. Скрипт расположен по-умолчанию: /home/site1/wev/site1.ru/public_html
В docker создаем собственный релиз CentOS на базе default centos:7. Приведу свой 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
Итак, что я делаю:
FROM centos:7 — выбираю инсталляцию docker hub
VOLUME /home/site1 — пробрасываю директорию из ОС в гостевую машину
EXPOSE 8082 — открываю порт httpd — 8082
RUN — запускаю в машине команду без консоли
RUN yum clean all — очищаю кэш, чтобы машина занимала меньше места.
Приступаю к созданию собственного образа docker для 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
и попадаем в консоль (ключ -it) созданного инстанса docker.
Чтобы в дальнейшем попадать в консоль инстанса я использую ID машины, который можно получить командой
docker ps -a
вида «e8b6d6ef6c1a». docker exec -it e8b6d6ef6c1a /bin/bash
и я внутри.
В дальнейшем я отказался от EXPOSE — мне не надо открывать порт наружу, устраивает что nginx видит сайт внутри сети 172.17.0.0/24, на порту 8082 инстанса docker.
Ключ
--restart always
указывает машине рестартовать всегда при перезапуске службы Docker, если забыли то можно так:
docker update --restart always e8b6d6ef6c1a
Проверяем, зацепился ли проброс директории хоста:
ls /home/site1
[root@e8b6d6ef6c1a centos.docker]# cd /home/site1
[root@e8b6d6ef6c1a centos.docker]# ls
conf mail tmp web
du -sh
418M .
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>
У каждого сайта VestaCP будет своя домашняя директория, site1.ru — тестовая, для примера.
Далее разберемся с автозапуском docker и машины в нем, кроме того systemctl выдает ошибку при попытке запустить службу httpd внутри инстанса, стартуем из 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
Предварительно создав службу для старта rc.local при загрузке.
Нужно сказать, что все манипуляции с настройками сайта производятся из VestaCP или VPS, с одной оговоркой: правка nginx.conf для доступа к 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*;
}
Далее дело техники — зацепляемся к MySQL, настраивая соответствующий файл сайта, содержащий настройки подключения, с указанием внутреннего адреса 172.17.0.1 головной VPS, естественно база должна быть уже развернута и доступ к ней настроен.
В результате, при обращении к сайту site1.ru все должно работать штатно, если нет, то где-то закралась ошибка настроек, перепроверяем.
Все остальные сайты работают с PHP 7.0 корректно, поэтому не буду описывать настройку самой VestaCP.
Таким образом, я достиг задач, которые ставил перед собой. Оставлю за рамками этой статьи выяснение ip-адреса 172.17.0.ххх инстанса docker, пинги и прочие моменты, их в DockerFile нет, ставил через yum соответствующие пакеты.
P.S. Попутно решил развернуть RouterOS так же в Docker, бекап конфигурационного файла сервера L2TP с домашнего роутера у меня был, так что только процесс:
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
Внесем в iptables через iptables.lst доступ для winbox (добавим порт доступа по аналогии с проброшенными при создании 8728 и 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
и применим в VPS:
iptables-restore < iptables.lst
Пробросы портов до инстансов docker делает при инициализации машины, при docker update, либо можно вписать их самому через файрволл iptables — все дело во вкусе.
Далее развернул конфигурацию RouterOS, пробросил порты для доступа внутрь docker RouterOS, все работает.
Замеров производительности приводить не буду, на данный момент меня и клиентов все устраивает. Если потребуется, возьму следующий VPS с увеличением мощности и ОЗУ.
Спасибо за внимание, надеюсь кому-либо статья поможет быстро разобраться с docker, а я к ней смогу вернуться через некоторое время и воскресить в памяти весь процесс установки.
OleksiyT
Танцы с бубном плюс панель, которая может сломаться от следующего обновления ОС?
Вас кто-то заставил либо это тема контрольной?
Поставьте себе cwp и войдите наконец в 2020.
Там есть всё, что нужно и даже больше: разные вэбсервера, версии php, почта, базы и пр. вплоть до кеширования и кластеризации.
Всё прямо из коробки.
Lopar
Я не знаю. Я пробовал много разного, в том числе и Весту и CWP. И практически всё что попадалось «спонтанно-нестабильно». То есть здорово работает, но порой чебучит такие коленца, что от мата взлетают голуби с соседних крыш.
Не так давно я похоронил весту на Centos7, потому что вышел CentOS8, release репозитории стали смотреть немного не туда и обновления помахали мне ручкой. При смене конфига yum, на previous-release Веста надавала мне по рукам за «неизместные, неправильные параметры в конфиге», попробовала всё откатить и встала наглухо. Ребут добил машину — она из него так и не вышла.
CWP в этом вопросе поспокойнее. Есть свои заскоки: веб панель тормозит. Нет, не так,! ТОРМОЗИТ!.. Секунд 15 на переход по какой-то ссылке? Запросто. Часть действий (нет, не помню что конкретно) отказывалось обрабатываться в Файрфоксе и Эдже, который на тот момент ещё не перехал на хромиум. Зато в Хроме — будто под него писалось. Прилетели обновления? Сходим в обновлятор… Написал «done», уведомления не пропали. Сходил в веб-консоль, проверка обновлений? Окей, они есть. Запускаем? Правильно! Ошибка 504 Gateway Timeout. Что же делать? Ой, баннер на четверть экрана: Купи платную версию, и живи в шоколаде! Но мы люди напористые: обновляемся через консоль. Обновились, молодцы, взяли пирожок. Приходим в CWP: есть обновления установите обновления! Жмём установить: ой, бес попутал, нет обновлений. Возвращаемся назад: ай, обновления, много важных обновлений, важно, срочно! Лечится ребутом.
И вот приходится делать медленно, как встарь, руками в консоли. Потому что подошёл к концу 2019 год, с панелями всё так же какая-то жопа…
OleksiyT
Ну, везде есть тараканы.
Особенно в бесплатнлм софте.
Решайте всегда сами, конечно.
Но cwp, с её возможностями, на порядок лучшее будет.
П.с. от тормозов поможет ssd вместо hdd — у меня есть оба варианта, могу сравнить.
А может провайдер оверселлит. За $5-то...
Lopar
У меня сервера на виртуалках вращались. Я давно в поисках удобной панельки исключительно для домашних (homelab) нужд. Но что ни посмотри, либо дорого либо боль. Либо подписка. Которая для дома — не то.
OleksiyT
Не могу сказать за всех, но сам пользуюсь cwp именно на виртуалках.
Всё, что нужно для хостинга (и лично мне) — там есть.
Платить, согласен, незачем.
Но если нужно больше — платная про стоит доллар в месяц.
Там идёт php-fpm и поддержка кластеризации (для ценителей).
У cwp активный девелопмент и поддержка — для меня это огромный плюс (в отличии от минусующих, походу ;)
Lopar