From 0060681fe5e124a604154df3e4e26e6b3516348c Mon Sep 17 00:00:00 2001 From: Sam Date: Sat, 28 Feb 2026 00:04:12 +0100 Subject: [PATCH] add some files --- .env.example | 35 ++++++++++ .gitea/workflows/build-and-deploy.yml | 99 +++++++++++++++++++++++++++ .gitignore | 44 ++++++++++++ 3 files changed, 178 insertions(+) create mode 100644 .env.example create mode 100644 .gitea/workflows/build-and-deploy.yml create mode 100644 .gitignore diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..a2e5dd1 --- /dev/null +++ b/.env.example @@ -0,0 +1,35 @@ +# ================================================ +# LEERDOELEN TRACKER - CONFIGURATIE +# Kopieer dit bestand naar .env en vul in +# ================================================ + +# Database +POSTGRES_DB=leerdoelen +POSTGRES_USER=leerdoelen +POSTGRES_PASSWORD=verander_dit_wachtwoord + +# Flask +# Genereer met: python3 -c "import secrets; print(secrets.token_hex(32))" +SECRET_KEY=verander_dit_naar_een_lange_random_string +FLASK_ENV=production + +# Lokale poort waarop Flask luistert (alleen bereikbaar vanaf host, niet publiek) +APP_PORT=5000 + +# Publieke URL (belangrijk voor OAuth2 callback!) +BASE_URL=https://leerdoelen.jouwdomain.be + +# ── Microsoft Entra ID (Azure AD) ────────────────── +# Aanmaken via: https://portal.azure.com → App registrations +# Redirect URI instellen op: https://jouwdomain.be/auth/callback +# Supported account types: "Accounts in any organizational directory" +# (= multitenant, nodig omdat elke school eigen tenant heeft) +MICROSOFT_CLIENT_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx +MICROSOFT_CLIENT_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + +# Naam van de scholengroep — verschijnt op de loginpagina +ORG_NAME=GO! Scholengroep 2 + +# Docker image uit de Gitea registry (wordt ingevuld door CI/CD) +# Lokaal builden: laat leeg of zet op 'leerdoelen-backend:local' +BACKEND_IMAGE=gitea.jouwdomein.be/jouw-org/leerdoelen-tracker:latest diff --git a/.gitea/workflows/build-and-deploy.yml b/.gitea/workflows/build-and-deploy.yml new file mode 100644 index 0000000..5a01f36 --- /dev/null +++ b/.gitea/workflows/build-and-deploy.yml @@ -0,0 +1,99 @@ +name: Build, Push & Deploy + +on: + push: + branches: + - main + workflow_dispatch: # ook handmatig te triggeren via de Gitea UI + +env: + REGISTRY: ${{ vars.GITEA_REGISTRY }} # bv. gitea.jouwdomein.be + IMAGE: ${{ vars.GITEA_REGISTRY }}/${{ gitea.repository }} # bv. gitea.../org/leerdoelen-tracker + +jobs: + build-and-push: + name: Build & Push image + runs-on: ubuntu-latest # pas aan als je runner een andere label heeft + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + # Genereer image tags: + # latest — altijd de meest recente main build + # sha- — voor traceerbaarheid / rollback + - name: Genereer image tags + id: meta + run: | + SHA_SHORT=$(echo "${{ gitea.sha }}" | cut -c1-8) + echo "tag_latest=${{ env.IMAGE }}:latest" >> $GITHUB_OUTPUT + echo "tag_sha=${{ env.IMAGE }}:sha-${SHA_SHORT}" >> $GITHUB_OUTPUT + echo "sha_short=${SHA_SHORT}" >> $GITHUB_OUTPUT + + - name: Inloggen op Gitea Container Registry + uses: docker/login-action@v3 + with: + registry: ${{ vars.GITEA_REGISTRY }} + username: ${{ secrets.REGISTRY_USER }} + password: ${{ secrets.REGISTRY_TOKEN }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build en push backend image + uses: docker/build-push-action@v5 + with: + context: ./backend + file: ./backend/Dockerfile + push: true + tags: | + ${{ steps.meta.outputs.tag_latest }} + ${{ steps.meta.outputs.tag_sha }} + # Layer cache via de registry — versnelt herhaalde builds sterk + cache-from: type=registry,ref=${{ env.IMAGE }}:buildcache + cache-to: type=registry,ref=${{ env.IMAGE }}:buildcache,mode=max + labels: | + org.opencontainers.image.revision=${{ gitea.sha }} + org.opencontainers.image.created=${{ gitea.event.head_commit.timestamp }} + + - name: Samenvatting + run: | + echo "## ✅ Build geslaagd" >> $GITEA_STEP_SUMMARY + echo "| | |" >> $GITEA_STEP_SUMMARY + echo "|---|---|" >> $GITEA_STEP_SUMMARY + echo "| **Commit** | \`${{ steps.meta.outputs.sha_short }}\` |" >> $GITEA_STEP_SUMMARY + echo "| **Image** | \`${{ steps.meta.outputs.tag_latest }}\` |" >> $GITEA_STEP_SUMMARY + + deploy: + name: Deploy naar VPS + needs: build-and-push + runs-on: ubuntu-latest + + steps: + - name: SSH deploy + uses: appleboy/ssh-action@v1 + with: + host: ${{ secrets.DEPLOY_HOST }} + username: ${{ secrets.DEPLOY_USER }} + key: ${{ secrets.DEPLOY_SSH_KEY }} + port: ${{ secrets.DEPLOY_PORT || 22 }} + script: | + set -e + cd ${{ secrets.DEPLOY_PATH }} + + # Inloggen op registry vanop de VPS + echo "${{ secrets.REGISTRY_TOKEN }}" | \ + docker login ${{ vars.GITEA_REGISTRY }} \ + -u "${{ secrets.REGISTRY_USER }}" --password-stdin + + # Nieuwste image pullen + docker compose pull backend + + # Herstarten met zero-downtime strategie: + # nieuwe container omhoog, dan pas oude stoppen + docker compose up -d --no-deps --remove-orphans backend + + # Verwijder ongebruikte images om schijfruimte te sparen + docker image prune -f + + echo "Deploy klaar op $(date '+%Y-%m-%d %H:%M:%S')" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5493742 --- /dev/null +++ b/.gitignore @@ -0,0 +1,44 @@ +# ── Omgevingsbestanden (NOOIT committen!) ──────────────────────────────────── +.env +.env.local +.env.*.local + +# ── Python ──────────────────────────────────────────────────────────────────── +__pycache__/ +*.py[cod] +*.pyo +*.pyd +.Python +*.egg-info/ +dist/ +build/ +.venv/ +venv/ +env/ + +# ── Leerdoelen JSON bestanden ───────────────────────────────────────────────── +# Deze zijn groot (22 MB) en worden beheerd via de upload UI, niet via git. +# Bewaar enkel de lege mapstructuur. +doelen/*.json +!doelen/.gitkeep + +# ── Database ────────────────────────────────────────────────────────────────── +*.sqlite3 +*.db +postgres_data/ + +# ── Logs ────────────────────────────────────────────────────────────────────── +*.log +logs/ + +# ── Docker ──────────────────────────────────────────────────────────────────── +docker-compose.override.yml +docker-compose.local.yml + +# ── Editor / OS ─────────────────────────────────────────────────────────────── +.vscode/ +.idea/ +*.swp +*.swo +.DS_Store +Thumbs.db