From e41d31af24a3d8e903d2a3f1b0d38f5fe904f521 Mon Sep 17 00:00:00 2001 From: infra-bot Date: Thu, 27 Aug 2026 16:21:28 +0300 Subject: [PATCH] README: Russian rewrite with mermaid architecture diagram, badges, tuning table --- README.md | 177 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 106 insertions(+), 71 deletions(-) diff --git a/README.md b/README.md index 8557031..dec9a65 100644 --- a/README.md +++ b/README.md @@ -1,119 +1,154 @@ -# ============================================================ -# bitrix-vps-infra — native Bitrix stack on Ubuntu 24.04 VPS -# nginx (static+TLS) → php-fpm → Percona MySQL (unix socket) -# + memcached x2 + fail2ban + CrowdSec + ufw + backups -# -#docker analogue of paskal/bitrix.infra, without containers. -# ============================================================ +
-## Services +# bitrix-vps-infra -| Service | What | Where | -|----------------|-----------------------------------------------|-------| -| nginx | front, static files, urlrewrite, rate-limit zones | `/etc/nginx/` | -| php8.4-fpm | Bitrix runtime, pool `bitrix` | `/etc/php/8.4/fpm/pool.d/bitrix.conf` | -| Percona MySQL | socket-only (`localhost`), buffer pool 4G | `/etc/mysql/conf.d/99-bitrix.cnf` | -| memcached x2 | cache `127.0.0.1:11211`, sessions `11212` | systemd units `memcached-cache/-sessions` | -| fail2ban | sshd + nginx-http-auth jails | `/etc/fail2ban/jail.local` | -| CrowdSec | parses nginx combined logs + sshd journal | `/etc/crowdsec/acquis.yaml` | -| cron | Bitrix agents CLI, exchange, nightly backup | `/etc/cron.d/bitrix` | -| ufw | OpenSSH/80/443 | `/etc/ufw/` | +**Нативная инфраструктура для Bitrix на VPS: один скрипт, ноль Docker** -## Quickstart (fresh Ubuntu 24.04) +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`), а база недоступна по сети физически. + +## Архитектура + +```mermaid +flowchart TB + U["Браузер"] -->|"HTTPS :443"| NG + + subgraph VPS["Ubuntu 24.04, без Docker"] + NG["nginx
TLS · статика · urlrewrite
limit_req zones"] + + NG -->|"fastcgi, unix-сокет
/run/php/bitrix-fpm.sock"| PHP["php-fpm pool 'bitrix'
dynamic, max 30, max_requests 500"] + PHP -->|"localhost = сокет"| DB[("Percona MySQL 8.0
bind 127.0.0.1 only")] + PHP --> MC1[("memcached cache
127.0.0.1:11211")] + PHP --> MC2[("memcached sessions
127.0.0.1:11212")] + + CRON["cron (CLI php)
agents · exchange · backup"] + CRON --> PHP + CRON --> DB + end + + LOGS["nginx access.log (combined)"] -.->|parse| CS["CrowdSec + firewall-bouncer"] + SSHD["sshd journal"] -.-> F2B["fail2ban"] + CRON --> BAK["backups:
mysqldump + code tarball
retention 14 дней"] + CS -.->|"блокирует"| U +``` + +Ключевые отличия от «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 /opt/bitrix-vps-infra && cd /opt/bitrix-vps-infra +git clone https://git.hlam.su/free/bitrix-vps-infra.git /opt/bitrix-vps-infra +cd /opt/bitrix-vps-infra -# 1) edit variables at top of install.sh (DOMAIN first!) -nano scripts/../install.sh # DOMAIN=..., FPM_MAX_CHILDREN=30, TZ +# обязательный минимум перед запуском: +nano install.sh # DOMAIN=..., при желании TZ, FPM_MAX_CHILDREN, DB_PASS sudo ./install.sh -# creds printed and saved to /root/bitrix-install-creds.txt (chmod 600) +# креды печатаются и сохраняются (chmod 600): cat /root/bitrix-install-creds.txt ``` -## Migrate site from old server +Скрипт ставит пакеты (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 -# on OLD server: dump db +# на старом сервере: дамп базы mysqldump --single-transaction --routines --triggers sitemanager | gzip > sitemanager.sql.gz -# copy content +# перенос содержимого rsync -avz /home/bitrix/www/bitrix newvps:/home/bitrix/www/ rsync -avz /home/bitrix/www/{local,upload} newvps:/home/bitrix/www/ -# import on NEW server +# импорт на новом gunzip < sitemanager.sql.gz | mysql sitemanager ./scripts/fix-rights.sh /home/bitrix/www -# bitrix app-configs: take examples, insert DB pass from creds file -cp config/bitrix-app/dbconn.php.example /home/bitrix/www/bitrix/php_interface/dbconn.php +# конфиги приложения из примеров репы +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 -# then edit .settings.php: host=localhost, add 'session' block from settings_extra comment +# пароль БД взять из creds, 'session'-блок перенести в .settings.php (см. комментарий в примере) ``` -After that: +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" # upgrades vhost to TLS + redirect +certbot --nginx -d "$DOMAIN" -d "www.$DOMAIN" systemctl reload nginx ``` -## Verify checklist +certbot допишет 443-блок и редирект прямо в существующий vhost. + +## Проверка после установки ```bash -curl -I http://DOMAIN # 200 or 301 -mysqladmin status # socket alive, TCP not listening: -ss -tlnp | grep -E '3306|33060' # expect EMPTY output -free -m # swap ~0 used, available >3G -php-fpm8.4 -tt # pool syntax ok -tail -f /var/log/php/bitrix-slow.log # requests >5s land here -fail2ban-client status sshd # jail active -cscli metrics # crowdsec parsing access.log -/usr/bin/php -d memory_limit=1024M -f /home/bitrix/www/bitrix/modules/main/tools/cron_events.php - # agents run manually without error +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 секунд ``` -Site smoke: main page → catalog section → cart → admin login. Check exchange via admin -or manual flock command from `/etc/cron.d/bitrix`. +Дымовой тест сайта: главная → каталог → корзина → вход в админку → обмен с 1С. -## Tuning knobs +## Ручки тюнинга -| Knob | File | Default | When change | -|------|------|---------|-------------| -| pm.max_children | fpm pool | 30 | OOM/slow under peak → raise if RAM free; 503 → lower concurrency | -| innodb_buffer_pool_size | mysql cnf | 4G | sized for 12GB box | -| memcached cache MB | unit file | 1024 | raise on cache churn | -| limit_req rate | nginx.conf zone | 10 r/s | enforce per-location when needed | -| backup retention | backup.sh | 14 days | disk budget | +| Ручка | Где | По умолчанию | Когда крутить | +|---|---|---|---| +| `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 дней | бюджет диска | -## Restore from backup +## Восстановление из бэкапа ```bash gunzip < /var/backups/bitrix/db/_sitemanager.sql.gz | mysql sitemanager -cd /home/bitrix/www -tar xzf /var/backups/bitrix/code/_site.tar.gz --strip-components=0 # replaces webroot files except upload/ +cd /home/bitrix/www && tar xzf /var/backups/bitrix/code/_site.tar.gz ./scripts/fix-rights.sh ``` -Upload directory is NOT in backups by design (bulky). Sync it separately -(e.g. weekly `rsync -a /home/bitrix/www/upload /var/backups/bitrix/upload`) if size permits. +Каталог `upload/` в бэкапы не входит намеренно: он громоздкий. При нехватке места +на проде синхронизируйте его отдельно раз в неделю. -## Notes / trade-offs taken deliberately ("no overskill") +## Осознанные упрощения -* No HTTP/3/brotli modules — gzip covers 95% benefit; upgrade path documented below. -* No composite-site nginx layer yet — enable after basic migration proved stable - (add `$bx_composite_file` map + try_files per paskal/bitrix.infra pattern). -* No Zabbix/Sentry — CrowdSec metrics + slowlog + system journal are the floor; - consider netdata later if growth demands. -* CrowdSec firewall-bouncer replaces host iptables scripting entirely. - -### Optional upgrades later -```bash -apt install libnginx-mod-http-brotli-filter libnginx-mod-http-brotli-static # brotli -add brotli line into nginx.conf http{} block after gzips. -``` +Взято «как в лучших традициях», но без overengineering: ни HTTP/3, ни brotli (gzip +покрывает основной выигрыш), ни Zabbix/Sentry, ни composite-слой в nginx. Расширять +просто: brotli ставится двумя пакетами, composite-схема берётся из paskal/bitrix.infra +как образец. Идеология та же, только нативные пакеты вместо контейнеров.