CI/CD build notifications
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
2025-11-02 06:33:45 +09:00
parent d5f1809f5a
commit 01532e860a
10 changed files with 1104 additions and 42 deletions

92
.dockerignore Normal file
View File

@@ -0,0 +1,92 @@
# Общие файлы разработки
.git
.gitignore
.gitattributes
README.md
LICENSE
CHANGELOG.md
# Документация
docs/
*.md
# CI/CD файлы
.drone.yml
.drone.simple.yml
.github/
.gitlab-ci.yml
Jenkinsfile
# IDE и редакторы
.vscode/
.idea/
*.swp
*.swo
*~
.DS_Store
Thumbs.db
# Логи
*.log
logs/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Временные файлы
.tmp/
.temp/
*.tmp
*.temp
# Операционная система
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
# Бэкапы
*.backup
*.bak
backups/
# Развертывание и окружение
.env.local
.env.development.local
.env.test.local
.env.production.local
docker-compose.override.yml
docker-compose.test.yml
docker-compose.production.yml
# Тесты
coverage/
.nyc_output/
test-results/
*.test
*.spec
# Скрипты разработки
scripts/
Makefile
# Frontend специфичные файлы (будут переопределены в frontend)
node_modules/
.next/
out/
build/
dist/
# Backend специфичные файлы (будут переопределены в backend)
__pycache__/
*.py[cod]
*$py.class
.pytest_cache/
.coverage
htmlcov/
.venv/
venv/
.env

175
.drone.simple.yml Normal file
View File

@@ -0,0 +1,175 @@
---
kind: pipeline
type: docker
name: catlink-ci
# Trigger настройки
trigger:
branch:
- master
- main
- develop
event:
- push
- pull_request
# Глобальные переменные
environment:
DOCKER_BUILDKIT: 1
COMPOSE_DOCKER_CLI_BUILD: 1
# Этапы пайплайна
steps:
# 1. Установка зависимостей и подготовка
- name: prepare
image: docker:20.10-dind
volumes:
- name: docker
path: /var/run/docker.sock
commands:
- apk add --no-cache make curl git bash
- docker --version
- echo "Repository:$${DRONE_REPO}"
- echo "Branch:$${DRONE_BRANCH}"
- echo "Commit:$${DRONE_COMMIT_SHA:0:8}"
# 2. Линтинг и проверка кода
- name: lint
image: docker:20.10-dind
volumes:
- name: docker
path: /var/run/docker.sock
commands:
- echo "🔍 Running code quality checks..."
- chmod +x ./scripts/ci/lint.sh
- ./scripts/ci/lint.sh
depends_on:
- prepare
# 3. Сборка приложения
- name: build
image: docker:20.10-dind
volumes:
- name: docker
path: /var/run/docker.sock
commands:
- echo "🏗️ Building application..."
- chmod +x ./scripts/ci/build.sh
- ./scripts/ci/build.sh
depends_on:
- lint
# 4. Тестирование
- name: test
image: docker:20.10-dind
volumes:
- name: docker
path: /var/run/docker.sock
environment:
DATABASE_URL: postgres://catlink:catlink@postgres:5432/catlink_test
commands:
- echo "🧪 Running tests..."
- chmod +x ./scripts/ci/test.sh
- ./scripts/ci/test.sh
depends_on:
- build
# 5. Анализ безопасности
- name: security-scan
image: docker:20.10-dind
volumes:
- name: docker
path: /var/run/docker.sock
commands:
- echo "🔒 Running security scans..."
- chmod +x ./scripts/ci/security-scan.sh
- ./scripts/ci/security-scan.sh
depends_on:
- test
failure: ignore # Не останавливаем пайплайн при проблемах безопасности
# 6. Простые уведомления через echo
- name: notify-success
image: alpine:latest
commands:
- echo "✅ BUILD SUCCESS!"
- echo "📁 Repository: $${DRONE_REPO}"
- echo "🌿 Branch: $${DRONE_BRANCH}"
- echo "👤 Author: $${DRONE_COMMIT_AUTHOR}"
- echo "📝 Commit: $${DRONE_COMMIT_SHA:0:8}"
- echo "🔗 Build: $${DRONE_BUILD_LINK}"
depends_on:
- security-scan
when:
status:
- success
- name: notify-failure
image: alpine:latest
commands:
- echo "❌ BUILD FAILED!"
- echo "📁 Repository: $${DRONE_REPO}"
- echo "🌿 Branch: $${DRONE_BRANCH}"
- echo "👤 Author: $${DRONE_COMMIT_AUTHOR}"
- echo "📝 Commit: $${DRONE_COMMIT_SHA:0:8}"
- echo "🔗 Build: $${DRONE_BUILD_LINK}"
depends_on:
- security-scan
when:
status:
- failure
# 7. Уведомления в Telegram
- name: telegram-notify
steps:
- name: telegram
image: appleboy/drone-telegram
settings:
token:
from_secret: 8579410984:AAHQAgz3Lw5r7W_Q352tVY6eFxfussOzREY
to:
from_secret: 556399210
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
# Сервисы для тестирования
services:
# PostgreSQL для тестов
- name: postgres
image: postgres:14-alpine
environment:
POSTGRES_DB: catlink_test
POSTGRES_USER: catlink
POSTGRES_PASSWORD: catlink
POSTGRES_HOST_AUTH_METHOD: trust
tmpfs:
- /var/lib/postgresql/data
# Redis для кеширования (если потребуется)
- name: redis
image: redis:7-alpine
# Volumes
volumes:
- name: docker
host:
path: /var/run/docker.sock

