This commit is contained in:
albivkt
2025-06-30 14:22:21 +03:00
7 changed files with 278 additions and 3 deletions

59
.dockerignore Normal file
View File

@ -0,0 +1,59 @@
# Зависимости
node_modules
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# Сборка
dist
.output
.vercel
# Environment files
.env
.env.local
.env.development.local
.env.test.local
.env.production.local
# IDE
.vscode
.idea
*.swp
*.swo
# OS
.DS_Store
Thumbs.db
# Git
.git
.gitignore
# Docker
Dockerfile
.dockerignore
docker-compose.yml
stack.env
# Logs
logs
*.log
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Coverage directory used by tools like istanbul
coverage
*.lcov
# Temporary folders
tmp
temp
# Astro
.astro

99
DOCKER_DEPLOY.md Normal file
View File

@ -0,0 +1,99 @@
# Docker Деплой для OOODMDK
## Описание
Этот проект настроен для деплоя на VPS с использованием Docker Compose. Приложение использует Astro с Node.js адаптером вместо Vercel.
## Файлы конфигурации
- `Dockerfile` - конфигурация Docker образа
- `docker-compose.yml` - оркестрация контейнеров
- `stack.env` - переменные окружения
- `.dockerignore` - исключения для Docker сборки
## Настройка
### 1. Переменные окружения
Отредактируйте файл `stack.env`:
```bash
# Замените на ваш домен
PUBLIC_SITE_URL=https://yourdomain.com
# Настройки порта (если нужно)
APP_PORT=4321
# Sanity токен (если используете приватные данные)
SANITY_TOKEN=your_sanity_token_here
```
### 2. Сборка и запуск
```bash
# Сборка образа
docker-compose build
# Запуск в фоновом режиме
docker-compose up -d
# Просмотр логов
docker-compose logs -f
# Остановка
docker-compose down
```
### 3. Обновление
```bash
# Остановка контейнеров
docker-compose down
# Пересборка с обновлениями
docker-compose build --no-cache
# Запуск обновленной версии
docker-compose up -d
```
## Мониторинг
Приложение включает health check, который проверяет доступность на порту 4321 каждые 30 секунд.
```bash
# Проверка статуса контейнеров
docker-compose ps
# Проверка health check
docker inspect ooodmdk-app | grep Health -A 10
```
## Порты
- **4321** - основное приложение Astro
## Безопасность
- Приложение запускается под непривилегированным пользователем
- Используется многоэтапная сборка для минимизации размера образа
- Переменные окружения изолированы в `stack.env`
## Nginx (настройте самостоятельно)
Пример базовой конфигурации для Nginx:
```nginx
server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://localhost:4321;
proxy_set_header Host $host;
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;
}
}
```

53
Dockerfile Normal file
View File

@ -0,0 +1,53 @@
# Многоэтапная сборка для оптимизации размера образа
FROM node:20-alpine AS base
# Этап установки зависимостей
FROM base AS deps
WORKDIR /app
# Копируем файлы для установки зависимостей
COPY package*.json ./
# Устанавливаем все зависимости для сборки
RUN npm ci
# Этап сборки
FROM base AS builder
WORKDIR /app
# Копируем зависимости из предыдущего этапа
COPY --from=deps /app/node_modules ./node_modules
COPY . .
# Собираем приложение
RUN npm run build
# Финальный этап - production
FROM base AS runner
WORKDIR /app
# Создаем пользователя для безопасности
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 astro
# Копируем package.json для установки production зависимостей
COPY --from=builder --chown=astro:nodejs /app/package*.json ./
# Устанавливаем только production зависимости
RUN npm ci --only=production && npm cache clean --force
# Копируем собранное приложение
COPY --from=builder --chown=astro:nodejs /app/dist ./dist
# Переключаемся на пользователя astro
USER astro
# Открываем порт
EXPOSE 4321
# Устанавливаем переменные окружения
ENV HOST=0.0.0.0
ENV PORT=4321
# Запускаем приложение
CMD ["node", "./dist/server/entry.mjs"]

View File

@ -3,7 +3,7 @@ import tailwind from "@astrojs/tailwind";
import sanity from "@sanity/astro";
import react from "@astrojs/react";
import vercel from "@astrojs/vercel/serverless";
import node from "@astrojs/node";
// https://astro.build/config
export default defineConfig({
@ -16,5 +16,11 @@ export default defineConfig({
react(),
],
output: "server",
adapter: vercel(),
adapter: node({
mode: "standalone"
}),
server: {
host: true,
port: 4321
}
});

40
docker-compose.yml Normal file
View File

@ -0,0 +1,40 @@
version: '3.8'
services:
app:
build:
context: .
dockerfile: Dockerfile
container_name: ooodmdk-app
restart: unless-stopped
ports:
- "3016:4321"
environment:
- NODE_ENV=production
- HOST=0.0.0.0
- PORT=4321
# Sanity переменные окружения
- SANITY_PROJECT_ID=${SANITY_PROJECT_ID:-hngg8xd3}
- SANITY_DATASET=${SANITY_DATASET:-production}
- SANITY_API_VERSION=${SANITY_API_VERSION:-2023-05-03}
- SANITY_TOKEN=${SANITY_TOKEN:-}
# Дополнительные переменные
- PUBLIC_SITE_URL=${PUBLIC_SITE_URL:-http://localhost:4321}
env_file:
- stack.env
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:4321/"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
networks:
- app-network
networks:
app-network:
driver: bridge
volumes:
app-data:
driver: local

View File

@ -13,7 +13,6 @@
"@astrojs/node": "^9.2.2",
"@astrojs/react": "^4.3.0",
"@astrojs/tailwind": "^6.0.2",
"@astrojs/vercel": "^8.2.0",
"@portabletext/react": "^3.1.0",
"@sanity/astro": "^3.1.6",
"@sanity/client": "^6.21.3",

19
stack.env Normal file
View File

@ -0,0 +1,19 @@
# Основные настройки приложения
NODE_ENV=production
APP_PORT=4321
# URL вашего сайта
PUBLIC_SITE_URL=https://ooodmdk.ru
# Sanity CMS настройки
SANITY_PROJECT_ID=hngg8xd3
SANITY_DATASET=production
SANITY_API_VERSION=2023-05-03
# Токен для Sanity (если нужен для приватных данных)
SANITY_TOKEN=
# Дополнительные настройки безопасности
CORS_ORIGIN=*
# Логирование
LOG_LEVEL=info