This commit is contained in:
100
.woodpecker.yml
100
.woodpecker.yml
@@ -97,67 +97,69 @@ steps:
|
|||||||
- org.opencontainers.image.title=Peikarband Landing
|
- org.opencontainers.image.title=Peikarband Landing
|
||||||
- org.opencontainers.image.description=Peikarband hosting platform landing page
|
- org.opencontainers.image.description=Peikarband hosting platform landing page
|
||||||
|
|
||||||
cache: inline
|
# cache: inline
|
||||||
provenance: true
|
# provenance: true
|
||||||
sbom: true
|
# sbom: true
|
||||||
push: true
|
push: true
|
||||||
|
cache_from: type=registry,ref=hub.peikarband.ir/peikarband/landing:cache
|
||||||
|
cache_to: type=registry,ref=hub.peikarband.ir/peikarband/landing:cache,mode=max
|
||||||
|
|
||||||
when:
|
when:
|
||||||
event: [push, tag]
|
event: [push, tag]
|
||||||
branch: [main, develop,]
|
branch: [main, develop,]
|
||||||
|
|
||||||
# ============================================
|
# # ============================================
|
||||||
# Verify Images
|
# # Verify Images
|
||||||
# ============================================
|
# # ============================================
|
||||||
|
|
||||||
verify-images:
|
# verify-images:
|
||||||
image: alpine:latest
|
# image: alpine:latest
|
||||||
commands:
|
# commands:
|
||||||
- apk add --no-cache curl
|
# - apk add --no-cache curl
|
||||||
- |
|
# - |
|
||||||
echo "════════════════════════════════════════"
|
# echo "════════════════════════════════════════"
|
||||||
echo " 🔍 Verifying Images in Registry"
|
# echo " 🔍 Verifying Images in Registry"
|
||||||
echo "════════════════════════════════════════"
|
# echo "════════════════════════════════════════"
|
||||||
echo ""
|
# echo ""
|
||||||
|
|
||||||
# Check base image
|
# # Check base image
|
||||||
echo "Checking base image..."
|
# echo "Checking base image..."
|
||||||
if curl -f -u "$HARBOR_USERNAME:$HARBOR_PASSWORD" \
|
# if curl -f -u "$HARBOR_USERNAME:$HARBOR_PASSWORD" \
|
||||||
"https://hub.peikarband.ir/v2/peikarband/landing/manifests/base" > /dev/null 2>&1; then
|
# "https://hub.peikarband.ir/v2/peikarband/landing/manifests/base" > /dev/null 2>&1; then
|
||||||
echo "✅ Base image: hub.peikarband.ir/peikarband/landing:base"
|
# echo "✅ Base image: hub.peikarband.ir/peikarband/landing:base"
|
||||||
else
|
# else
|
||||||
echo "⚠️ Base image not found (this is OK if first build)"
|
# echo "⚠️ Base image not found (this is OK if first build)"
|
||||||
fi
|
# fi
|
||||||
|
|
||||||
echo ""
|
# echo ""
|
||||||
|
|
||||||
# Check app image
|
# # Check app image
|
||||||
echo "Checking app image..."
|
# echo "Checking app image..."
|
||||||
TAG="${CI_COMMIT_SHA:0:8}"
|
# TAG="${CI_COMMIT_SHA:0:8}"
|
||||||
if curl -f -u "$HARBOR_USERNAME:$HARBOR_PASSWORD" \
|
# if curl -f -u "$HARBOR_USERNAME:$HARBOR_PASSWORD" \
|
||||||
"https://hub.peikarband.ir/v2/peikarband/landing/manifests/$TAG" > /dev/null 2>&1; then
|
# "https://hub.peikarband.ir/v2/peikarband/landing/manifests/$TAG" > /dev/null 2>&1; then
|
||||||
echo "✅ App image: hub.peikarband.ir/peikarband/landing:$TAG"
|
# echo "✅ App image: hub.peikarband.ir/peikarband/landing:$TAG"
|
||||||
echo ""
|
# echo ""
|
||||||
echo "Available tags:"
|
# echo "Available tags:"
|
||||||
echo " • latest"
|
# echo " • latest"
|
||||||
echo " • ${CI_COMMIT_SHA:0:8}"
|
# echo " • ${CI_COMMIT_SHA:0:8}"
|
||||||
echo " • ${CI_COMMIT_BRANCH}"
|
# echo " • ${CI_COMMIT_BRANCH}"
|
||||||
echo ""
|
# echo ""
|
||||||
echo "════════════════════════════════════════"
|
# echo "════════════════════════════════════════"
|
||||||
else
|
# else
|
||||||
echo "❌ Failed to verify app image"
|
# echo "❌ Failed to verify app image"
|
||||||
exit 1
|
# exit 1
|
||||||
fi
|
# fi
|
||||||
|
|
||||||
environment:
|
# environment:
|
||||||
HARBOR_USERNAME:
|
# HARBOR_USERNAME:
|
||||||
from_secret: HARBOR_USERNAME
|
# from_secret: HARBOR_USERNAME
|
||||||
HARBOR_PASSWORD:
|
# HARBOR_PASSWORD:
|
||||||
from_secret: HARBOR_PASSWORD
|
# from_secret: HARBOR_PASSWORD
|
||||||
|
|
||||||
when:
|
# when:
|
||||||
event: [push, tag]
|
# event: [push, tag]
|
||||||
branch: [main, develop]
|
# branch: [main, develop]
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# Notifications
|
# Notifications
|
||||||
|
|||||||
51
docker/Dockerfile copy
Normal file
51
docker/Dockerfile copy
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
# استفاده از ایمیج پایهای که قبلاً Push کردید
|
||||||
|
ARG BASE_IMAGE=hub.peikarband.ir/peikarband/landing:base
|
||||||
|
FROM ${BASE_IMAGE} AS builder
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# ۱. کپی کردن فایلهای نیازمندی (برای استفاده از Cache)
|
||||||
|
COPY peikarband/requirements.txt .
|
||||||
|
RUN --mount=type=cache,target=/root/.cache/pip \
|
||||||
|
pip install --no-cache-dir -r requirements.txt
|
||||||
|
|
||||||
|
# ۲. کپی کردن کل کدها
|
||||||
|
# مهم: ساختار فولدر باید با app_name در rxconfig.py یکی باشد
|
||||||
|
COPY peikarband/ .
|
||||||
|
|
||||||
|
# ۳. تنظیم PYTHONPATH برای حل مشکل ModuleNotFoundError
|
||||||
|
ENV PYTHONPATH=/app
|
||||||
|
|
||||||
|
# ۴. اجرای Reflex Export
|
||||||
|
# این دستور خودش فرانتتند را بیلد میکند و نیازی به npm run build دستی نیست
|
||||||
|
RUN reflex init --loglevel debug
|
||||||
|
RUN reflex export --frontend-only --no-zip --loglevel debug
|
||||||
|
|
||||||
|
# ================= Stage 2: Runtime =================
|
||||||
|
FROM ${BASE_IMAGE} AS runtime
|
||||||
|
|
||||||
|
# ایجاد یوزر غیر ریشه برای امنیت
|
||||||
|
RUN groupadd -r peikarband && useradd -r -g peikarband -u 1000 -m peikarband
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# کپی کردن کتابخانههای نصب شده از مرحله قبل
|
||||||
|
COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages
|
||||||
|
COPY --from=builder /usr/local/bin /usr/local/bin
|
||||||
|
|
||||||
|
# کپی کردن کد اپلیکیشن و فایلهای بیلد شده فرانتتند
|
||||||
|
COPY --from=builder --chown=peikarband:peikarband /app /app
|
||||||
|
|
||||||
|
# ایجاد پوشههای مورد نیاز
|
||||||
|
RUN mkdir -p data logs uploaded_files && \
|
||||||
|
chown -R peikarband:peikarband /app && \
|
||||||
|
chmod -R 755 /app
|
||||||
|
|
||||||
|
ENV PYTHONUNBUFFERED=1 \
|
||||||
|
PYTHONPATH=/app \
|
||||||
|
NODE_ENV=production
|
||||||
|
|
||||||
|
USER peikarband
|
||||||
|
EXPOSE 3000 8000
|
||||||
|
|
||||||
|
ENTRYPOINT ["/usr/bin/tini", "--"]
|
||||||
|
CMD ["reflex", "run", "--env", "prod"]
|
||||||
27
docker/Dockerfile copy.base
Normal file
27
docker/Dockerfile copy.base
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
# Peikarband Base Image
|
||||||
|
ARG PYTHON_VERSION=3.11
|
||||||
|
FROM python:${PYTHON_VERSION}-slim
|
||||||
|
|
||||||
|
# نصب ابزارهای سیستم و پاکسازی برای کاهش حجم
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
gcc g++ make curl gnupg ca-certificates unzip git tini \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# نصب Node.js 20
|
||||||
|
RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \
|
||||||
|
&& apt-get install -y --no-install-recommends nodejs \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# نصب Bun با مکانیزم Retry برای پایداری در شبکه
|
||||||
|
RUN set -ex && \
|
||||||
|
for i in 1 2 3 4 5; do \
|
||||||
|
curl -fsSL https://bun.sh/install | bash && break || \
|
||||||
|
(echo "Attempt $i failed, retrying in 5 seconds..." && sleep 5); \
|
||||||
|
done
|
||||||
|
ENV PATH="/root/.bun/bin:${PATH}"
|
||||||
|
|
||||||
|
# آپدیت ابزارهای پایتون
|
||||||
|
RUN pip install --no-cache-dir --upgrade pip setuptools wheel
|
||||||
|
|
||||||
|
WORKDIR /build
|
||||||
|
CMD ["/bin/bash"]
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
"""Peikarband Landing Application Module.
|
|
||||||
|
|
||||||
This module exports the Reflex app instance.
|
|
||||||
Reflex expects to find 'app' in peikarband.peikarband when app_name='peikarband'.
|
|
||||||
"""
|
|
||||||
|
|
||||||
# Import app from app.py module (same directory, use relative import)
|
|
||||||
from .app import app
|
|
||||||
|
|
||||||
__all__ = ["app"]
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user