1c9d647787
Co-authored-by: Cursor <cursoragent@cursor.com>
304 lines
7.6 KiB
Markdown
304 lines
7.6 KiB
Markdown
# استقرار 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`** (نه 3000)
|
||
4. Command در Dokploy باید **خالی** باشد — Dockerfile خودش `python main.py` را اجرا میکند
|
||
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 اگر فعال کردید).
|
||
|
||
---
|
||
|
||
## عیبیابی
|
||
|
||
### ۰. Build گیر میکند روی `load metadata for python`
|
||
|
||
علت: Docker Hub از ایران در دسترس نیست.
|
||
|
||
**راهحل (در Dockerfile اعمال شده):**
|
||
- Base image از `docker.arvancloud.ir/library/python:3.12-slim-bookworm`
|
||
- pip از `pypi.org` از طریق پروکسی VPN (`172.17.0.1:1081`)
|
||
|
||
**اگر pip fail شد:** VPN را روشن کنید و دوباره Deploy بزنید.
|
||
|
||
**قبل از deploy دستی روی سرور (اختیاری):**
|
||
```bash
|
||
docker pull docker.arvancloud.ir/library/python:3.12-slim-bookworm
|
||
```
|
||
|
||
**اگر باز هم گیر کرد** — VPN را روشن کنید و دوباره Deploy بزنید.
|
||
|
||
**تست build دستی:**
|
||
```bash
|
||
cd /etc/dokploy/compose/vpn-mirror-sazg0b/code
|
||
docker compose -p vpn-mirror-sazg0b build --progress=plain 2>&1 | tee /tmp/mirror-build.log
|
||
```
|
||
|
||
### ۱. 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)
|