Оптимизация сборки Docker: устранение зависания на yarn install

- Устранена двойная установка зависимостей в Dockerfile
- Добавлены ENV переменные для пропуска ненужных бинарников
- Создан .dockerignore для ускорения копирования файлов
- Обновлены скрипты deploy.sh и update.sh с поддержкой --fast режима
- Добавлена документация BUILD_OPTIMIZATION.md и QUICK_FIX.md

Ожидаемое время сборки с --fast: 10-15 минут (было 30+ минут)
This commit is contained in:
DeepAgent
2025-10-27 13:04:00 +00:00
parent f81aba55db
commit 44d6ef1da5
7 changed files with 461 additions and 53 deletions

View File

@@ -1,33 +1,21 @@
# Dependencies # Зависимости
node_modules node_modules
nextjs_space/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* npm-debug.log*
yarn-debug.log* yarn-debug.log*
yarn-error.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 # IDE
.vscode .vscode
.idea .idea
@@ -35,29 +23,34 @@ yarn-error.log*
*.swo *.swo
*~ *~
# OS
.DS_Store
Thumbs.db
# Переменные окружения (они монтируются отдельно)
.env
.env.local
.env*.local
nextjs_space/.env*
# Git # Git
.git .git
.gitignore .gitignore
# Documentation (не нужны в образе) # Docker
README.md
README.deployment.md
DATABASE.md
DATABASE.pdf
# Docker files
Dockerfile Dockerfile
docker-compose.yml docker-compose*.yml
.dockerignore .dockerignore
# Scripts # Документация
README*.md
*.md
# Логи и кеш
*.log
.cache
# Скрипты развертывания
*.sh *.sh
# Backups
backups/
*.sql
*.sql.gz
# Config examples
nginx.conf.example
traefik-config-example.yml traefik-config-example.yml
nginx.conf.example

132
BUILD_OPTIMIZATION.md Normal file
View File

@@ -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.

BIN
BUILD_OPTIMIZATION.pdf Normal file

Binary file not shown.

View File

@@ -9,11 +9,15 @@ WORKDIR /app
# Копируем файлы зависимостей # Копируем файлы зависимостей
COPY nextjs_space/package.json nextjs_space/yarn.lock ./ 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: Сборка приложения # Стадия 2: Сборка приложения
FROM node:18-alpine AS builder FROM node:18-alpine AS builder

177
QUICK_FIX.md Normal file
View File

@@ -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 (сборка на мощной машине).

View File

@@ -2,9 +2,43 @@
#!/bin/bash #!/bin/bash
# Скрипт для быстрого развертывания Global-IT24 на Ubuntu с внешним Traefik # Скрипт для быстрого развертывания Global-IT24 на Ubuntu с внешним Traefik
# Использование:
# ./deploy.sh - полная сборка без кеша (медленно, 15-30 минут)
# ./deploy.sh --fast - быстрая сборка с кешем (5-10 минут)
set -e 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..." echo "🚀 Развертывание Global-IT24..."
# Проверка наличия .env файла # Проверка наличия .env файла
@@ -31,8 +65,16 @@ echo "🛑 Остановка предыдущей версии..."
docker compose down 2>/dev/null || true docker compose down 2>/dev/null || true
# Сборка нового образа # Сборка нового образа
echo "🔨 Сборка Docker образа..." if [ "$FAST_BUILD" = true ]; then
docker compose build --no-cache 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 "▶️ Запуск контейнера..." echo "▶️ Запуск контейнера..."

View File

@@ -1,24 +1,84 @@
#!/bin/bash #!/bin/bash
# Скрипт для быстрого обновления приложения без пересборки # Скрипт для обновления приложения
# Использование:
# ./update.sh - просто перезапуск (без пересборки)
# ./update.sh --rebuild - пересборка с кешем и перезапуск (5-10 минут)
set -e 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 "🔄 Обновление Global-IT24..."
# Перезапуск контейнера if [ "$REBUILD" = true ]; then
echo "🔄 Перезапуск контейнера..." echo "🔨 Пересборка образа с использованием кеша (5-10 минут)..."
docker-compose restart 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 "⏳ Ожидание готовности..." echo "⏳ Ожидание готовности..."
sleep 5 sleep 5
if docker-compose ps | grep -q "Up"; then if docker compose ps | grep -q "Up"; then
echo "✅ Обновление завершено!" echo "✅ Обновление завершено!"
docker-compose ps docker compose ps
echo ""
echo "📝 Полезные команды:"
echo " Просмотр логов: ./logs.sh"
echo " Статус: ./status.sh"
echo " С пересборкой: ./update.sh --rebuild"
else else
echo "❌ Ошибка при перезапуске!" echo "❌ Ошибка при перезапуске!"
docker-compose logs --tail=50 docker compose logs --tail=50
exit 1 exit 1
fi fi