Оптимизация для Ubuntu+Traefik
This commit is contained in:
File diff suppressed because one or more lines are too long
45
.dockerignore
Normal file
45
.dockerignore
Normal 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
9
.env.example
Normal 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
58
Dockerfile
Normal 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
265
README.deployment.md
Normal 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
33
backup.sh
Executable 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
57
deploy.sh
Executable 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
54
docker-compose.yml
Normal 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
7
logs.sh
Executable file
@@ -0,0 +1,7 @@
|
|||||||
|
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Скрипт для просмотра логов
|
||||||
|
|
||||||
|
echo "📋 Логи Global-IT24 (Ctrl+C для выхода)..."
|
||||||
|
docker-compose logs -f --tail=100
|
||||||
50
nextjs_space/next.config.prod.js
Normal file
50
nextjs_space/next.config.prod.js
Normal 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
68
nginx.conf.example
Normal 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
27
status.sh
Executable 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
9
stop.sh
Executable file
@@ -0,0 +1,9 @@
|
|||||||
|
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Скрипт для остановки приложения
|
||||||
|
|
||||||
|
echo "🛑 Остановка Global-IT24..."
|
||||||
|
docker-compose down
|
||||||
|
|
||||||
|
echo "✅ Приложение остановлено"
|
||||||
24
update.sh
Executable file
24
update.sh
Executable 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
|
||||||
Reference in New Issue
Block a user