Оптимизация для Ubuntu+Traefik

This commit is contained in:
DeepAgent
2025-10-25 08:47:39 +00:00
parent d688d93bc0
commit 9f77a9c773
14 changed files with 707 additions and 1 deletions

File diff suppressed because one or more lines are too long

45
.dockerignore Normal file
View File

@@ -0,0 +1,45 @@
# Dependencies
node_modules
nextjs_space/node_modules
npm-debug.log
yarn-error.log
# Next.js
nextjs_space/.next
.next
# Testing
coverage
.nyc_output
# Misc
.DS_Store
*.pem
.env
.env.local
.env.development.local
.env.test.local
.env.production.local
# Debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# IDE
.vscode
.idea
*.swp
*.swo
*~
# Git
.git
.gitignore
README.md
# Docker
Dockerfile
docker-compose.yml
.dockerignore

9
.env.example Normal file
View File

@@ -0,0 +1,9 @@
# Домен вашего сайта
DOMAIN=global-it24.example.com
# URL сайта (используется для метатегов и canonical URL)
NEXT_PUBLIC_SITE_URL=https://global-it24.example.com
# Для production окружения
NODE_ENV=production

58
Dockerfile Normal file
View File

@@ -0,0 +1,58 @@
# Многоступенчатая сборка для оптимизации размера образа
# Стадия 1: Установка зависимостей
FROM node:18-alpine AS deps
RUN apk add --no-cache libc6-compat
WORKDIR /app
# Копируем файлы зависимостей
COPY nextjs_space/package.json nextjs_space/yarn.lock* ./
RUN yarn install --frozen-lockfile --production=false
# Стадия 2: Сборка приложения
FROM node:18-alpine AS builder
WORKDIR /app
# Копируем зависимости из предыдущей стадии
COPY --from=deps /app/node_modules ./node_modules
COPY nextjs_space/ ./
# Используем production конфигурацию
RUN mv next.config.prod.js next.config.js || true
# Создаем .env файл для сборки
ARG NEXT_PUBLIC_SITE_URL
ENV NEXT_PUBLIC_SITE_URL=${NEXT_PUBLIC_SITE_URL}
# Собираем приложение
RUN yarn build
# Стадия 3: Production образ
FROM node:18-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
ENV NEXT_TELEMETRY_DISABLED=1
# Создаем пользователя для безопасности
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
# Копируем необходимые файлы
COPY --from=builder /app/public ./public
COPY --from=builder /app/.next/standalone ./
COPY --from=builder /app/.next/static ./.next/static
# Устанавливаем правильные права
RUN chown -R nextjs:nodejs /app
USER nextjs
EXPOSE 3000
ENV PORT=3000
ENV HOSTNAME="0.0.0.0"
# Запускаем приложение
CMD ["node", "server.js"]

265
README.deployment.md Normal file
View File

