From 8a08a95a1792357664e0523aeda7e63bd30cbeed Mon Sep 17 00:00:00 2001 From: Niranjan Date: Tue, 7 Apr 2026 10:41:22 +0530 Subject: [PATCH] new changes --- .../__pycache__/site_service.cpython-314.pyc | Bin 37225 -> 38423 bytes .../backend/app/services/site_service.py | 49 +++++++++++++++--- 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/YakPanel-server/backend/app/services/__pycache__/site_service.cpython-314.pyc b/YakPanel-server/backend/app/services/__pycache__/site_service.cpython-314.pyc index 540cc0c519b76d5e6b97e397b604d88eb0c9555b..657ff2c00a3bae9adbe018cd0f7aa671e7f54d8d 100644 GIT binary patch delta 9060 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 F{|CN@NCf}@ delta 8006 zcma)B33yahmVWQmnpCQi)RL;~6+)H@*?=ezG#EA!GNE|lOGg7`QdJ3MDyj0m7d9KJ z9p`gEMZqiMGUKSN(@J;S+LIpb8MS9n8f*~_O-tKvfLVIeS$cv!j-P&?-^@AZRW=5p z-X#QP4_4P`2Yt%7X7sbF29 zR=Ccsxz~9#&pNN>trWIM;Rb9l_o))(oHo(O(~9I=&A-*91!RX`kn{XPvOp`AoglkN zE|K#=E+Dy7E(F<4a+&M_*$Z-}Kr5GP%ssnNm25Z^34$G68q-aQQH^(-_E`MT#><~}grwgK z<0l=v#avxVsk%AcuWjQSor{(iKm}HaJzLW(KA704i=(rT7ak&neW(Kyp0*eP>Ex;rE>54;(w91@uiUMl)_9`(jhD}s4k%C8dx z;|=*GQh6EXmILV4ggTf=#+efn7MM^X&HD#uH~wK^t+?7yY+Fjz&{`@f7BcDPWCA)w?R0Z25!J4wUMpYe0rhyg&pW=?^P)-A zd5eGD4bzIU3h0KlAT(o#mSk#2oayE}Qi)Mgg$$sZMpHYO32QAv@bXvuwa$4UhMcS& zb5`(={cG2301#S;ibZB7*aP)j$F)GYw1Vbt zpDHqZa>Ve7Zqdfl$@rC~t?-GGR`7~gs!Exa&?{R7uv=;e`*3_$b2>f} zveVqzO<0diF=L+fn70n02_R%)y(r57x_O{qjqB22RF~4j#%jZP8dG#fl5tIqk4D)p zSK3%tD!Uz;DO{|0862{yzL=k^_(w6HKVMm&!8NQq(%aIJ?Qy0iQlo4$=Gd}Y>NzY9 zdn6v!)NW%Hn2puB9BQ%K5WE0avPcxl)g1ue5Iz&yMC(O_b8g?H3EsRr7z1mK2jh~s za=f^@#k5Sf_NUYF(HJ8OEX3Xm*Z{m3_QYZcwDaO9p|)%gVTkXo?G=mohqdLFyC5Sv z{za`KLg$<6=ZhJ`t6F>{o$QCj{#E_y4pr{yL=G}(%E zB79#V*H(!9O*hTv@Mnz=}(LrfdeBN83_Z&m5lT@&tJ3v zR;XC&1nZ(35GwOCg1_)dtSD*H<)o*2(8xz|{ljC!Ir7{!fA(UC=3>9-VX_v>L1|Wij1h9 zA{L$Uw*CPX4_4hCiQu6aiLgAZh0B#W5b&JPt&@vpV1LE$r!egctbxtE&RI4A`Gz&yK9qQ5#qc_B9Q@>20gqvvEab_wpOpEcDaH zazt4i0u-%Vb{hJ)F#gb*QZsEULp}1m$?!Zm{c8RW^55KqM8UOw*wTg$=_bdKCk&6G z$H{cFoZf+XhUfW<8yATC`7bt>+jJ8!E%rG7a$_K4*jkPDCxK1qrv7Bo@WEkhNo(R! zlyG6_HfYwbX^c@+qg6F)0IWtn{5jUmNvNsp_C~J6dH_N$WAZ03qY&Xq^dt}*pmZv0 z<4=dHJ+%F%Oiom#ou3Vdipa3Jm_cS$*+GIat-Swf>+D zbp!w1%?)7S;?3VOXK-3;*|UIOxNZjJf
    gTVY^jMm8!9Prx+-$8g0;cpRM1K7Mf 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 M;%Dt}_)#bS2fUImMgRZ+ diff --git a/YakPanel-server/backend/app/services/site_service.py b/YakPanel-server/backend/app/services/site_service.py index 933bcf2b..b10fc10d 100644 --- a/YakPanel-server/backend/app/services/site_service.py +++ b/YakPanel-server/backend/app/services/site_service.py @@ -7,7 +7,7 @@ from sqlalchemy import select from app.models.site import Site, Domain from app.models.redirect import SiteRedirect -from app.core.config import get_runtime_config +from app.core.config import get_runtime_config, get_settings from app.core.utils import path_safe_check, write_file, read_file, exec_shell_sync @@ -17,6 +17,37 @@ LETSENCRYPT_LIVE = "/etc/letsencrypt/live" SSL_EXPIRING_DAYS = 14 +def _nginx_site_template_path() -> str | None: + """ + Resolve webserver/templates/nginx_site.conf. + Order: YAKPANEL_NGINX_TEMPLATE env, repo root (parent of backend/), Settings.panel_path. + """ + candidates: list[str] = [] + env_override = (os.environ.get("YAKPANEL_NGINX_TEMPLATE") or "").strip() + if env_override: + candidates.append(env_override) + # site_service.py -> services -> app -> backend -> YakPanel-server (repo root) + here = os.path.abspath(__file__) + repo_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(here)))) + candidates.append(os.path.join(repo_root, "webserver", "templates", "nginx_site.conf")) + try: + s = get_settings() + pp = (s.panel_path or "").strip() + if pp: + candidates.append(os.path.join(os.path.abspath(pp), "webserver", "templates", "nginx_site.conf")) + sp = (s.setup_path or "").strip() + if sp: + candidates.append( + os.path.join(os.path.abspath(sp), "YakPanel-server", "webserver", "templates", "nginx_site.conf") + ) + except Exception: + pass + for path in candidates: + if path and os.path.isfile(path): + return path + return None + + def _backup_count(site_name: str, backup_dir: str) -> int: if not backup_dir or not os.path.isdir(backup_dir): return 0 @@ -415,9 +446,8 @@ async def update_site( cfg = get_runtime_config() vhost_path = os.path.join(cfg["setup_path"], "panel", "vhost", "nginx") conf_path = os.path.join(vhost_path, f"{site.name}.conf") - panel_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) - template_path = os.path.join(panel_root, "webserver", "templates", "nginx_site.conf") - if os.path.exists(template_path): + template_path = _nginx_site_template_path() + if template_path: template = read_file(template_path) or "" domain_result = await db.execute(select(Domain).where(Domain.pid == site.id)) domain_rows = domain_result.scalars().all() @@ -492,10 +522,13 @@ async def regenerate_site_vhost(db: AsyncSession, site_id: int) -> dict: write_path = conf_path else: write_path = disabled_path if os.path.isfile(disabled_path) else conf_path - panel_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) - template_path = os.path.join(panel_root, "webserver", "templates", "nginx_site.conf") - if not os.path.exists(template_path): - return {"status": False, "msg": "Template not found"} + template_path = _nginx_site_template_path() + if not template_path: + return { + "status": False, + "msg": "Template not found (nginx_site.conf). Expected under panel webserver/templates/ " + "or set env YAKPANEL_NGINX_TEMPLATE to the full path. Check Settings.panel_path matches the install directory.", + } template = read_file(template_path) or "" domain_result = await db.execute(select(Domain).where(Domain.pid == site.id)) domain_rows = domain_result.scalars().all()