# Цагдаагийн Мэдэгдэл Систем - Үйлдвэрлэлийн Баритгалалт
# Police Notification System - Deployment Guide

Энэ баримтын үндсэн зорилго:系统-ийг үйлдвэрлэлийн сервер дээр аюулгүй байдлаар байршуулах.

---

## 📋 Агуулга

1. [Систем Шаардлага](#систем-шаардлага)
2. [Хурдан Тохиргоо](#хурдан-тохиргоо)
3. [Нарийвчилсан Тохиргоо](#нарийвчилсан-тохиргоо)
4. [Өгөгдлийн Сан Үүсгэлт](#өгөгдлийн-сан-үүсгэлт)
5. [Сервер Эхлүүлэлт](#сервер-эхлүүлэлт)
6. [Стандартын Файлууд](#стандартын-файлууд)
7. [Асуудлыг Засах](#асуудлыг-засах)
8. [Дараагийн Үе](#дараагийн-үе)

---

## Систем Шаардлага

### Хэрэглэгчийн Үйлдвэрлэлийн Сервер

| Компонент | Хамгийн Бага | Санал Болгож Буй |
|-----------|--------------|-----------------|
| Процессор | 2x CPU | 4x CPU эсвэл ихэвч |
| Санах ой | 2 GB RAM | 4-8 GB RAM |
| Диск | 20 GB | 100 GB+ |
| Node.js | v14+ | v18+ LTS |
| MySQL | 5.7+ | 8.0+ |
| npm | 6+ | 8+ |

### Үйлдвэрлэлийн Сервер OS

Дараах ОС-д дээр туршилт хийгдсэн:
- Ubuntu 20.04 LTS / 22.04 LTS
- CentOS 7 / 8
- Debian 10 / 11
- Windows Server 2019 / 2022
- Amazon Linux 2

---

## Хурдан Тохиргоо

### Linux / Mac дээр:

```bash
# 1. deploy директорид явах
cd deploy

# 2. Эхлүүлэх скрипт гүйлгүүлэх
chmod +x setup.sh
./setup.sh

# 3. Сервер асаах
npm start
```

### Windows дээр:

```bash
# 1. deploy директорид явах
cd deploy

# 2. Эхлүүлэх скрипт гүйлгүүлэх
setup.bat

# 3. Сервер асаах
npm start
```

---

## Нарийвчилсан Тохиргоо

### Алхам 1: Ангилал Үүсгэлт

```bash
# deploy директорид явах
cd deploy

# Шаардлагатай папка үүсгэх
mkdir -p uploads/imports uploads/notifications logs backups
chmod -R 755 uploads logs backups
```

### Алхам 2: Node.js Хамаарлуудыг Суулгах

```bash
# Үйлдвэрлэлийн хамаарлуудыг суулгах
npm install --production

# Баталгаажуулалт
npm list --depth=0
```

### Алхам 3: .env Файл Үүсгэлт

```bash
# Жишээ файлаас хууслах
cp .env.example .env

# .env файлийг засварлах (텍스트редакторыг ашиглах)
# Linux/Mac:
nano .env
# эсвэл
vim .env

# Windows:
# Блокнотоор нээх
notepad .env
```

### Алхам 4: .env Файлыг Засварлах

Дараах утгуудыг өөрийнхээ утгуудаар сольох:

```env
# 🔐 Аюулгүй байдал
JWT_SECRET=generate_a_strong_random_string_here_at_least_32_chars
HCAPTCHA_SECRET=your_hcaptcha_secret_from_hcaptcha.com

# 📊 Өгөгдлийн Сан
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=your_strong_mysql_password
DB_NAME=police_notification_db

# 📧 Имэйл (SMTP)
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=your_email@gmail.com
SMTP_PASSWORD=your_app_password
EMAIL_FROM=noreply@police.mn

# 🌐 Сервер
APP_BASE_URL=https://your_domain.com
PORT=5000
```

**⚠️ Чухал:** .env файлыг хүлэмжийг хүрээлэн засварлах!

---

## Өгөгдлийн Сан Үүсгэлт

### Алхам 1: MySQL Сервер Эхлүүлэлт

```bash
# Linux дээр
sudo systemctl start mysql
# эсвэл
sudo service mysql start

# macOS дээр (Homebrew)
brew services start mysql

# Windows дээр
net start MySQL80  # хэвтээний версион хамаарна
```

### Алхам 2: Өгөгдлийн Сан болон Таблицуудыг Үүсгэх

```bash
# deploy/ директорид байхдаа:

# Аргачлал 1: Бүх скрипт нэгэн дор гүйлгүүлэх
mysql -h localhost -u root -p < database.sql

# Аргачлал 2: Интерактив холбоо
mysql -h localhost -u root -p
USE police_notification_db;
SOURCE database.sql;
EXIT;
```

### Алхам 3: Өгөгдлийн Сан Баталгаажуулалт

```bash
mysql -h localhost -u root -p

# MySQL-ийн дотор:
USE police_notification_db;

# Бүх таблицуудыг харах
SHOW TABLES;

# Таблицуудын тохиргоо шалгах
DESCRIBE users;
DESCRIBE notifications;
DESCRIBE registration_requests;

# Анхны өгөгдөлсүүдийг шалгах
SELECT * FROM users;
SELECT * FROM districts;
SELECT * FROM system_settings;

EXIT;
```

### Алхам 4: Администратор Дамжилтыг Суулгах (сонголттой)

Анхны администратор:
- **Нэр:** admin
- **Нууц үг:** admin123 (ШИНЭЧЛЭХ!)

Нууц үгийг өөрчлөхөд:

```bash
node -e "
const bcrypt = require('bcryptjs');
const mysql = require('mysql2/promise');

(async () => {
  const connection = await mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'your_password',
    database: 'police_notification_db'
  });

  const hashedPassword = await bcrypt.hash('new_password_here', 10);
  
  await connection.execute(
    'UPDATE users SET password = ? WHERE email = ?',
    [hashedPassword, 'admin@gmail.com']
  );

  console.log('✓ Админ нууц үг шинэчлэгдсэн');
  await connection.end();
})();
"
```

---

## Сервер Эхлүүлэлт

### Үйлдвэрлэлийн Режимээр Асаах

```bash
# Зөвхөн нэг удаа
NODE_ENV=production npm start

# эсвэл PM2 ашиглан (зөвхөн нэгээс их гүйсэлтийн үед)
npm install -g pm2
pm2 start server.js --name "police-notification-system" -i max
```

### Сервер Ажиллаж Байгаа Эсэх Шалгах

```bash
# Linux/Mac
curl http://localhost:5000

# Windows PowerShell
Invoke-WebRequest http://localhost:5000

# Браузер
# http://localhost:5000 эсвэл http://your_domain:5000
```

### Сервер Гаргаж Авах

```bash
# Ctrl+C гэжүүлэх (Сервер хүргүүлэгджээ)

# PM2-ийг хүргүүлэх
pm2 stop police-notification-system
pm2 delete police-notification-system
```

---

## Стандартын Файлууд

### Үндсэн Файл Бүтэц

```
deploy/
├── .env.example          # Окружа жишээ
├── .env                  # Окружа (хүн ажиглахгүй) - ТА ҮҮСГЭХ
├── database.sql          # Өгөгдлийн сан схем
├── package.json          # Node.js хамаарлуудын жагсаалт
├── package-lock.json     # Хамаарлуудын бэхлэлтийн жагсаалт
├── server.js             # Үндсэн сервер файл
├── setup.sh              # Linux/Mac эхлүүлэх скрипт
├── setup.bat             # Windows эхлүүлэх скрипт
├── setup-system-settings.js  # Системийн тохиргоо
│
├── DEPLOYMENT_CHECKLIST.md   # Баталгаажуулалтын жагсаалт
├── DEPLOYMENT_GUIDE.md       # Энэ файл
├── DEPLOYMENT_SCRIPTS.md     # Үйлдвэрлэлийн скриптүүд
│
├── config/
│   └── database.js       # Өгөгдлийн санн руу холбоо
│
├── middleware/
│   └── auth.js           # JWT баталгаажуулалт middleware
│
├── routes/
│   ├── auth.js           # Нэвтрэлтийн маршруут
│   ├── users.js          # Хэрэглэгчийн маршруут
│   ├── locations.js      # Дүүргийн маршруут
│   ├── notifications.js  # Мэдэгдлийн маршруут
│   └── settings.js       # Тохиргооны маршруут
│
├── public/
│   └── index.html        # Администратор интерфэйс
│
├── utils/
│   ├── email.js          # Имэйл сэндэх утилита
│   └── validators.js     # Баталгаажуулалтийн утилита
│
├── uploads/
│   ├── imports/          # Excel импортын файлууд
│   └── notifications/    # Мэдэгдлийн сан
│
├── logs/                 # Логирование директори (ҮҮСГЭХ)
└── backups/              # Өгөгдлийн сан бэкап (ҮҮСГЭХ)
```

### Ээлжээр Үүсгэх Файлууд

Нь `deploy/` директорид ҮҮСГЭХ шаардлагатай:

```bash
mkdir -p uploads/imports uploads/notifications logs backups
touch logs/app.log
```

---

## Асуудлыг Засах

### ❌ Өгөгдлийн Санн руу холбоо ямар байхгүй

**Алдаа:**
```
Error: connect ECONNREFUSED 127.0.0.1:3306
```

**Шийдэл:**
1. MySQL сервер ажиллаж байгаа эсэх шалгах
2. `.env` дэх DB_HOST, DB_USER, DB_PASSWORD сайн баршилгалаа
3. MySQL сервер эхлүүлэлтийг аа

```bash
# Linux дээр
sudo systemctl status mysql
sudo systemctl start mysql

# macOS дээр
brew services list
brew services start mysql

# Windows дээр (PowerShell Admin)
Get-Service MySQL80
Start-Service MySQL80  # хэвтээний хэчээ 
```

### ❌ Port 5000 аль хэдийн ашиглагдаж байна

**Алдаа:**
```
Error: listen EADDRINUSE :::5000
```

**Шийдэл:**
1. .env-д PORT-ыг өөр утгаар өөрчлөх (жнь: 8000)
2. Эсвэл одоогийн процессийг хүргүүлэх

```bash
# Linux/Mac - процессын ID-г олох
lsof -i :5000

# Процессийг зогсоох
kill -9 <PID>

# Windows PowerShell
Get-NetTCPConnection -LocalPort 5000 | Select-Object -ExpandProperty OwningProcess
Stop-Process -Id <PID> -Force
```

### ❌ JWT токены алдаа

**Алдаа:**
```
Error: jwt must be provided
JsonWebTokenError: invalid token
```

**Шийдэл:**
1. .env дэх JWT_SECRET байгаа эсэх шалгаа
2. JWT_SECRET ядуу байхгүй (20+ тэмдэгт шаардлагатай)

```bash
# Хүчтэй JWT_SECRET үүсгэх
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"

# Үр дүнг .env-д JWT_SECRET утга болгон оруулна
```

### ❌ Имэйл илгээх амжилтгүй

**Алдаа:**
```
Error: Invalid login: 105, [AUTH] Authentication failed.
```

**Шийдэл:**
1. SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASSWORD сайн баршилгалаа
2. Gmail хэрэглэхийн үед App Password ашиглах
3. SMTP сервер портыг эхлүүлэлээ (жнь: 587, 25)

```bash
# Tuning эмэйл тохиргоо
# Linux дээр
telnet smtp_host smtp_port

# Gmail App Password авах:
# https://myaccount.google.com/apppasswords
```

### ❌ Node.js хамаарлуудын алдаа

**Алдаа:**
```
Error: Cannot find module 'express'
```

**Шийдэл:**
```bash
# Хамаарлуудыг дахин суулгах
rm -rf node_modules package-lock.json
npm install --production
```

---

## Дараагийн Үе

### 1️⃣ PM2 Ашиглан Үргэлжүүлэлтийн Үйлдвэрлэлийн Сүргүүлэлт

```bash
# PM2 нь Node.js үйлдвэрлэлийн сүргүүлэгч

npm install -g pm2

# Эхлүүлэх скрипт үүсгэх
pm2 ecosystem.config.js

# Сервер асаах (нэгээс олон gүйсэлт)
pm2 start ecosystem.config.js

# Процессийг харах
pm2 list

# Логүүдийг харах
pm2 logs

# Сервер restart хийх
pm2 restart all

# Сервер停止
pm2 stop all
```

### 2️⃣ Nginx Ашиглан Reverse Proxy

```bash
# Nginx суулгах
sudo apt install nginx  # Ubuntu/Debian
# эсвэл
brew install nginx     # macOS

# Nginx тохиргоо: /etc/nginx/sites-available/police-system
server {
    listen 80;
    server_name your_domain.com;

    location / {
        proxy_pass http://localhost:5000;
        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;
    }
}

# Nginx эхлүүлэлт
sudo systemctl restart nginx
```

### 3️⃣ SSL Сертификат (HTTPS)

```bash
# Certbot суулгах
sudo apt install certbot python3-certbot-nginx

# SSL авах
sudo certbot --nginx -d your_domain.com

# Автоматик refresh хийх
sudo certbot renew --dry-run
```

### 4️⃣ Өгөгдлийн Сан Бэкап

```bash
# Архив үүсгэх скрипт: backup-db.sh
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
mysqldump -h localhost -u root -p police_notification_db > backups/police_notification_db_$DATE.sql
echo "✓ Backup completed: backups/police_notification_db_$DATE.sql"

# Гүйлгүүлэх
chmod +x backup-db.sh
./backup-db.sh

# Cron-с автоматаар гүйлгүүлэх (өдөр бүрт 2 цаг дээр)
0 2 * * * /path/to/backup-db.sh
```

### 5️⃣ Үйлдвэрлэлийн Дүгнэлтийн Мониторинг

Системийн үйлдвэрлэлийн хүчин чадлыг сүргүүлэх:

```bash
# PM2 монитор ашиглах
pm2 monit

# System логүүдийг харах
tail -f logs/app.log

# MySQL сүргүүлэх
mysqld_safe --log-error=/var/log/mysql/error.log
```

---

## Асуугадаж Буй Асуултууд

**Q: Үйлдвэрлэл PORT-ыг сольж болох үү?**
A: Тийм. .env дээр `PORT=8000` гэж сольно.

**Q: SSL сертификат анхнаа яаж үүсгэх?**
A: Let's Encrypt болон Certbot ашигла (үнэгүй).

**Q: Өгөгдлийн санг сэргээх яаж?**
A: `mysql -u root -p police_notification_db < backups/file.sql`

**Q: Node.js версион сэргээхэд байна уу?**
A: `nvm use 18` гэж гүйлгүүлэх (nvm суулгагдсан байхыг шаардлагатай).

---

## Дүргүүлэлтийн Үндэсний Захирамжүүд

1. **Аюулгүй байдал:**
   - .env файл аль хэдийн хүнээс ажиглагддаггүй байна
   - JWT_SECRET 32+ тэмдэгт
   - HTTPS ашигла

2. **Үйл ажиллагаа:**
   - PM2 ашиглан сүргүүлэлт
   - Өдөр бүрт бэкап хийх
   - Логүүдийн хувиргалт сүргүүлэлт

3. **Гүйцэтгэл:**
   - Node.js кеш сүргүүлэлт
   - MySQL индекс оновлалт
   - CDN ашиглан файл хүргүүлэлт

---

## Дүн

✅ Системийг үйлдвэрлэлийн сервер дээр баталгаажуулалтаар байршуулагдсан.

❓ Асуулт байвал `/deploy/` директори дээр байгаа скриптүүдийг авч үзнэ.

🚀 Хэрэглэгч яг одоо системийг үйлдвэрлэлийн сервер дээр ашиглаж болно.

---

**Үйлдвэрлэлийн хувилбар:** 1.0.0
**Сүүлийн шинэчлэлт:** 2026-05-15
**Төгс байдал:** ✓
