Files

148 lines
8.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<div align="center">
# bitrix-vps-infra
**Нативная инфраструктура для Bitrix на VPS: один скрипт, ноль Docker**
nginx · php-fpm · Percona MySQL через сокет · memcached ×2 · fail2ban · CrowdSec
[Ubuntu&nbsp;24.04](https://releases.ubuntu.com/noble/) · [PHP&nbsp;8.4-FPM](https://rpms.remirepo.net/) · [Percona&nbsp;8.0](https://www.percona.com/software/mysql-database/percona-server)
</div>
---
## Что это
Полный набор конфигов и идемпотентный `install.sh`, который превращает свежую Ubuntu 24.04
в рабочую площадку под 1С-Битрикс: веб-сервер, база только по unix-сокету, два memcached,
агенты в cron, бэкапы по расписанию, защита на fail2ban и CrowdSec.
Конфигурация поднята на реальном магазине и закрывает типовые проблемы классического
Bitrix VM: prefork-Apache держит пул воркеров, которые съедают всю память к обеду;
MySQL слушает TCP и ловит сканеры портянкой aborted connects. Здесь воркеры создаются
под нагрузку и умирают сами (`pm.max_requests`), а база недоступна по сети физически.
## Архитектура
<p align="center">
<img src="./assets/readme/architecture.svg" width="100%" alt="Схема: браузер по HTTPS заходит на nginx; nginx через unix-сокет передаёт php-fpm; php-fpm работает с Percona MySQL только локально и с двумя memcached; cron выполняет агентов и бэкапы; CrowdSec и fail2ban читают журналы и блокируют атакующих; TCP у MySQL закрыт">
</p>
<details>
<summary>Текстовая версия схемы</summary>
- Браузер → HTTPS :443 → nginx (TLS, статика, urlrewrite, limit_req)
- nginx → fastcgi unix-сокет → php-fpm pool «bitrix» (dynamic, max 30)
- php-fpm → `localhost` = сокет → Percona MySQL 8.0; TCP :3306/:33060 закрыты
- php-fpm → memcached :11211 (кэш) и :11212 (сессии)
- cron CLI php → агенты каждую минуту, обмен 1С каждые 5 минут, бэкапы в `/var/backups/bitrix`
- nginx access.log → CrowdSec + firewall-bouncer; sshd → fail2ban; оба банят источники атак
</details>
Ключевые отличия от «Bitrix VM по умолчанию»:
| Проблема VM | Решение здесь |
|---|---|
| 60 постоянных воркеров mod_php съедают RAM | fpm dynamic: создаются под трафик, верхняя граница 30 |
| MySQL на TCP, Aborted_connects десятками тысяч | сеть отключена, доступ только локальный сокет |
| Сессии в файлах на одном диске с сайтом | отдельный memcached-инстанс |
| Агенты через веб-хиты | CLI cron раз в минуту |
| Ручные бэкапы | nightly mysqldump + tarball, авторотация |
## Быстрый старт
```bash
apt update && apt install -y git
git clone https://git.hlam.su/free/bitrix-vps-infra.git /opt/bitrix-vps-infra
cd /opt/bitrix-vps-infra
# обязательный минимум перед запуском:
nano install.sh # DOMAIN=..., при желании TZ, FPM_MAX_CHILDREN, DB_PASS
sudo ./install.sh
# креды печатаются и сохраняются (chmod 600):
cat /root/bitrix-install-creds.txt
```
Скрипт ставит пакеты (ondrej PPA → php8.4-fpm, Percona repo → mysql-server, memcached,
fail2ban, CrowdSec + firewall-bouncer, certbot), раскладывает все конфиги из `config/`,
создаёт БД и пользователя, настраивает ufw (22/80/443), swap 4G и swappiness=10.
Повторный запуск безопасен: конфиги перезаписываются, ничего не удаляется.
## Миграция сайта со старого сервера
```bash
# на старом сервере: дамп базы
mysqldump --single-transaction --routines --triggers sitemanager | gzip > sitemanager.sql.gz
# перенос содержимого
rsync -avz /home/bitrix/www/bitrix newvps:/home/bitrix/www/
rsync -avz /home/bitrix/www/{local,upload} newvps:/home/bitrix/www/
# импорт на новом
gunzip < sitemanager.sql.gz | mysql sitemanager
./scripts/fix-rights.sh /home/bitrix/www
# конфиги приложения из примеров репы
cp config/bitrix-app/dbconn.php.example /home/bitrix/www/bitrix/php_interface/dbconn.php
cp config/bitrix-app/settings_extra.php.example /home/bitrix/www/bitrix/.settings_extra.php
# пароль БД взять из creds, 'session'-блок перенести в .settings.php (см. комментарий в примере)
```
TLS одним ходом:
```bash
apt-get install -y certbot python3-certbot-nginx
DOMAIN=$(grep '^DOMAIN=' /root/bitrix-install-creds.txt | cut -d= -f2)
certbot --nginx -d "$DOMAIN" -d "www.$DOMAIN"
systemctl reload nginx
```
certbot допишет 443-блок и редирект прямо в существующий vhost.
## Проверка после установки
```bash
curl -I http://$DOMAIN # ожидаем 200 или 301
ss -tlnp | grep -E ':3306|:33060' # пусто: TCP у базы выключен
free -m # swap почти пуст, available > 3G
fail2ban-client status sshd # jail активен
cscli metrics # crowdsec читает access.log
/usr/bin/php -f /home/bitrix/www/bitrix/modules/main/tools/cron_events.php
# агенты вручную, без ошибок
tail -f /var/log/php/bitrix-slow.log # всё, что дольше 5 секунд
```
Дымовой тест сайта: главная → каталог → корзина → вход в админку → обмен с 1С.
## Ручки тюнинга
| Ручка | Где | По умолчанию | Когда крутить |
|---|---|---|---|
| `FPM_MAX_CHILDREN` | install.sh / pool | 30 | 503 под пиком: свободной RAM мало, снижайте; «висит» и есть память: повышайте |
| `innodb_buffer_pool_size` | mysql cnf | 4G | рассчитано на бокс ~12 GB RAM |
| memcached cache MB | systemd unit | 1024 | частая инвалидация кэша |
| rate limit | nginx.conf zone | 10 r/s | включать пер-локацией по необходимости |
| retention бэкапов | backup.sh | 14 дней | бюджет диска |
## Восстановление из бэкапа
```bash
gunzip < /var/backups/bitrix/db/<ts>_sitemanager.sql.gz | mysql sitemanager
cd /home/bitrix/www && tar xzf /var/backups/bitrix/code/<ts>_site.tar.gz
./scripts/fix-rights.sh
```
Каталог `upload/` в бэкапы не входит намеренно: он громоздкий. При нехватке места
на проде синхронизируйте его отдельно раз в неделю.
## Осознанные упрощения
Взято «как в лучших традициях», но без overengineering: ни HTTP/3, ни brotli (gzip
покрывает основной выигрыш), ни Zabbix/Sentry, ни composite-слой в nginx. Расширять
просто: brotli ставится двумя пакетами, composite-схема берётся из paskal/bitrix.infra
как образец. Идеология та же, только нативные пакеты вместо контейнеров.