feat(docker): Add self-hosted local Supabase via Docker Compose profiles #155
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Deploy to GitHub Pages | |
| on: | |
| push: | |
| branches: [main] | |
| workflow_dispatch: | |
| permissions: | |
| contents: read | |
| pages: write | |
| id-token: write | |
| concurrency: | |
| group: 'pages' | |
| cancel-in-progress: false | |
| jobs: | |
| build-and-deploy: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v4 | |
| - name: Setup pnpm | |
| uses: pnpm/action-setup@v4 | |
| with: | |
| version: 10.16.1 | |
| - name: Setup Node.js | |
| uses: actions/setup-node@v4 | |
| with: | |
| node-version: '22' | |
| cache: 'pnpm' | |
| - name: Install dependencies | |
| run: pnpm install --frozen-lockfile | |
| - name: Verify PageSpeed API Key | |
| run: | | |
| if [ -z "${{ secrets.NEXT_PUBLIC_PAGESPEED_API_KEY }}" ]; then | |
| echo "::error::NEXT_PUBLIC_PAGESPEED_API_KEY secret is empty or not set" | |
| exit 1 | |
| fi | |
| echo "::notice::PageSpeed API key is set (length: ${#NEXT_PUBLIC_PAGESPEED_API_KEY})" | |
| env: | |
| NEXT_PUBLIC_PAGESPEED_API_KEY: ${{ secrets.NEXT_PUBLIC_PAGESPEED_API_KEY }} | |
| - name: Build Next.js app | |
| run: pnpm run build | |
| env: | |
| NEXT_PUBLIC_AUTHOR_AVATAR: ${{ secrets.NEXT_PUBLIC_AUTHOR_AVATAR }} | |
| NEXT_PUBLIC_AUTHOR_BIO: ${{ secrets.NEXT_PUBLIC_AUTHOR_BIO }} | |
| NEXT_PUBLIC_AUTHOR_BLUESKY: ${{ secrets.NEXT_PUBLIC_AUTHOR_BLUESKY }} | |
| NEXT_PUBLIC_AUTHOR_EMAIL: ${{ secrets.NEXT_PUBLIC_AUTHOR_EMAIL }} | |
| NEXT_PUBLIC_AUTHOR_GITHUB: ${{ secrets.NEXT_PUBLIC_AUTHOR_GITHUB }} | |
| NEXT_PUBLIC_AUTHOR_LINKEDIN: ${{ secrets.NEXT_PUBLIC_AUTHOR_LINKEDIN }} | |
| NEXT_PUBLIC_AUTHOR_MASTODON: ${{ secrets.NEXT_PUBLIC_AUTHOR_MASTODON }} | |
| NEXT_PUBLIC_AUTHOR_NAME: ${{ secrets.NEXT_PUBLIC_AUTHOR_NAME }} | |
| NEXT_PUBLIC_AUTHOR_ROLE: ${{ secrets.NEXT_PUBLIC_AUTHOR_ROLE }} | |
| NEXT_PUBLIC_AUTHOR_TWITCH: ${{ secrets.NEXT_PUBLIC_AUTHOR_TWITCH }} | |
| NEXT_PUBLIC_AUTHOR_TWITTER: ${{ secrets.NEXT_PUBLIC_AUTHOR_TWITTER }} | |
| NEXT_PUBLIC_AUTHOR_WEBSITE: ${{ secrets.NEXT_PUBLIC_AUTHOR_WEBSITE }} | |
| # NEXT_PUBLIC_BASE_PATH removed - let auto-detection set it from GITHUB_ACTIONS | |
| NEXT_PUBLIC_BASE_URL: ${{ secrets.NEXT_PUBLIC_BASE_URL }} | |
| NEXT_PUBLIC_CALENDAR_PROVIDER: ${{ secrets.NEXT_PUBLIC_CALENDAR_PROVIDER }} | |
| NEXT_PUBLIC_CALENDAR_URL: ${{ secrets.NEXT_PUBLIC_CALENDAR_URL }} | |
| NEXT_PUBLIC_DISQUS_SHORTNAME: ${{ secrets.NEXT_PUBLIC_DISQUS_SHORTNAME }} | |
| NEXT_PUBLIC_EMAILJS_PUBLIC_KEY: ${{ secrets.NEXT_PUBLIC_EMAILJS_PUBLIC_KEY }} | |
| NEXT_PUBLIC_EMAILJS_SERVICE_ID: ${{ secrets.NEXT_PUBLIC_EMAILJS_SERVICE_ID }} | |
| NEXT_PUBLIC_EMAILJS_TEMPLATE_ID: ${{ secrets.NEXT_PUBLIC_EMAILJS_TEMPLATE_ID }} | |
| NEXT_PUBLIC_GA_MEASUREMENT_ID: ${{ secrets.NEXT_PUBLIC_GA_MEASUREMENT_ID }} | |
| NEXT_PUBLIC_GOOGLE_SITE_VERIFICATION: ${{ secrets.NEXT_PUBLIC_GOOGLE_SITE_VERIFICATION }} | |
| NEXT_PUBLIC_ORS_API_KEY: ${{ secrets.NEXT_PUBLIC_ORS_API_KEY }} | |
| NEXT_PUBLIC_PAGESPEED_API_KEY: ${{ secrets.NEXT_PUBLIC_PAGESPEED_API_KEY }} | |
| NEXT_PUBLIC_PROJECT_NAME: ${{ secrets.NEXT_PUBLIC_PROJECT_NAME }} | |
| NEXT_PUBLIC_PROJECT_OWNER: ${{ secrets.NEXT_PUBLIC_PROJECT_OWNER }} | |
| NEXT_PUBLIC_SITE_URL: ${{ secrets.NEXT_PUBLIC_SITE_URL }} | |
| NEXT_PUBLIC_SOCIAL_PLATFORMS: ${{ secrets.NEXT_PUBLIC_SOCIAL_PLATFORMS }} | |
| NEXT_PUBLIC_WEB3FORMS_ACCESS_KEY: ${{ secrets.NEXT_PUBLIC_WEB3FORMS_ACCESS_KEY }} | |
| NEXT_PUBLIC_DEPLOY_URL: ${{ secrets.NEXT_PUBLIC_DEPLOY_URL }} | |
| NEXT_PUBLIC_SUPABASE_URL: ${{ secrets.NEXT_PUBLIC_SUPABASE_URL }} | |
| NEXT_PUBLIC_SUPABASE_ANON_KEY: ${{ secrets.NEXT_PUBLIC_SUPABASE_ANON_KEY }} | |
| - name: Build Storybook | |
| run: pnpm run build-storybook | |
| - name: Add cache busting and merge outputs | |
| run: | | |
| # Create merged output directory | |
| mkdir -p merged-output | |
| # Check if Next.js build output exists and copy it | |
| if [ -d "out" ]; then | |
| echo "Copying Next.js build from 'out' directory..." | |
| cp -r out/* merged-output/ | |
| else | |
| echo "Warning: 'out' directory not found. The Next.js build may have failed." | |
| # Create a minimal index.html to prevent complete failure | |
| echo "<html><body><h1>Build Error</h1><p>The Next.js build did not complete successfully.</p></body></html>" > merged-output/index.html | |
| fi | |
| # Check if Storybook build exists and copy it | |
| if [ -d "storybook-static" ]; then | |
| echo "Copying Storybook build..." | |
| cp -r storybook-static merged-output/storybook | |
| # Add build timestamp to force cache refresh | |
| echo "Build: $(date -u +'%Y-%m-%d %H:%M:%S UTC')" > merged-output/storybook/BUILD_TIME.txt | |
| else | |
| echo "Warning: 'storybook-static' directory not found. Storybook build may have failed." | |
| fi | |
| # Create _headers file for cache control (GitHub Pages doesn't use it but good practice) | |
| cat > merged-output/_headers << EOF | |
| /storybook/* | |
| Cache-Control: no-cache, no-store, must-revalidate | |
| Pragma: no-cache | |
| Expires: 0 | |
| /storybook/static/* | |
| Cache-Control: public, max-age=31536000, immutable | |
| EOF | |
| - name: Upload artifact | |
| uses: actions/upload-pages-artifact@v3 | |
| with: | |
| path: ./merged-output | |
| deploy: | |
| environment: | |
| name: github-pages | |
| url: ${{ steps.deployment.outputs.page_url }} | |
| runs-on: ubuntu-latest | |
| needs: build-and-deploy | |
| steps: | |
| - name: Deploy to GitHub Pages | |
| id: deployment | |
| uses: actions/deploy-pages@v4 |