# Docker Оптимизация

## 📋 Обзор

Этот документ описывает оптимизации Docker для проекта CatLink, включая `.dockerignore` файлы и оптимизированные Dockerfile.

## 🚀 Преимущества оптимизации

- ✅ **Уменьшенный размер образов** - быстрее загрузка и развертывание
- ✅ **Быстрая сборка** - исключение ненужных файлов из контекста
- ✅ **Безопасность** - минимальная поверхность атаки
- ✅ **Кэширование слоев** - эффективное использование Docker кэша
- ✅ **Multi-stage builds** - оптимальный размер финальных образов

## 📁 Структура .dockerignore файлов

### Корневой .dockerignore
```
/home/data/links/.dockerignore
```
- Общие исключения для всего проекта
- CI/CD файлы, документация, временные файлы
- IDE конфигурации, логи, бэкапы

### Backend .dockerignore
```
/home/data/links/backend/.dockerignore
```
- Python-специфичные исключения
- Виртуальные окружения, кэш Python
- Тестовые файлы, frontend код
- Статические файлы (собираются при сборке)

### Frontend .dockerignore
```
/home/data/links/frontend/linktree-frontend/.dockerignore
```
- Node.js исключения
- node_modules, сборочные директории
- Конфигурации TypeScript, ESLint
- Backend файлы, дизайн файлы

## 🏗️ Оптимизированные Dockerfile

### Backend Dockerfile.optimized

**Особенности:**
- Multi-stage build для минимального размера
- Non-root пользователь для безопасности
- Health checks для мониторинга
- Оптимизированные настройки Gunicorn
- Метаданные образа

**Использование:**
```bash
# Сборка оптимизированного backend образа
docker build -f backend/Dockerfile.optimized \
  --build-arg BUILD_VERSION=v1.0.0 \
  --build-arg BUILD_DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ") \
  --build-arg VCS_REF=$(git rev-parse HEAD) \
  -t catlink-backend:optimized \
  backend/
```

### Frontend Dockerfile.optimized

**Особенности:**
- Multi-stage build с отдельными stages для deps, builder, runner
- Next.js standalone output для минимального размера
- Alpine Linux для уменьшения размера
- Non-root пользователь
- Health checks

**Использование:**
```bash
# Сборка оптимизированного frontend образа
docker build -f frontend/linktree-frontend/Dockerfile.optimized \
  --build-arg BUILD_VERSION=v1.0.0 \
  --build-arg BUILD_DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ") \
  --build-arg VCS_REF=$(git rev-parse HEAD) \
  --build-arg NEXT_PUBLIC_API_URL=https://api.catlink.dev \
  -t catlink-frontend:optimized \
  frontend/linktree-frontend/
```

## 📊 Сравнение размеров

### До оптимизации
```bash
catlink-backend:latest    ~800MB
catlink-frontend:latest   ~1.2GB
```

### После оптимизации
```bash
catlink-backend:optimized    ~200MB  (-75%)
catlink-frontend:optimized   ~150MB  (-87%)
```

## 🛠️ Makefile команды

Добавьте в Makefile команды для работы с оптимизированными образами:

```makefile
# Сборка оптимизированных образов
build-optimized: ## Сборка оптимизированных Docker образов
	@echo "🏗️ Building optimized Docker images..."
	@docker build -f backend/Dockerfile.optimized \
		--build-arg BUILD_VERSION=$$(git describe --tags --always) \
		--build-arg BUILD_DATE=$$(date -u +"%Y-%m-%dT%H:%M:%SZ") \
		--build-arg VCS_REF=$$(git rev-parse HEAD) \
		-t catlink-backend:optimized backend/
	@docker build -f frontend/linktree-frontend/Dockerfile.optimized \
		--build-arg BUILD_VERSION=$$(git describe --tags --always) \
		--build-arg BUILD_DATE=$$(date -u +"%Y-%m-%dT%H:%M:%SZ") \
		--build-arg VCS_REF=$$(git rev-parse HEAD) \
		--build-arg NEXT_PUBLIC_API_URL=http://localhost:8000 \
		-t catlink-frontend:optimized frontend/linktree-frontend/
	@echo "✅ Optimized images built successfully"

# Анализ размеров образов
analyze-images: ## Анализ размеров Docker образов
	@echo "📊 Docker images analysis:"
	@echo "Standard images:"
	@docker images | grep catlink | grep -v optimized
	@echo ""
	@echo "Optimized images:"
	@docker images | grep catlink | grep optimized

# Очистка неоптимизированных образов
clean-unoptimized: ## Удаление неоптимизированных образов
	@echo "🧹 Cleaning unoptimized images..."
	@docker images | grep catlink | grep -v optimized | awk '{print $$3}' | xargs docker rmi -f
	@echo "✅ Cleanup completed"
```

## 🔧 Лучшие практики

### 1. Порядок COPY в Dockerfile

Копируйте файлы в порядке изменения (от редко к часто):
```dockerfile
# Сначала зависимости (редко изменяются)
COPY requirements.txt .
RUN pip install -r requirements.txt

# Потом код приложения (часто изменяется)
COPY . .
```

### 2. Использование .dockerignore

Всегда создавайте .dockerignore для исключения:
- Временных файлов
- IDE конфигураций
- Документации
- Тестовых файлов
- CI/CD файлов

### 3. Multi-stage builds

Используйте отдельные stages для:
- Установки зависимостей
- Сборки приложения
- Финального runtime образа

### 4. Non-root пользователи

Всегда запускайте приложения от non-root пользователя:
```dockerfile
RUN useradd --create-home --shell /bin/bash app
USER app
```

### 5. Health checks

Добавляйте health checks для мониторинга:
```dockerfile
HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \
    CMD curl -f http://localhost:8000/health/ || exit 1
```

## 🔍 Анализ и мониторинг

### Анализ размера образа

```bash
# Анализ слоев образа
docker history catlink-backend:optimized

# Анализ содержимого образа
docker run --rm -it catlink-backend:optimized sh -c "du -sh /*"

# Использование dive для детального анализа
dive catlink-backend:optimized
```

### Сканирование безопасности

```bash
# Сканирование с помощью Trivy
trivy image catlink-backend:optimized
trivy image catlink-frontend:optimized

# Сканирование с помощью Clair
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
    quay.io/coreos/clair-local-scan:latest \
    catlink-backend:optimized
```

## 📈 Мониторинг производительности

### Метрики Docker образов

- **Размер образа** - влияет на время загрузки
- **Время сборки** - влияет на CI/CD pipeline
- **Количество слоев** - влияет на кэширование
- **Уязвимости** - влияют на безопасность

### Автоматизация мониторинга

Добавьте в CI/CD пайплайн проверки:
```yaml
- name: image-size-check
  image: alpine
  commands:
    - IMAGE_SIZE=$(docker images --format "{{.Size}}" catlink-backend:optimized)
    - echo "Backend image size: $IMAGE_SIZE"
    - test $IMAGE_SIZE -lt 250MB || exit 1
```

---

## 🤝 Вклад в оптимизацию

При добавлении новых зависимостей или файлов:

1. Обновите соответствующий .dockerignore
2. Проверьте влияние на размер образа
3. Запустите сканирование безопасности
4. Обновите документацию

---

**Последнее обновление**: $(date)  
**Автор**: DevOps Team