Initial commit
This commit is contained in:
@@ -0,0 +1,279 @@
|
||||
# استقرار Mirror Manager روی Dokploy
|
||||
|
||||
**دامنه:** `mirror.itistan.ir`
|
||||
**Repo:** https://git.itistan.ir/mohammadian7/mirror
|
||||
|
||||
---
|
||||
|
||||
## نمای کلی
|
||||
|
||||
```
|
||||
Gitea (git.itistan.ir)
|
||||
│
|
||||
▼ clone + build
|
||||
Dokploy
|
||||
│
|
||||
├── Traefik → https://mirror.itistan.ir
|
||||
└── Container (privileged)
|
||||
└── mount /etc → apply DNS/APT/Docker/Git
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## مرحله ۰ — پیشنیاز DNS
|
||||
|
||||
در پنل DNS دامنه `itistan.ir` یک رکورد **A** بسازید:
|
||||
|
||||
| نوع | نام | مقدار |
|
||||
|-----|-----|-------|
|
||||
| A | `mirror` | IP سرور VPS |
|
||||
|
||||
بعد از propagate شدن:
|
||||
|
||||
```bash
|
||||
ping mirror.itistan.ir
|
||||
```
|
||||
|
||||
باید IP سرور را برگرداند.
|
||||
|
||||
---
|
||||
|
||||
## مرحله ۱ — Push کد به Gitea
|
||||
|
||||
روی **کامپیوتر خودتان** (Windows) در پوشه پروژه:
|
||||
|
||||
```powershell
|
||||
cd C:\Users\DELL\Desktop\Project\mirror
|
||||
|
||||
git init
|
||||
git branch -M main
|
||||
git remote add origin https://git.itistan.ir/mohammadian7/mirror.git
|
||||
|
||||
git add .
|
||||
git commit -m "Initial Mirror Manager for mirror.itistan.ir"
|
||||
git push -u origin main
|
||||
```
|
||||
|
||||
> اگر Gitea username/password خواست، از token یا رمز Gitea استفاده کنید.
|
||||
> repo فعلاً public است؛ بعداً میتوانید private کنید.
|
||||
|
||||
---
|
||||
|
||||
## مرحله ۲ — آمادهسازی سرور (یک بار)
|
||||
|
||||
SSH به VPS:
|
||||
|
||||
```bash
|
||||
# پوشه داده persistent
|
||||
sudo mkdir -p /var/lib/mirror-manager/data
|
||||
sudo chmod 755 /var/lib/mirror-manager/data
|
||||
|
||||
# (اختیاری) clone دستی برای CLI
|
||||
sudo git clone https://git.itistan.ir/mohammadian7/mirror.git /opt/mirror-manager
|
||||
sudo bash /opt/mirror-manager/deploy/install-cli.sh /opt/mirror-manager
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## مرحله ۳ — ساخت پروژه در Dokploy
|
||||
|
||||
### ۳.۱ Project
|
||||
|
||||
1. وارد پنل Dokploy شوید
|
||||
2. **Create Project** → نام مثلاً `mirror-manager`
|
||||
|
||||
### ۳.۲ اتصال Gitea (اگر قبلاً نکردید)
|
||||
|
||||
1. **Settings → Git Providers**
|
||||
2. **Add Provider** → Gitea
|
||||
3. URL: `https://git.itistan.ir`
|
||||
4. Token با دسترسی `read:repository` بسازید و وارد کنید
|
||||
|
||||
### ۳.۳ Application — Docker Compose
|
||||
|
||||
1. داخل پروژه → **Create Service** → **Docker Compose**
|
||||
2. تنظیمات:
|
||||
|
||||
| فیلد | مقدار |
|
||||
|------|-------|
|
||||
| Name | `mirror-manager` |
|
||||
| Source | Git |
|
||||
| Repository | `mohammadian7/mirror` |
|
||||
| Branch | `main` |
|
||||
| Compose Path | `docker-compose.yml` |
|
||||
| Build Path | `.` (root) |
|
||||
|
||||
3. **Save**
|
||||
|
||||
---
|
||||
|
||||
## مرحله ۴ — Environment Variables در Dokploy
|
||||
|
||||
در تب **Environment** این متغیرها را اضافه کنید:
|
||||
|
||||
```env
|
||||
SECRET_KEY=یک-رشته-تصادفی-حداقل-۳۲-کاراکتر
|
||||
ADMIN_USERNAME=admin
|
||||
ADMIN_PASSWORD=رمز-قوی-شما
|
||||
HOST_ROOT=/host
|
||||
DATA_DIR=/app/data
|
||||
ROLLBACK_MINUTES=15
|
||||
AUTO_TEST_INTERVAL_MINUTES=30
|
||||
MIRROR_CONTAINER_NAME=mirror-manager
|
||||
```
|
||||
|
||||
**SECRET_KEY** تصادفی:
|
||||
|
||||
```bash
|
||||
openssl rand -hex 32
|
||||
```
|
||||
|
||||
> `.env` روی سرور لازم نیست — Dokploy خودش env را inject میکند.
|
||||
|
||||
---
|
||||
|
||||
## مرحله ۵ — Domain در Dokploy (دو روش)
|
||||
|
||||
### روش A — Traefik labels (پیشنهادی، از قبل در compose هست)
|
||||
|
||||
در `docker-compose.yml` labelها برای `mirror.itistan.ir` تنظیم شده. فقط **Deploy** کنید.
|
||||
|
||||
### روش B — Dokploy Domains UI
|
||||
|
||||
اگر label کار نکرد:
|
||||
|
||||
1. تب **Domains**
|
||||
2. Host: `mirror.itistan.ir`
|
||||
3. Port: `8765`
|
||||
4. HTTPS: فعال / Let's Encrypt
|
||||
5. **Deploy** مجدد
|
||||
|
||||
> هر دو روش همزمان نباشد — یکی کافی است.
|
||||
|
||||
---
|
||||
|
||||
## مرحله ۶ — Deploy
|
||||
|
||||
1. **Deploy** را بزنید
|
||||
2. لاگ build را ببینید (اولین بار build image ممکن است ۲–۵ دقیقه طول بکشد)
|
||||
3. ۱۰–۳۰ ثانیه صبر کنید تا Traefik گواهی SSL بگیرد
|
||||
4. باز کنید: **https://mirror.itistan.ir**
|
||||
5. login: `ADMIN_USERNAME` / `ADMIN_PASSWORD`
|
||||
|
||||
---
|
||||
|
||||
## مرحله ۷ — اولین استفاده
|
||||
|
||||
1. با **IP** به SSH وصل باشید (نه hostname)
|
||||
2. اولین login → backup اولیه خودکار
|
||||
3. **پروفایلها** → «آروان کامل» → **اعمال**
|
||||
4. ۱۵ دقیقه تست → **تأیید** یا **Rollback**
|
||||
|
||||
---
|
||||
|
||||
## CLI از SSH (بعد از deploy)
|
||||
|
||||
```bash
|
||||
# وضعیت
|
||||
mirror-manager status
|
||||
|
||||
# غیرفعال کردن UI (تنظیمات host دست نخورده)
|
||||
mirror-manager disable
|
||||
|
||||
# فعال کردن مجدد
|
||||
mirror-manager enable
|
||||
|
||||
# بازگردانی به قبل از نصب Mirror Manager
|
||||
mirror-manager restore --initial
|
||||
```
|
||||
|
||||
اگر `mirror-manager` پیدا نشد:
|
||||
|
||||
```bash
|
||||
export PYTHONPATH=/opt/mirror-manager
|
||||
python3 /opt/mirror-manager/mirror-manager status
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## بهروزرسانی بعدی
|
||||
|
||||
```bash
|
||||
# روی PC: push تغییرات
|
||||
git push origin main
|
||||
```
|
||||
|
||||
در Dokploy → **Redeploy** (یا webhook auto-deploy اگر فعال کردید).
|
||||
|
||||
---
|
||||
|
||||
## عیبیابی
|
||||
|
||||
### ۱. 502 / 504 از Traefik
|
||||
|
||||
```bash
|
||||
docker ps | grep mirror-manager
|
||||
docker logs mirror-manager --tail 50
|
||||
```
|
||||
|
||||
- container باید `Up` باشد
|
||||
- روی network `dokploy-network` باشد:
|
||||
|
||||
```bash
|
||||
docker network inspect dokploy-network | grep mirror-manager
|
||||
```
|
||||
|
||||
### ۲. SSL صادر نمیشود
|
||||
|
||||
- رکورد A درست است؟
|
||||
- پورت 80/443 از اینترنت باز است (فایروال سرور / cloud panel)
|
||||
- ۲–۳ دقیقه صبر + Redeploy
|
||||
|
||||
### ۳. Apply کار نمیکند
|
||||
|
||||
Container باید **privileged** + `pid: host` + mount `/etc:/host/etc` داشته باشد.
|
||||
|
||||
```bash
|
||||
docker inspect mirror-manager --format '{{.HostConfig.Privileged}}'
|
||||
# باید true باشد
|
||||
```
|
||||
|
||||
### ۴. apt update fail
|
||||
|
||||
میرور را در UI **تست** کنید؛ URL میرور را CRUD کنید.
|
||||
|
||||
### ۵. Docker restart و Dokploy down
|
||||
|
||||
طبیعی است — apply را در ساعات کمترافیک انجام دهید.
|
||||
|
||||
---
|
||||
|
||||
## امنیت (repo public)
|
||||
|
||||
Repo فعلاً public است:
|
||||
|
||||
- **هرگز** `.env` با رمز واقعی commit نکنید
|
||||
- `SECRET_KEY` و `ADMIN_PASSWORD` فقط در Dokploy Environment
|
||||
- بعداً repo را **private** کنید
|
||||
- رمز admin را بلافاصله عوض کنید
|
||||
|
||||
---
|
||||
|
||||
## چکلیست نهایی
|
||||
|
||||
- [ ] رکورد A: `mirror.itistan.ir` → IP سرور
|
||||
- [ ] کد push شده به Gitea
|
||||
- [ ] Dokploy Compose از repo clone میکند
|
||||
- [ ] Environment variables تنظیم شده
|
||||
- [ ] Deploy موفق
|
||||
- [ ] https://mirror.itistan.ir/login باز میشود
|
||||
- [ ] `install-cli.sh` روی host اجرا شده
|
||||
- [ ] backup اولیه در UI تأیید شده
|
||||
- [ ] SSH با IP (نه hostname)
|
||||
|
||||
---
|
||||
|
||||
## پشتیبانی
|
||||
|
||||
- راهنمای هر بخش داخل UI: `/guide/dns` و ...
|
||||
- README اصلی: [README.md](../README.md)
|
||||
@@ -0,0 +1,18 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
INSTALL_DIR="${1:-/opt/mirror-manager}"
|
||||
BIN="/usr/local/bin/mirror-manager"
|
||||
|
||||
echo "نصب Mirror Manager CLI..."
|
||||
sudo mkdir -p /var/lib/mirror-manager/data
|
||||
sudo cp "$INSTALL_DIR/mirror-manager" "$BIN"
|
||||
sudo chmod +x "$BIN"
|
||||
|
||||
PROFILE_D="/etc/profile.d/mirror-manager.sh"
|
||||
echo "export PYTHONPATH=$INSTALL_DIR" | sudo tee "$PROFILE_D" > /dev/null
|
||||
echo "export MIRROR_CONTAINER_NAME=mirror-manager" | sudo tee -a "$PROFILE_D" > /dev/null
|
||||
|
||||
echo "CLI نصب شد: mirror-manager"
|
||||
echo " mirror-manager status"
|
||||
echo " mirror-manager restore --initial"
|
||||
Reference in New Issue
Block a user