trueCORD или как я сделал self-hosted чат в стиле Discord, который работает на обычном PHP + SQLite — без Docker и Node [open-source]
Серверы, текстовые каналы, личные сообщения, голосовые комнаты, звонки, реакции и обмен файлами — в одном привычном интерфейсе. Без сборки, без Node, без отдельного сервера БД, за которым нужно следить. Только PHP и один файл SQLite.
Демо: https://4tusa.site Демо: https://morrowind.site Исходники (MIT): https://github.com/MrZer0x0/trueCORD
🖼 Обзор в слайдах
🏠 Свой Discord-чат на собственном хостинге — серверы, каналы, личные сообщения, голос и демонстрация экрана в одном привычном интерфейсе. Только PHP + SQLite.
💬 Чат, который уже знаком — текстовые каналы, личные сообщения, эмодзи-реакции, превью ссылок и обмен файлами.
🎙 Общение в реальном времени — голосовые каналы и звонки по WebRTC, живой список участников и подсветка говорящего.
🖥 Делитесь экраном — транслируйте рабочий стол прямо в голосовой канал, смотрите вместе и выносите звонок в отдельное окно. Без плагинов.
⚙ Нужны лишь PHP + SQLite — без Docker, без Node, без Postgres, без сборки. Тянет блог на WordPress — потянет и trueCORD.
📱 Запускается на любом устройстве с браузером — одностраничное веб-приложение, ставится как PWA. Без App Store и Google Play.
Зачем это
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.
Если вы развернули свой экземпляр, нашли баг или собрали что-то на основе проекта — буду рад услышать.