trueCORD или как я сделал self-hosted чат в стиле Discord, который работает на обычном PHP + SQLite — без Docker и Node [open-source]

Self-hosted чат в стиле Discord, который реально можно поднять самому.
Self-hosted чат в стиле Discord, который реально можно поднять самому.

Серверы, текстовые каналы, личные сообщения, голосовые комнаты, звонки, реакции и обмен файлами — в одном привычном интерфейсе. Без сборки, без Node, без отдельного сервера БД, за которым нужно следить. Только PHP и один файл SQLite.
Демо: https://4tusa.site Демо: https://morrowind.site Исходники (MIT): https://github.com/MrZer0x0/trueCORD

🖼 Обзор в слайдах

trueCORD или как я сделал self-hosted чат в стиле Discord, который работает на обычном PHP + SQLite — без Docker и Node [open-source]

🏠 Свой Discord-чат на собственном хостинге — серверы, каналы, личные сообщения, голос и демонстрация экрана в одном привычном интерфейсе. Только PHP + SQLite.
💬 Чат, который уже знаком — текстовые каналы, личные сообщения, эмодзи-реакции, превью ссылок и обмен файлами.

trueCORD или как я сделал self-hosted чат в стиле Discord, который работает на обычном PHP + SQLite — без Docker и Node [open-source]

🎙 Общение в реальном времени — голосовые каналы и звонки по WebRTC, живой список участников и подсветка говорящего.

trueCORD или как я сделал self-hosted чат в стиле Discord, который работает на обычном PHP + SQLite — без Docker и Node [open-source]

🖥 Делитесь экраном — транслируйте рабочий стол прямо в голосовой канал, смотрите вместе и выносите звонок в отдельное окно. Без плагинов.

trueCORD или как я сделал self-hosted чат в стиле Discord, который работает на обычном PHP + SQLite — без Docker и Node [open-source]

⚙ Нужны лишь PHP + SQLite — без Docker, без Node, без Postgres, без сборки. Тянет блог на WordPress — потянет и trueCORD.

trueCORD или как я сделал self-hosted чат в стиле Discord, который работает на обычном PHP + SQLite — без Docker и Node [open-source]

📱 Запускается на любом устройстве с браузером — одностраничное веб-приложение, ставится как PWA. Без App Store и Google Play.

trueCORD или как я сделал self-hosted чат в стиле Discord, который работает на обычном PHP + SQLite — без Docker и Node [open-source]

Зачем это

https://4tusa.site (демонстрация)

Мне хотелось место, где моё сообщество могло бы общаться, не завися от чужих серверов, без рекламы и без необходимости быть админом-девопсом, чтобы всё это работало. Большинство self-hosted чатов требуют Docker, инстанс Postgres, очередь сообщений и полдня вашей жизни до того, как вы увидите экран входа. trueCORD — полная противоположность: закидываете файлы почти на любой дешёвый PHP-хостинг, открываете страницу, и всё.

Это одностраничное приложение поверх небольшого PHP-API. Всё состояние хранится в одном файле SQLite. Если ваш хостинг тянет блог на WordPress — он потянет и это.

Что внутри

  • Серверы и каналы — организуйте общение так, как привыкли.
  • Личные сообщения — приватные диалоги один на один, с редактированием и реакциями.
  • Голосовые комнаты и звонки — общение в реальном времени (WebRTC), с возможностью демонстрации экрана.
  • Реакции — эмодзи на любое сообщение.
  • Обмен файлами — картинки, аудио, видео и документы. Крупные изображения сжимаются автоматически, а лента подгружает лёгкие миниатюры; полный размер открывается по клику.
  • Четыре языка из коробки — английский, русский, немецкий, французский, переключаются на лету.
  • Темы оформления — несколько встроенных тем, включая светлую и AMOLED-чёрную.
  • Плавающее поле ввода — поле «Написать сообщение» парит островом над лентой во всех темах; последние сообщения мягко уезжают под него.
  • Динамический фон — необязательные плавные цветные пятна за интерфейсом (оптимизированы под GPU, см. раздел «Производительность»).
  • PWA — устанавливается на телефон и компьютер.
  • Мини-приложения — встраиваемые внутри клиента игры и инструменты (в комплекте демо 3D-шашек).
  • Конфиг в одном файле — брендинг, политики и лимиты живут в config.json. Чтобы перебрендировать или подкрутить настройки, код трогать не нужно.

Требования

Нужно немного. Обычного шаред-хостинга достаточно.

  • PHP 7.3 или новее (рекомендуется 8.1+ — быстрее, и код полностью совместим)
  • Расширение PDO SQLite (почти всегда включено по умолчанию)
  • Расширение GD — для сжатия картинок и миниатюр. Без него приложение тоже работает, просто не будет уменьшать изображения.
  • Веб-сервер — Apache работает сразу благодаря вложенному .htaccess. Nginx тоже подходит, нужно лишь добавить пару правил вручную (см. ниже).
  • HTTPS — настоятельно рекомендуется, а для голоса/звонков и установки PWA браузеры его требуют.

