Код-ревью 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-файл.

Что должен найти ревьюер

  1. Безопасностьстрока 3
    Порт базы опубликован на всех интерфейсах: Docker обходит ufw, база доступна из интернета. API ходит по внутренней сети, публикация не нужна (или 127.0.0.1:5432:5432).
  2. Безопасностьстрока 4
    Пароль postgres в открытом виде в командной строке: виден в ps и истории shell. Использовать сильный пароль из файла --env-file или POSTGRES_PASSWORD_FILE с секретом.
  3. Ошибкастрока 5
    У базы нет тома: данные пропадут при пересоздании контейнера. Нужен -v pgdata:/var/lib/postgresql/data.
  4. Ошибкастрока 8
    Подключение по IP 172.18.0.2: адрес меняется при пересоздании контейнера. Использовать имя db.
  5. Ошибкастрока 10
    Тег latest: непонятно, какая версия запущена, откат невозможен. Указать версию или digest.
  6. Стиль
    Нет политики перезапуска (--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 ошибок.