diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..d298e8b --- /dev/null +++ b/.dockerignore @@ -0,0 +1,6 @@ +node_modules +dist +.git +.env +.DS_Store +.claude/ diff --git a/.gitea/workflows/main.yaml b/.gitea/workflows/main.yaml index 2be6de9..edd709e 100644 --- a/.gitea/workflows/main.yaml +++ b/.gitea/workflows/main.yaml @@ -1,12 +1,20 @@ -name: Build and Release +name: Build and Release to Staging on: push: branches: - main + workflow_dispatch: + +env: + REGISTRY_HOST: git.ivanch.me + REGISTRY_USERNAME: ivanch + IMAGE_NAME: ${{ env.REGISTRY_HOST }}/ivanch/vision-start + IMAGE_TAG: staging jobs: build: + name: Build Vision Start if: gitea.event_name == 'push' runs-on: ubuntu-latest steps: @@ -16,3 +24,47 @@ jobs: run: npm install - name: Run build run: npm run build + + build_vision_start: + name: Build Vision Start Image + runs-on: ubuntu-latest + needs: build + steps: + - name: Check out repository + uses: actions/checkout@v2 + + - name: Log in to Container Registry + run: | + echo "${{ secrets.REGISTRY_PASSWORD }}" \ + | docker login "${{ env.REGISTRY_HOST }}" \ + -u "${{ env.REGISTRY_USERNAME }}" \ + --password-stdin + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build and Push Multi-Arch Image + uses: docker/build-push-action@v6 + with: + push: true + context: . + platforms: linux/amd64,linux/arm64 + tags: | + ${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }} + + deploy_vision_start: + name: Deploy Vision Start (staging) + runs-on: ubuntu-amd64 + needs: build_vision_start + steps: + - name: Recreate Container + uses: appleboy/ssh-action@v0.1.7 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + port: ${{ secrets.PORT }} + script: | + cd ${{ secrets.DIR }} + docker compose pull + docker compose up -d --force-recreate diff --git a/.gitea/workflows/release.yaml b/.gitea/workflows/release.yaml index a2789f3..b342ea0 100644 --- a/.gitea/workflows/release.yaml +++ b/.gitea/workflows/release.yaml @@ -5,6 +5,12 @@ on: tags: - v* +env: + REGISTRY_HOST: git.ivanch.me + REGISTRY_USERNAME: ivanch + IMAGE_NAME: ${{ env.REGISTRY_HOST }}/ivanch/vision-start + IMAGE_TAG: latest + jobs: build: runs-on: ubuntu-latest @@ -20,7 +26,7 @@ jobs: - name: Run build run: npm run build - name: Prepare release - run: | + run: | bash scripts/prepare_release.sh mv dist vision-start/ mv manifest.json vision-start/ @@ -55,15 +61,15 @@ jobs: run: | # Run the VirusTotal check script and capture output bash scripts/check_virustotal.sh > vt_output.txt 2>&1 - + # Extract analysis URL and detection ratio from output ANALYSIS_URL=$(grep "Analysis URL:" vt_output.txt | cut -d' ' -f3- || echo "Not available") DETECTION_RATIO=$(grep "Detection ratio:" vt_output.txt | cut -d' ' -f3- || echo "Not available") - + # Set outputs for next job echo "analysis-url=$ANALYSIS_URL" >> $GITEA_OUTPUT echo "detection-ratio=$DETECTION_RATIO" >> $GITEA_OUTPUT - + # Display the full output cat vt_output.txt @@ -82,9 +88,53 @@ jobs: with: body: | This is the release for version ${{ gitea.ref_name }}. - + **Virus Total Analysis URL:** ${{ needs.virus-total-check.outputs.analysis-url }} **Virus Total Detection Ratio:** ${{ needs.virus-total-check.outputs.detection-ratio }} name: ${{ gitea.ref_name }} tag_name: ${{ gitea.ref_name }} - files: vision-start-${{ gitea.ref_name }}.zip \ No newline at end of file + files: vision-start-${{ gitea.ref_name }}.zip + + build_vision_start: + name: Build Vision Start Image + runs-on: ubuntu-latest + needs: build + steps: + - name: Check out repository + uses: actions/checkout@v2 + + - name: Log in to Container Registry + run: | + echo "${{ secrets.REGISTRY_PASSWORD }}" \ + | docker login "${{ env.REGISTRY_HOST }}" \ + -u "${{ env.REGISTRY_USERNAME }}" \ + --password-stdin + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build and Push Multi-Arch Image + uses: docker/build-push-action@v6 + with: + push: true + context: . + platforms: linux/amd64,linux/arm64 + tags: | + ${{ env.IMAGE_NAME }}:${{ env.IMAGE_TAG }} + + deploy_vision_start: + name: Deploy Vision Start (production) + runs-on: ubuntu-amd64 + needs: build_vision_start + steps: + - name: Recreate Container + uses: appleboy/ssh-action@v0.1.7 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + port: ${{ secrets.PORT }} + script: | + cd ${{ secrets.DIR }} + docker compose pull + docker compose up -d --force-recreate diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..fdfffeb --- /dev/null +++ b/Dockerfile @@ -0,0 +1,29 @@ +# Build stage +FROM node:20-alpine AS builder + +# Set working directory +WORKDIR /app + +# Copy package.json and package-lock.json (if available) +COPY package*.json ./ + +# Install dependencies +RUN npm install + +# Copy the rest of the application +COPY . . + +# Build the application +RUN npm run build + +# Production stage +FROM nginx:alpine + +# Copy the built application from the builder stage +COPY --from=builder /app/dist /usr/share/nginx/html + +# Expose port 80 +EXPOSE 80 + +# Start Nginx +CMD ["nginx", "-g", "daemon off;"]