diff --git a/.dockerignore b/.dockerignore index 86bae41..c9458ff 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,33 +1,21 @@ -# Dependencies +# Зависимости node_modules nextjs_space/node_modules -npm-debug.log - -# Next.js build output -nextjs_space/.next -.next - -# Testing -coverage -.nyc_output - -# Misc -.DS_Store -*.pem - -# Environment variables (except example) -.env -.env.local -.env.development.local -.env.test.local -.env.production.local - -# Debug logs npm-debug.log* yarn-debug.log* yarn-error.log* +# Build +nextjs_space/.next +nextjs_space/out +nextjs_space/build +nextjs_space/dist + +# Тестирование +nextjs_space/coverage +nextjs_space/.nyc_output + # IDE .vscode .idea @@ -35,29 +23,34 @@ yarn-error.log* *.swo *~ +# OS +.DS_Store +Thumbs.db + +# Переменные окружения (они монтируются отдельно) +.env +.env.local +.env*.local +nextjs_space/.env* + # Git .git .gitignore -# Documentation (не нужны в образе) -README.md -README.deployment.md -DATABASE.md -DATABASE.pdf - -# Docker files +# Docker Dockerfile -docker-compose.yml +docker-compose*.yml .dockerignore -# Scripts +# Документация +README*.md +*.md + +# Логи и кеш +*.log +.cache + +# Скрипты развертывания *.sh - -# Backups -backups/ -*.sql -*.sql.gz - -# Config examples -nginx.conf.example traefik-config-example.yml +nginx.conf.example diff --git a/BUILD_OPTIMIZATION.md b/BUILD_OPTIMIZATION.md new file mode 100644 index 0000000..cb73642 --- /dev/null +++ b/BUILD_OPTIMIZATION.md @@ -0,0 +1,132 @@ + +# Оптимизация сборки Docker образа + +## Проблема: Медленная сборка на этапе "Building fresh packages" + +Сборка может занимать **15-30 минут** из-за компиляции нативных модулей (Prisma, bcryptjs и др.). + +## Внесенные оптимизации + +### 1. Устранена двойная установка зависимостей +**Было:** +```dockerfile +RUN yarn install --production --frozen-lockfile +RUN yarn install --frozen-lockfile +``` + +**Стало:** +```dockerfile +RUN yarn install --immutable --network-timeout 600000 +``` + +### 2. Добавлены переменные окружения для ускорения +```dockerfile +ENV SKIP_SASS_BINARY_DOWNLOAD_FOR_CI=true +ENV SKIP_NODE_SASS_TESTS=true +ENV CYPRESS_INSTALL_BINARY=0 +ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true +``` + +### 3. Создан .dockerignore +Исключены ненужные файлы из контекста сборки (логи, кеш, документация и т.д.). + +## Рекомендации при развертывании + +### Если сборка все еще медленная: + +#### Вариант 1: Увеличьте ресурсы Docker +```bash +# Проверьте текущие лимиты +docker info | grep -i "CPUs\|Memory" + +# Для Docker Desktop: Settings → Resources +# CPU: минимум 2 ядра, рекомендуется 4 +# RAM: минимум 4GB, рекомендуется 8GB +``` + +#### Вариант 2: Используйте готовый образ (рекомендуется) +Соберите образ один раз на мощной машине и загрузите в реестр: + +```bash +# На мощной машине +docker build -t global-it24:latest . +docker save global-it24:latest | gzip > global-it24-image.tar.gz + +# Перенесите файл на сервер и загрузите +docker load < global-it24-image.tar.gz +``` + +#### Вариант 3: Используйте BuildKit с кешированием +```bash +# Включите BuildKit +export DOCKER_BUILDKIT=1 + +# Соберите с кешем +docker build --build-arg BUILDKIT_INLINE_CACHE=1 -t global-it24:latest . +``` + +#### Вариант 4: Установите более быстрый линкер (на хосте) +```bash +# Для Ubuntu/Debian +sudo apt-get install -y mold + +# Добавьте в Dockerfile перед RUN yarn install +ENV CC=clang +ENV CXX=clang++ +ENV LD=mold +``` + +## Мониторинг прогресса сборки + +```bash +# В отдельном терминале следите за процессом +docker ps -a | grep build +docker stats + +# Проверьте логи подробнее +docker build --progress=plain -t global-it24:latest . +``` + +## Типичное время сборки + +| Конфигурация | Время | +|-------------|-------| +| 2 CPU, 4GB RAM | 20-30 минут | +| 4 CPU, 8GB RAM | 10-15 минут | +| 8 CPU, 16GB RAM | 5-8 минут | +| С кешем BuildKit | 2-5 минут | + +## Нормальное поведение + +✅ **Это нормально:** +- Предупреждения о peer dependencies (они не влияют на работу) +- Долгая компиляция на этапе "Building fresh packages" (10-20 минут) +- Множество предупреждений от Prisma и других пакетов + +❌ **Это проблема:** +- Сборка зависла более 45 минут без прогресса +- Ошибки (errors), а не предупреждения (warnings) +- Выход с кодом ошибки + +## Если сборка зависла намертво + +```bash +# Остановите сборку +Ctrl+C + +# Очистите все промежуточные контейнеры и кеш +docker builder prune -a -f + +# Попробуйте снова с --no-cache +docker build --no-cache -t global-it24:latest . +``` + +## Альтернатива: Многоступенчатая сборка на CI/CD + +Если у вас есть GitHub Actions, GitLab CI или Jenkins: + +1. Соберите образ на CI/CD сервере (обычно там больше ресурсов) +2. Загрузите в Docker Registry (Docker Hub, GitHub Registry, GitLab Registry) +3. На продакшн-сервере просто выполните `docker pull` + +Это самый быстрый и надежный способ для production. diff --git a/BUILD_OPTIMIZATION.pdf b/BUILD_OPTIMIZATION.pdf new file mode 100644 index 0000000..2cd5a1d Binary files /dev/null and b/BUILD_OPTIMIZATION.pdf differ diff --git a/Dockerfile b/Dockerfile index ed244f7..081f4c0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,11 +9,15 @@ WORKDIR /app # Копируем файлы зависимостей COPY nextjs_space/package.json nextjs_space/yarn.lock ./ -# Устанавливаем только production зависимости -RUN yarn install --production --frozen-lockfile --network-timeout 600000 +# Настройки для ускорения компиляции +ENV NODE_ENV=development +ENV SKIP_SASS_BINARY_DOWNLOAD_FOR_CI=true +ENV SKIP_NODE_SASS_TESTS=true +ENV CYPRESS_INSTALL_BINARY=0 +ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true -# Устанавливаем dev зависимости отдельно -RUN yarn install --frozen-lockfile --network-timeout 600000 +# Устанавливаем все зависимости одним вызовом +RUN yarn install --immutable --network-timeout 600000 # Стадия 2: Сборка приложения FROM node:18-alpine AS builder diff --git a/QUICK_FIX.md b/QUICK_FIX.md new file mode 100644 index 0000000..f59c164 --- /dev/null +++ b/QUICK_FIX.md @@ -0,0 +1,177 @@ +# 🚀 Быстрое решение проблемы зависания сборки + +## Проблема +Сборка зависла на этапе `[4/4] Building fresh packages...` при `yarn install --immutable` + +## ✅ Что было исправлено + +1. **Устранена двойная установка зависимостей** в Dockerfile +2. **Добавлены переменные окружения** для пропуска ненужных бинарников +3. **Создан .dockerignore** для ускорения копирования файлов +4. **Обновлены скрипты развертывания** с поддержкой быстрой сборки + +## 📋 Инструкция по развертыванию + +### Вариант 1: Первое развертывание (рекомендуется) + +```bash +cd /home/ubuntu/global_it24_landing + +# Остановите текущую сборку (если запущена) +docker compose down +docker builder prune -f + +# Запустите развертывание с быстрой сборкой +./deploy.sh --fast +``` + +**Ожидаемое время:** 10-15 минут (вместо 30+ минут) + +### Вариант 2: Если всё ещё медленно + +Если сборка всё равно занимает более 20 минут, увеличьте ресурсы Docker: + +```bash +# Проверьте текущие лимиты +docker info | grep -i "CPUs\|Memory" + +# Для Docker на Ubuntu (редактируйте daemon.json) +sudo nano /etc/docker/daemon.json +``` + +Добавьте или измените: +```json +{ + "default-runtime": "runc", + "builder": { + "gc": { + "enabled": true + } + } +} +``` + +Перезапустите Docker: +```bash +sudo systemctl restart docker +``` + +### Вариант 3: Использование готового образа (самый быстрый) + +Если у вас есть доступ к более мощной машине: + +**На мощной машине:** +```bash +cd /home/ubuntu/global_it24_landing +docker build -t global-it24:latest . +docker save global-it24:latest | gzip > global-it24-image.tar.gz +``` + +**Перенесите файл на сервер и загрузите:** +```bash +scp global-it24-image.tar.gz user@server:/home/ubuntu/ +ssh user@server +docker load < /home/ubuntu/global-it24-image.tar.gz +cd /home/ubuntu/global_it24_landing +docker compose up -d +``` + +## 🎯 Рекомендации + +### Для первого развертывания: +```bash +./deploy.sh --fast +``` + +### Для обновлений кода: +```bash +./update.sh --rebuild +``` + +### Для простого перезапуска (изменения в .env): +```bash +./update.sh +``` + +## ⏱️ Ожидаемое время сборки + +| Метод | Время | Когда использовать | +|-------|-------|-------------------| +| `./deploy.sh` | 20-30 мин | Первое развертывание без кеша | +| `./deploy.sh --fast` | 10-15 мин | Первое развертывание с кешем | +| `./update.sh --rebuild` | 5-10 мин | Обновление кода | +| `./update.sh` | ~10 сек | Изменения .env или перезапуск | + +## ℹ️ Что происходит при сборке + +1. **[1/11] Создание базового образа** (~30 сек) +2. **[2/11] Установка системных пакетов** (~1 мин) +3. **[3/11] Копирование файлов** (~10 сек) +4. **[4/11] yarn install** (~8-12 мин) ⚠️ Самый долгий этап +5. **[5/11] Сборка Next.js** (~2-3 мин) +6. **[6/11] Prisma generate** (~30 сек) +7. **[7/11-11/11] Финализация образа** (~1 мин) + +## ✅ Нормальное поведение + +**Это нормально:** +- Множество предупреждений о peer dependencies +- Долгая компиляция на "Building fresh packages" (8-12 минут) +- Предупреждения от ESLint, Prettier, Prisma + +**Это проблема:** +- Сборка зависла более 30 минут без прогресса +- Ошибки (errors), а не предупреждения (warnings) +- Выход с кодом ошибки + +## 🔍 Мониторинг прогресса + +В отдельном терминале: +```bash +# Следите за логами +docker compose logs -f web + +# Проверяйте использование ресурсов +docker stats + +# Подробные логи сборки +docker compose build --progress=plain +``` + +## 📝 После успешной сборки + +```bash +# Проверьте статус +./status.sh + +# Просмотрите логи +./logs.sh + +# Локальная проверка +curl http://localhost:3000 + +# Настройте Traefik для доступа из интернета +``` + +## 🆘 Если проблема не решена + +1. Проверьте доступные ресурсы: +```bash +free -h +df -h +docker system df +``` + +2. Очистите Docker кеш: +```bash +docker builder prune -a -f +docker system prune -a -f +``` + +3. Попробуйте пересобрать с нуля: +```bash +docker compose down -v +./deploy.sh +``` + +Если ничего не помогает, рассмотрите Вариант 3 (сборка на мощной машине). diff --git a/deploy.sh b/deploy.sh index 3967743..60abd9b 100755 --- a/deploy.sh +++ b/deploy.sh @@ -2,9 +2,43 @@ #!/bin/bash # Скрипт для быстрого развертывания Global-IT24 на Ubuntu с внешним Traefik +# Использование: +# ./deploy.sh - полная сборка без кеша (медленно, 15-30 минут) +# ./deploy.sh --fast - быстрая сборка с кешем (5-10 минут) set -e +FAST_BUILD=false + +# Парсинг аргументов +while [[ $# -gt 0 ]]; do + case $1 in + --fast) + FAST_BUILD=true + shift + ;; + --help|-h) + echo "Использование: $0 [--fast] [--help]" + echo "" + echo "Опции:" + echo " --fast Быстрая сборка с использованием кеша" + echo " --help Показать эту справку" + echo "" + echo "Примеры:" + echo " $0 # Полная сборка без кеша" + echo " $0 --fast # Быстрая сборка с кешем" + echo "" + echo "Рекомендация: используйте --fast для обновлений и пересборок" + exit 0 + ;; + *) + echo "❌ Неизвестный параметр: $1" + echo "Используйте --help для справки" + exit 1 + ;; + esac +done + echo "🚀 Развертывание Global-IT24..." # Проверка наличия .env файла @@ -31,8 +65,16 @@ echo "🛑 Остановка предыдущей версии..." docker compose down 2>/dev/null || true # Сборка нового образа -echo "🔨 Сборка Docker образа..." -docker compose build --no-cache +if [ "$FAST_BUILD" = true ]; then + echo "⚡ Быстрая сборка с использованием кеша (5-10 минут)..." + export DOCKER_BUILDKIT=1 + export COMPOSE_DOCKER_CLI_BUILD=1 + docker compose build +else + echo "🔨 Полная сборка Docker образа без кеша (15-30 минут)..." + echo "💡 Подсказка: используйте --fast для ускорения следующих сборок" + docker compose build --no-cache +fi # Запуск контейнера echo "▶️ Запуск контейнера..." diff --git a/update.sh b/update.sh index eb908ab..33afbc3 100755 --- a/update.sh +++ b/update.sh @@ -1,24 +1,84 @@ #!/bin/bash -# Скрипт для быстрого обновления приложения без пересборки +# Скрипт для обновления приложения +# Использование: +# ./update.sh - просто перезапуск (без пересборки) +# ./update.sh --rebuild - пересборка с кешем и перезапуск (5-10 минут) set -e +REBUILD=false + +# Парсинг аргументов +while [[ $# -gt 0 ]]; do + case $1 in + --rebuild|-r) + REBUILD=true + shift + ;; + --help|-h) + echo "Использование: $0 [--rebuild] [--help]" + echo "" + echo "Опции:" + echo " --rebuild, -r Пересобрать образ перед перезапуском" + echo " --help, -h Показать эту справку" + echo "" + echo "Примеры:" + echo " $0 # Просто перезапустить (быстро)" + echo " $0 --rebuild # Пересобрать и перезапустить" + echo "" + echo "Когда использовать --rebuild:" + echo " - Изменился код приложения" + echo " - Обновились зависимости (package.json)" + echo " - Изменилась конфигурация Next.js" + echo "" + echo "Когда НЕ нужен --rebuild:" + echo " - Изменились только переменные в .env" + echo " - Нужно применить миграции базы данных" + exit 0 + ;; + *) + echo "❌ Неизвестный параметр: $1" + echo "Используйте --help для справки" + exit 1 + ;; + esac +done + echo "🔄 Обновление Global-IT24..." -# Перезапуск контейнера -echo "🔄 Перезапуск контейнера..." -docker-compose restart +if [ "$REBUILD" = true ]; then + echo "🔨 Пересборка образа с использованием кеша (5-10 минут)..." + export DOCKER_BUILDKIT=1 + export COMPOSE_DOCKER_CLI_BUILD=1 + + # Остановка контейнера + docker compose down + + # Пересборка + docker compose build + + # Запуск + docker compose up -d +else + echo "🔄 Перезапуск контейнера без пересборки..." + docker compose restart +fi echo "⏳ Ожидание готовности..." sleep 5 -if docker-compose ps | grep -q "Up"; then +if docker compose ps | grep -q "Up"; then echo "✅ Обновление завершено!" - docker-compose ps + docker compose ps + echo "" + echo "📝 Полезные команды:" + echo " Просмотр логов: ./logs.sh" + echo " Статус: ./status.sh" + echo " С пересборкой: ./update.sh --rebuild" else echo "❌ Ошибка при перезапуске!" - docker-compose logs --tail=50 + docker compose logs --tail=50 exit 1 fi