В этом коммите я решил наконец разобраться с инфраструктурой фронтенда в 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 отвечает на вопросы ещё до того, как их зададут.