Главная/Кейсы/Macrulez Platform Tools
Vue 3Node.js · ExpressPostgreSQLDockerxterm.jsПет-проект

Файлы, база данных
и терминал —
прямо в браузере

Файловый менеджер и многотабовый терминал — для любого запущенного контейнера платформы, а не только для самой панели. Рядом — браузер и SQL-редактор её собственной базы PostgreSQL. Поправить конфиг, посмотреть таблицу, выполнить команду — без отдельного SSH-клиента.

3инструмента в одном модуле: файлы, БД, терминал
Любойконтейнер платформы — для файлового менеджера и терминала
5вкладок терминала одновременно, у каждой свой контейнер
0SSH-сессий, чтобы туда попасть
Проблема

Опять открывать
SSH ради
мелочи?

Деплой и мониторинг контейнеров — это отдельный кейс. Но даже когда сборка и логи под контролем, любая мелкая задача внутри уже запущенного контейнера — поправить конфиг, заглянуть в таблицу Postgres, выполнить команду — почти всегда означает отдельный SSH-клиент, туннель и попытку вспомнить, какой это контейнер и где он висит.

Файловый менеджер и многотабовый терминал решают это прямо в админ-панели: оба работают с любым запущенным контейнером платформы, выбранным из единого списка, а не только с самой панелью управления. Рядом — браузер собственной базы PostgreSQL панели, где обычно и видна причина: битый конфиг или неудачная миграция.

Что построено

Три инструмента,
ноль SSH-сессий.

Файловый менеджер и терминал — с выбором контейнера из общего списка. Рядом — полноценный браузер собственной базы PostgreSQL панели.

01

Файловый менеджер — любой контейнер

Выбор контейнера из списка (с человекочитаемым именем деплоя, а не techническим app-<uuid>) — и дерево каталогов внутри него: листинг через find + stat, чтение и редактирование текстовых файлов, mkdir / copy / move / delete, скачивание и множественная загрузка. Всё через Docker Archive API, без единого SSH-подключения.

Docker Archive APImulti-containerupload/download
02

Каталог: схемы и таблицы под рукой

Дерево схем и таблиц с поиском и избранным, бейджи размера и количества строк, тип объекта (таблица / view / materialized view). Вкладки «Данные» / «Структура» / «Индексы»: PK / UQ / FK прямо на колонках, клик по внешнему ключу — переход к связанной таблице. Мультифильтры, массовое выделение, инлайн-редактирование ячеек, экспорт в CSV.

PostgreSQL catalogFK navigationbulk opsCSV export
03

SQL-редактор, который знает схему

Редактор на CodeMirror с подсветкой синтаксиса и автодополнением, которое знает реальные схемы, таблицы и колонки текущей БД. История запросов и именованные сохранённые запросы. Подтверждение перед выполнением «опасных» запросов (DELETE / UPDATE / DROP без WHERE), кнопка EXPLAIN.

CodeMirrorschema-aware autocompleteEXPLAIN
04

Терминал на несколько контейнеров сразу

До 5 вкладок одновременно, у каждой свой выбор контейнера в выпадающем списке прямо под шапкой. Смена контейнера во вкладке переоткрывает сессию в нём же — старая закрывается, вкладка и её история остаются. Шелл (bash или sh) и идентити пользователя определяются автоматически при подключении.

xterm.jsdocker execper-tab container binding
05

Быстрые команды и история без localStorage

История и избранные команды сохраняются на сервере — доступны с любого устройства. Чипы быстрых команд (ls -a, docker compose ps, htop…), контекстное меню по правому клику с готовыми утилитами по группам, и модалка-справочник: какие CLI-инструменты вообще доступны в контейнерах — файлы, мониторинг, редакторы, сеть, утилиты.

server-side historyquick commandscontext menu
06

Общий список контейнеров — для файлов и терминала

Файловый менеджер и терминал берут список запущенных контейнеров из одного эндпоинта — с теми же человекочитаемыми именами деплоев. Выбрал контейнер в одном модуле — он сразу узнаваем и в другом, не нужно сверяться с техническим ID из docker ps.

единый источник данныхконсистентный UX
Под капотом

Нетривиальные
решения.

Детали, которые делают разницу между «вроде работает» и «работает с любым контейнером».

  1. 01
    Файлы и шелл — на одном движке, но не мешают друг другу

    Редактор файлов и интерактивный терминал работают через один и тот же канал docker exec, но ведут себя по-разному: команда «сохранить файл» отрабатывает и возвращает результат мгновенно, а сессия терминала держит живой поток ввода-вывода, пока вкладка открыта. Это разделение и позволяет открывать оба инструмента в одном контейнере одновременно, не мешая друг другу.

    docker execфайлы + терминалбез блокировок
  2. 02
    Загрузка файлов — без лишнего веса в проекте

    Сохранение, скачивание и пакетная загрузка файлов внутри любого контейнера работают через нативный Docker Archive API — без сторонней библиотеки-архиватора в зависимостях. Меньше кода в проекте, меньше поверхность для багов и обновлений зависимостей.

    Docker Archive APIбез лишних зависимостей
  3. 03
    Внешние ключи — это ссылки, а не просто текст

    В вкладке «Структура» внешний ключ — не подпись, а кликабельный переход к связанной таблице. Чтобы это работало одинаково надёжно для простой таблицы и для схемы с десятками перекрёстных связей, все связи собираются одним запросом, а не пачкой отдельных обращений к базе на каждую колонку.

    PostgreSQLFK-навигацияединый запрос
  4. 04
    Состав индекса — человеческим языком

    Вкладка «Индексы» показывает, из каких колонок собран составной индекс или ограничение, простым списком через запятую — а не внутренним форматом PostgreSQL, который без явной обработки превращается в нечитаемую строку.

    PostgreSQLчитаемые индексы
  5. 05
    Подключение к контейнеру — без угадывания

    У произвольного контейнера платформы не всегда есть bash, и неизвестно, под каким пользователем там окажешься. Терминал выясняет всё это одним быстрым обменом данными при подключении — и открывает сессию сразу с правильным шеллом, без задержек и проб «методом тыка».

    автоопределение шеллабез задержек
В деле

Без SSH
от начала
до конца.

Один из задеплоенных сервисов начал отвечать 500. Открываю «Базы данных» — нахожу его запись в таблице деплоев, вижу битое значение в JSON-колонке с runtime-переменными.

Перехожу в «Файлы», выбираю тот же контейнер — открываю .env рядом с настройками, сверяю переменные окружения. Проблема не в окружении — значит, в коде.

Открываю «Терминал», во вкладке выбираю тот же контейнер — запускаю node -e … прямо в его окружении, чтобы воспроизвести ошибку. Ни одной вкладки SSH-клиента, ни одного docker exec с хоста руками.

Без этих модулей такой сценарий выглядел бы иначе: правка через psql на хосте, SSH и docker exec в нужный контейнер — здесь это просмотр записи в браузере и пара кликов между уже открытыми вкладками панели.

Скриншоты

Как это
выглядит.

«Лучший инструмент диагностики — тот, который не заставляет переключаться между пятью разными терминалами и помнить, в каком из них ты сейчас находишься.»

— из опыта разработки Macrulez Platform Tools
Следующий шаг

Нужны admin-инструменты для своей платформы?

Спроектирую и реализую admin-инструменты любой сложности: от файлового менеджера до браузера БД и веб-терминала. Работаю с Vue 3, Node.js и Docker.