Форум, приём в гильдию с голосованием, аукцион за очки активности, ивенты и кос-лист —
на своём сервере одной командой
Возможности · Установка · Первая настройка · Руководство · Решение проблем
Тёмная и светлая тема переключаются одной кнопкой рядом с уведомлениями
Готовое решение для гильдии в Perfect World: форум, приём заявок с голосованием, аукцион за очки активности, запись на ивенты, кос-лист, уведомления и сервер TeamSpeak 3 с ботом гильдии. Ставится на свой сервер одной командой, HTTPS-сертификат получается автоматически. Название гильдии, иконку сайта, почту, капчу и все разделы вы настраиваете в админ-панели — править код не нужно.
- Форум — категории, подкатегории, темы и ответы с картинками. Для каждого раздела можно указать, кто его видит: все, только зарегистрированные или только определённые группы (например, члены гильдии).
- Профили игроков — аватар, класс персонажа, характеристики (HP, атака, защита, пробив, крит и т. д.), TS3 ID, город, возраст.
- Приём в гильдию — кандидат заполняет анкету со скриншотами, офицер допускает её до голосования, члены гильдии голосуют «за», «против» или «воздержался» и оставляют комментарии. Кандидат получает уведомления о каждом шаге.
- Очки активности — удобная таблица в админ-панели: все члены гильдии, сгруппированные по классам, с начислением и списанием очков в одно касание.
- Аукцион — лоты за очки активности. Ставка замораживает очки, перебитая ставка возвращает их, победитель платит после завершения лота.
- Ивенты — типы ивентов с отрядами, рассылка приглашений выбранным группам, ответы «приду / не приду / возможно», распределение игроков по отрядам.
- Кос-лист — враждебные гильдии и игроки.
- Уведомления — колокольчик на сайте: заявки, голоса, итоги аукционов, приглашения на ивенты.
- Регистрация — по желанию с подтверждением по email и капчей DDoS-Guard (российский сервис). Всё включается в админ-панели.
- Резервные копии по расписанию — на сервере и на Яндекс Диске, с журналом и скачиванием из админ-панели.
- TeamSpeak 3 и бот — голосовой сервер в том же Docker с готовыми комнатами (гостевые, МТВ / ГВГ и КХ по отрядам, закрытые комнаты гильдии). Бот выдаёт доступ по кнопке на сайте, создаёт личные комнаты и начисляет очки активности за посещение ивентов. Бот работает только с сервером TeamSpeak из этого проекта — к стороннему серверу его не подключить.
- Удобная админ-панель — дашборд с ключевыми цифрами, блоком «Требует внимания» (новые заявки, лоты без итогов, проблемы с копиями и почтой) и быстрыми действиями; светлая и тёмная темы.
- Сервер (VPS) с Ubuntu 22.04, 24.04 или Debian 12, 13 на процессоре x86-64. Хватит 1 ядра и 2 ГБ памяти. На ARM-серверах TeamSpeak не запустится.
- Домен, например
myguild.ru, с доступом к настройке DNS-записей. Для TeamSpeak — поддомен, обычноts.myguild.ru. - Свободные порты 80 и 443 на сервере (на нём не должен работать другой веб-сервер) и 9987/udp, 30033/tcp для TeamSpeak (на нём не должен работать другой сервер TeamSpeak).
- По желанию: почтовый ящик для писем подтверждения регистрации и ключи капчи DDoS-Guard для защиты формы регистрации от ботов. Настраиваются в админ-панели после установки.
В панели управления доменом (у регистратора или DNS-провайдера) создайте записи, указывающие на IP-адрес вашего сервера:
| Тип | Имя | Значение | |
|---|---|---|---|
| A | @ |
IP сервера | сайт |
| A | www |
IP сервера | если сайт должен открываться и с www |
| A | ts |
IP сервера | TeamSpeak. В Cloudflare — только режим «DNS only» (серое облако) |
| SRV | _ts3._udp |
приоритет 0, вес 5, порт 9987, цель ts.myguild.ru |
необязательно: игроки смогут вводить в TeamSpeak просто myguild.ru |
Как заполнить SRV-запись у разных регистраторов — в «DNS для TeamSpeak». Обновление DNS занимает от нескольких минут до нескольких часов — установщик проверит записи и подождёт, если они ещё не обновились.
Подключитесь к серверу по SSH под пользователем root (или выполните sudo -i) и запустите:
bash <(curl -fsSL https://raw.githubusercontent.com/THEChrismoth/Perfect_World_guild_forum/master/install.sh)Установщик:
- Проверит сервер: систему, процессор, память и свободные порты.
- Спросит домен сайта и домен TeamSpeak (по умолчанию
ts.ваш-домен) и проверит, что они указывают на этот сервер. - Спросит логин администратора и согласие с лицензией TeamSpeak.
- Установит Docker и последнюю версию сайта в
/opt/guild-forum, сам сгенерирует все пароли и ключи в.env. - Запустит сайт, создаст администратора и установит команду
guildдля управления сайтом.
В конце он покажет адрес сайта, логин и пароль администратора, адрес и ключ администратора TeamSpeak и пароль шифрования резервных копий. Сохраните их: пароль администратора больше нигде не показывается, а без пароля шифрования не восстановить резервные копии — храните его вне сервера, например в менеджере паролей.
Первый запуск занимает несколько минут: скачиваются и собираются компоненты, создаётся база данных, бот создаёт группы и комнаты TeamSpeak. Повторный запуск установщика на готовом сервере ничего не сломает — он предложит обновить сайт или показать адреса.
Установка без вопросов (для автоматизации)
bash <(curl -fsSL https://raw.githubusercontent.com/THEChrismoth/Perfect_World_guild_forum/master/install.sh) \
--domain myguild.ru --ts-domain ts.myguild.ru --admin leader --accept-ts-license--accept-ts-license означает, что вы принимаете лицензию TeamSpeak. --yes — продолжить, даже если DNS ещё не обновился или порты заняты. Папку установки можно поменять переменной GUILD_DIR.
- Откройте в панели хостинга (если там есть свой файрвол) порты 80, 443/tcp, 9987/udp (голос) и 30033/tcp (передача файлов).
- В клиенте TeamSpeak подключитесь к адресу из итогов установки, откройте Права → Использовать ключ привилегий и вставьте ключ — вы станете администратором сервера (главный администратор — вы, бот работает отдельно через ServerQuery). Ключ одноразовый; пока администратор не назначен, его можно посмотреть командой
guild ts-key.
Как устроены комнаты, группы и доступ для членов гильдии — в «TeamSpeak».
Если установщик не подходит — например, другая система
-
Установите Docker:
curl -fsSL https://get.docker.com | sh(для других систем — официальная инструкция). -
Скачайте последний релиз:
git clone --branch v1.0.0 https://github.com/THEChrismoth/Perfect_World_guild_forum.git /opt/guild-forum cd /opt/guild-forum -
Заполните настройки:
cp .env.example .env chmod 600 .env # файл с паролями может читать только владелец nano .envПараметр Что вписать DOMAINВаш домен. Несколько — через запятую: myguild.ru, www.myguild.ruDJANGO_SECRET_KEYСгенерируйте: openssl rand -base64 48POSTGRES_PASSWORDПароль базы данных. Не придумывайте его, а сгенерируйте: openssl rand -hex 24BACKUP_ENCRYPTION_PASSWORDПароль шифрования резервных копий: openssl rand -base64 32. Сохраните его вне сервераDJANGO_SUPERUSER_USERNAME,DJANGO_SUPERUSER_PASSWORDЛогин и пароль первого администратора. Не используйте логин admin, пароль — не короче 12 символовTS3SERVER_LICENSEaccept— вы принимаете лицензию TeamSpeak. Прочитать её:docker run --rm -e TS3SERVER_LICENSE=view teamspeak:3.13TS3_SERVERADMIN_PASSWORDПароль, которым бот управляет сервером TeamSpeak: openssl rand -hex 16TSBOT_API_TOKENКлюч, которым бот входит в API сайта: openssl rand -hex 32⚠️ Пароль базы задаётся один раз. Он применяется при самом первом запуске, когда создаётся база. Если позже просто поменятьPOSTGRES_PASSWORDв.env, сайт перестанет подключаться к базе. Как сменить пароль правильно — в разделе «Безопасность». -
Установите команду
guild, запустите сайт и укажите адрес TeamSpeak:sudo python3 cli/guild.py install guild start guild manage ts_address ts.myguild.ru
-
Настройте DNS, как в шаге 1, и подключитесь к TeamSpeak, как в шаге 3. После первого входа удалите строку
DJANGO_SUPERUSER_PASSWORDиз.env— повторно администратор не создаётся.
Зайдите в админ-панель: https://ваш-домен/admin/ — логин и пароль из итогов установки.
Сразу после первого входа смените пароль администратора: правый верхний угол → «Изменить пароль».
-
Настройки сайта — впишите название гильдии (оно появится в шапке и во вкладке браузера) и загрузите иконку сайта (
.icoили.png). -
Группы — создайте группу с названием ровно
Член гильдии. Её участники голосуют по заявкам, видят закрытые разделы и попадают в таблицу очков активности. Добавлять игроков в группу можно на странице пользователя. -
Категории и подкатегории — создайте разделы форума. В «Группах с доступом» можно ограничить, кто видит раздел. Поле «Порядок сортировки» задаёт порядок разделов.
-
Специальные разделы — создайте подкатегории и отметьте у каждой нужный флаг:
Флаг Что будет в разделе Это прием заявок Форма вступления в гильдию. Члены гильдии этот раздел не видят Это просмотр заявок Заявки на голосовании. Виден только членам гильдии Это аукцион Аукцион лотов за очки активности Это ивентовая подкатегория Список ивентов и запись на них -
Резервные копии — включите шифрование и копии по расписанию, см. «Резервные копии».
-
TeamSpeak — в TeamSpeak → Настройки TeamSpeak должно быть «🟢 на связи». Там же укажите адрес сервера и сколько личных комнат можно одному игроку, см. «TeamSpeak».
Дальше — руководство: приём в гильдию, очки активности, аукцион, ивенты, кос-лист, почта и капча, резервные копии и TeamSpeak.
Сайтом управляет команда guild (утилита cli/guild.py). Она работает из любой папки. guild без аргументов открывает меню, guild help показывает все команды.
| Задача | Команда |
|---|---|
| Посмотреть, что запущено | guild status |
| Адреса сайта и TeamSpeak, ключ TeamSpeak | guild info |
| Логи всех сервисов / только сайта | guild logs / guild logs web |
| Перезапустить | guild restart |
| Остановить | guild stop |
Запустить снова, применить изменения .env |
guild start |
| Обновить до новой версии | guild update |
| Версия сайта | guild version |
| Добавить администратора | guild admin |
| Сделать резервную копию сейчас | guild backup |
| Восстановить из копии | guild restore (подробнее — в «Восстановлении») |
| Логи резервных копий | guild logs scheduler |
| Ключ администратора TeamSpeak | guild ts-key |
| Логи бота TeamSpeak | guild logs tsbot |
Применить изменения tsbot/channels.json |
guild restart tsbot |
| Сменить адрес TeamSpeak, который видят игроки | guild manage ts_address ts.myguild.ru |
| Любая команда Django | guild manage <команда> |
guild update обновляет сайт до последнего релиза: показывает список изменений, пересобирает и перезапускает сайт. Если обновлений нет, ничего не перезапускается. guild update --dev обновляет до текущей версии из master — она новее, но не проверена как релиз.
Если команда guild не установлена, запускайте утилиту напрямую: python3 /opt/guild-forum/cli/guild.py <команда>. Она вызывает обычный docker compose, поэтому в папке сайта (/opt/guild-forum) по-прежнему работают и команды docker compose.
Данные (база, загруженные картинки, резервные копии, сертификаты) хранятся отдельно от контейнеров и сохраняются при перезапуске и обновлении. Не используйте docker compose down -v — флаг -v удаляет все данные вместе с базой.
- Файл
.envсодержит все пароли и ключи. Держите его с правами600(chmod 600 .env), не публикуйте и не отправляйте в чаты. - База данных недоступна из интернета: её порт не открыт наружу, подключаются к ней только контейнеры сайта. Имя базы и пользователя (
forum) поэтому не секрет, но пароль должен быть случайным. - Администраторы — используйте неочевидные логины и длинные пароли, выдавайте права суперпользователя только тем, кому они действительно нужны: суперпользователь видит все данные и может скачать резервную копию.
- Резервные копии — включите шифрование (
BACKUP_ENCRYPTION_PASSWORD, см. «Шифрование») и храните его пароль вне сервера. Скачанные копии храните так же бережно, как пароли.
Пароль нужно поменять в двух местах: в самой базе и в .env. Выполните в папке сайта (cd /opt/guild-forum):
# 1. Сгенерируйте новый пароль
openssl rand -hex 24
# 2. Задайте его в базе (forum — значение POSTGRES_USER, если вы его меняли — подставьте своё)
docker compose exec db psql -U forum -d postgres -c "ALTER USER forum WITH PASSWORD 'НОВЫЙ_ПАРОЛЬ';"
# 3. Впишите тот же пароль в POSTGRES_PASSWORD в .env и перезапустите сайт
nano .env
docker compose up -dЕсли сначала поменять пароль только в .env, сайт не сможет подключиться к базе — тогда выполните шаг 2 с новым паролем, и всё заработает.
Сайт не открывается по домену
- Проверьте, что A-запись указывает на IP сервера:
nslookup ваш-домен. - Посмотрите логи:
docker compose logs caddy. Пока DNS не обновился, сертификат не будет получен — подождите и перезапустите:docker compose restart caddy. - Убедитесь, что порты 80 и 443 открыты в файрволе сервера и в панели хостинга.
Ошибка 400 «Bad Request» — вы открываете сайт по адресу, которого нет в DOMAIN (например, по IP или без www). Добавьте этот адрес в DOMAIN в /opt/guild-forum/.env через запятую и выполните guild start.
В логах password authentication failed for user "forum", сайт не открывается — пароль в POSTGRES_PASSWORD не совпадает с паролем в базе (обычно после того, как его поменяли в .env). Задайте этот пароль в базе — шаг 2 из раздела «Сменить пароль базы данных».
Не получается подключиться к TeamSpeak — проверьте, что порт 9987/udp открыт в файрволе сервера и в панели хостинга (это UDP, а не TCP). Логи: docker compose logs teamspeak. Если контейнер teamspeak сразу останавливается — не принята лицензия: в .env должно быть TS3SERVER_LICENSE=accept.
Не получается подключиться к TeamSpeak по ts.домен — проверьте A-запись ts (nslookup ts.ваш-домен) и что в Cloudflare для неё выключен прокси (серое облако). Если работает только по IP — DNS ещё не обновился или клиент TeamSpeak запомнил старый ответ: перезапустите клиент. Подробнее — «DNS для TeamSpeak».
Контейнер caddy не запускается — порт 80 или 443 занят другой программой (например, установленным nginx или Apache). Остановите её или удалите.
Не приходят письма подтверждения регистрации — админ-панель → Настройки сайта → «Почта (SMTP)»: проверьте сервер, порт и пароль приложения, затем нажмите «Отправить тестовое письмо» — при ошибке появится её причина. Проверьте и папку «Спам».
Хочу сначала попробовать на своём компьютере — установите Docker Desktop, укажите в .env DOMAIN=localhost и запустите docker compose up -d. Сайт откроется по адресу https://localhost (именно https и без порта). Браузер предупредит о сертификате — нажмите «Дополнительно» → «Перейти на сайт»: для localhost настоящий сертификат получить нельзя, на сервере с доменом предупреждения не будет.
Файл .env:
| Параметр | Обязателен | Описание |
|---|---|---|
DOMAIN |
да | Домен(ы) сайта через запятую |
DJANGO_SECRET_KEY |
да | Секретный ключ — длинная случайная строка. Никому не сообщайте |
POSTGRES_PASSWORD |
да | Пароль базы данных: openssl rand -hex 24. Применяется только при первом запуске — см. «Сменить пароль базы данных» |
DJANGO_SUPERUSER_USERNAME, DJANGO_SUPERUSER_PASSWORD, DJANGO_SUPERUSER_EMAIL |
— | Только для ручной установки: администратор, создаётся при первом запуске. Установщик создаёт администратора сам и эти параметры не заполняет. Ещё одного администратора можно добавить командой guild admin |
COMPOSE_PROFILES |
да | teamspeak — запускает сервер TeamSpeak и бота вместе с сайтом. Уже задан в .env.example, не удаляйте |
TS3SERVER_LICENSE |
да | accept — вы принимаете лицензию TeamSpeak |
TS3_SERVERADMIN_PASSWORD |
да | Пароль ServerQuery, которым бот управляет сервером: openssl rand -hex 16 |
TSBOT_API_TOKEN |
да | Ключ, которым бот входит в API сайта: openssl rand -hex 32. Без него бот только создаёт комнаты |
BACKUP_ENCRYPTION_PASSWORD |
для Яндекс Диска | Пароль шифрования резервных копий: openssl rand -base64 32. Сохраните вне сервера — без него копии не восстановить |
POSTGRES_DB, POSTGRES_USER |
— | Имя базы и пользователя. По умолчанию forum. Менять только до первого запуска |
GUNICORN_WORKERS |
— | Число процессов сайта. По умолчанию 3 |
После изменения .env выполните guild start, чтобы применить настройки.
- docs/GUIDE.md — руководство: работа с гильдией, регистрация и почта, резервные копии, TeamSpeak.
- docs/DEVELOPMENT.md — для разработчиков.
Запуск без Docker, тесты и перенос данных со старой установки — в docs/DEVELOPMENT.md.