@@ -0,0 +1,265 @@
# Инструкция по развертыванию Global-IT24 на Ubuntu с Traefik
## Предварительные требования
1. Ubuntu Server (20.04 или новее)
2. Docker и Docker Compose установлены
3. Traefik настроен как reverse proxy
4. Домен направлен на ваш сервер
## Шаг 1: Настройка Traefik
Если Traefik еще не настроен, создайте базовую конфигурацию:
```bash
# Создайте сеть для Traefik
docker network create traefik-public
# Создайте директорию для Traefik
mkdir -p ~/traefik
cd ~/traefik
```
Создайте `docker-compose.yml` для Traefik:
```yaml
version: '3.8'
services:
traefik:
image: traefik:v2.10
container_name: traefik
restart: unless-stopped
security_opt:
- no-new-privileges:true
networks:
- traefik-public
ports:
- "80:80"
- "443:443"
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./traefik.yml:/traefik.yml:ro
- ./acme.json:/acme.json
- ./config.yml:/config.yml:ro
labels:
- "traefik.enable=true"
- "traefik.http.routers.traefik.entrypoints=web"
networks:
traefik-public:
external: true
```
Создайте `traefik.yml`:
```yaml
api:
dashboard: true
insecure: false
entryPoints:
web:
address: ":80"
http:
redirections:
entryPoint:
to: websecure
scheme: https
websecure:
address: ":443"
http:
tls:
certResolver: letsencrypt
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false
network: traefik-public
file:
filename: /config.yml
certificatesResolvers:
letsencrypt:
acme:
email: your-email@example.com
storage: acme.json
httpChallenge:
entryPoint: web
```
Создайте файл для SSL сертификатов:
```bash
touch acme.json
chmod 600 acme.json
```
Запустите Traefik:
```bash
docker-compose up -d
```
## Шаг 2: Развертывание Global-IT24
1. **Клонируйте или скопируйте проект на сервер:**
```bash
cd /home/your-user
# Скопируйте папку global_it24_landing на сервер
```
2. **Создайте .env файл:**
```bash
cd global_it24_landing
cp .env.example .env
nano .env
```
Отредактируйте `.env`:
```env
DOMAIN=ваш-домен.ru
NEXT_PUBLIC_SITE_URL=https://ваш-домен.ru
NODE_ENV=production
```
3. **Соберите и запустите контейнер:**
```bash
# Сборка образа
docker-compose build
# Запуск контейнера
docker-compose up -d
# Проверка логов
docker-compose logs -f
```
## Шаг 3: Проверка работы
1. Откройте браузер и перейдите на ваш домен
2. Проверьте, что HTTPS работает корректно
3. Проверьте мобильную версию сайта
## Команды для управления
```bash
# Перезапуск контейнера
docker-compose restart
# Остановка контейнера
docker-compose down
# Просмотр логов
docker-compose logs -f
# Обновление после изменений
docker-compose down
docker-compose build
docker-compose up -d
# Проверка статуса
docker-compose ps
```
## Оптимизация производительности
1. **Включите кэширование в Traefik** (добавьте в labels):
```yaml
- "traefik.http.middlewares.cache-control.headers.customResponseHeaders.Cache-Control=public, max-age=31536000"
```
2. **Настройте компрессию** (добавьте в labels):
```yaml
- "traefik.http.middlewares.compress.compress=true"
- "traefik.http.routers.global-it24-secure.middlewares=compress@docker"
```
3. **Ограничьте ресурсы контейнера** (добавьте в docker-compose.yml):
```yaml
deploy:
resources:
limits:
cpus: '1'
memory: 512M
reservations:
cpus: '0.5'
memory: 256M
```
## Резервное копирование
```bash
# Создайте скрипт для бэкапа
cat > backup.sh << 'EOF'
#!/bin/bash
BACKUP_DIR="/backup/global-it24"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
docker-compose exec global-it24-web tar czf - /app > $BACKUP_DIR/backup_$DATE.tar.gz
EOF
chmod +x backup.sh
```
## Мониторинг
```bash
# Проверка использования ресурсов
docker stats global-it24-landing
# Проверка здоровья контейнера
docker inspect --format='{{.State.Health.Status}}' global-it24-landing
```
## Устранение неполадок
### Контейнер не запускается:
```bash
docker-compose logs global-it24-web
```
### Проблемы с SSL:
```bash
docker logs traefik
# Проверьте acme.json
```
### Сайт недоступен:
```bash
# Проверьте, что контейнер работает
docker ps | grep global-it24
# Проверьте сеть
docker network inspect traefik-public
# Проверьте порты
netstat -tulpn | grep -E '80|443'
```
## Безопасность
1. Регулярно обновляйте Docker образы
2. Используйте файрвол (ufw):
```bash
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
```
3. Настройте автоматические обновления безопасности:
```bash
sudo apt install unattended-upgrades
sudo dpkg-reconfigure --priority=low unattended-upgrades
```
## Контакты для поддержки
При возникновении проблем проверьте логи и документацию Traefik: https://doc.traefik.io/traefik/

33
backup.sh Executable file
View File

@@ -0,0 +1,33 @@
#!/bin/bash
# Скрипт для резервного копирования
set -e
BACKUP_DIR="./backups"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="$BACKUP_DIR/global-it24_backup_$DATE.tar.gz"
echo "💾 Создание резервной копии..."
# Создание директории для бэкапов
mkdir -p $BACKUP_DIR
# Создание архива проекта
tar -czf $BACKUP_FILE \
--exclude='node_modules' \
--exclude='.next' \
--exclude='backups' \
--exclude='.git' \
.
echo "✅ Резервная копия создана: $BACKUP_FILE"
echo "📦 Размер: $(du -h $BACKUP_FILE | cut -f1)"
# Удаление старых бэкапов (оставляем последние 5)
cd $BACKUP_DIR
ls -t global-it24_backup_*.tar.gz | tail -n +6 | xargs -r rm
cd ..
echo "🧹 Старые бэкапы очищены (оставлены последние 5)"

