diff --git a/.woodpecker.yml b/.woodpecker.yml index 5cf6503..5e4850d 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -97,67 +97,69 @@ steps: - org.opencontainers.image.title=Peikarband Landing - org.opencontainers.image.description=Peikarband hosting platform landing page - cache: inline - provenance: true - sbom: true + # cache: inline + # provenance: true + # sbom: 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: event: [push, tag] branch: [main, develop,] - # ============================================ - # Verify Images - # ============================================ + # # ============================================ + # # Verify Images + # # ============================================ - verify-images: - image: alpine:latest - commands: - - apk add --no-cache curl - - | - echo "════════════════════════════════════════" - echo " 🔍 Verifying Images in Registry" - echo "════════════════════════════════════════" - echo "" + # verify-images: + # image: alpine:latest + # commands: + # - apk add --no-cache curl + # - | + # echo "════════════════════════════════════════" + # echo " 🔍 Verifying Images in Registry" + # echo "════════════════════════════════════════" + # echo "" - # Check base image - echo "Checking base image..." - if curl -f -u "$HARBOR_USERNAME:$HARBOR_PASSWORD" \ - "https://hub.peikarband.ir/v2/peikarband/landing/manifests/base" > /dev/null 2>&1; then - echo "✅ Base image: hub.peikarband.ir/peikarband/landing:base" - else - echo "⚠️ Base image not found (this is OK if first build)" - fi + # # Check base image + # echo "Checking base image..." + # if curl -f -u "$HARBOR_USERNAME:$HARBOR_PASSWORD" \ + # "https://hub.peikarband.ir/v2/peikarband/landing/manifests/base" > /dev/null 2>&1; then + # echo "✅ Base image: hub.peikarband.ir/peikarband/landing:base" + # else + # echo "⚠️ Base image not found (this is OK if first build)" + # fi - echo "" + # echo "" - # Check app image - echo "Checking app image..." - TAG="${CI_COMMIT_SHA:0:8}" - if curl -f -u "$HARBOR_USERNAME:$HARBOR_PASSWORD" \ - "https://hub.peikarband.ir/v2/peikarband/landing/manifests/$TAG" > /dev/null 2>&1; then - echo "✅ App image: hub.peikarband.ir/peikarband/landing:$TAG" - echo "" - echo "Available tags:" - echo " • latest" - echo " • ${CI_COMMIT_SHA:0:8}" - echo " • ${CI_COMMIT_BRANCH}" - echo "" - echo "════════════════════════════════════════" - else - echo "❌ Failed to verify app image" - exit 1 - fi + # # Check app image + # echo "Checking app image..." + # TAG="${CI_COMMIT_SHA:0:8}" + # if curl -f -u "$HARBOR_USERNAME:$HARBOR_PASSWORD" \ + # "https://hub.peikarband.ir/v2/peikarband/landing/manifests/$TAG" > /dev/null 2>&1; then + # echo "✅ App image: hub.peikarband.ir/peikarband/landing:$TAG" + # echo "" + # echo "Available tags:" + # echo " • latest" + # echo " • ${CI_COMMIT_SHA:0:8}" + # echo " • ${CI_COMMIT_BRANCH}" + # echo "" + # echo "════════════════════════════════════════" + # else + # echo "❌ Failed to verify app image" + # exit 1 + # fi - environment: - HARBOR_USERNAME: - from_secret: HARBOR_USERNAME - HARBOR_PASSWORD: - from_secret: HARBOR_PASSWORD + # environment: + # HARBOR_USERNAME: + # from_secret: HARBOR_USERNAME + # HARBOR_PASSWORD: + # from_secret: HARBOR_PASSWORD - when: - event: [push, tag] - branch: [main, develop] + # when: + # event: [push, tag] + # branch: [main, develop] # ============================================ # Notifications diff --git a/docker/Dockerfile copy b/docker/Dockerfile copy new file mode 100644 index 0000000..f4bbca0 --- /dev/null +++ b/docker/Dockerfile copy @@ -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"] \ No newline at end of file diff --git a/docker/Dockerfile copy.base b/docker/Dockerfile copy.base new file mode 100644 index 0000000..bd7aa0d --- /dev/null +++ b/docker/Dockerfile copy.base @@ -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"] \ No newline at end of file diff --git a/peikarband/peikarband.py b/peikarband/peikarband.py deleted file mode 100644 index 9508eda..0000000 --- a/peikarband/peikarband.py +++ /dev/null @@ -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"] -