Оптимизация сборки 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:
@@ -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
|
||||
|
||||
132
BUILD_OPTIMIZATION.md
Normal file
132
BUILD_OPTIMIZATION.md
Normal 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
BIN
BUILD_OPTIMIZATION.pdf
Normal file
Binary file not shown.
12
Dockerfile
12
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
|
||||
|
||||
177
QUICK_FIX.md
Normal file
177
QUICK_FIX.md
Normal 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 (сборка на мощной машине).
|
||||
46
deploy.sh
46
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 "▶️ Запуск контейнера..."
|
||||
|
||||
74
update.sh
74
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
|
||||
|
||||
Reference in New Issue
Block a user