57
deploy.sh Executable file
View File

@@ -0,0 +1,57 @@
#!/bin/bash
# Скрипт для быстрого развертывания Global-IT24 на Ubuntu с Traefik
set -e
echo "🚀 Развертывание Global-IT24..."
# Проверка наличия .env файла
if [ ! -f .env ]; then
echo "⚠️ Файл .env не найден. Создаю из .env.example..."
cp .env.example .env
echo "📝 Отредактируйте файл .env и запустите скрипт снова."
exit 1
fi
# Загрузка переменных окружения
source .env
# Проверка наличия сети traefik-public
if ! docker network inspect traefik-public >/dev/null 2>&1; then
echo "📡 Создаю сеть traefik-public..."
docker network create traefik-public
fi
# Остановка предыдущей версии
echo "🛑 Остановка предыдущей версии..."
docker-compose down 2>/dev/null || true
# Сборка нового образа
echo "🔨 Сборка Docker образа..."
docker-compose build --no-cache
# Запуск контейнера
echo "▶️ Запуск контейнера..."
docker-compose up -d
# Ожидание готовности
echo "⏳ Ожидание готовности сервиса..."
sleep 10
# Проверка статуса
if docker-compose ps | grep -q "Up"; then
echo "✅ Развертывание успешно завершено!"
echo "🌐 Сайт доступен по адресу: ${NEXT_PUBLIC_SITE_URL}"
echo ""
echo "📊 Статус контейнера:"
docker-compose ps
echo ""
echo "📝 Для просмотра логов используйте: docker-compose logs -f"
else
echo "❌ Ошибка при запуске контейнера!"
echo "📝 Логи:"
docker-compose logs
exit 1
fi

54
docker-compose.yml Normal file
View File

