diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index 4180b9af..00000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,219 +0,0 @@ -name: Build And Save Log - -on: - workflow_dispatch: - inputs: - environment: - description: "Target environment (e.g., staging, production)" - required: true - default: "staging" - version: - description: "Version to deploy" - required: false - default: "latest" - -env: - APP_NAME: desa-darmasaba-action - WA_PHONE: "6289697338821,6289697338822" - -jobs: - build: - runs-on: ubuntu-latest - services: - postgres: - image: postgres:14 - env: - POSTGRES_USER: ${{ secrets.POSTGRES_USER }} - POSTGRES_PASSWORD: ${{ secrets.POSTGRES_PASSWORD }} - POSTGRES_DB: ${{ secrets.POSTGRES_DB }} - ports: - - 5432:5432 - options: >- - --health-cmd="pg_isready" - --health-interval=10s - --health-timeout=5s - --health-retries=5 - - steps: - # Checkout kode sumber - - name: Checkout code - uses: actions/checkout@v3 - - # Setup Bun - - name: Setup Bun - uses: oven-sh/setup-bun@v2 - - # Cache dependencies - - name: Cache dependencies - uses: actions/cache@v3 - with: - path: .bun - key: ${{ runner.os }}-bun-${{ hashFiles('bun.lockb') }} - restore-keys: | - ${{ runner.os }}-bun- - - # Step 1: Set BRANCH_NAME based on event type - - name: Set BRANCH_NAME - run: | - if [[ "${{ github.event_name }}" == "pull_request" ]]; then - echo "BRANCH_NAME=${{ github.head_ref }}" >> $GITHUB_ENV - else - echo "BRANCH_NAME=${{ github.ref_name }}" >> $GITHUB_ENV - fi - - # Step 2: Generate APP_VERSION dynamically - - name: Set APP_VERSION - run: echo "APP_VERSION=${{ github.sha }}---$(date +%Y%m%d%H%M%S)" >> $GITHUB_ENV - - # Step 3: Kirim notifikasi ke API build Start - - name: Notify start build - run: | - IFS=',' read -ra PHONES <<< "${{ env.WA_PHONE }}" - for PHONE in "${PHONES[@]}"; do - ENCODED_TEXT=$(bun -e "console.log(encodeURIComponent('Build:start\nApp:${{ env.APP_NAME }}\nBranch:${{ env.BRANCH_NAME }}\nVersion:${{ env.APP_VERSION }}'))") - curl -X GET "https://wa.wibudev.com/code?text=$ENCODED_TEXT&nom=$PHONE" - done - - # Install dependencies - - name: Install dependencies - run: bun install - - # Konfigurasi environment variable untuk PostgreSQL dan variabel tambahan - - name: Set up environment variables - run: | - echo "DATABASE_URL=postgresql://${{ secrets.POSTGRES_USER }}:${{ secrets.POSTGRES_PASSWORD }}@localhost:5432/${{ secrets.POSTGRES_DB }}?schema=public" >> .env - echo "PORT=3000" >> .env - echo "NEXT_PUBLIC_WIBU_URL=localhost:3000" >> .env - echo "WIBU_UPLOAD_DIR=/uploads" >> .env - - # Create log file - - name: Create log file - run: touch build.txt - - # Migrasi database menggunakan Prisma - - name: Apply Prisma schema to database - run: bun prisma db push >> build.txt 2>&1 - - # Seed database (opsional) - - name: Seed database - run: | - bun prisma db seed >> build.txt 2>&1 || echo "Seed failed or no seed data found. Continuing without seed." >> build.txt - - # Build project - - name: Build project - run: bun run build >> build.txt 2>&1 - - # Ensure project directory exists - - name: Ensure /var/www/projects/${{ env.APP_NAME }} exists - uses: appleboy/ssh-action@master - with: - host: ${{ secrets.VPS_HOST }} - username: ${{ secrets.VPS_USERNAME }} - key: ${{ secrets.VPS_SSH_KEY }} - script: | - mkdir -p /var/www/projects/${{ env.APP_NAME }} - - # Deploy to a new version directory - - name: Deploy to VPS (New Version) - uses: appleboy/scp-action@master - with: - host: ${{ secrets.VPS_HOST }} - username: ${{ secrets.VPS_USERNAME }} - key: ${{ secrets.VPS_SSH_KEY }} - source: "." - target: "/var/www/projects/${{ env.APP_NAME }}/releases/${{ env.APP_VERSION }}" - - # Set up environment variables - - name: Set up environment variables - run: | - rm -r .env - echo "DATABASE_URL=postgresql://${{ secrets.POSTGRES_USER }}:${{ secrets.POSTGRES_PASSWORD }}@localhost:5433/${{ secrets.POSTGRES_DB }}?schema=public" >> .env - echo "NEXT_PUBLIC_WIBU_URL=${{ env.APP_NAME }}" >> .env - echo "WIBU_UPLOAD_DIR=/var/www/projects/${{ env.APP_NAME }}/uploads" >> .env - - # Kirim file .env ke server - - name: Upload .env to server - uses: appleboy/scp-action@master - with: - host: ${{ secrets.VPS_HOST }} - username: ${{ secrets.VPS_USERNAME }} - key: ${{ secrets.VPS_SSH_KEY }} - source: ".env" - target: "/var/www/projects/${{ env.APP_NAME }}/releases/${{ env.APP_VERSION }}/" - - # manage deployment - - name: manage deployment - uses: appleboy/ssh-action@master - with: - host: ${{ secrets.VPS_HOST }} - username: ${{ secrets.VPS_USERNAME }} - key: ${{ secrets.VPS_SSH_KEY }} - script: | - - # Source ~/.bashrc - source ~/.bashrc - - # Find an available port - PORT=$(curl -s -X GET https://wibu-bot.wibudev.com/api/find-port | jq -r '.[0]') - if [ -z "$PORT" ] || ! [[ "$PORT" =~ ^[0-9]+$ ]]; then - echo "Invalid or missing port from API." - exit 1 - fi - - # manage deployment - cd /var/www/projects/${{ env.APP_NAME }}/releases/${{ env.APP_VERSION }} - - # Create uploads directory - mkdir -p /var/www/projects/${{ env.APP_NAME }}/uploads - - # Install dependencies - bun install --production - - # Apply database schema - if ! bun prisma db push; then - echo "Database migration failed." - exit 1 - fi - - # Seed database (optional) - bun prisma db seed || echo "tidak membutuhkan seed" - - # Restart the application - pm2 reload ${{ env.APP_NAME }} || pm2 start "bun run start --port $PORT" --name "${{ env.APP_NAME }}-$PORT" --namespace "${{ env.APP_NAME }}" - - # Step 4: Set BUILD_STATUS based on success or failure - - name: Set BUILD_STATUS - if: success() - run: echo "BUILD_STATUS=success" >> $GITHUB_ENV - - - name: Set BUILD_STATUS on failure - if: failure() - run: echo "BUILD_STATUS=failed" >> $GITHUB_ENV - - # Update status log - - name: Update status log - if: always() - run: | - echo "=====================" >> build.txt - echo "BUILD_STATUS=${{ env.BUILD_STATUS }}" >> build.txt - echo "APP_NAME=${{ env.APP_NAME }}" >> build.txt - echo "APP_VERSION=${{ env.APP_VERSION }}" >> build.txt - echo "=====================" >> build.txt - - # Upload log to 0x0.st - - name: Upload log to 0x0.st - id: upload_log - if: always() - run: | - LOG_URL=$(curl -F "file=@build.txt" https://wibu-bot.wibudev.com/api/file ) - echo "LOG_URL=$LOG_URL" >> $GITHUB_ENV - - # Kirim notifikasi ke API - - name: Notify build success via API - if: always() - run: | - IFS=',' read -ra PHONES <<< "${{ env.WA_PHONE }}" - for PHONE in "${PHONES[@]}"; do - ENCODED_TEXT=$(bun -e "console.log(encodeURIComponent('Build:${{ env.BUILD_STATUS }}\nApp:${{ env.APP_NAME }}\nBranch:${{ env.BRANCH_NAME }}\nVersion:${{ env.APP_VERSION }}\nLog:${{ env.LOG_URL }}'))") - curl -X GET "https://wa.wibudev.com/code?text=$ENCODED_TEXT&nom=$PHONE" - done diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index ce6e2370..00000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,55 +0,0 @@ -name: test workflows - -on: - workflow_dispatch: - inputs: - environment: - description: "Target environment (e.g., staging, production)" - required: true - default: "staging" - version: - description: "Version to deploy" - required: false - default: "latest" - -env: - APP_NAME: desa-darmasaba-action - WA_PHONE: "6289697338821,6289697338822" - -jobs: - build: - runs-on: ubuntu-latest - steps: - # Checkout kode sumber - - name: Checkout code - uses: actions/checkout@v3 - - # Setup Bun - - name: Setup Bun - uses: oven-sh/setup-bun@v2 - - # Create log file - - name: Create log file - run: touch build.txt - - # Step 1: Set BRANCH_NAME based on event type - - name: Set BRANCH_NAME - run: | - if [[ "${{ github.event_name }}" == "pull_request" ]]; then - echo "BRANCH_NAME=${{ github.head_ref }}" >> $GITHUB_ENV - else - echo "BRANCH_NAME=${{ github.ref_name }}" >> $GITHUB_ENV - fi - - # Step 2: Generate APP_VERSION dynamically - - name: Set APP_VERSION - run: echo "APP_VERSION=${{ github.sha }}---$(date +%Y%m%d%H%M%S)" >> $GITHUB_ENV - - # Step 3: Kirim notifikasi ke API build Start - - name: Notify start build - run: | - IFS=',' read -ra PHONES <<< "${{ env.WA_PHONE }}" - for PHONE in "${PHONES[@]}"; do - ENCODED_TEXT=$(bun -e "console.log(encodeURIComponent('Build:start\nApp:${{ env.APP_NAME }}\nenv:${{ inputs.environment }}\nBranch:${{ env.BRANCH_NAME }}\nVersion:${{ env.APP_VERSION }}'))") - curl -X GET "https://wa.wibudev.com/code?text=$ENCODED_TEXT&nom=$PHONE" - done diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..dc2b93db --- /dev/null +++ b/Dockerfile @@ -0,0 +1,50 @@ +FROM debian:bookworm-slim AS base + +RUN apt-get update && apt-get install -y --no-install-recommends \ + curl unzip ca-certificates libssl3 && \ + rm -rf /var/lib/apt/lists/* && \ + curl -fsSL https://bun.sh/install | bash + +ENV PATH="/root/.bun/bin:$PATH" +WORKDIR /app + +# ---- deps ---- +FROM base AS deps + +COPY package.json bun.lock ./ +RUN bun install --frozen-lockfile + +# ---- builder ---- +FROM deps AS builder + +COPY prisma ./prisma +RUN bunx prisma generate + +COPY src ./src +COPY types ./types +COPY tsconfig.json bunfig.toml ./ + + + +# BUN_PUBLIC_* vars are baked into the browser bundle at build time +ARG BUN_PUBLIC_BASE_URL +ENV BUN_PUBLIC_BASE_URL=${BUN_PUBLIC_BASE_URL} +RUN bun run build + +# ---- runner ---- +FROM base AS runner + +COPY package.json bun.lock ./ +RUN bun install --production + +COPY --from=builder /app/generated ./generated +COPY --from=builder /app/dist ./dist +COPY src ./src +COPY prisma ./prisma +COPY types ./types +COPY tsconfig.json bunfig.toml ./ + +ENV NODE_ENV=production +EXPOSE 3000 + +CMD ["bun", "run", "./src/index.tsx"]