diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml new file mode 100644 index 00000000..e5e04445 --- /dev/null +++ b/.github/workflows/docker-build.yml @@ -0,0 +1,169 @@ +name: Build and Push Docker Images + +on: + push: + branches: + - main # Pushes to main โ tags as "latest" + - development # Pushes to development โ tags as "dev" + tags: + - 'v*.*.*' # Version tags (v1.0.0, v1.2.3, etc.) โ tags as version number + workflow_dispatch: # Allows manual trigger from GitHub UI + +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} + +jobs: + build-and-push: + name: Build and Push Docker Image + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + steps: + # Step 1: Download the code + - name: ๐ฅ Checkout code + uses: actions/checkout@v4 + + # Step 2: Set up QEMU for multi-platform builds (ARM, AMD64, etc.) + - name: ๐ง Set up QEMU + uses: docker/setup-qemu-action@v3 + + # Step 3: Set up Docker Buildx (advanced Docker builder) + - name: ๐ง Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + # Step 4: Log in to GitHub Container Registry + - name: ๐ Log in to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.CPMP_GHCR_TOKEN }} + + # Step 5: Figure out what tags to use + - name: ๐ท๏ธ Extract metadata (tags, labels) + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + tags: | + # Tag "latest" for main branch + type=raw,value=latest,enable={{is_default_branch}} + # Tag "dev" for development branch + type=raw,value=dev,enable=${{ github.ref == 'refs/heads/development' }} + # Tag version numbers from git tags (v1.0.0 โ 1.0.0) + type=semver,pattern={{version}} + # Tag major.minor from git tags (v1.2.3 โ 1.2) + type=semver,pattern={{major}}.{{minor}} + # Tag major from git tags (v1.2.3 โ 1) + type=semver,pattern={{major}} + # Tag with git SHA for tracking (first 7 characters) + type=sha,prefix=sha-,format=short + + # Step 6: Build the frontend first + - name: ๐จ Build frontend + run: | + cd frontend + npm ci + npm run build + + # Step 7: Build and push Docker image + - name: ๐ณ Build and push Docker image + uses: docker/build-push-action@v5 + with: + context: . + file: ./Dockerfile + platforms: linux/amd64,linux/arm64 + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max + + # Step 8: Create a summary + - name: ๐ Create summary + run: | + echo "## ๐ Docker Image Built Successfully!" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### ๐ฆ Image Details" >> $GITHUB_STEP_SUMMARY + echo "- **Registry**: GitHub Container Registry (ghcr.io)" >> $GITHUB_STEP_SUMMARY + echo "- **Repository**: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}" >> $GITHUB_STEP_SUMMARY + echo "- **Tags**: " >> $GITHUB_STEP_SUMMARY + echo '```' >> $GITHUB_STEP_SUMMARY + echo "${{ steps.meta.outputs.tags }}" >> $GITHUB_STEP_SUMMARY + echo '```' >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### ๐ How to Use" >> $GITHUB_STEP_SUMMARY + echo '```bash' >> $GITHUB_STEP_SUMMARY + echo "docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest" >> $GITHUB_STEP_SUMMARY + echo "docker run -d -p 8080:8080 -v caddy_data:/app/data ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest" >> $GITHUB_STEP_SUMMARY + echo '```' >> $GITHUB_STEP_SUMMARY + + test-image: + name: Test Docker Image + needs: build-and-push + runs-on: ubuntu-latest + + steps: + # Step 1: Figure out which tag to test + - name: ๐ท๏ธ Determine image tag + id: tag + run: | + if [[ "${{ github.ref }}" == "refs/heads/main" ]]; then + echo "tag=latest" >> $GITHUB_OUTPUT + elif [[ "${{ github.ref }}" == "refs/heads/development" ]]; then + echo "tag=dev" >> $GITHUB_OUTPUT + elif [[ "${{ github.ref }}" == refs/tags/v* ]]; then + echo "tag=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT + else + echo "tag=sha-$(echo ${{ github.sha }} | cut -c1-7)" >> $GITHUB_OUTPUT + fi + + # Step 2: Pull the image we just built + - name: ๐ฅ Pull Docker image + run: docker pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.tag.outputs.tag }} + + # Step 3: Start the container + - name: ๐ Run container + run: | + docker run -d \ + --name test-container \ + -p 8080:8080 \ + ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.tag.outputs.tag }} + + # Step 4: Wait for it to start + - name: โณ Wait for container to be ready + run: sleep 10 + + # Step 5: Check if the health endpoint works + - name: ๐ฅ Test health endpoint + run: | + response=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/api/v1/health) + if [ $response -eq 200 ]; then + echo "โ Health check passed!" + else + echo "โ Health check failed with status $response" + docker logs test-container + exit 1 + fi + + # Step 6: Check the logs for errors + - name: ๐ Check container logs + if: always() + run: docker logs test-container + + # Step 7: Clean up + - name: ๐งน Stop container + if: always() + run: docker stop test-container && docker rm test-container + + # Step 8: Summary + - name: ๐ Create test summary + if: always() + run: | + echo "## ๐งช Docker Image Test Results" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "- **Image**: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.tag.outputs.tag }}" >> $GITHUB_STEP_SUMMARY + echo "- **Health Check**: ${{ job.status == 'success' && 'โ Passed' || 'โ Failed' }}" >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 00000000..6db95c81 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,353 @@ +name: Deploy Documentation to GitHub Pages + +on: + push: + branches: + - main # Deploy docs when pushing to main + paths: + - 'docs/**' # Only run if docs folder changes + - 'README.md' # Or if README changes + - '.github/workflows/docs.yml' # Or if this workflow changes + workflow_dispatch: # Allow manual trigger + +# Sets permissions to allow deployment to GitHub Pages +permissions: + contents: read + pages: write + id-token: write + +# Allow only one concurrent deployment +concurrency: + group: "pages" + cancel-in-progress: false + +jobs: + build: + name: Build Documentation + runs-on: ubuntu-latest + + steps: + # Step 1: Get the code + - name: ๐ฅ Checkout code + uses: actions/checkout@v4 + + # Step 2: Set up Node.js (for building any JS-based doc tools) + - name: ๐ง Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + # Step 3: Create a beautiful docs site structure + - name: ๐ Build documentation site + run: | + # Create output directory + mkdir -p _site + + # Copy all markdown files + cp README.md _site/ + cp -r docs _site/ + + # Create a simple HTML index that looks nice + cat > _site/index.html << 'EOF' + + +
+ + +Make your websites easy to reach - No coding required!
++ This documentation will help you get started with Caddy Proxy Manager Plus. + Whether you're a complete beginner or an experienced developer, we've got you covered! +
+Your first setup in just 5 minutes! We'll walk you through everything step by step.
+ Read the Guide โ +Learn what the app does, how to install it, and see examples of what you can build.
+ Read More โ +Already using Caddy? Learn how to bring your existing configuration into the app.
+ Import Your Configs โ +Complete REST API documentation with examples in JavaScript and Python.
+ View API Docs โ +Understand how data is stored, relationships, and backup strategies.
+ View Schema โ +Want to help make this better? Learn how to contribute code, docs, or ideas.
+ Start Contributing โ +Browse all available documentation organized by topic and skill level.
+ View Full Index โ ++ Stuck? Have questions? We're here to help! +
+ +