Dev-база и загрузки попадают в Docker-образ: .dockerignore не исключает backend/data/ (#71) #93

Merged
NotBigGhost merged 1 commits from issue-71-dockerignore-data into dev 2026-09-19 00:11:09 +03:00
Collaborator

Что сделано

Шаблоны .dockerignore отсчитываются от корня контекста. Поэтому data/ ловил только корневую папку, а backend/*.db — только файлы прямо в backend/. Dockerfile копирует backend/ целиком, и в каждый прод-образ уходили backend/data/dev/ — dev-БД и uploads — и egg-info.

Теперь .dockerignore исключает:

  • backend/data/;
  • любые *.db, *.db-wal, *.db-shm;
  • **/*.egg-info/;
  • .env в любой папке;
  • backups/ — там лежат локальные копии прод-БД, теперь они не уходят даже в контекст сборки.

В README убрана пометка о дыре.

Модель угрозы

  • Атакующий — любой, кто может сделать pull образа forbidden-stars из реестра Gitea.
  • Что он получал: слои с dev-БД (ники, bcrypt-хеши паролей, аудит с IP), dev-uploads (фото) и egg-info.
  • Что закрыто: образы, собранные из этой ветки, этих файлов не содержат.
  • Что не закрыто кодом: старые образы в реестре по-прежнему содержат dev-данные на момент своей сборки (см. ниже).

Что проверено

Собрал одноразовый образ FROM scratch + COPY backend/ /app/ (+ COPY frontend/) с выгрузкой файловой системы в папку. Базовый образ и реестр для этого не нужны.

  • Старый .dockerignore: в /app есть data/dev/forbidden_stars.db, -shm, -wal, data/dev/uploads, forbidden_stars_backend.egg-info — дыра подтверждена.
  • Новый .dockerignore:
    • нет ни data, ни *.db*, ни *.egg-info, ни dev_*.py, ни tests/, ни .env, ни node_modules;
    • прод-код на месте: app/, alembic/, alembic.ini, entrypoint.sh, requirements.txt;
    • во фронтенд-контексте есть src/, package*.json, vite.config.ts.

Полную сборку docker buildx bake (arm64) не запускал: изменение убирает из контекста только данные, файлы для сборки не трогает.

Коммиты

  • 164db49 Безопасность: dev-БД и загрузки не попадают в Docker-образ

Отклонения от плана

Нет.

Что остаётся владельцу

  • Пересобрать и перепушить образы: scripts/build-push.ps1.
  • Убедиться, что реестр Gitea приватный, и удалить старые теги или манифесты forbidden-stars: в них dev-БД на момент сборки. Реестр я не трогал.
  • Если в dev-БД когда-либо была копия прод-данных — считать их скомпрометированными в пределах доступа к реестру и сменить затронутые пароли.

Closes #71

🤖 Generated with Claude Code

https://claude.ai/code/session_01LqSoRj99iwVEH5U5fnZgsd

## Что сделано Шаблоны `.dockerignore` отсчитываются от корня контекста. Поэтому `data/` ловил только корневую папку, а `backend/*.db` — только файлы прямо в `backend/`. `Dockerfile` копирует `backend/` целиком, и в каждый прод-образ уходили `backend/data/dev/` — dev-БД и uploads — и `egg-info`. Теперь `.dockerignore` исключает: - `backend/data/`; - любые `*.db`, `*.db-wal`, `*.db-shm`; - `**/*.egg-info/`; - `.env` в любой папке; - `backups/` — там лежат локальные копии прод-БД, теперь они не уходят даже в контекст сборки. В README убрана пометка о дыре. ## Модель угрозы - **Атакующий** — любой, кто может сделать `pull` образа `forbidden-stars` из реестра Gitea. - **Что он получал:** слои с dev-БД (ники, bcrypt-хеши паролей, аудит с IP), dev-uploads (фото) и `egg-info`. - **Что закрыто:** образы, собранные из этой ветки, этих файлов не содержат. - **Что не закрыто кодом:** старые образы в реестре по-прежнему содержат dev-данные на момент своей сборки (см. ниже). ## Что проверено Собрал одноразовый образ `FROM scratch` + `COPY backend/ /app/` (+ `COPY frontend/`) с выгрузкой файловой системы в папку. Базовый образ и реестр для этого не нужны. - **Старый `.dockerignore`:** в `/app` есть `data/dev/forbidden_stars.db`, `-shm`, `-wal`, `data/dev/uploads`, `forbidden_stars_backend.egg-info` — дыра подтверждена. - **Новый `.dockerignore`:** - нет ни `data`, ни `*.db*`, ни `*.egg-info`, ни `dev_*.py`, ни `tests/`, ни `.env`, ни `node_modules`; - прод-код на месте: `app/`, `alembic/`, `alembic.ini`, `entrypoint.sh`, `requirements.txt`; - во фронтенд-контексте есть `src/`, `package*.json`, `vite.config.ts`. Полную сборку `docker buildx bake` (arm64) не запускал: изменение убирает из контекста только данные, файлы для сборки не трогает. ## Коммиты - `164db49` Безопасность: dev-БД и загрузки не попадают в Docker-образ ## Отклонения от плана Нет. ## Что остаётся владельцу - [ ] Пересобрать и перепушить образы: `scripts/build-push.ps1`. - [ ] Убедиться, что реестр Gitea приватный, и удалить старые теги или манифесты `forbidden-stars`: в них dev-БД на момент сборки. Реестр я не трогал. - [ ] Если в dev-БД когда-либо была копия прод-данных — считать их скомпрометированными в пределах доступа к реестру и сменить затронутые пароли. Closes #71 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01LqSoRj99iwVEH5U5fnZgsd
Agent added 1 commit 2026-09-18 23:55:30 +03:00
Шаблоны .dockerignore отсчитываются от корня контекста: `data/` ловил только
корневую папку, `backend/*.db` — только файлы прямо в backend/. Dockerfile
копирует backend/ целиком, и в каждый прод-образ уходили backend/data/dev/
(dev-БД с хешами паролей и аудитом, uploads) и egg-info от pip install -e.

Теперь исключены backend/data/, любые *.db/-wal/-shm, *.egg-info, .env в любой
папке и backups/ (копии прод-БД не уходят и в контекст сборки). README больше
не говорит о дыре. #71

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LqSoRj99iwVEH5U5fnZgsd
NotBigGhost merged commit f7f74fee8c into dev 2026-09-19 00:11:09 +03:00
NotBigGhost deleted branch issue-71-dockerignore-data 2026-09-19 00:11:09 +03:00
Sign in to join this conversation.