This commit is contained in:
246
docs/DOCKER_OPTIMIZATION.md
Normal file
246
docs/DOCKER_OPTIMIZATION.md
Normal file
@@ -0,0 +1,246 @@
|
||||
# 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
|
||||
@@ -8,8 +8,10 @@
|
||||
|
||||
- **[MAKEFILE.md](./MAKEFILE.md)** - Полное руководство по командам Make для разработки и деплоя
|
||||
- **[CICD.md](./CICD.md)** - Документация по CI/CD пайплайну и автоматизации
|
||||
- **[DOCKER_OPTIMIZATION.md](./DOCKER_OPTIMIZATION.md)** - Оптимизация Docker образов и .dockerignore
|
||||
- **[DEPLOYMENT.md](./DEPLOYMENT.md)** - Инструкции по развертыванию в продакшене
|
||||
- **[FIXES.md](./FIXES.md)** - Известные проблемы и их решения
|
||||
- **[TELEGRAM_SETUP.md](./TELEGRAM_SETUP.md)** - Настройка Telegram уведомлений для CI/CD
|
||||
|
||||
### 🧪 Для тестировщиков
|
||||
|
||||
@@ -36,8 +38,10 @@ docs/
|
||||
├── README.md # Этот файл - обзор документации
|
||||
├── MAKEFILE.md # Руководство по командам Make
|
||||
├── CICD.md # Документация по CI/CD и автоматизации
|
||||
├── DOCKER_OPTIMIZATION.md # Оптимизация Docker образов
|
||||
├── DEPLOYMENT.md # Инструкции по деплою
|
||||
├── FIXES.md # Исправления и решения проблем
|
||||
├── TELEGRAM_SETUP.md # Настройка Telegram уведомлений
|
||||
└── COVER_OVERLAY_TESTING.md # Документация по тестированию
|
||||
```
|
||||
|
||||
@@ -59,6 +63,13 @@ make backup # Создать бэкап БД
|
||||
make restore # Восстановить БД
|
||||
```
|
||||
|
||||
### Docker и оптимизация
|
||||
```bash
|
||||
make build-optimized # Сборка оптимизированных образов
|
||||
make analyze-images # Анализ размеров образов
|
||||
make clean-unoptimized # Очистка неоптимизированных образов
|
||||
```
|
||||
|
||||
### CI/CD и автоматизация
|
||||
```bash
|
||||
make ci-lint # Проверка кода (CI)
|
||||
|
||||
169
docs/TELEGRAM_SETUP.md
Normal file
169
docs/TELEGRAM_SETUP.md
Normal file
@@ -0,0 +1,169 @@
|
||||
# Настройка Telegram уведомлений для Drone CI
|
||||
|
||||
## 📱 Как настроить Telegram уведомления
|
||||
|
||||
Если вы хотите получать уведомления о сборках в Telegram, следуйте этой инструкции.
|
||||
|
||||
### 1. Создание Telegram бота
|
||||
|
||||
1. Найдите [@BotFather](https://t.me/botfather) в Telegram
|
||||
2. Отправьте команду `/newbot`
|
||||
3. Следуйте инструкциям для создания бота
|
||||
4. Сохраните **токен бота** (например: `123456789:ABCdefGHIjklMNOpqrSTUvwxyz`)
|
||||
|
||||
### 2. Получение Chat ID
|
||||
|
||||
**Способ 1 - Личные сообщения:**
|
||||
1. Напишите вашему боту любое сообщение
|
||||
2. Откройте: `https://api.telegram.org/bot<TOKEN>/getUpdates`
|
||||
3. Найдите `"chat":{"id":123456789}` - это ваш Chat ID
|
||||
|
||||
**Способ 2 - Групповой чат:**
|
||||
1. Добавьте бота в группу
|
||||
2. Дайте боту права администратора (если нужно)
|
||||
3. Напишите в группе: `/start`
|
||||
4. Откройте: `https://api.telegram.org/bot<TOKEN>/getUpdates`
|
||||
5. Найдите Chat ID группы (обычно отрицательное число)
|
||||
|
||||
### 3. Настройка секретов в Drone
|
||||
|
||||
Добавьте следующие секреты в ваш Drone CI репозиторий:
|
||||
|
||||
```bash
|
||||
# Токен бота
|
||||
telegram_token: 123456789:ABCdefGHIjklMNOpqrSTUvwxyz
|
||||
|
||||
# Chat ID (можно несколько через запятую)
|
||||
telegram_chat_id: 123456789,987654321
|
||||
```
|
||||
|
||||
### 4. Добавление в .drone.yml
|
||||
|
||||
Добавьте этот пайплайн в ваш `.drone.yml`:
|
||||
|
||||
```yaml
|
||||
---
|
||||
kind: pipeline
|
||||
type: docker
|
||||
name: telegram-notify
|
||||
|
||||
steps:
|
||||
- name: telegram
|
||||
image: appleboy/drone-telegram
|
||||
settings:
|
||||
token:
|
||||
from_secret: telegram_token
|
||||
to:
|
||||
from_secret: telegram_chat_id
|
||||
format: markdown
|
||||
message: |
|
||||
{{#success build.status}}
|
||||
✅ *Build Success*
|
||||
{{else}}
|
||||
❌ *Build Failed*
|
||||
{{/success}}
|
||||
|
||||
📁 *Repository:* {{repo.name}}
|
||||
🌿 *Branch:* {{build.branch}}
|
||||
👤 *Author:* {{build.author}}
|
||||
📝 *Commit:* `{{truncate build.commit 8}}`
|
||||
⏱️ *Duration:* {{since build.started}}
|
||||
🔗 [View Build]({{build.link}})
|
||||
|
||||
trigger:
|
||||
status:
|
||||
- success
|
||||
- failure
|
||||
|
||||
depends_on:
|
||||
- catlink-ci
|
||||
```
|
||||
|
||||
### 5. Тестирование
|
||||
|
||||
1. Сделайте коммит в репозиторий
|
||||
2. Проверьте логи Drone CI
|
||||
3. Убедитесь, что уведомление пришло в Telegram
|
||||
|
||||
### 🛠️ Расширенные настройки
|
||||
|
||||
#### Уведомления только для определенных событий
|
||||
|
||||
```yaml
|
||||
trigger:
|
||||
status:
|
||||
- success
|
||||
- failure
|
||||
branch:
|
||||
- master
|
||||
- main
|
||||
event:
|
||||
exclude:
|
||||
- pull_request
|
||||
```
|
||||
|
||||
#### Кастомное сообщение с больше информации
|
||||
|
||||
```yaml
|
||||
message: |
|
||||
{{#success build.status}}
|
||||
🎉 *Сборка прошла успешно!*
|
||||
{{else}}
|
||||
💥 *Сборка упала!*
|
||||
{{/success}}
|
||||
|
||||
📦 *Проект:* {{repo.name}}
|
||||
🌿 *Ветка:* {{build.branch}}
|
||||
👨💻 *Автор:* {{build.author}}
|
||||
📝 *Коммит:* `{{build.commit}}`
|
||||
⏱️ *Время:* {{datetime build.finished "02/01/2006 15:04:05" "Europe/Moscow"}}
|
||||
|
||||
{{#success build.status}}
|
||||
✅ Все тесты прошли
|
||||
🚀 Готово к деплою
|
||||
{{else}}
|
||||
❌ Проверьте логи: {{build.link}}
|
||||
{{/success}}
|
||||
```
|
||||
|
||||
### 🔧 Устранение неполадок
|
||||
|
||||
#### Ошибка: "missing telegram token or user list"
|
||||
|
||||
**Причина:** Не настроены секреты в Drone
|
||||
|
||||
**Решение:**
|
||||
1. Проверьте, что секреты добавлены в настройках репозитория
|
||||
2. Убедитесь в правильности названий секретов
|
||||
3. Перезапустите сборку
|
||||
|
||||
#### Ошибка: "Bad Request: chat not found"
|
||||
|
||||
**Причина:** Неправильный Chat ID
|
||||
|
||||
**Решение:**
|
||||
1. Убедитесь, что бот добавлен в чат
|
||||
2. Проверьте Chat ID через getUpdates API
|
||||
3. Для групп используйте отрицательный ID
|
||||
|
||||
#### Бот не отвечает
|
||||
|
||||
**Причина:** Неправильный токен или бот заблокирован
|
||||
|
||||
**Решение:**
|
||||
1. Проверьте токен бота
|
||||
2. Убедитесь, что бот не заблокирован
|
||||
3. Создайте нового бота если необходимо
|
||||
|
||||
### 📱 Альтернативы
|
||||
|
||||
Если Telegram не подходит, вы можете использовать:
|
||||
|
||||
- **Slack**: `plugins/slack`
|
||||
- **Discord**: `appleboy/drone-discord`
|
||||
- **Email**: `drillster/drone-email`
|
||||
- **Microsoft Teams**: `kibble-cabal/drone-teams`
|
||||
|
||||
---
|
||||
|
||||
**Примечание:** В текущей конфигурации Telegram уведомления отключены чтобы избежать ошибок. Включите их только после настройки секретов.
|
||||
Reference in New Issue
Block a user