View File

@@ -27,12 +27,12 @@ steps:
- name: docker
path: /var/run/docker.sock
commands:
- apk add --no-cache make curl git
- apk add --no-cache make curl git bash
- docker --version
- docker-compose --version
- echo "Repository:$${DRONE_REPO}"
- echo "Branch:$${DRONE_BRANCH}"
- echo "Commit:$${DRONE_COMMIT_SHA:0:8}"
- chmod +x scripts/ci/*.sh
# 2. Линтинг и проверка кода
- name: lint
@@ -178,8 +178,8 @@ steps:
event:
- push
# 10. Уведомления
- name: notify
# 10. Уведомления через Slack (если настроено)
- name: notify-slack
image: plugins/slack
settings:
webhook:
@@ -209,6 +209,34 @@ steps:
status:
- success
- failure
failure: ignore # Не падаем если Slack не настроен
# 11. Простые уведомления в логах
- name: notify-console
image: alpine:latest
commands:
- |
if [ "$${DRONE_BUILD_STATUS}" = "success" ]; then
echo "✅ BUILD SUCCESS!"
echo "📁 Repository: $${DRONE_REPO}"
echo "🌿 Branch: $${DRONE_BRANCH}"
echo "👤 Author: $${DRONE_COMMIT_AUTHOR}"
echo "📝 Commit: $${DRONE_COMMIT_SHA:0:8}"
echo "🕐 Duration: $$(date -d @$${DRONE_BUILD_STARTED} '+%H:%M:%S')"
else
echo "❌ BUILD FAILED!"
echo "📁 Repository: $${DRONE_REPO}"
echo "🌿 Branch: $${DRONE_BRANCH}"
echo "👤 Author: $${DRONE_COMMIT_AUTHOR}"
echo "📝 Commit: $${DRONE_COMMIT_SHA:0:8}"
fi
depends_on:
- deploy-production
- deploy-staging
when:
status:
- success
- failure
# Сервисы для тестирования
services:
@@ -233,44 +261,6 @@ volumes:
host:
path: /var/run/docker.sock
---
# Дополнительный пайплайн для нотификаций в Telegram
kind: pipeline
type: docker
name: telegram-notify
# Уведомления в Telegram
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
---
# Пайплайн для релизов
kind: pipeline

109
backend/.dockerignore Normal file
View File

@@ -0,0 +1,109 @@
# Python bytecode
__pycache__/
*.py[cod]
*$py.class
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
*.manifest
*.spec
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
.hypothesis/
.pytest_cache/
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Django specific
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
media/
staticfiles/
# Development files
.git/
.gitignore
README.md
docs/
*.md
# IDE
.vscode/
.idea/
*.swp
*.swo
# CI/CD
.drone.yml
.github/
Dockerfile.dev
docker-compose*.yml
# Testing
pytest.ini
.pytest_cache/
test_*.py
*_test.py
tests/
# Migrations (включаем только для разработки)
# migrations/
# Static files (собираются при сборке)
static/
storage/
# Backup files
*.backup
*.bak
# OS files
.DS_Store
Thumbs.db
# Frontend files (не нужны в backend контейнере)
frontend/
node_modules/
package*.json
*.js.map
# Development scripts
scripts/
Makefile

View File

@@ -0,0 +1,65 @@
# Multi-stage Docker build для оптимального размера
FROM python:3.11-slim as base
# Установка системных зависимостей
RUN apt-get update && apt-get install -y \
gcc \
postgresql-client \
curl \
&& rm -rf /var/lib/apt/lists/*
# Создание пользователя приложения
RUN useradd --create-home --shell /bin/bash app
# Установка рабочей директории
WORKDIR /app
# Копирование и установка Python зависимостей
COPY requirements.txt .
RUN pip install --no-cache-dir --upgrade pip && \
pip install --no-cache-dir -r requirements.txt
# Production stage
FROM base as production
# Build arguments для метаданных
ARG BUILD_VERSION=latest
ARG BUILD_DATE
ARG VCS_REF
# Метаданные образа
LABEL org.opencontainers.image.title="CatLink Backend" \
org.opencontainers.image.description="Django REST API для CatLink" \
org.opencontainers.image.version="$BUILD_VERSION" \
org.opencontainers.image.created="$BUILD_DATE" \
org.opencontainers.image.revision="$VCS_REF" \
org.opencontainers.image.source="https://github.com/smartsoltech/links"
# Копирование приложения
COPY --chown=app:app . .
# Создание необходимых директорий
RUN mkdir -p staticfiles media logs && \
chown -R app:app /app
# Переключение на пользователя приложения
USER app
# Сбор статических файлов
RUN python manage.py collectstatic --noinput
# Переменные окружения для продакшена
ENV PYTHONPATH="/app" \
PYTHONUNBUFFERED=1 \
DJANGO_SETTINGS_MODULE="backend.settings" \
PORT=8000
# Health check
HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \
CMD curl -f http://localhost:$PORT/api/health/ || exit 1
# Открытие порта
EXPOSE $PORT
# Команда запуска
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "--workers", "4", "--worker-class", "sync", "--worker-connections", "1000", "--max-requests", "1000", "--max-requests-jitter", "100", "backend.wsgi:application"]

246
docs/DOCKER_OPTIMIZATION.md Normal file
View 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

View File

@@ -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
View 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 уведомления отключены чтобы избежать ошибок. Включите их только после настройки секретов.

View File

@@ -0,0 +1,119 @@
# Dependencies
node_modules/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
package-lock.json
yarn.lock
# Production build
.next/
out/
build/
dist/
# Environment files
.env
.env.local
.env.development.local
.env.test.local
.env.production.local
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Coverage directory used by tools like istanbul
coverage/
.nyc_output/
# IDE and editor files
.vscode/
.idea/
*.swp
*.swo
*~
# OS generated files
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
# Git
.git/
.gitignore
.gitattributes
# Documentation
README.md
*.md
docs/
# CI/CD files
.drone.yml
.github/
.gitlab-ci.yml
docker-compose*.yml
Dockerfile.dev
# Testing
jest.config.js
.jest/
__tests__/
**/*.test.js
**/*.test.ts
**/*.test.tsx
**/*.spec.js
**/*.spec.ts
**/*.spec.tsx
# Linting
.eslintrc*
.eslintignore
.prettierrc*
.prettierignore
# TypeScript
*.tsbuildinfo
tsconfig.json
# Storybook
.storybook/
storybook-static/
# Temporary folders
tmp/
temp/
# Logs
logs/
*.log
# Backend files (не нужны в frontend контейнере)
backend/
*.py
*.pyc
requirements.txt
manage.py
# Development scripts
scripts/
Makefile
# Design files
design/
# Cache directories
.cache/
# Vercel
.vercel
# Turbo
.turbo

View File

@@ -0,0 +1,86 @@
# Multi-stage build для оптимального размера
FROM node:20-alpine AS base
# Установка зависимостей для сборки
RUN apk add --no-cache libc6-compat curl
# Dependencies stage
FROM base AS deps
WORKDIR /app
# Копирование файлов зависимостей
COPY package.json package-lock.json* ./
# Установка зависимостей
RUN npm ci --only=production && npm cache clean --force
# Builder stage
FROM base AS builder
WORKDIR /app
# Копирование зависимостей из предыдущего stage
COPY --from=deps /app/node_modules ./node_modules
# Копирование исходного кода
COPY . .
# Build arguments
ARG BUILD_VERSION=latest
ARG BUILD_DATE
ARG VCS_REF
ARG NEXT_PUBLIC_API_URL
# Переменные окружения для сборки
ENV NODE_ENV=production \
NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL \
BUILD_VERSION=$BUILD_VERSION
# Генерация статических файлов Next.js
RUN npm run build
# Production stage
FROM node:20-alpine AS runner
# Build arguments для метаданных
ARG BUILD_VERSION=latest
ARG BUILD_DATE
ARG VCS_REF
# Метаданные образа
LABEL org.opencontainers.image.title="CatLink Frontend" \
org.opencontainers.image.description="Next.js приложение для CatLink" \
org.opencontainers.image.version="$BUILD_VERSION" \
org.opencontainers.image.created="$BUILD_DATE" \
org.opencontainers.image.revision="$VCS_REF" \
org.opencontainers.image.source="https://github.com/smartsoltech/links"
WORKDIR /app
# Создание пользователя приложения
RUN addgroup --system --gid 1001 nodejs && \
adduser --system --uid 1001 nextjs
# Копирование собранного приложения
COPY --from=builder /app/public ./public
# Копирование статических файлов
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
# Переменные окружения
ENV NODE_ENV=production \
PORT=3000 \
HOSTNAME="0.0.0.0"
# Переключение на пользователя приложения
USER nextjs
# Health check
HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \
CMD curl -f http://localhost:$PORT/health || exit 1
# Открытие порта
EXPOSE $PORT
# Команда запуска
CMD ["node", "server.js"]