Skip to content

About

Готовое решение для гильдии в Perfect World: форум, приём заявок с голосованием, аукцион за очки активности, запись на ивенты, кос-лист, уведомления и сервер TeamSpeak 3 с ботом гильдии.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

⚔️ Сайт гильдии Perfect World

Форум, приём в гильдию с голосованием, аукцион за очки активности, ивенты и кос-лист —
на своём сервере одной командой

Python 3.13 Django 6.0 PostgreSQL 17 Docker Compose HTTPS через Caddy Лицензия MIT

Возможности · Установка · Первая настройка · Руководство · Решение проблем

Главная страница форума: слева тёмная тема, справа светлая

Тёмная и светлая тема переключаются одной кнопкой рядом с уведомлениями


Готовое решение для гильдии в 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 для защиты формы регистрации от ботов. Настраиваются в админ-панели после установки.

Установка

1. Настройте DNS

В панели управления доменом (у регистратора или 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 занимает от нескольких минут до нескольких часов — установщик проверит записи и подождёт, если они ещё не обновились.

2. Запустите установку

Подключитесь к серверу по SSH под пользователем root (или выполните sudo -i) и запустите:

bash <(curl -fsSL https://raw.githubusercontent.com/THEChrismoth/Perfect_World_guild_forum/master/install.sh)

Установщик:

  1. Проверит сервер: систему, процессор, память и свободные порты.
  2. Спросит домен сайта и домен TeamSpeak (по умолчанию ts.ваш-домен) и проверит, что они указывают на этот сервер.
  3. Спросит логин администратора и согласие с лицензией TeamSpeak.
  4. Установит Docker и последнюю версию сайта в /opt/guild-forum, сам сгенерирует все пароли и ключи в .env.
  5. Запустит сайт, создаст администратора и установит команду 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.

3. Подключитесь к TeamSpeak

  1. Откройте в панели хостинга (если там есть свой файрвол) порты 80, 443/tcp, 9987/udp (голос) и 30033/tcp (передача файлов).
  2. В клиенте TeamSpeak подключитесь к адресу из итогов установки, откройте Права → Использовать ключ привилегий и вставьте ключ — вы станете администратором сервера (главный администратор — вы, бот работает отдельно через ServerQuery). Ключ одноразовый; пока администратор не назначен, его можно посмотреть командой guild ts-key.

Как устроены комнаты, группы и доступ для членов гильдии — в «TeamSpeak».

Ручная установка

Если установщик не подходит — например, другая система
  1. Установите Docker: curl -fsSL https://get.docker.com | sh (для других систем — официальная инструкция).

  2. Скачайте последний релиз:

    git clone --branch v1.0.0 https://github.com/THEChrismoth/Perfect_World_guild_forum.git /opt/guild-forum
    cd /opt/guild-forum
  3. Заполните настройки:

    cp .env.example .env
    chmod 600 .env   # файл с паролями может читать только владелец
    nano .env
    Параметр Что вписать
    DOMAIN Ваш домен. Несколько — через запятую: myguild.ru, www.myguild.ru
    DJANGO_SECRET_KEY Сгенерируйте: openssl rand -base64 48
    POSTGRES_PASSWORD Пароль базы данных. Не придумывайте его, а сгенерируйте: openssl rand -hex 24
    BACKUP_ENCRYPTION_PASSWORD Пароль шифрования резервных копий: openssl rand -base64 32. Сохраните его вне сервера
    DJANGO_SUPERUSER_USERNAME, DJANGO_SUPERUSER_PASSWORD Логин и пароль первого администратора. Не используйте логин admin, пароль — не короче 12 символов
    TS3SERVER_LICENSE accept — вы принимаете лицензию TeamSpeak. Прочитать её: docker run --rm -e TS3SERVER_LICENSE=view teamspeak:3.13
    TS3_SERVERADMIN_PASSWORD Пароль, которым бот управляет сервером TeamSpeak: openssl rand -hex 16
    TSBOT_API_TOKEN Ключ, которым бот входит в API сайта: openssl rand -hex 32

    ⚠️ Пароль базы задаётся один раз. Он применяется при самом первом запуске, когда создаётся база. Если позже просто поменять POSTGRES_PASSWORD в .env, сайт перестанет подключаться к базе. Как сменить пароль правильно — в разделе «Безопасность».

  4. Установите команду guild, запустите сайт и укажите адрес TeamSpeak:

    sudo python3 cli/guild.py install
    guild start
    guild manage ts_address ts.myguild.ru
  5. Настройте DNS, как в шаге 1, и подключитесь к TeamSpeak, как в шаге 3. После первого входа удалите строку DJANGO_SUPERUSER_PASSWORD из .env — повторно администратор не создаётся.

Первая настройка

Зайдите в админ-панель: https://ваш-домен/admin/ — логин и пароль из итогов установки.

Сразу после первого входа смените пароль администратора: правый верхний угол → «Изменить пароль».

  1. Настройки сайта — впишите название гильдии (оно появится в шапке и во вкладке браузера) и загрузите иконку сайта (.ico или .png).

  2. Группы — создайте группу с названием ровно Член гильдии. Её участники голосуют по заявкам, видят закрытые разделы и попадают в таблицу очков активности. Добавлять игроков в группу можно на странице пользователя.

  3. Категории и подкатегории — создайте разделы форума. В «Группах с доступом» можно ограничить, кто видит раздел. Поле «Порядок сортировки» задаёт порядок разделов.

  4. Специальные разделы — создайте подкатегории и отметьте у каждой нужный флаг:

    Флаг Что будет в разделе
    Это прием заявок Форма вступления в гильдию. Члены гильдии этот раздел не видят
    Это просмотр заявок Заявки на голосовании. Виден только членам гильдии
    Это аукцион Аукцион лотов за очки активности
    Это ивентовая подкатегория Список ивентов и запись на них
  5. Резервные копии — включите шифрование и копии по расписанию, см. «Резервные копии».

  6. 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.

Лицензия

MIT

About

Готовое решение для гильдии в Perfect World: форум, приём заявок с голосованием, аукцион за очки активности, запись на ивенты, кос-лист, уведомления и сервер TeamSpeak 3 с ботом гильдии.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages