Фикс Docker-фронтенда, README и package-lock.json: наводим порядок в окружении

В этом коммите я решил наконец разобраться с инфраструктурой фронтенда в Docker — накопилось несколько мелких, но неприятных проблем, которые мешали гладкому деплою.

Проблема первая: package-lock.json не копировался в образ

В hub/frontend/Dockerfile было написано:

COPY package.json ./

Это значило, что при сборке Docker-образа package-lock.json не попадал в контейнер. npm в Alpine-образе устанавливал зависимости по package.json, игнорируя lock-файл. В результате на CI и локально могли получаться разные наборы зависимостей — классическая проблема воспроизводимости сборок.

Фикс тривиальный, но важный:

COPY package*.json ./

Теперь package-lock.json копируется, и npm установит именно те версии, что зафиксированы в lock-файле.

Проблема вторая: несуществующая мажорная версия eslint-plugin-react

В hub/frontend/package.json была ошибка в devDependencies:

"eslint-plugin-react": "^8.32.2"

Восьмой мажорной версии eslint-plugin-react не существует (на момент написания кода актуальная — 7.x). npm пытался найти ^8.32.2, не находил, и установка зависимостей падала с ошибкой. Вероятно, это произошло из-за автодополнения или копирования из непроверенного источника.

Исправление:

"eslint-plugin-react": "^7.32.2"

Теперь зависимости устанавливаются без ошибок, и ESLint снова работает.

Проблема третья: добавление package-lock.json

Сам lock-файл был добавлен в репозиторий впервые (файл hub/frontend/package-lock.json, +5396 строк). Раньше его не было — зависимости устанавливались «на лету» по package.json, что, как я уже сказал, ломало воспроизводимость. Теперь lock-файл под версионным контролем, и каждый разработчик (и CI) получит одинаковое дерево зависимостей.

Проблема четвёртая: в README не хватало таблицы портов

В hub/README.md я добавил секцию Default Ports с таблицей:

Service Host Port Container Port Environment
Frontend 80 80 Production (Nginx)
Backend 8001 8000 Production (FastAPI)
Development 3000 N/A Local Development (Vite)
Database 5432 5432 PostgreSQL

Раньше разработчику приходилось лезть в docker-compose.yml, чтобы узнать, на каком порту что висит. Теперь вся информация о портах — в одном месте, прямо в README, сразу после инструкции по запуску.

Итог

Четыре небольших, но важных изменения: 1. Dockerfile — копируем lock-файл для детерминированных сборок 2. package.json — исправлена несуществующая версия плагина 3. package-lock.json — добавлен в репозиторий 4. README.md — документированы порты всех сервисов

Вместе они делают сборку фронтенда стабильной и прозрачной. Docker-образ собирается одинаково на любой машине, а README отвечает на вопросы ещё до того, как их зададут.