63d0699cdd
Remove invalid _mirror_manager from daemon.json that prevented Docker from starting. Add 2-minute test apply with auto-rollback, final apply confirmation, emergency-restore CLI/UI, and post-restart Docker health checks. Co-authored-by: Cursor <cursoragent@cursor.com>
200 lines
4.8 KiB
Markdown
200 lines
4.8 KiB
Markdown
# Mirror Manager
|
||
|
||
پنل وب فارسی برای مدیریت DNS، میرور APT، Docker Registry، GitHub و pip/npm روی Ubuntu (فوکوس 24.04).
|
||
|
||
## قابلیتها
|
||
|
||
- CRUD میرورها و پروفایلها
|
||
- اعمال سراسری تنظیمات روی host (systemd-resolved، apt، docker، git)
|
||
- تست latency و دسترسی میرورها
|
||
- Backup خودکار (اولیه + قبل از هر apply)
|
||
- Rollback با پنجره زمانی (پیشفرض ۱۵ دقیقه)
|
||
- Auto-switch اختیاری per-category
|
||
- راهنمای فارسی برای هر بخش
|
||
- CLI برای SSH: restore، enable، disable
|
||
- **بدون تغییر SSH یا فایروال**
|
||
|
||
---
|
||
|
||
## پیشنیاز
|
||
|
||
- Ubuntu 18.04 / 22.04 / 24.04 (فوکوس noble)
|
||
- Docker + Dokploy + Traefik
|
||
- دسترسی root/privileged برای container
|
||
|
||
---
|
||
|
||
## نصب روی Dokploy
|
||
|
||
### ۱. Clone پروژه روی سرور
|
||
|
||
```bash
|
||
git clone <repo-url> /opt/mirror-manager
|
||
cd /opt/mirror-manager
|
||
```
|
||
|
||
### ۲. تنظیم `.env` (فقط برای deploy دستی؛ در Dokploy از Environment UI استفاده کنید)
|
||
|
||
```bash
|
||
cp .env.example .env
|
||
nano .env
|
||
```
|
||
|
||
| متغیر | مقدار |
|
||
|-------|-------|
|
||
| `MIRROR_DOMAIN` | `mirror.itistan.ir` |
|
||
| `SECRET_KEY` | رشته تصادفی ۳۲+ کاراکتر |
|
||
| `ADMIN_PASSWORD` | رمز قوی |
|
||
|
||
### ۳. Repo Gitea
|
||
|
||
```
|
||
https://git.itistan.ir/mohammadian7/mirror
|
||
```
|
||
|
||
راهنمای کامل Dokploy: [deploy/DOKPLOY.md](deploy/DOKPLOY.md)
|
||
|
||
---
|
||
|
||
## نصب روی Dokploy (خلاصه)
|
||
|
||
1. Push به Gitea → Deploy از Dokploy
|
||
2. Environment variables را در Dokploy تنظیم کنید
|
||
3. رکورد A: `mirror.itistan.ir` → IP سرور
|
||
4. **https://mirror.itistan.ir**
|
||
|
||
---
|
||
|
||
## نصب دستی (بدون Dokploy)
|
||
|
||
```bash
|
||
docker compose up -d --build
|
||
```
|
||
|
||
Volumeها:
|
||
- `/etc` → `/host/etc` (برای apply)
|
||
- `/var/lib/mirror-manager/data` → دیتابیس و backup
|
||
|
||
### ۴. Traefik / Dokploy
|
||
|
||
در Dokploy یک Application از نوع Docker Compose بسازید یا labelهای Traefik را در `docker-compose.yml` تنظیم کنید:
|
||
|
||
```yaml
|
||
traefik.http.routers.mirror-itistan.rule=Host(`mirror.itistan.ir`)
|
||
```
|
||
|
||
### ۵. نصب CLI روی host
|
||
|
||
```bash
|
||
chmod +x mirror-manager deploy/install-cli.sh
|
||
sudo cp mirror-manager /usr/local/bin/mirror-manager
|
||
# PYTHONPATH را در /usr/local/bin/mirror-manager-wrapper یا:
|
||
echo 'export PYTHONPATH=/opt/mirror-manager' | sudo tee /etc/profile.d/mirror-manager.sh
|
||
```
|
||
|
||
---
|
||
|
||
## استفاده
|
||
|
||
1. به **https://mirror.itistan.ir** بروید
|
||
2. با `ADMIN_USERNAME` / `ADMIN_PASSWORD` وارد شوید
|
||
3. در **اولین ورود** backup اولیه خودکار گرفته میشود
|
||
4. یک **پروفایل** انتخاب کنید → **تست موقت (۲ دقیقه)** بزنید
|
||
5. Dokploy و deploy را تست کنید → **اعمال نهایی** (نگهداشتن تغییرات)
|
||
6. اگر مشکل پیش آمد: `mirror-manager emergency-restore` از SSH
|
||
|
||
---
|
||
|
||
## CLI (از SSH)
|
||
|
||
```bash
|
||
# بازگردانی فوری — آخرین backup قبل از apply (توصیه در emergency)
|
||
mirror-manager emergency-restore
|
||
|
||
# یا معادل:
|
||
mirror-manager restore --last
|
||
|
||
# بازگردانی تنظیمات اولیه (قبل از نصب Mirror Manager)
|
||
mirror-manager restore --initial
|
||
|
||
# بازگردانی یک backup مشخص
|
||
mirror-manager restore --backup /var/lib/mirror-manager/data/backups/20250603_120000_before_apply_1
|
||
|
||
# غیرفعال / فعال container
|
||
mirror-manager disable
|
||
mirror-manager enable
|
||
|
||
# وضعیت
|
||
mirror-manager status
|
||
```
|
||
|
||
---
|
||
|
||
## پروفایلهای پیشفرض
|
||
|
||
| پروفایل | محتوا |
|
||
|---------|--------|
|
||
| آروان کامل | Shecan + Arvan APT/Docker + GitClone |
|
||
| 403 + Shatel | 403 DNS + Shatel APT + GHProxy |
|
||
| حداقلی | Shecan + Arvan Docker |
|
||
|
||
---
|
||
|
||
## میرورهای seed
|
||
|
||
### DNS
|
||
Shecan، 403.online، Begzar، Electro + fallback Cloudflare/Google
|
||
|
||
### APT
|
||
Arvan، Shatel، Ubuntu Archive
|
||
|
||
### Docker
|
||
Arvan Docker Registry
|
||
|
||
### GitHub
|
||
GitClone، GHProxy
|
||
|
||
---
|
||
|
||
## نکات امنیتی
|
||
|
||
- رمز admin را حتماً عوض کنید
|
||
- `SECRET_KEY` تصادفی و طولانی
|
||
- UI را فقط از طریق HTTPS (Traefik) در دسترس بگذارید
|
||
- قبل از apply با **IP** به SSH وصل شوید (نه hostname)
|
||
|
||
---
|
||
|
||
## ساختار پروژه
|
||
|
||
```
|
||
app/
|
||
models.py # SQLite models
|
||
services/ # apply, backup, test, dns, apt, docker, github
|
||
routes/ # Flask blueprints
|
||
templates/ # UI فارسی RTL
|
||
guides.py # راهنمای هر بخش
|
||
docker-compose.yml
|
||
Dockerfile
|
||
mirror-manager # CLI entry
|
||
```
|
||
|
||
---
|
||
|
||
## توسعه محلی
|
||
|
||
```bash
|
||
python -m venv .venv
|
||
source .venv/bin/activate # Windows: .venv\Scripts\activate
|
||
pip install -r requirements.txt
|
||
set DISABLE_SCHEDULER=1
|
||
set HOST_ROOT=
|
||
python run.py
|
||
```
|
||
|
||
---
|
||
|
||
## License
|
||
|
||
MIT
|