Две редакции, один продукт
Toutadmin существует в двух экземплярах: один работает на Node.js, другой на PHP. Это не два продукта и не урезанная версия рядом с полной. Это те же 51 разделов, та же схема из 142 таблиц, те же 16 языков, те же экраны. Эта страница говорит, что их разделяет на самом деле, — и это немного.
Почему их две#
Продукт для предприятия должен ставиться там, где предприятие уже находится. У одних есть
сервер, systemd и администратор; у других — виртуальный хостинг за четыре
евро в месяц и доступ по FTP. Редакция Node обращается к первым, редакция PHP — ко
вторым. Отказать вторым значило бы отказать половине компаний, которым инструмент
управления нужнее всего.
Что совпадает в точности#
| Показатель | Node | PHP |
|---|---|---|
| Рабочие разделы | 51 | 51 |
| Таблиц в базе | 142 | 142 |
| Столбцов | 1311 | 1311 |
| Языков интерфейса | 16 | 16 |
| Ключей перевода | 2765 | 2792 |
| Дополнительных модулей | 7 | 7 |
| Событий веб-перехватчиков | 8 | 8 |
| Ресурсов API | 9 | 9 |
Поскольку схема одна и та же, база переходит из одной редакции в другую без
преобразования: остановите одну, скопируйте app.sqlite и папки с
файлами, запустите другую. Пароли продолжают работать — обе редакции читают один формат
хеша. Это самая честная проверка паритета, и она пройдена.
Что различается#
Форма нескольких адресов#
531 маршрутов со стороны Node, 513 со стороны PHP. Разрыв — не нехватка: это те же функции, записанные короче.
-
API. Node объявляет свои девять ресурсов по одному
(
/api/v1/collaborateurs,/api/v1/services…); PHP обслуживает их одним маршрутом с параметром. Отвечают все девять, корень объявляет все девять, и тест вызывает их по одному, чтобы это доказать. - Установка. Node ведёт в пять шагов, PHP умещается на одной странице и в одной отправке. Спрашивают одно и то же: язык, требования, организацию, число дней годового отпуска, учётную запись администратора.
-
Сквозные права. У Node по маршруту на каждое право, у PHP — один
маршрут с параметром
/admin/droits/{flag}.
Эти двадцать восемь различий в форме не утверждаются по памяти: файл
tests/test_parity.php проверяет каждое из них поодиночке.
Периодический обход#
Node несёт собственный планировщик: сервер работает постоянно и будит себя сам. PHP живёт
только во время запроса: те же восемь операций проходят через tools/cron.php,
вызываемый планировщиком хостинга. Тот же прикладной код, тот же результат, другой
спусковой механизм.
Даты#
Node пишет даты через Intl, встроенный в V8. PHP делает то же, когда есть
расширение intl, — тот же движок ICU, совпадение до символа. Когда его нет,
названия дней и месяцев берутся из словарей перевода: дата остаётся верной и переведённой,
но порядок частей в некоторых языках может отличаться.
Что не различается, хотя казалось бы должно#
| Предмет | В обеих редакциях |
|---|---|
| QR-коды (двухфакторная проверка) | Кодировщик, написанный вручную на стороне PHP и сверенный побайтно с библиотекой, используемой на стороне Node, на шестнадцати длинах текста. |
| Архивы резервных копий | tar.gz, написанный без зависимостей с обеих сторон: то же содержимое, те же контрольные суммы SHA-256. |
| Бухгалтерский почтовый ящик IMAP | Клиент IMAP, написанный внутри продукта с обеих сторон. |
| PDF, CSV, импорт | Написаны внутри продукта, на выходе те же файлы. |
| Журнал аудита | Одинаковое сцепление хешей: изменённая строка рвёт цепочку, с обеих сторон. |
| Политика безопасности HTTP | Те же заголовки, та же CSP с разовым значением, то же отсутствие незаменимого JavaScript. |
Какую выбрать#
| Ваш случай | Редакция |
|---|---|
| Виртуальный хостинг, доступ по FTP, нет командной строки | PHP — ровно тот случай, ради которого она сделана |
Свой сервер, systemd, администратор | Node |
| Вы уже умеете вести одну из них | Её. Паритет делает выбор обратимым. |
| Много людей одновременно | Node — постоянный процесс, база уже открыта |
| Вы колеблетесь | PHP — меньше деталей в обслуживании, а переход на Node остаётся копированием файлов |
Как паритет удерживается#
Это не намерение, а проверка. При каждом изменении проходят четыре сравнения:
- Маршруты — извлекаются с обеих сторон и сравниваются; всякое расхождение должно быть задокументированным различием.
- Функции — имена, которые выставляет каждый модуль, сравниваются модуль за модулем.
- Схема — таблицы и столбцы считываются из обеих баз и сравниваются.
- Экраны — обе редакции запускаются рядом и обходятся настоящим браузером, страница за страницей, со сверкой кода ответа и структуры.
Эти четыре прохода нашли настоящие дефекты — в том числе два, затрагивавшие обе редакции. Именно это делает их полезными: паритет, который не измеряют, — это паритет, который потеряли, не заметив.
К этому добавляются наборы тестов: 802 случаев со стороны Node, 572 со стороны PHP, всего 1374.
Установить редакцию Node
Служба, обратный прокси, TLS, резервные копии, обновление.
Установить редакцию PHP
Виртуальный хостинг, права доступа, планировщик, TLS.
Документация Toutadmin — собрана 2026-09-13. Самостоятельный сайт, независимый от программы.