Никакого Node.js. Никакого Composer. Никакой отдельной базы данных. Никакой сборки.

Установка

Кратко: загрузить, выставить права, открыть в браузере.

1. Загрузите файлы на сервер.

git clone https://github.com/MrZer0/truecord.git cd truecord

Или просто скачайте ZIP и загрузите содержимое в корень сайта (например, public_html/) по FTP.

2. Сделайте папку uploads доступной для записи.

Там хранятся загруженные файлы и миниатюры изображений.

mkdir -p uploads chmod 755 uploads

На большинстве хостингов 755 достаточно. Если загрузка не работает — попробуйте 775. Файл базы SQLite создаётся автоматически при первом запуске в каталоге приложения, поэтому он тоже должен быть доступен для записи.

3. Настройте свой экземпляр.

Откройте config.json и задайте как минимум название и описание проекта. Всё снабжено комментариями прямо в файле. Что обычно меняют первым делом:

  • project.name — название в заголовке и боковой панели
  • project.description — текст на экране входа
  • owner.super_admin_name — имя пользователя, который станет суперадмином
  • messaging.dm_policy — кто кому может писать в ЛС (shared_space, verified_only или everyone)
  • registration.username_min_length — минимальная длина имени (по умолчанию 4)
  • security.cors_enabled — оставьте false, если точно не знаете, что вам это нужно

4. Откройте в браузере.

Зайдите на свой домен. Откроется экран входа/регистрации. Зарегистрируйте аккаунт с именем, совпадающим с owner.super_admin_name — он автоматически станет администратором.

Вот и всё. Мастера установки нет, потому что устанавливать нечего.

Про Nginx

Вложенный .htaccess рассчитан на Apache. На Nginx приложение отдаёт и страницу, и API из одной точки входа, поэтому хитрой маршрутизации не нужно — но стоит закрыть доступ к конфигу и базе. Минимальное добавление:

location~* /(config\.json|.*\.db)$ { deny all; }location~ /\.ht { deny all; }

Убедитесь, что PHP-файлы обрабатываются вашим блоком PHP-FPM как обычно.

Обновление

Сначала всегда сделайте резервную копию config.json и файла .db.

Затем замените файлы приложения (index.php, truecord_api.php, api_modules/, i18n.js, config.php, sw.js) новыми версиями. Конфиг и база остаются нетронутыми. После обновления сделайте жёсткую перезагрузку (Ctrl+Shift+R), чтобы браузер подхватил новый фронтенд. Схема базы при необходимости мигрирует сама при первой загрузке.

Конфигурация вкратце

Два экземпляра могут использовать абсолютно одинаковый код и различаться только своим config.json — именно так проект и задуман.

Производительность

Клиент trueCORD написан без тяжёлых фреймворков, но пара визуальных эффектов умеет нагружать видеокарту. Что важно знать:

  • Динамический фон (плавные цветные пятна) — самый затратный эффект. Он использует крупные размытые слои; чтобы не жечь GPU, анимация двигает только transform (работа композитора), масштабирование внутри анимации убрано, радиус размытия и режим наложения подобраны экономно.
  • Авто-пауза. Когда вкладка свёрнута или вы переключились на другую, все фоновые анимации останавливаются (visibilitychange) — в фоне нагрузка падает практически до нуля.
  • Авто-режим для слабых устройств. Если у нового пользователя мало ядер CPU или памяти, тяжёлый фон по умолчанию выключается. Включить его вручную можно в «Настройках» → «Динамический фон»; ваш выбор сохраняется.
  • Если устройство греется или садится батарея — отключите динамический фон и «живую анимацию» в настройках. Интерфейс при этом полностью сохраняет вид и плавность.

Темы и интерфейс

Доступны три основные темы — белая, Discord и чёрная (trueCORD). Поле ввода во всех темах оформлено как плавающий «остров» над лентой сообщений. На мобильных устройствах поле ввода остаётся закреплённым снизу (это удобнее с экранной клавиатурой).

О безопасности

  • Пароли хешируются через password_hash PHP. Токены используют random_bytes.
  • Все обращения к базе — через подготовленные запросы (prepared statements).
  • Загруженные файлы отдаются с X-Content-Type-Options: nosniff и песочной Content-Security-Policy; всё, что не является заведомо безопасным медиа, принудительно скачивается, а не отображается.
  • Есть базовое ограничение частоты входа против перебора паролей.
  • Держите security.debug_mode в значении false в продакшене, чтобы детали ошибок не утекали.
  • Всегда работайте по HTTPS.

Лицензия

MIT

Автор

Сделано MrZer0.

Если вы развернули свой экземпляр, нашли баг или собрали что-то на основе проекта — буду рад услышать.

1
1