@@ -0,0 +1,54 @@
version: '3.8'
services:
global-it24-web:
build:
context: .
dockerfile: Dockerfile
args:
NEXT_PUBLIC_SITE_URL: ${NEXT_PUBLIC_SITE_URL:-https://global-it24.local}
container_name: global-it24-landing
restart: unless-stopped
environment:
- NODE_ENV=production
- NEXT_PUBLIC_SITE_URL=${NEXT_PUBLIC_SITE_URL:-https://global-it24.local}
networks:
- traefik-public
labels:
# Включаем Traefik для этого контейнера
- "traefik.enable=true"
# Настройка HTTP
- "traefik.http.routers.global-it24.rule=Host(`${DOMAIN:-global-it24.local}`)"
- "traefik.http.routers.global-it24.entrypoints=web"
- "traefik.http.routers.global-it24.middlewares=redirect-to-https@docker"
# Настройка HTTPS
- "traefik.http.routers.global-it24-secure.rule=Host(`${DOMAIN:-global-it24.local}`)"
- "traefik.http.routers.global-it24-secure.entrypoints=websecure"
- "traefik.http.routers.global-it24-secure.tls=true"
- "traefik.http.routers.global-it24-secure.tls.certresolver=letsencrypt"
# Middleware для редиректа HTTP -> HTTPS
- "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
- "traefik.http.middlewares.redirect-to-https.redirectscheme.permanent=true"
# Указываем порт сервиса
- "traefik.http.services.global-it24.loadbalancer.server.port=3000"
# Middleware для заголовков безопасности
- "traefik.http.middlewares.security-headers.headers.customResponseHeaders.X-Frame-Options=SAMEORIGIN"
- "traefik.http.middlewares.security-headers.headers.customResponseHeaders.X-Content-Type-Options=nosniff"
- "traefik.http.middlewares.security-headers.headers.customResponseHeaders.X-XSS-Protection=1; mode=block"
- "traefik.http.routers.global-it24-secure.middlewares=security-headers@docker"
healthcheck:
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:3000/"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
networks:
traefik-public:
external: true

7
logs.sh Executable file
View File

@@ -0,0 +1,7 @@
#!/bin/bash
# Скрипт для просмотра логов
echo "📋 Логи Global-IT24 (Ctrl+C для выхода)..."
docker-compose logs -f --tail=100

View File

@@ -0,0 +1,50 @@
const path = require('path');
/** @type {import('next').NextConfig} */
const nextConfig = {
distDir: process.env.NEXT_DIST_DIR || '.next',
output: 'standalone',
experimental: {
outputFileTracingRoot: path.join(__dirname, '../'),
},
eslint: {
ignoreDuringBuilds: true,
},
typescript: {
ignoreBuildErrors: false,
},
images: {
unoptimized: true,
domains: [],
},
// Оптимизация для production
compress: true,
poweredByHeader: false,
reactStrictMode: true,
swcMinify: true,
// Настройки для работы за reverse proxy (Traefik)
async headers() {
return [
{
source: '/:all*(svg|jpg|jpeg|png|gif|ico|webp)',
headers: [
{
key: 'Cache-Control',
value: 'public, max-age=31536000, immutable',
},
],
},
{
source: '/_next/static/:path*',
headers: [
{
key: 'Cache-Control',
value: 'public, max-age=31536000, immutable',
},
],
},
];
},
};
module.exports = nextConfig;

68
nginx.conf.example Normal file
View File

@@ -0,0 +1,68 @@
# Альтернативная конфигурация для Nginx (если вы используете Nginx вместо Traefik)
upstream global_it24_app {
server localhost:3000;
keepalive 64;
}
server {
listen 80;
server_name ваш-домен.ru www.ваш-домен.ru;
# Редирект на HTTPS
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name ваш-домен.ru www.ваш-домен.ru;
# SSL сертификаты (Let's Encrypt)
ssl_certificate /etc/letsencrypt/live/ваш-домен.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ваш-домен.ru/privkey.pem;
# SSL настройки
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# Логи
access_log /var/log/nginx/global-it24-access.log;
error_log /var/log/nginx/global-it24-error.log;
# Безопасность
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
# Основная локация
location / {
proxy_pass http://global_it24_app;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# Кэширование статики
location /_next/static {
proxy_pass http://global_it24_app;
add_header Cache-Control "public, max-age=31536000, immutable";
}
# Кэширование изображений
location ~* \.(jpg|jpeg|png|gif|ico|svg|webp)$ {
proxy_pass https://placehold.co/1200x600/e2e8f0/1e293b?text=Proxy_server_address_for_caching_image_files_with_
add_header Cache-Control "public, max-age=31536000, immutable";
}
# Размер загрузки файлов
client_max_body_size 10M;
}

27
status.sh Executable file
View File

@@ -0,0 +1,27 @@
#!/bin/bash
# Скрипт для проверки статуса
echo "📊 Статус Global-IT24:"
echo ""
# Статус контейнера
echo "=== Статус контейнера ==="
docker-compose ps
echo ""
# Использование ресурсов
echo "=== Использование ресурсов ==="
docker stats global-it24-landing --no-stream
echo ""
# Здоровье контейнера
echo "=== Здоровье контейнера ==="
HEALTH=$(docker inspect --format='{{.State.Health.Status}}' global-it24-landing 2>/dev/null || echo "не настроено")
echo "Статус: $HEALTH"
echo ""
# Последние логи
echo "=== Последние 10 строк логов ==="
docker-compose logs --tail=10

9
stop.sh Executable file
View File

@@ -0,0 +1,9 @@
#!/bin/bash
# Скрипт для остановки приложения
echo "🛑 Остановка Global-IT24..."
docker-compose down
echo "✅ Приложение остановлено"

24
update.sh Executable file
View File

@@ -0,0 +1,24 @@
#!/bin/bash
# Скрипт для быстрого обновления приложения без пересборки
set -e
echo "🔄 Обновление Global-IT24..."
# Перезапуск контейнера
echo "🔄 Перезапуск контейнера..."
docker-compose restart
echo "⏳ Ожидание готовности..."
sleep 5
if docker-compose ps | grep -q "Up"; then
echo "✅ Обновление завершено!"
docker-compose ps
else
echo "❌ Ошибка при перезапуске!"
docker-compose logs --tail=50
exit 1
fi