diff --git a/CI-CD-SETUP.md b/CI-CD-SETUP.md new file mode 100644 index 0000000..05aaeed --- /dev/null +++ b/CI-CD-SETUP.md @@ -0,0 +1,145 @@ +# CI/CD Setup Instructions + +## โœ… What's Done + +1. **Gitea Actions workflow** created (`.gitea/workflows/ci-cd.yaml`) + - Build job: Verify Astro build works + - Deploy job: Build Docker image + push to registry + trigger Portainer + +2. **Docker files** created: + - `Dockerfile` - Multi-stage build (Node + nginx) + - `docker-compose.yml` - Local testing + - `nginx.conf` - SPA routing + cache headers + - `.dockerignore` - Optimize build + +3. **Pushed to git** - CI will run on next push to main branch + +--- + +## ๐Ÿ”ง Manual Steps Required + +### 1. Configure Gitea Secrets + +Go to: https://gitlab.impresion3d.pro/root/davidaragon-portfolio/settings/secrets + +Add these secrets: + +#### `DOCKER_USERNAME` +``` +root +``` + +#### `DOCKER_PASSWORD` +``` + +``` + +#### `PORTAINER_WEBHOOK_URL` +``` + +``` + +### 2. Create Portainer Stack + +1. Go to Portainer: http://192.168.1.30:9000 +2. Navigate to: **Stacks** โ†’ **Add stack** +3. Name: `davidaragon-portfolio` +4. Build method: **Git Repository** or **Web editor** + +#### Stack compose file: + +```yaml +version: '3.8' + +services: + portfolio: + image: gitlab.impresion3d.pro/root/davidaragon-portfolio:latest + container_name: davidaragon-portfolio + ports: + - "8081:80" + restart: unless-stopped + environment: + - NODE_ENV=production + networks: + - web + +networks: + web: + external: true +``` + +5. Deploy the stack +6. Go to stack **Webhooks** tab +7. Create webhook for service `portfolio` +8. Copy webhook URL (format: `http://192.168.1.30:9000/api/stacks/webhooks/...`) +9. Add this URL as `PORTAINER_WEBHOOK_URL` secret in Gitea (step 1) + +### 3. Optional: Configure Gitea Runner + +If no runners registered yet: + +```bash +# On server 192.168.1.30 (port 2222) +docker run -d \ + --name gitea-runner-portfolio \ + --restart unless-stopped \ + -e GITEA_INSTANCE_URL=https://gitlab.impresion3d.pro \ + -e GITEA_RUNNER_REGISTRATION_TOKEN= \ + -e GITEA_RUNNER_NAME=ubuntu-latest \ + -v /var/run/docker.sock:/var/run/docker.sock \ + gitea/act_runner:latest +``` + +Get registration token from: https://gitlab.impresion3d.pro/admin/actions/runners + +--- + +## ๐Ÿš€ How It Works + +### On Every Push to Main: + +1. **Build job** runs: + - Install Node.js 20 + - Install dependencies (`npm ci`) + - Build Astro site (`npm run build`) + - Upload `dist/` artifact + +2. **Deploy job** runs (only if build succeeds): + - Download `dist/` artifact + - Build Docker image (multi-stage) + - Push to Gitea registry: `gitlab.impresion3d.pro/root/davidaragon-portfolio:latest` + - Trigger Portainer webhook โ†’ Portainer pulls new image and restarts container + +### Result: +- Site auto-deployed to http://192.168.1.30:8081 +- No manual intervention needed after initial setup + +--- + +## ๐Ÿงช Test Locally + +```bash +cd ~/code_ubuntu/davidaragon-portfolio + +# Build and run with Docker Compose +docker-compose up --build + +# Visit: http://localhost:8080 +``` + +--- + +## ๐Ÿ“ Next Steps + +1. Configure secrets in Gitea (step 1) +2. Create Portainer stack (step 2) +3. Add webhook URL to Gitea secrets +4. Push any commit to main โ†’ CI/CD runs automatically! + +--- + +## ๐Ÿ” Monitor CI/CD + +- **Actions**: https://gitlab.impresion3d.pro/root/davidaragon-portfolio/actions +- **Registry**: https://gitlab.impresion3d.pro/root/-/packages/container/davidaragon-portfolio +- **Portainer**: http://192.168.1.30:9000/#!/stacks