Код-ревью Middle Сети и тома обновлено
Ревью: скрипт запуска контейнеров
Вопрос
Скрипт поднимает базу и API на публичном сервере. Найди проблемы.
docker network create app-net
docker run -d --name db --network app-net \
-p 5432:5432 \
-e POSTGRES_PASSWORD=postgres \
postgres:16
docker run -d --name api --network app-net \
-p 8080:8080 \
-e DATABASE_URL=postgres://postgres:postgres@172.18.0.2:5432/app \
-v /srv/uploads:/app/uploads \
my/api:latest
Коротко
Исправленный вариант: База не публикуется наружу, данные в томе, секреты в файлах с правами 600, API ходит к db по имени. Для такого набора сервисов удобнее сразу compose-файл.
Что должен найти ревьюер
- Безопасностьстрока 3Порт базы опубликован на всех интерфейсах: Docker обходит ufw, база доступна из интернета. API ходит по внутренней сети, публикация не нужна (или
127.0.0.1:5432:5432). - Безопасностьстрока 4Пароль
postgresв открытом виде в командной строке: виден вpsи истории shell. Использовать сильный пароль из файла--env-fileилиPOSTGRES_PASSWORD_FILEс секретом. - Ошибкастрока 5У базы нет тома: данные пропадут при пересоздании контейнера. Нужен
-v pgdata:/var/lib/postgresql/data. - Ошибкастрока 8Подключение по IP
172.18.0.2: адрес меняется при пересоздании контейнера. Использовать имяdb. - Ошибкастрока 10Тег
latest: непонятно, какая версия запущена, откат невозможен. Указать версию или digest. - СтильНет политики перезапуска (
--restart unless-stopped) и ограничения логов: после ребута сервисы не поднимутся, логи растут без ограничений.
Разбор
Исправленный вариант:
docker network create app-net
docker volume create pgdata
docker run -d --name db --network app-net --restart unless-stopped \
--env-file /etc/app/db.env \
-v pgdata:/var/lib/postgresql/data \
postgres:16
docker run -d --name api --network app-net --restart unless-stopped \
-p 8080:8080 --env-file /etc/app/api.env \
-v /srv/uploads:/app/uploads \
--log-opt max-size=10m --log-opt max-file=3 \
my/api:1.4.2
База не публикуется наружу, данные в томе, секреты в файлах с правами 600, API ходит к db по имени. Для такого набора сервисов удобнее сразу compose-файл.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.