This commit is contained in:
92
.dockerignore
Normal file
92
.dockerignore
Normal 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
175
.drone.simple.yml
Normal 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
|
||||||
74
.drone.yml
74
.drone.yml
@@ -27,12 +27,12 @@ steps:
|
|||||||
- name: docker
|
- name: docker
|
||||||
path: /var/run/docker.sock
|
path: /var/run/docker.sock
|
||||||
commands:
|
commands:
|
||||||
- apk add --no-cache make curl git
|
- apk add --no-cache make curl git bash
|
||||||
- docker --version
|
- docker --version
|
||||||
- docker-compose --version
|
|
||||||
- echo "Repository:$${DRONE_REPO}"
|
- echo "Repository:$${DRONE_REPO}"
|
||||||
- echo "Branch:$${DRONE_BRANCH}"
|
- echo "Branch:$${DRONE_BRANCH}"
|
||||||
- echo "Commit:$${DRONE_COMMIT_SHA:0:8}"
|
- echo "Commit:$${DRONE_COMMIT_SHA:0:8}"
|
||||||
|
- chmod +x scripts/ci/*.sh
|
||||||
|
|
||||||
# 2. Линтинг и проверка кода
|
# 2. Линтинг и проверка кода
|
||||||
- name: lint
|
- name: lint
|
||||||
@@ -178,8 +178,8 @@ steps:
|
|||||||
event:
|
event:
|
||||||
- push
|
- push
|
||||||
|
|
||||||
# 10. Уведомления
|
# 10. Уведомления через Slack (если настроено)
|
||||||
- name: notify
|
- name: notify-slack
|
||||||
image: plugins/slack
|
image: plugins/slack
|
||||||
settings:
|
settings:
|
||||||
webhook:
|
webhook:
|
||||||
@@ -209,6 +209,34 @@ steps:
|
|||||||
status:
|
status:
|
||||||
- success
|
- success
|
||||||
- failure
|
- 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:
|
services:
|
||||||
@@ -233,44 +261,6 @@ volumes:
|
|||||||
host:
|
host:
|
||||||
path: /var/run/docker.sock
|
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
|
kind: pipeline
|
||||||
|
|||||||
109
backend/.dockerignore
Normal file
109
backend/.dockerignore
Normal 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
|
||||||
65
backend/Dockerfile.optimized
Normal file
65
backend/Dockerfile.optimized
Normal 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
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 для разработки и деплоя
|
- **[MAKEFILE.md](./MAKEFILE.md)** - Полное руководство по командам Make для разработки и деплоя
|
||||||
- **[CICD.md](./CICD.md)** - Документация по CI/CD пайплайну и автоматизации
|
- **[CICD.md](./CICD.md)** - Документация по CI/CD пайплайну и автоматизации
|
||||||
|
- **[DOCKER_OPTIMIZATION.md](./DOCKER_OPTIMIZATION.md)** - Оптимизация Docker образов и .dockerignore
|
||||||
- **[DEPLOYMENT.md](./DEPLOYMENT.md)** - Инструкции по развертыванию в продакшене
|
- **[DEPLOYMENT.md](./DEPLOYMENT.md)** - Инструкции по развертыванию в продакшене
|
||||||
- **[FIXES.md](./FIXES.md)** - Известные проблемы и их решения
|
- **[FIXES.md](./FIXES.md)** - Известные проблемы и их решения
|
||||||
|
- **[TELEGRAM_SETUP.md](./TELEGRAM_SETUP.md)** - Настройка Telegram уведомлений для CI/CD
|
||||||
|
|
||||||
### 🧪 Для тестировщиков
|
### 🧪 Для тестировщиков
|
||||||
|
|
||||||
@@ -36,8 +38,10 @@ docs/
|
|||||||
├── README.md # Этот файл - обзор документации
|
├── README.md # Этот файл - обзор документации
|
||||||
├── MAKEFILE.md # Руководство по командам Make
|
├── MAKEFILE.md # Руководство по командам Make
|
||||||
├── CICD.md # Документация по CI/CD и автоматизации
|
├── CICD.md # Документация по CI/CD и автоматизации
|
||||||
|
├── DOCKER_OPTIMIZATION.md # Оптимизация Docker образов
|
||||||
├── DEPLOYMENT.md # Инструкции по деплою
|
├── DEPLOYMENT.md # Инструкции по деплою
|
||||||
├── FIXES.md # Исправления и решения проблем
|
├── FIXES.md # Исправления и решения проблем
|
||||||
|
├── TELEGRAM_SETUP.md # Настройка Telegram уведомлений
|
||||||
└── COVER_OVERLAY_TESTING.md # Документация по тестированию
|
└── COVER_OVERLAY_TESTING.md # Документация по тестированию
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -59,6 +63,13 @@ make backup # Создать бэкап БД
|
|||||||
make restore # Восстановить БД
|
make restore # Восстановить БД
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Docker и оптимизация
|
||||||
|
```bash
|
||||||
|
make build-optimized # Сборка оптимизированных образов
|
||||||
|
make analyze-images # Анализ размеров образов
|
||||||
|
make clean-unoptimized # Очистка неоптимизированных образов
|
||||||
|
```
|
||||||
|
|
||||||
### CI/CD и автоматизация
|
### CI/CD и автоматизация
|
||||||
```bash
|
```bash
|
||||||
make ci-lint # Проверка кода (CI)
|
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 уведомления отключены чтобы избежать ошибок. Включите их только после настройки секретов.
|
||||||
119
frontend/linktree-frontend/.dockerignore
Normal file
119
frontend/linktree-frontend/.dockerignore
Normal 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
|
||||||
86
frontend/linktree-frontend/Dockerfile.optimized
Normal file
86
frontend/linktree-frontend/Dockerfile.optimized
Normal 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"]
|
||||||
Reference in New Issue
Block a user