diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..3a2ee83 --- /dev/null +++ b/.dockerignore @@ -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 \ No newline at end of file diff --git a/DOCKER_DEPLOY.md b/DOCKER_DEPLOY.md new file mode 100644 index 0000000..2829021 --- /dev/null +++ b/DOCKER_DEPLOY.md @@ -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; + } +} +``` \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..c41a83c --- /dev/null +++ b/Dockerfile @@ -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"] \ No newline at end of file diff --git a/astro.config.mjs b/astro.config.mjs index 82c5f70..e07211b 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -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 + } }); diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..547d844 --- /dev/null +++ b/docker-compose.yml @@ -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 \ No newline at end of file diff --git a/package.json b/package.json index 32793fd..d0354a1 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/stack.env b/stack.env new file mode 100644 index 0000000..85a3153 --- /dev/null +++ b/stack.env @@ -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 \ No newline at end of file