From b808816099fe3b123f92f761244500275d66ef63 Mon Sep 17 00:00:00 2001 From: sbb45 Date: Tue, 2 Jun 2026 18:01:57 +0500 Subject: [PATCH] deply --- Dockerfile | 32 +++++++++++ docker-compose.yml | 75 ++++++++++++++++++++++++ init/init.sql | 133 +++++++++++++++++++++++++++++++++++++++++++ next.config.js | 1 + nginx/nginx.conf | 38 +++++++++++++ public/sitemap-0.xml | 16 +++--- 6 files changed, 287 insertions(+), 8 deletions(-) create mode 100644 Dockerfile create mode 100644 docker-compose.yml create mode 100644 init/init.sql create mode 100644 nginx/nginx.conf diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..ad3ef44 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,32 @@ +FROM node:22-alpine AS deps +WORKDIR /app +COPY package.json package-lock.json ./ +RUN npm ci + +FROM node:22-alpine AS builder +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY . . +RUN npm run build + +FROM node:22-alpine AS runner +WORKDIR /app + +ENV NODE_ENV=production +ENV PORT=3000 +ENV HOSTNAME=0.0.0.0 + +RUN addgroup --system --gid 1001 nodejs && \ + adduser --system --uid 1001 nextjs + +COPY --from=builder /app/public ./public +COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static + +RUN mkdir -p /app/uploads && chown nextjs:nodejs /app/uploads + +USER nextjs + +EXPOSE 3000 + +CMD ["node", "server.js"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..ad9357c --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,75 @@ +name: strike_arena + +services: + app: + build: + context: . + dockerfile: Dockerfile + container_name: strike_arena_app + restart: unless-stopped + env_file: + - .env + expose: + - "3000" + volumes: + - uploads_data:/app/uploads + depends_on: + db: + condition: service_healthy + networks: + - backend + healthcheck: + test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:3000/ || exit 1"] + interval: 30s + timeout: 10s + retries: 5 + start_period: 30s + + nginx: + image: nginx:1.27-alpine + container_name: strike_arena_nginx + restart: unless-stopped + depends_on: + app: + condition: service_healthy + ports: + - "10.20.0.20:18073:80" + volumes: + - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro + networks: + - backend + healthcheck: + test: ["CMD-SHELL", "wget -qO- http://127.0.0.1/health || exit 1"] + interval: 30s + timeout: 5s + retries: 5 + start_period: 10s + + db: + image: mysql:8.4 + container_name: strike_arena_db + restart: unless-stopped + environment: + MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD} + MYSQL_DATABASE: ${MYSQL_DATABASE} + expose: + - "3306" + volumes: + - db_data:/var/lib/mysql + - ./init/init.sql:/docker-entrypoint-initdb.d/init.sql:ro + networks: + - backend + healthcheck: + test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "-u", "root", "--password=${MYSQL_PASSWORD}"] + interval: 10s + timeout: 5s + retries: 10 + start_period: 30s + +volumes: + db_data: + uploads_data: + +networks: + backend: + driver: bridge diff --git a/init/init.sql b/init/init.sql new file mode 100644 index 0000000..74dba3e --- /dev/null +++ b/init/init.sql @@ -0,0 +1,133 @@ +SET NAMES utf8mb4; +SET character_set_client = utf8mb4; + +CREATE TABLE IF NOT EXISTS `rooms` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL, + `description` text COLLATE utf8mb4_unicode_ci, + `cpu` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `ram` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `gpu` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `mouse` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `keyboard` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `headphones` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `monitor` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `bracket` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `chair` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +INSERT INTO `rooms` VALUES +(1,'solo','5 отдельных комнат с мощным железом для игры соло','intel i7-13700kf','kingston 16gX2=32G/3200','Asus dual4070 012g','Logitech superlight 2','Hyper X origins core','Hyper X Cloud II','ASUS ROG 380 Hz','NB Display stand','DX Racer Gladiator'), +(2,'DUO / TRIO','4 комнаты на двоих и 3 на троих','intel i5-14600kf','kingston 16gX2=32G/3200','MSI 4060 Ventus 2X','Logitech superlight 1','Hyper X origins core','Hyper X Cloud II','ASUS ROG 310 Hz','NB Display stand','DX Racer Gladiator'), +(3,'BOOTCAMP 5/6','2 буткэмпа на пять и 1 на шесть игроков','intel i5-12400f','kingston 16gX2=32G/3200','MSI 4060 Ventus 2X','Logitech G403','Hyper X origins core','Hyper X Cloud II','ASUS ROG 310 Hz','NB Display stand','DX Racer Gladiator'), +(4,'ps','Консольный зал','PlayStation 5','2x DualShock','LG 55','','','','','',''); + +CREATE TABLE IF NOT EXISTS `faq` ( + `id` int NOT NULL AUTO_INCREMENT, + `title` varchar(500) COLLATE utf8mb4_unicode_ci NOT NULL, + `description` text COLLATE utf8mb4_unicode_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +INSERT INTO `faq` VALUES +(1,'Можно ли загрузить свою игру?','Да, вы можете установить свою игру самостоятельно, однако после перезагрузки компьютера игра удалится. Если вам нужно долгосрочное использование игры, сообщите нам заранее, и мы поможем всё настроить.'), +(2,'Какая у вас версия игр?','Мы всегда используем только самые свежие и актуальные версии игр. Наши операторы регулярно следят за обновлениями.'), +(3,'Установлены ли CS-2, CS:GO, CS 1.6?','Да, у нас установлены все популярные версии Counter-Strike: CS-2, CS:GO и CS 1.6.'), +(5,'Сколько стоит комп в общем зале?','Общего зала у нас нет. Наш клуб является VIP-форматом и предлагает только приватные кабинки. Вы можете забронировать место в BootCamp 5/6, если вам комфортно играть рядом с другими игроками.'), +(6,'Можно ли распечатать документы?','Да, можно распечатать документы в чёрно-белом формате. Стоимость распечатки — 100 тг за одну сторону листа А4.'), +(7,'Указанная цена за 1 компьютер или за весь буткэмп?','Все цены указаны за одно игровое место (1 компьютер).'), +(8,'Почему такие высокие цены?','Наш клуб ориентирован на тех, кто ценит приватность, комфорт и тишину. Наши гости часто отмечают, что наши цены полностью оправданы высоким уровнем комфорта и качества обслуживания.'), +(9,'Как можно забронировать место?','Есть два способа бронирования:\nЧерез администратора с предварительной оплатой 1000 тг за каждый компьютер.\nОнлайн через регистрацию с дополнительной скидкой 10%.'); + +CREATE TABLE IF NOT EXISTS `contacts` ( + `id` int NOT NULL AUTO_INCREMENT, + `type` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL, + `value` varchar(500) COLLATE utf8mb4_unicode_ci NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +INSERT INTO `contacts` VALUES +(1,'phone','+7 700 062 8559'), +(2,'whatsapp','https://wa.me/77752608559'), +(3,'tg','https://t.me/StrikeArenaAstana'), +(4,'gis2','https://2gis.kz/astana/firm/70000001097382279'), +(5,'inst','https://www.instagram.com/strikearena_astana'); + +CREATE TABLE IF NOT EXISTS `games` ( + `id` int NOT NULL AUTO_INCREMENT, + `title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `image_url` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `platform` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT 'pc', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +INSERT INTO `games` VALUES +(14,'Мир танков','image.png','pc'), +(15,'Sims4','image-1.png','pc'), +(16,'Pubg','image-2.png','pc'), +(17,'Generals zerohour','image-3.png','pc'), +(18,'Dota2','image-4.png','pc'), +(19,'Valorant','image-5.png','pc'), +(20,'CS2','image-6.png','pc'), +(21,'League of legends','image-7.png','pc'), +(22,'CS1.6','image-8.png','pc'), +(23,'Genshin Impact','image-9.png','pc'), +(24,'Call of duty','image-10.png','pc'), +(25,'War thunder','image-11.png','pc'), +(26,'Gta 5','image-12.png','pc'), +(27,'Warface','image-13.png','pc'), +(28,'InZoi','image-14.png','pc'), +(29,'Gta SA','image-15.png','pc'), +(30,'It takes two','image-16.png','pc'), +(31,'Heroes of might and magic','image-17.png','pc'), +(32,'Left4dead 2','image-18.png','pc'), +(33,'Frozen throne','image-19.png','pc'), +(34,'Overwatch 2','image-20.png','pc'), +(35,'Nfs carbon','image-21.png','pc'), +(36,'Fortnite','image-22.png','pc'), +(37,'Red dead redemption 2','image-23.png','pc'); + +CREATE TABLE IF NOT EXISTS `prices` ( + `id` int NOT NULL AUTO_INCREMENT, + `game_type` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL, + `room_type` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL, + `day_type` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `hour_1` decimal(10,2) DEFAULT NULL, + `hour_3` decimal(10,2) DEFAULT NULL, + `hour_5` decimal(10,2) DEFAULT NULL, + `night` decimal(10,2) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +INSERT INTO `prices` VALUES +(1,'ПК','solo','ПН-ЧТ',2800.00,5600.00,8400.00,10000.00), +(2,'ПК','solo','ПТ-ВС',3000.00,6000.00,9000.00,11000.00), +(3,'ПК','duo','ПН-ЧТ',2500.00,5000.00,7500.00,9500.00), +(4,'ПК','duo','ПТ-ВС',2700.00,5400.00,8100.00,10500.00), +(5,'ПК','trio','ПН-ЧТ',2300.00,4600.00,6900.00,9000.00), +(6,'ПК','trio','ПТ-ВС',2500.00,5000.00,7500.00,9800.00), +(7,'ПК','five','ПН-ЧТ',2100.00,4200.00,6300.00,8500.00), +(8,'ПК','five','ПТ-ВС',2300.00,4600.00,6900.00,9200.00), +(9,'ПК','six','ПН-ЧТ',2000.00,4000.00,6000.00,8200.00), +(10,'ПК','six','ПТ-ВС',2200.00,4400.00,6600.00,9000.00), +(11,'PS','lounge','2000',4000.00,9000.00,9000.00,14000.00), +(13,'PS','vip_normal','2500',5000.00,10000.00,10000.00,15000.00), +(15,'PS','vip_big','3000',6000.00,11000.00,12000.00,17000.00); + +CREATE TABLE IF NOT EXISTS `bookings` ( + `id` int NOT NULL AUTO_INCREMENT, + `type` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL, + `room` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL, + `date_time` datetime NOT NULL, + `time_slot` varchar(5) COLLATE utf8mb4_unicode_ci NOT NULL, + `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, + `game` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `contact` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL, + `contact_method` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `status` enum('pending','confirmed','cancelled') COLLATE utf8mb4_unicode_ci DEFAULT 'pending', + `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `idx_date_room_time` (`date_time`,`room`,`time_slot`), + KEY `idx_status` (`status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; diff --git a/next.config.js b/next.config.js index 60a6311..a0bd60a 100644 --- a/next.config.js +++ b/next.config.js @@ -1,5 +1,6 @@ /** @type {import('next').NextConfig} */ const nextConfig = { + output: 'standalone', reactStrictMode: true, eslint: { ignoreDuringBuilds: true, diff --git a/nginx/nginx.conf b/nginx/nginx.conf new file mode 100644 index 0000000..189fbb1 --- /dev/null +++ b/nginx/nginx.conf @@ -0,0 +1,38 @@ +server { + listen 80; + server_name _; + + client_max_body_size 64m; + + location = /health { + access_log off; + return 200 "ok\n"; + add_header Content-Type text/plain; + } + + location / { + proxy_pass http://app:3000; + + proxy_http_version 1.1; + 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; + + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + + proxy_read_timeout 60s; + proxy_connect_timeout 10s; + } + + location ~* \.(css|js|mjs|png|jpg|jpeg|gif|webp|svg|ico|woff|woff2)$ { + proxy_pass http://app:3000; + + proxy_http_version 1.1; + proxy_set_header Host $host; + + expires 30d; + add_header Cache-Control "public, immutable"; + } +} diff --git a/public/sitemap-0.xml b/public/sitemap-0.xml index d6fa743..c661ed0 100644 --- a/public/sitemap-0.xml +++ b/public/sitemap-0.xml @@ -1,11 +1,11 @@ -https://strike-arena.kz/admin/contacts2026-06-02T12:51:55.363Zweekly0.7 -https://strike-arena.kz/admin/faq2026-06-02T12:51:55.363Zweekly0.7 -https://strike-arena.kz/admin/games2026-06-02T12:51:55.363Zweekly0.7 -https://strike-arena.kz/admin/login2026-06-02T12:51:55.363Zweekly0.7 -https://strike-arena.kz/admin/price2026-06-02T12:51:55.363Zweekly0.7 -https://strike-arena.kz/policy2026-06-02T12:51:55.363Zweekly0.7 -https://strike-arena.kz/admin/hardware2026-06-02T12:51:55.363Zweekly0.7 -https://strike-arena.kz2026-06-02T12:51:55.363Zweekly0.7 +https://strike-arena.kz/admin/faq2026-06-02T13:00:15.241Zweekly0.7 +https://strike-arena.kz/admin/price2026-06-02T13:00:15.242Zweekly0.7 +https://strike-arena.kz/admin/games2026-06-02T13:00:15.242Zweekly0.7 +https://strike-arena.kz/admin/login2026-06-02T13:00:15.242Zweekly0.7 +https://strike-arena.kz/admin/hardware2026-06-02T13:00:15.242Zweekly0.7 +https://strike-arena.kz/admin/contacts2026-06-02T13:00:15.242Zweekly0.7 +https://strike-arena.kz2026-06-02T13:00:15.242Zweekly0.7 +https://strike-arena.kz/policy2026-06-02T13:00:15.242Zweekly0.7 \ No newline at end of file