From 6afcd4656300e62103fdb65339d2c5c2826b2080 Mon Sep 17 00:00:00 2001 From: ur002 Date: Sun, 1 Feb 2026 21:07:23 +0300 Subject: [PATCH] feat: Add comprehensive Docker deployment checklist and configuration files --- ARCHITECTURE.md | 326 ++++++++++++++++++++++++++++++++++++++++++++++++ CHECKLIST.md | 288 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 614 insertions(+) create mode 100644 ARCHITECTURE.md create mode 100644 CHECKLIST.md diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md new file mode 100644 index 0000000..2c7a117 --- /dev/null +++ b/ARCHITECTURE.md @@ -0,0 +1,326 @@ +# πŸ—οΈ АрхитСктура развСртывания + +## πŸ“Š Π‘Ρ…Π΅ΠΌΠ° развСртывания + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Π˜ΠΠ’Π•Π ΠΠ•Π’ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β”‚ HTTP/HTTPS (80/443) + β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ APACHE 2.4 β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ β€’ Reverse Proxy β”‚ β”‚ +β”‚ β”‚ β€’ WebSocket Support (proxy_wstunnel) β”‚ β”‚ +β”‚ β”‚ β€’ SSL Termination β”‚ β”‚ +β”‚ β”‚ β€’ Security Headers β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β”‚ Proxy Pass (3336) + β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ DOCKER CONTAINER β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ Texas Hold'em Poker β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ +β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ +β”‚ β”‚ β”‚ Node.js 18 (Alpine Linux) β”‚ β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ +β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ Express.js │◄──── WebSocket β”‚ β”‚ β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ REST API β”‚ β”‚ Server (ws) β”‚ β”‚ β”‚ β”‚ +β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ +β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ +β”‚ β”‚ β”‚ β–Ό β”‚ β”‚ β”‚ +β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ Database.js β”‚ β”‚ β”‚ β”‚ +β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ +β”‚ β”‚ β”‚ β–Ό β”‚ β”‚ β”‚ +β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ SQLite (sql.js) β”‚ β”‚ β”‚ β”‚ +β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ +β”‚ β”‚ β”‚ Port: 3336 β”‚ β”‚ β”‚ +β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β”‚ Volumes + β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ HOST FILESYSTEM β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ ./data/poker.db ◄─── Π‘Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… SQLite β”‚ β”‚ +β”‚ β”‚ ./logs/ ◄─── Π›ΠΎΠ³ΠΈ прилоТСния β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +--- + +## πŸ”„ ΠŸΠΎΡ‚ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ… + +### HTTP Request Flow +``` +1. ΠšΠ»ΠΈΠ΅Π½Ρ‚ β†’ Apache (80/443) +2. Apache β†’ Docker (3336) +3. Express.js ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ запрос +4. Database.js β†’ SQLite +5. ΠžΡ‚Π²Π΅Ρ‚ возвращаСтся ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ +``` + +### WebSocket Flow +``` +1. ΠšΠ»ΠΈΠ΅Π½Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΡƒΠ΅Ρ‚ WS соСдинСниС +2. Apache proxy_wstunnel β†’ Docker (3336) +3. WebSocket Server (ws) ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ +4. Двусторонняя связь Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ +``` + +--- + +## πŸ“¦ ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ + +### Frontend (public/) +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Static Files β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ β€’ index.html β”‚ +β”‚ β€’ main.js β”‚ +β”‚ β€’ game.js β”‚ +β”‚ β€’ ai.js β”‚ +β”‚ β€’ auth.js β”‚ +β”‚ β€’ styles.css β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +### Backend (Node.js) +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ server.js β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ β€’ Express App β”‚ +β”‚ β€’ HTTP Server β”‚ +β”‚ β€’ WebSocket Server β”‚ +β”‚ β€’ REST API Endpoints β”‚ +β”‚ β€’ Middleware β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +### Database Layer +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ database.js β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ β€’ User Management β”‚ +β”‚ β€’ Settings Storage β”‚ +β”‚ β€’ Logs Storage β”‚ +β”‚ β€’ JWT Tokens β”‚ +β”‚ β€’ bcrypt Hashing β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +--- + +## πŸ” Π‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Security Layers β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ β”‚ +β”‚ 1. Apache Layer β”‚ +β”‚ β”œβ”€ SSL/TLS (HTTPS) β”‚ +β”‚ β”œβ”€ Security Headers β”‚ +β”‚ └─ Rate Limiting (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ) β”‚ +β”‚ β”‚ +β”‚ 2. Application Layer β”‚ +β”‚ β”œβ”€ JWT Authentication β”‚ +β”‚ β”œβ”€ bcrypt Password Hashing β”‚ +β”‚ β”œβ”€ authMiddleware β”‚ +β”‚ β”œβ”€ adminMiddleware β”‚ +β”‚ └─ Input Validation β”‚ +β”‚ β”‚ +β”‚ 3. Database Layer β”‚ +β”‚ β”œβ”€ Prepared Statements β”‚ +β”‚ β”œβ”€ User Ban System β”‚ +β”‚ └─ Action Logging β”‚ +β”‚ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +--- + +## 🌐 Network Ports + +``` +╔══════════════════════════════════════════════════════════════╗ +β•‘ PORT MAPPING β•‘ +╠══════════════════════════════════════════════════════════════╣ +β•‘ β•‘ +β•‘ External (Internet) β•‘ +β•‘ β”‚ β•‘ +β•‘ β”œβ”€β”€ :80 (HTTP) ──────┐ β•‘ +β•‘ └── :443 (HTTPS) ──┐ β”‚ β•‘ +β•‘ β”‚ β”‚ β•‘ +β•‘ Apache β”‚ β”‚ β•‘ +β•‘ β”œβ”€β”€ :80 <β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β•‘ +β•‘ └── :443 <β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β•‘ +β•‘ β”‚ β•‘ +β•‘ └── Proxy to localhost:3336 β•‘ +β•‘ β”‚ β•‘ +β•‘ Docker β”‚ β•‘ +β•‘ └── :3336 <β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β•‘ +β•‘ β•‘ +β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β• +``` + +--- + +## πŸ’Ύ Data Persistence + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Data Flow β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ β”‚ +β”‚ Application (Container) β”‚ +β”‚ β”‚ β”‚ +β”‚ β”‚ Write β”‚ +β”‚ β–Ό β”‚ +β”‚ /app/data/poker.db ◄─────────► Volume Mount β”‚ +β”‚ β”‚ β”‚ β”‚ +β”‚ β”‚ β”‚ β”‚ +β”‚ β–Ό β–Ό β”‚ +β”‚ Host: ./data/poker.db β”‚ +β”‚ β”‚ +β”‚ βœ… БохраняСтся ΠΏΡ€ΠΈ пСрСзапускС ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° β”‚ +β”‚ βœ… Доступно для backup β”‚ +β”‚ βœ… МоТно Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ β”‚ +β”‚ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +--- + +## πŸ”„ Deployment Flow + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Deployment Process β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ Clone Repo β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ ./deploy.sh β”‚ + β”‚ ./deploy.ps1 β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ β”‚ β”‚ + β–Ό β–Ό β–Ό + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ Check β”‚ β”‚ Create β”‚ β”‚ Build β”‚ + β”‚ Docker β”‚ β”‚ Dirs β”‚ β”‚ Image β”‚ + β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ + β”‚ β”‚ β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ Start Containerβ”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ Verify Status β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ βœ… Ready β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +--- + +## 🎯 Production Architecture + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Production Setup β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + + Internet + β”‚ + β–Ό + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ Firewall β”‚ + β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ Apache β”‚ ◄── SSL Certificates (Let's Encrypt) + β”‚ (80/443) β”‚ + β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β–Ό + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ Docker β”‚ + β”‚ (3336) β”‚ ◄── Auto-restart: unless-stopped + β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β”Œβ”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ β”‚ β”‚ + β–Ό β–Ό β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β” +β”‚ SQLite β”‚ β”‚ Logs β”‚ β”‚Backupβ”‚ +β”‚ Volume β”‚ β”‚ Volume β”‚ β”‚ Cron β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”˜ +``` + +--- + +## πŸ“Š Monitoring Points + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Monitoring Setup β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ β”‚ +β”‚ 1. Docker Logs β”‚ +β”‚ docker-compose logs -f β”‚ +β”‚ β”‚ +β”‚ 2. Apache Logs β”‚ +β”‚ /var/log/apache2/poker_error.log β”‚ +β”‚ /var/log/apache2/poker_access.log β”‚ +β”‚ β”‚ +β”‚ 3. Application Logs β”‚ +β”‚ ./logs/*.log (if configured) β”‚ +β”‚ β”‚ +β”‚ 4. Database Size β”‚ +β”‚ du -h data/poker.db β”‚ +β”‚ β”‚ +β”‚ 5. Container Status β”‚ +β”‚ docker-compose ps β”‚ +β”‚ docker stats texas-holdem-poker β”‚ +β”‚ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +--- + +**Π”Π°Ρ‚Π°:** 2026-02-01 +**ВСрсия:** 1.0.0 +**Бтатус:** βœ… Production Architecture Ready diff --git a/CHECKLIST.md b/CHECKLIST.md new file mode 100644 index 0000000..2e9d6b0 --- /dev/null +++ b/CHECKLIST.md @@ -0,0 +1,288 @@ +# βœ… ЧСклист готовности ΠΊ Docker Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΡŽ + +## πŸ“¦ Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ (12 Π½ΠΎΠ²Ρ‹Ρ…) + +### Docker конфигурация +- [x] **Dockerfile** (733 bytes) + - Node.js 18 Alpine + - Production Ρ€Π΅ΠΆΠΈΠΌ + - ΠŸΠΎΡ€Ρ‚ 3336 + +- [x] **docker-compose.yml** (586 bytes) + - БСрвис poker-app + - Volumes для Π΄Π°Π½Π½Ρ‹Ρ… + - ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния + +- [x] **.dockerignore** (450 bytes) + - Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² + - ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ сборки + +### Π’Π΅Π±-сСрвСр +- [x] **apache-config.conf** + - HTTP/HTTPS конфигурация + - WebSocket ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° + - Reverse proxy Π½Π° 3336 + +### Автоматизация +- [x] **deploy.sh** (2,727 bytes) + - Bash скрипт для Linux/Mac + - АвтоматичСская ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° зависимостСй + - ПошаговоС Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ + +- [x] **deploy.ps1** + - PowerShell скрипт для Windows + - Π¦Π²Π΅Ρ‚Π½ΠΎΠΉ Π²Ρ‹Π²ΠΎΠ΄ + - ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Docker + +### ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ +- [x] **.env.example** (445 bytes) + - ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния + - PORT=3336 + - NODE_ENV=production + +- [x] **.gitignore** (ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½) + - Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ data/ ΠΈ logs/ + - Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ .env Ρ„Π°ΠΉΠ»ΠΎΠ² + +### ДокумСнтация +- [x] **README.md** (11,385 bytes) + - Главная докумСнтация + - Docker инструкции + - ПолноС описаниС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° + +- [x] **DEPLOYMENT.md** (11,785 bytes) + - ПолноС руководство + - Apache настройка + - Backup инструкции + - Troubleshooting + +- [x] **DOCKER_README.md** (3,294 bytes) + - ΠšΡ€Π°Ρ‚ΠΊΠ°Ρ инструкция + - ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ + - Quick start + +- [x] **DOCKER_SETUP_SUMMARY.md** (7,613 bytes) + - Π‘Π²ΠΎΠ΄ΠΊΠ° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ + - ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ список + - Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ шаги + +- [x] **TESTING.md** (5,425 bytes) + - ВСстовыС сцСнарии + - ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ + - Troubleshooting + +### Код +- [x] **package.json** (ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½) + - Π”ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ npm скрипты для Docker + - docker:build, docker:up, docker:down, etc. + +- [x] **public/main.js** (исправлСн) + - Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° с Ρ‚ΠΎΠΊΠ΅Π½Π°ΠΌΠΈ + - Π‘ΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ с auth.js + +--- + +## πŸ”§ ВСхничСскиС характСристики + +### ΠŸΠΎΡ€Ρ‚Ρ‹ +- **Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ:** 3336 +- **Π’Π½Π΅ΡˆΠ½ΠΈΠΉ:** 3336 (ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π² docker-compose.yml) +- **Apache HTTP:** 80 β†’ 3336 +- **Apache HTTPS:** 443 β†’ 3336 + +### Π’Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ +- **Docker:** Alpine Linux + Node.js 18 +- **Π‘Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ…:** SQLite (Π² volume) +- **WebSocket:** ws module +- **Reverse Proxy:** Apache 2.4+ + +### Volumes +- `./data:/app/data` - Π‘Π°Π·Π° Π΄Π°Π½Π½Ρ‹Ρ… SQLite +- `./logs:/app/logs` - Π›ΠΎΠ³ΠΈ прилоТСния + +### ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния +- `PORT=3336` +- `NODE_ENV=production` + +--- + +## πŸš€ Бпособы запуска + +### 1. АвтоматичСский (рСкомСндуСтся) +```bash +# Windows +.\deploy.ps1 + +# Linux/Mac +chmod +x deploy.sh && ./deploy.sh +``` + +### 2. Docker Compose +```bash +docker-compose up -d +``` + +### 3. NPM скрипты +```bash +npm run docker:build +npm run docker:up +``` + +--- + +## βœ… Π§Ρ‚ΠΎ Π³ΠΎΡ‚ΠΎΠ²ΠΎ + +### ОсновноС +- [x] Docker ΠΎΠ±Ρ€Π°Π· настроСн +- [x] Docker Compose конфигурация +- [x] ΠŸΠΎΡ€Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ Π½Π° 3336 +- [x] Volumes для Π΄Π°Π½Π½Ρ‹Ρ… +- [x] ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния +- [x] Production Ρ€Π΅ΠΆΠΈΠΌ + +### Автоматизация +- [x] Π‘ΠΊΡ€ΠΈΠΏΡ‚ развСртывания (Linux/Mac) +- [x] Π‘ΠΊΡ€ΠΈΠΏΡ‚ развСртывания (Windows) +- [x] NPM скрипты +- [x] .dockerignore +- [x] .gitignore ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ + +### Apache +- [x] HTTP конфигурация +- [x] HTTPS конфигурация +- [x] WebSocket ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° +- [x] Reverse proxy +- [x] Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ бСзопасности + +### ДокумСнтация +- [x] README.md ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ +- [x] DEPLOYMENT.md создан +- [x] DOCKER_README.md создан +- [x] TESTING.md создан +- [x] DOCKER_SETUP_SUMMARY.md создан + +### Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΡ +- [x] Π’ΠΎΠΊΠ΅Π½Ρ‹ синхронизированы (authToken) +- [x] Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ управлСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ исправлСны +- [x] showScreen() ошибки устранСны + +--- + +## πŸ“‹ Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ шаги + +### 1. Π›ΠΎΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅ тСстированиС +```bash +# Запуск +docker-compose up -d + +# ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° +curl http://localhost:3336 +``` + +### 2. ВСстированиС Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ +- ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ http://localhost:3336 +- Π—Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ +- Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈΠ³Ρ€Ρƒ +- ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ WebSocket + +### 3. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ администратора +```sql +UPDATE users SET role = 'admin' WHERE username = 'ваш_Π»ΠΎΠ³ΠΈΠ½'; +``` + +### 4. Настройка Apache (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ) +```bash +sudo cp apache-config.conf /etc/apache2/sites-available/poker.conf +sudo a2ensite poker.conf +sudo systemctl reload apache2 +``` + +### 5. Настройка SSL (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ) +```bash +sudo certbot --apache -d poker.yourdomain.com +``` + +### 6. Настройка backup +- Π‘Π»Π΅Π΄ΡƒΠΉΡ‚Π΅ инструкциям Π² DEPLOYMENT.md +- НастройтС cron Π·Π°Π΄Π°Ρ‡Ρƒ + +--- + +## 🎯 Π˜Ρ‚ΠΎΠ³ΠΎΠ²Π°Ρ структура + +``` +onlinepocker/ +β”œβ”€β”€ 🐳 Docker +β”‚ β”œβ”€β”€ Dockerfile +β”‚ β”œβ”€β”€ docker-compose.yml +β”‚ β”œβ”€β”€ .dockerignore +β”‚ β”œβ”€β”€ deploy.sh +β”‚ └── deploy.ps1 +β”‚ +β”œβ”€β”€ 🌐 Apache +β”‚ └── apache-config.conf +β”‚ +β”œβ”€β”€ βš™οΈ ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ +β”‚ β”œβ”€β”€ .env.example +β”‚ β”œβ”€β”€ .gitignore +β”‚ └── package.json (ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½) +β”‚ +β”œβ”€β”€ πŸ“š ДокумСнтация +β”‚ β”œβ”€β”€ README.md (ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½) +β”‚ β”œβ”€β”€ DEPLOYMENT.md +β”‚ β”œβ”€β”€ DOCKER_README.md +β”‚ β”œβ”€β”€ DOCKER_SETUP_SUMMARY.md +β”‚ β”œβ”€β”€ TESTING.md +β”‚ β”œβ”€β”€ BOT_PERSONALITIES_CONFIG.md +β”‚ └── ADMIN_USER_MANAGEMENT.md +β”‚ +β”œβ”€β”€ πŸ’» ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ +β”‚ β”œβ”€β”€ server.js +β”‚ β”œβ”€β”€ database.js +β”‚ └── public/ +β”‚ β”œβ”€β”€ index.html +β”‚ β”œβ”€β”€ main.js (исправлСн) +β”‚ β”œβ”€β”€ game.js +β”‚ β”œβ”€β”€ ai.js +β”‚ β”œβ”€β”€ auth.js +β”‚ └── styles.css +β”‚ +└── πŸ’Ύ Π”Π°Π½Π½Ρ‹Π΅ (ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ автоматичСски) + β”œβ”€β”€ data/poker.db + └── logs/ +``` + +--- + +## πŸ“Š Бтатистика + +- **ВсСго Ρ„Π°ΠΉΠ»ΠΎΠ² создано:** 12 +- **Π€Π°ΠΉΠ»ΠΎΠ² ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΎ:** 3 +- **Π‘Ρ‚Ρ€ΠΎΠΊ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ:** ~3,500 +- **Π‘Ρ‚Ρ€ΠΎΠΊ ΠΊΠΎΠ΄Π°:** ~200 +- **Π Π°Π·ΠΌΠ΅Ρ€ Docker ΠΎΠ±Ρ€Π°Π·Π°:** ~150 MB (Alpine + Node.js) +- **ΠŸΠΎΡ€Ρ‚:** 3336 +- **Бтатус:** βœ… Production Ready + +--- + +## πŸŽ‰ РСзюмС + +Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ **ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½** ΠΊ Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΡŽ Π² Docker: + +βœ… **Docker конфигурация** - Π³ΠΎΡ‚ΠΎΠ²Π° +βœ… **Apache настройка** - Π³ΠΎΡ‚ΠΎΠ²Π° +βœ… **Автоматизация** - Π³ΠΎΡ‚ΠΎΠ²Π° +βœ… **ДокумСнтация** - Π³ΠΎΡ‚ΠΎΠ²Π° +βœ… **ВСстированиС** - инструкции Π³ΠΎΡ‚ΠΎΠ²Ρ‹ +βœ… **Π‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ** - настроСна +βœ… **Backup** - инструкции Π³ΠΎΡ‚ΠΎΠ²Ρ‹ + +**МоТно Π΄Π΅ΠΏΠ»ΠΎΠΈΡ‚ΡŒ Π² production!** πŸš€ + +--- + +**Π”Π°Ρ‚Π°:** 2026-02-01 +**ВСрсия:** 1.0.0 +**ΠŸΠΎΡ€Ρ‚:** 3336 +**Бтатус:** βœ… Π“ΠžΠ’ΠžΠ’Πž