# bitrix-vps-infra **Нативная инфраструктура для Bitrix на VPS: один скрипт, ноль Docker** nginx · php-fpm · Percona MySQL через сокет · memcached ×2 · fail2ban · CrowdSec [Ubuntu 24.04](https://releases.ubuntu.com/noble/) · [PHP 8.4-FPM](https://rpms.remirepo.net/) · [Percona 8.0](https://www.percona.com/software/mysql-database/percona-server)
--- ## Что это Полный набор конфигов и идемпотентный `install.sh`, который превращает свежую Ubuntu 24.04 в рабочую площадку под 1С-Битрикс: веб-сервер, база только по unix-сокету, два memcached, агенты в cron, бэкапы по расписанию, защита на fail2ban и CrowdSec. Конфигурация поднята на реальном магазине и закрывает типовые проблемы классического Bitrix VM: prefork-Apache держит пул воркеров, которые съедают всю память к обеду; MySQL слушает TCP и ловит сканеры портянкой aborted connects. Здесь воркеры создаются под нагрузку и умирают сами (`pm.max_requests`), а база недоступна по сети физически. ## Архитектура

Схема: браузер по HTTPS заходит на nginx; nginx через unix-сокет передаёт php-fpm; php-fpm работает с Percona MySQL только локально и с двумя memcached; cron выполняет агентов и бэкапы; CrowdSec и fail2ban читают журналы и блокируют атакующих; TCP у MySQL закрыт

Текстовая версия схемы - Браузер → 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; оба банят источники атак
Ключевые отличия от «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/_sitemanager.sql.gz | mysql sitemanager cd /home/bitrix/www && tar xzf /var/backups/bitrix/code/_site.tar.gz ./scripts/fix-rights.sh ``` Каталог `upload/` в бэкапы не входит намеренно: он громоздкий. При нехватке места на проде синхронизируйте его отдельно раз в неделю. ## Осознанные упрощения Взято «как в лучших традициях», но без overengineering: ни HTTP/3, ни brotli (gzip покрывает основной выигрыш), ни Zabbix/Sentry, ни composite-слой в nginx. Расширять просто: brotli ставится двумя пакетами, composite-схема берётся из paskal/bitrix.infra как образец. Идеология та же, только нативные пакеты вместо контейнеров.