Files
mohammadian7 63d0699cdd Fix Docker apply crash and add safe profile test flow
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>
2026-06-10 20:20:10 +03:30

220 lines
6.3 KiB
Python

from __future__ import annotations
import json
from app.extensions import db
from app.models import Mirror, Profile, ProfileItem
def seed_mirrors() -> None:
if Mirror.query.first():
return
mirrors = [
# DNS
Mirror(
category="dns",
name="Shecan",
ips="178.22.122.100,185.51.200.2",
priority=10,
notes="DNS شکن — مناسب دسترسی به سرویس‌های فیلترشده",
),
Mirror(
category="dns",
name="403.online",
ips="10.202.10.202,10.202.10.102",
priority=20,
notes="DNS رادار / 403",
),
Mirror(
category="dns",
name="Begzar",
ips="185.55.226.26,185.55.227.27",
priority=30,
notes="DNS community",
),
Mirror(
category="dns",
name="Electro",
ips="10.10.34.36,10.10.34.35",
priority=40,
notes="DNS Electro",
),
Mirror(
category="dns",
name="Cloudflare",
ips="1.1.1.1,1.0.0.1",
priority=90,
notes="fallback بین‌المللی",
),
Mirror(
category="dns",
name="Google DNS",
ips="8.8.8.8,8.8.4.4",
priority=95,
notes="fallback بین‌المللی",
),
# APT
Mirror(
category="apt",
name="Arvan Ubuntu",
url="https://mirror.arvancloud.ir/ubuntu",
priority=10,
notes="میرور ابر آروان — Ubuntu",
),
Mirror(
category="apt",
name="Shatel Ubuntu",
url="https://mirror.shatel.ir/ubuntu",
priority=20,
notes="میرور شاتل",
),
Mirror(
category="apt",
name="Ubuntu Archive",
url="http://archive.ubuntu.com/ubuntu",
priority=100,
notes="مخزن رسمی — fallback",
enabled=False,
),
# Docker
Mirror(
category="docker",
name="Arvan Docker Registry",
url="https://docker.arvancloud.ir",
priority=10,
notes="رجیstry mirror ابر آروان",
),
Mirror(
category="docker",
name="Docker Hub Direct",
url="https://registry-1.docker.io",
priority=100,
notes="رجیstry مستقیم — fallback",
enabled=False,
),
# GitHub
Mirror(
category="github",
name="GitClone",
url="https://gitclone.com/github.com",
priority=10,
notes="پروکسی clone/pull گیت‌هاب",
meta_json=json.dumps({"instead_prefix": "https://gitclone.com/github.com/"}, ensure_ascii=False),
),
Mirror(
category="github",
name="GHProxy",
url="https://mirror.ghproxy.com/https://github.com",
priority=20,
notes="پروکسی ghproxy",
meta_json=json.dumps({"instead_prefix": "https://mirror.ghproxy.com/https://github.com/"}, ensure_ascii=False),
),
Mirror(
category="github",
name="GitHub Direct",
url="https://github.com",
priority=100,
notes="دسترسی مستقیم",
enabled=False,
),
# pip
Mirror(
category="pip",
name="Arvan PyPI",
url="https://mirror.arvancloud.ir/pypi/simple",
priority=10,
notes="میرور pip آروان",
),
Mirror(
category="pip",
name="PyPI Official",
url="https://pypi.org/simple",
priority=100,
notes="مخزن رسمی",
enabled=False,
),
# npm
Mirror(
category="npm",
name="npm Official",
url="https://registry.npmjs.org",
priority=100,
notes="رجیstry رسمی npm",
enabled=False,
),
]
for mirror in mirrors:
db.session.add(mirror)
db.session.commit()
def seed_profiles() -> None:
if Profile.query.first():
return
profiles_data = [
(
"آروان کامل",
"DNS Shecan + میرور APT/Docker آروان + GitClone",
{"dns": "Shecan", "apt": "Arvan Ubuntu", "docker": "Arvan Docker Registry", "github": "GitClone"},
),
(
"403 + Shatel",
"DNS 403 + میرور شاتل",
{"dns": "403.online", "apt": "Shatel Ubuntu", "docker": "Arvan Docker Registry", "github": "GHProxy"},
),
(
"حداقلی",
"فقط DNS و Docker",
{"dns": "Shecan", "docker": "Arvan Docker Registry"},
),
]
for idx, (name, desc, mapping) in enumerate(profiles_data):
profile = Profile(name=name, description=desc, is_default=(idx == 0))
db.session.add(profile)
db.session.flush()
for order, (category, mirror_name) in enumerate(mapping.items()):
mirror = Mirror.query.filter_by(category=category, name=mirror_name).first()
if mirror:
db.session.add(
ProfileItem(
profile_id=profile.id,
mirror_id=mirror.id,
category=category,
order=order,
)
)
db.session.commit()
def seed_settings() -> None:
defaults = {
"auto_switch_dns": "false",
"auto_switch_apt": "false",
"auto_switch_docker": "false",
"auto_switch_github": "false",
"auto_switch_pip": "false",
"auto_switch_npm": "false",
"auto_test_interval_minutes": "30",
"max_switches_per_day": "3",
"rollback_minutes": "15",
"test_rollback_minutes": "2",
"rollback_on_all_fail": "true",
}
from app.models import Setting
for key, value in defaults.items():
if Setting.get(key) is None:
Setting.set(key, value)
def seed_all() -> None:
seed_mirrors()
seed_profiles()
seed_settings()