Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
88 changes: 79 additions & 9 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -7,34 +7,104 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
gcc python3-dev libc6-dev git curl unzip \
&& rm -rf /var/lib/apt/lists/*

# نصب bun برای ساخت فرانت‌اند داشبورد (خود ایمیج رسمی این کار را در CI انجام می‌دهد،
# ولی چون از سورس تازه کلون می‌کنیم باید اینجا خودمان انجامش دهیم)
# انجام می‌دهد CI برای ساخت فرانت‌اند دادشورد (خود ایمیج رسمی این کار را انجام
# (ولی چون از سورس تازه کلون می‌کنیم باید اینجا خودمان انجامش دهیم
RUN curl -fsSL https://bun.sh/install | bash
ENV PATH="/root/.bun/bin:$PATH"

WORKDIR /build
RUN git clone --depth 1 https://github.com/PasarGuard/panel.git .

# ساخت خروجی استاتیک داشبورد؛ اگر این پوشه از قبل وجود نداشته باشد،
# خود برنامه هنگام استارت runtime سعی می‌کند با bun بسازدش که در ایمیج نهایی
# bun نصب نیست و باعث کرش می‌شود (FileNotFoundError: bun)
# ساخت خروجی استاتیک داشبورد؛ اگر این پوشه از قبل وجود نداشته باشد #
# می‌سازدش که در ایمیج نهایی bun سعی می‌کند با runtime خود برنامه هنگام استارت #
# نصب نیست و باعث کرش می‌شود (FileNotFoundError: bun) #
RUN cd dashboard && bun install --frozen-lockfile && cd .. && bash build_dashboard.sh

# پچ ۱: باگ فعلی برنچ main پاسارگارد -- سینتکس پایتون ۲ که در پایتون ۳ SyntaxError می‌دهد
# و باعث می‌شود کل main.py اصلاً اجرا نشود (کرش کامل هنگام استارت).
# می‌دهد SyntaxError -- سینتکس پایتون ۴ که در پایتون ۲ باک فعلی برنج #
# .اصلا اجرا نشود (کرش کامل هنگام استارت) main.py #
RUN sed -i 's/except ValueError, socket.gaierror:/except (ValueError, socket.gaierror):/' main.py

# پچ ۲: بدون SSL، پاسارگارد به‌صورت پیش‌فرض روی localhost گوش می‌دهد که در Railway
# باعث "Application failed to respond" می‌شود؛ این پچ همیشه 0.0.0.0 را اجباری می‌کند.
# پاسارگاد به صورت پیش‌فرض روی SSL, پیچ ۲: بدون localhost گوش می‌دهد که در Railway #
# .باعث "Application failed to respond" می‌شود. این پیچ 0.0.0.0 را اجباری می‌کند #
RUN sed -i 's/bind_args\["host"\] = ip/bind_args["host"] = server_settings.host/' main.py

RUN uv sync --frozen --no-dev

FROM python:$PYTHON_VERSION-slim-bookworm
COPY --from=builder /build /code
WORKDIR /code

# ایجاد و جایگزینی فایل قالب سابسکریپشن با پس‌زمینه سفارشی
RUN mkdir -p /code/app/templates/subscription && \
cat <<'EOF' > /code/app/templates/subscription/index.html
<!DOCTYPE html>
<html lang="fa" dir="rtl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>پروفایل اشتراک</title>
<style>
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
background-color: #0d1117 !important;
background-image: radial-gradient(circle at top, #161b22 0%, #0d1117 100%) !important;
color: #c9d1d9;
min-height: 100vh;
display: flex;
justify-content: center;
align-items: center;
padding: 20px;
}
.card {
background: #161b22;
border: 1px solid #30363d;
border-radius: 12px;
padding: 24px;
width: 100%;
max-width: 450px;
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);
text-align: center;
}
h1 {
font-size: 1.25rem;
color: #58a6ff;
margin-bottom: 12px;
}
p {
font-size: 0.9rem;
color: #8b949e;
line-height: 1.5;
}
</style>
</head>
<body>
<div class="card">
<h1>پروفایل اشتراک</h1>
<p>اطلاعات اشتراک شما فعال است.</p>
</div>
</body>
</html>
EOF

ENV PATH="/code/.venv/bin:$PATH"

RUN apt-get update && apt-get install -y --no-install-recommends curl \
&& rm -rf /var/lib/apt/lists/*

COPY start-railway.sh /start-railway.sh
RUN chmod +x /start-railway.sh

# می‌گوید پنل روی کدام پورت گوش می‌دهد تا موقع ساخت Railway این خط به #
# .دامنه، پورت درست را خودش به صورت خودکار تشخیص دهد #
EXPOSE 8000

ENTRYPOINT ["/start-railway.sh"]

RUN apt-get update && apt-get install -y --no-install-recommends curl \
&& rm -rf /var/lib/apt/lists/*

Expand Down