Панель: - engine/main/lang.php: класс Lang, автоопределение языка (?lang= -> cookie -> Accept-Language -> конфиг) - перевод применяется к готовому ответу через ob_start(): покрывает всю панель, админку и письма, не требуя правки 200 файлов шаблонов; отсутствующая фраза остаётся русской - замена только на границах слов, иначе короткий ключ портил длинные слова (Модуль -> Modуль) - AJAX-ответы переводятся отдельно (json_encode экранирует кириллицу в \uXXXX) - application/lang/en.php: 657 переводов; ru.php как точка расширения - переключатель RU/EN в шапке кабинета, админки и в подвале страницы входа - 'lang' в config.php — язык по умолчанию - проверено обходом 20 разделов: 0 непереведённых фраз, 0 мешанины языков, 0 фаталов Документация — теперь на русском и английском: - README.en.md, CHANGES.en.md, SECURITY.en.md, GUIDE.en.md - переключатели языка в начале каждого документа - раздел «Язык интерфейса» в инструкции: как работает, как добавить свой язык
21 KiB
Русский · English
Полная инструкция
От пустого сервера до принимающего клиентов хостинга.
Поддерживается и развивается с помощью REDL.IO — Хостинг с искусственным интеллектом.
Содержание:
- Как всё устроено
- Установка панели
- Установка игровой ноды
- Подключение ноды к панели
- Сборки игр
- Настройка панели
- Язык интерфейса
- Капча
- HTTPS и домен
- Обслуживание
- Если что-то не работает
1. Как всё устроено
Две роли, обычно на разных машинах:
Панель — сайт, база данных, личные кабинеты, тикеты, платежи. Docker ей не нужен, живёт на любом дешёвом VPS.
Игровая нода (локация) — здесь запускаются сами игровые сервера. Панель подключается к ней по SSH и на каждый заказанный сервер создаёт отдельный Docker-контейнер:
docker create --tty --rm --name=gs<ID> --network=host \
--cpus="<ядра>" --memory=<ОЗУ>M \
--volume="/home/gs<ID>/:/home/container/" \
--workdir=/home/container debian:stretch
Отсюда два жёстких требования к ноде: работающий Docker и локальный образ с тегом
debian:stretch (имя прописано в коде панели). Файлы сервера лежат на ноде в /home/gs<ID>,
внутри контейнера они видны как /home/container.
Нод может быть несколько — они добавляются в панели как отдельные локации, клиент выбирает локацию при заказе.
Важно про ноду. Docker не запускается в контейнерных VPS (LXC, OpenVZ и подобные) — ядро запрещает вложенные namespace. Под ноду нужен выделенный сервер или KVM. Установщик проверяет это первым делом и предупреждает.
2. Установка панели
Подходит Ubuntu 24.04 / 22.04 или Debian 12 / 13. Минимум: 1 ядро, 1 ГБ ОЗУ, 10 ГБ диска.
apt-get update && apt-get install -y git
git clone https://github.com/RedlHosting/redl-gamepanel.git
cd redl-gamepanel
sudo bash install-panel.sh
Скрипт спросит три вещи:
- домен или IP панели — попадёт в конфиг как базовый адрес, с него формируются все ссылки и письма;
- e-mail администратора — он же логин;
- пароль администратора — минимум 6 символов.
Дальше без вашего участия: пакеты, база со случайным паролем, схема (27 таблиц), конфиг, права, PHP, nginx, планировщик, сторож автозапуска, администратор с полным уровнем доступа, финальная проверка страницы входа.
Занимает 2–5 минут. В конце печатается адрес панели и логин.
Нестандартный порт (если 80 занят или панель за обратным прокси):
sudo PORT=8095 bash install-panel.sh
Где что лежит после установки:
| Что | Путь |
|---|---|
| Код панели | /var/www/hostinpl |
| Конфигурация | /var/www/hostinpl/application/config.php |
| Пароль БД и токен планировщика | /root/.redl-panel-credentials |
| Конфиг nginx | /etc/nginx/sites-available/hostinpl |
| Планировщик | /etc/cron.d/hostinpl |
| Сторож автозапуска | /usr/local/bin/hostinpl-guard |
| База данных | MariaDB, база hostin |
phpMyAdmin (по желанию, панель ссылается на него из админки):
sudo apt-get install -y phpmyadmin # веб-сервер настраивать НЕ надо, откажитесь
sudo ln -sfn /usr/share/phpmyadmin /var/www/hostinpl/phpmyadmin
Логин — пользователь БД из /root/.redl-panel-credentials. Помните, что phpMyAdmin будет
доступен всем, кто знает адрес: либо закройте его в nginx по IP, либо не ставьте вообще.
3. Установка игровой ноды
Нужен выделенный сервер или KVM (не LXC/OpenVZ). Минимум: 2 ядра, 2 ГБ ОЗУ, 100 ГБ диска, считайте 1–2 ГБ на игровой сервер.
apt-get update && apt-get install -y git
git clone https://github.com/RedlHosting/redl-gamepanel.git
cd redl-gamepanel
sudo bash install-node.sh
Скрипт спросит:
- IP этой ноды — как её увидит панель;
- разрешить ли вход root по SSH с паролем — панель умеет подключаться только логином и
паролем, а её команды требуют прав root. Ответите
yes— скрипт сам сгенерирует стойкий пароль root и покажет его в конце.
Что делает: проверяет пригодность машины, ставит Docker из официального репозитория, собирает
образ debian:stretch (внутри Debian 12 + 32-битные библиотеки + Java + Node.js + screen),
создаёт /home/cp/gameservers/files и группу gameservers, ставит MariaDB для баз игровых
серверов, SteamCMD, ProFTPD, настраивает sshd, ставит сторож Docker.
Первый запуск идёт 5–15 минут — большую часть времени собирается образ.
Сразу после установки закройте порты. Скрипт напечатает готовые команды, подставьте адрес панели:
ufw allow from IP_ПАНЕЛИ to any port 22 proto tcp
ufw allow from IP_ПАНЕЛИ to any port 3306 proto tcp
ufw deny 3306
# порты игровых серверов оставьте открытыми: 7777 (SA-MP), 22005 (RAGE:MP), 25565 (Minecraft) и т.д.
Если подключаетесь к ноде по SSH сами — сначала разрешите свой IP, иначе потеряете доступ:
ufw allow from ВАШ_IP to any port 22 proto tcp
4. Подключение ноды к панели
- Войдите в панель администратором
- Админка → Локации → Добавить локацию
- Заполните:
| Поле | Что вписать |
|---|---|
| Название | Любое понятное: «Москва», «Хельсинки» |
| IP | IP ноды |
| Пользователь | root |
| Пароль | Пароль root, который напечатал install-node.sh |
| Игры | Отметьте игры, доступные на этой ноде |
- Сохраните и откройте Админка → Локации — если панель подключилась, у локации появятся реальные ядра, ОЗУ и диск (обновляются планировщиком раз в час).
Не подключилось — проверьте с машины панели:
ssh root@IP_НОДЫ # пароль подходит?
php -m | grep ssh2 # расширение php-ssh2 стоит?
Расширения нет — apt-get install -y php-ssh2 и перезапустите PHP-FPM.
5. Сборки игр
В комплект они не входят. В оригинальном установщике сборки качались с посторонних сайтов по обычному HTTP без проверки подписи — мы этот способ убрали (подробно в БЕЗОПАСНОСТЬ.md).
Разложите файлы на ноде так:
/home/cp/gameservers/files/<код_игры>/
Коды игр смотрите в Админка → Игры (например samp, crmp, mta, minecraft, cs, css, ragemp).
При создании сервера панель копирует содержимое этого каталога в /home/gs<ID>/.
Берите сборки только из первоисточников: SA-MP — с sa-mp.com, MTA — с mtasa.com,
Minecraft (Paper) — с papermc.io, RAGE:MP — с rage.mp, игры Steam — через SteamCMD
(уже установлен в /root/steamcmd).
После этого проверьте цепочку целиком: закажите сервер от имени тестового клиента и убедитесь, что он создался и запустился.
6. Настройка панели
Админка → Настройки, четыре вкладки:
- Общие настройки — название, описание, контакты, логотип
- Платёжные системы — Unitpay, Enot, AnyPay, LiteKassa, RoboKassa, FreeKassa, Юkassa, QIWI. Нужны ваши мерчант-аккаунты. Ни один шлюз мы живыми платежами не проверяли — обязательно протестируйте своим платежом перед приёмом клиентов.
- Прочие настройки — тестовый период, подтверждение e-mail, капча, техработы, VK-авторизация
- Информация и бонусы — бонусы за пополнение, реферальные проценты
Тарифы и игры: Админка → Игры (версии, лимиты ОЗУ и ядер, цены).
При сохранении настроек панель перезаписывает
config.phpцеликом. Механизм ищет строки по подстроке, поэтому не создавайте параметры, чьи имена являются частью других. После правки файла руками перезапускайте PHP-FPM полностью (restart, неreload) — иначе отдаётся закешированная версия.
7. Язык интерфейса
Панель говорит на русском и английском. Язык выбирается в таком порядке:
?lang=enили?lang=ruв адресе — явный выбор, запоминается в cookie на год- cookie
lang— прошлый выбор - заголовок браузера
Accept-Language— автоопределение - параметр
langвapplication/config.php(по умолчаниюru)
Автоопределение намеренно оставляет русский для русскоязычных локалей (ru, uk, be, kk и других) и переключает на английский для всех остальных — то есть посетитель из Германии или Бразилии сразу получает английский интерфейс, ничего не нажимая.
Переключатель стоит в верхней панели кабинета и админки (кнопки RU / EN рядом с балансом)
и в подвале страницы входа.
Как это сделано. Панель написана с русским текстом прямо в шаблонах — около 1500 строк в
200 файлах. Вместо того чтобы переписывать их все, перевод применяется к готовому ответу:
index.php оборачивает вывод в ob_start(), и перед отправкой браузеру строки заменяются по
словарю (engine/main/lang.php). Это разом покрывает всю панель, включая админку и письма, а
фразы, которых нет в словаре, просто остаются русскими — ничего не может пропасть с экрана.
Замена работает только на границах слов, поэтому короткий ключ не может испортить слово подлиннее (без этого «Мод» превращал «Модуль» в «Modуль»).
Как добавить свой язык, например немецкий:
cp panel/application/lang/en.php panel/application/lang/de.php
# перевести значения в de.php, затем добавить 'de' в Lang::AVAILABLE
# в panel/engine/main/lang.php
Полноту словаря мы проверяли обходом страниц: все 20 разделов, которые проходим, отдаются без
остатков русского текста. Если увидите непереведённую фразу — допишите её в
application/lang/en.php, ключ это русский текст ровно в том виде, в каком он на странице.
Перевод включается только когда язык не русский; в русском режиме словарь даже не загружается, поэтому накладных расходов нет.
8. Капча
По умолчанию выключена — регистрация и вход работают без неё, поля просто нет.
Чтобы включить:
- Получите ключи reCAPTCHA v2 «Я не робот» на google.com/recaptcha/admin — укажите домен панели
- Админка → Настройки → Прочие настройки → «Защита от ботов (reCAPTCHA v2)»
- Вставьте Site key и Secret key
- Переключите на «Включена» и сохраните
Порядок важен. Включите капчу без ключей — на форме появится
«ERROR for site owner: Invalid site key», и войти будет нельзя. Если так вышло, откройте
/var/www/hostinpl/application/config.php, поставьте 'captcha_enable' => '0' и перезапустите
PHP-FPM:
sudo sed -i "s/'captcha_enable' => '1'/'captcha_enable' => '0'/" /var/www/hostinpl/application/config.php
sudo service php8.4-fpm restart # подставьте свою версию PHP
Капча закрывает вход, регистрацию, восстановление пароля и создание тикетов — все четыре формы сразу.
9. HTTPS и домен
Панель ставится на HTTP. Для сертификата:
sudo apt-get install -y certbot python3-certbot-nginx
sudo certbot --nginx -d panel.example.com
После выпуска сертификата поправьте адрес в конфиге, иначе ссылки в письмах и редиректы
останутся на http://:
sudo sed -i "s|'url' => 'http://|'url' => 'https://|" /var/www/hostinpl/application/config.php
sudo service php8.4-fpm restart
Если панель за обратным прокси (Caddy, nginx, Cloudflare), в её конфиге nginx уже стоят
absolute_redirect off; port_in_redirect off; — без них редиректы уводят на внутренний порт
и ссылки вроде /phpmyadmin снаружи не открываются.
10. Обслуживание
Резервные копии. Сохраняйте базу и конфиг:
mysqldump hostin > /root/hostin-$(date +%F).sql
cp /var/www/hostinpl/application/config.php /root/config-$(date +%F).php
Файлы игровых серверов лежат на ноде в /home/gs<ID> — их бэкапьте на ноде.
Логи:
| Что смотреть | Где |
|---|---|
| Ошибки PHP и nginx | /var/log/nginx/error.log |
| Обращения планировщика | grep 'main/cron' /var/log/nginx/access.log |
| Журнал входов | Таблица authlog в базе |
| Сборка образа ноды | /tmp/redl-docker-build.log |
Проверка состояния: Админка → Проверка системы — расширения PHP, версии, ссылки планировщика. Все пункты должны быть зелёными.
Обновление кода из репозитория:
cd redl-gamepanel && git pull
sudo cp -a panel/application panel/engine /var/www/hostinpl/ # config.php не перезапишется
sudo chown -R www-data:www-data /var/www/hostinpl
sudo service php8.4-fpm restart
11. Если что-то не работает
«Ошибка: Не удалось загрузить контроллер …» — панель не нашла контроллер для этого адреса.
Обычно это ссылка на то, чего нет: например /phpmyadmin, когда phpMyAdmin не установлен
(см. раздел 2). Если раздел точно должен быть — проверьте, что файлы на месте и права www-data,
затем перезапустите PHP-FPM полностью: opcache мог закешировать файл, пойманный в момент записи.
Страница входа пустая или без формы — смотрите /var/log/nginx/error.log.
Частая причина: short_open_tag = Off. Панель использует короткие теги <? ?>, установщик
включает эту опцию сам, но при переустановке PHP её нужно вернуть.
Не могу войти, на форме «Invalid site key» — включена капча без ключей, см. раздел 8.
Планировщик не работает (статистика не обновляется, просроченные сервера не отключаются):
grep -c 'main/cron' /var/log/nginx/access.log # должно расти
pgrep -a cron # демон запущен?
cat /etc/cron.d/hostinpl # каждое задание — ОДНОЙ строкой
Если задание разорвано на две строки — токен попал в файл с переводом строки, перепишите файл
целиком, взяв токен из /root/.redl-panel-credentials.
Сервер не создаётся на ноде — проверьте на ноде:
docker info # демон работает?
docker image inspect debian:stretch # образ на месте?
docker run --rm debian:stretch echo ok # контейнер запускается?
ls /home/cp/gameservers/files/ # сборка игры на месте?
Сервер создался, но сразу падает — смотрите логи контейнера на ноде:
docker logs gs<ID>. Чаще всего не хватает 32-битных библиотек (тогда пересоберите образ
из нашего docker/Dockerfile) или сборка игры повреждена.
Всё было хорошо, перестало после перезагрузки — на машинах без systemd подъём делают
сторожа на cron. Проверьте: pgrep -a cron и вручную /usr/local/bin/hostinpl-guard
(на ноде — gamenode-guard).
Поддерживается и развивается с помощью REDL.IO — Хостинг с искусственным интеллектом.