[{"content":"","date":"5 maart 2026","externalUrl":null,"permalink":"/posts/","section":"Blog","summary":"","title":"Blog","type":"posts"},{"content":"","date":"5 maart 2026","externalUrl":null,"permalink":"/tags/cloud/","section":"Tags","summary":"","title":"Cloud","type":"tags"},{"content":"","date":"5 maart 2026","externalUrl":null,"permalink":"/tags/devops/","section":"Tags","summary":"","title":"Devops","type":"tags"},{"content":"","date":"5 maart 2026","externalUrl":null,"permalink":"/tags/kubernetes/","section":"Tags","summary":"","title":"Kubernetes","type":"tags"},{"content":"Na twee jaar Kubernetes in productie heb ik een aantal lessen geleerd die ik graag deel.\nCluster opzetten met k3s # Voor kleine tot middelgrote projecten is k3s een uitstekende keuze. Lichtgewicht en snel te installeren:\n1 curl -sfL https://get.k3s.io | sh - Controleer of het cluster draait:\n1 2 kubectl get nodes kubectl get pods -A Resource limits instellen # Zonder limits kan één pod het hele cluster platleggen:\n1 2 3 4 5 6 7 resources: requests: memory: \u0026#34;128Mi\u0026#34; cpu: \u0026#34;250m\u0026#34; limits: memory: \u0026#34;256Mi\u0026#34; cpu: \u0026#34;500m\u0026#34; Monitoring met kube-prometheus-stack # Installeer via Helm:\n1 2 helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm install monitoring prometheus-community/kube-prometheus-stack Dit geeft je direct Prometheus, Grafana en Alertmanager.\nBackup strategie # Gebruik Velero voor cluster backups:\n1 2 velero install --provider aws --bucket k8s-backups --use-restic velero schedule create daily --schedule=\u0026#34;0 2 * * *\u0026#34; Vergeet niet regelmatig een restore te testen — een backup zonder test is geen backup.\n","date":"5 maart 2026","externalUrl":null,"permalink":"/posts/kubernetes-clusters-beheren/","section":"Blog","summary":"Praktische tips voor het beheren van Kubernetes clusters bij Hetzner en DigitalOcean.","title":"Kubernetes clusters beheren in de cloud","type":"posts"},{"content":"","date":"5 maart 2026","externalUrl":null,"permalink":"/","section":"Lars van der Berg","summary":"","title":"Lars van der Berg","type":"page"},{"content":"","date":"5 maart 2026","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"","date":"15 februari 2026","externalUrl":null,"permalink":"/tags/automatisering/","section":"Tags","summary":"","title":"Automatisering","type":"tags"},{"content":"","date":"15 februari 2026","externalUrl":null,"permalink":"/tags/ci-cd/","section":"Tags","summary":"","title":"Ci-Cd","type":"tags"},{"content":"GitHub Actions is mijn favoriete CI/CD-tool geworden. Gratis voor open-source en de integratie met GitHub is natuurlijk perfect.\nBasis workflow # Een eenvoudige workflow die tests draait bij elke push:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 name: Test \u0026amp; Build on: push: branches: [main] pull_request: branches: [main] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: \u0026#39;3.12\u0026#39; - run: pip install -r requirements.txt - run: pytest --verbose Docker image bouwen en pushen # 1 2 3 4 5 6 7 8 9 10 11 12 13 14 build: needs: test runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - uses: docker/build-push-action@v5 with: push: true tags: ghcr.io/${{ github.repository }}:latest Deployment via SSH # Na een succesvolle build deploy ik vaak via SSH naar de server:\n1 2 3 4 5 6 7 8 9 10 11 12 13 deploy: needs: build runs-on: ubuntu-latest steps: - uses: appleboy/ssh-action@v1 with: host: ${{ secrets.SERVER_HOST }} username: deploy key: ${{ secrets.SSH_KEY }} script: | cd /opt/app docker compose pull docker compose up -d Simpel, betrouwbaar en volledig geautomatiseerd.\n","date":"15 februari 2026","externalUrl":null,"permalink":"/posts/cicd-github-actions/","section":"Blog","summary":"Hoe ik GitHub Actions gebruik voor het automatisch testen en deployen van projecten.","title":"CI/CD pipelines met GitHub Actions","type":"posts"},{"content":"","date":"15 februari 2026","externalUrl":null,"permalink":"/tags/github/","section":"Tags","summary":"","title":"Github","type":"tags"},{"content":"","date":"20 januari 2026","externalUrl":null,"permalink":"/tags/database/","section":"Tags","summary":"","title":"Database","type":"tags"},{"content":"","date":"20 januari 2026","externalUrl":null,"permalink":"/tags/performance/","section":"Tags","summary":"","title":"Performance","type":"tags"},{"content":"","date":"20 januari 2026","externalUrl":null,"permalink":"/tags/postgresql/","section":"Tags","summary":"","title":"Postgresql","type":"tags"},{"content":"PostgreSQL is fantastisch, maar de standaardinstellingen zijn erg conservatief. Met een paar aanpassingen krijg je veel betere prestaties.\nGeheugenconfiguratie # Pas deze waarden aan in postgresql.conf:\n1 2 3 4 5 # Beschikbaar geheugen: 8GB server shared_buffers = 2GB # 25% van RAM effective_cache_size = 6GB # 75% van RAM work_mem = 64MB # Per query sort/hash maintenance_work_mem = 512MB # Voor VACUUM, INDEX WAL configuratie # 1 2 3 4 wal_buffers = 64MB checkpoint_completion_target = 0.9 max_wal_size = 4GB min_wal_size = 1GB Connectie pooling met PgBouncer # PostgreSQL maakt voor elke verbinding een apart proces aan. Bij veel verbindingen is PgBouncer essentieel:\n1 2 3 4 5 6 7 [databases] mydb = host=127.0.0.1 port=5432 dbname=mydb [pgbouncer] pool_mode = transaction max_client_conn = 200 default_pool_size = 20 Langzame queries opsporen # 1 log_min_duration_statement = 500 # Log queries \u0026gt; 500ms Analyseer met pg_stat_statements:\n1 2 3 4 SELECT query, calls, mean_exec_time, total_exec_time FROM pg_stat_statements ORDER BY total_exec_time DESC LIMIT 10; VACUUM niet vergeten # 1 2 # Handmatig full vacuum (vergrendelt tabel!) VACUUM (FULL, ANALYZE) grote_tabel; Zorg dat autovacuum correct is geconfigureerd — standaard is het aan, maar de drempelwaarden zijn vaak te hoog.\n","date":"20 januari 2026","externalUrl":null,"permalink":"/posts/postgresql-performance-tuning/","section":"Blog","summary":"Mijn favoriete PostgreSQL-instellingen voor betere prestaties op productieservers.","title":"PostgreSQL performance tuning tips","type":"posts"},{"content":"","date":"10 november 2025","externalUrl":null,"permalink":"/tags/infrastructure/","section":"Tags","summary":"","title":"Infrastructure","type":"tags"},{"content":"","date":"10 november 2025","externalUrl":null,"permalink":"/tags/terraform/","section":"Tags","summary":"","title":"Terraform","type":"tags"},{"content":"Terraform maakt het mogelijk om je hele infrastructuur als code te beheren. Geen handmatig klikken meer in een dashboard.\nInstallatie # 1 2 3 4 wget https://releases.hashicorp.com/terraform/1.7.0/terraform_1.7.0_linux_amd64.zip unzip terraform_1.7.0_linux_amd64.zip sudo mv terraform /usr/local/bin/ terraform version Eerste configuratie — Hetzner Cloud # Maak een main.tf:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 terraform { required_providers { hcloud = { source = \u0026#34;hetznercloud/hcloud\u0026#34; version = \u0026#34;~\u0026gt; 1.45\u0026#34; } } } variable \u0026#34;hcloud_token\u0026#34; { sensitive = true } provider \u0026#34;hcloud\u0026#34; { token = var.hcloud_token } resource \u0026#34;hcloud_server\u0026#34; \u0026#34;web\u0026#34; { name = \u0026#34;web-server\u0026#34; image = \u0026#34;ubuntu-24.04\u0026#34; server_type = \u0026#34;cx22\u0026#34; location = \u0026#34;nbg1\u0026#34; ssh_keys = [hcloud_ssh_key.default.id] } resource \u0026#34;hcloud_ssh_key\u0026#34; \u0026#34;default\u0026#34; { name = \u0026#34;laptop\u0026#34; public_key = file(\u0026#34;~/.ssh/id_ed25519.pub\u0026#34;) } output \u0026#34;server_ip\u0026#34; { value = hcloud_server.web.ipv4_address } Uitvoeren # 1 2 3 4 terraform init # Download providers terraform plan # Bekijk wat er gaat veranderen terraform apply # Voer uit terraform destroy # Verwijder alles State opslaan # Sla je state niet lokaal op in productie. Gebruik een remote backend:\n1 2 3 4 5 6 7 8 terraform { backend \u0026#34;s3\u0026#34; { bucket = \u0026#34;my-terraform-state\u0026#34; key = \u0026#34;prod/terraform.tfstate\u0026#34; region = \u0026#34;eu-central-1\u0026#34; encrypt = true } } De leercurve is kort en het bespaart uren handmatig werk.\n","date":"10 november 2025","externalUrl":null,"permalink":"/posts/terraform-voor-beginners/","section":"Blog","summary":"Een introductie tot Infrastructure as Code met Terraform en Hetzner Cloud.","title":"Terraform voor beginners","type":"posts"},{"content":"","date":"1 september 2025","externalUrl":null,"permalink":"/tags/api/","section":"Tags","summary":"","title":"Api","type":"tags"},{"content":"FastAPI is momenteel mijn favoriete framework voor het bouwen van API\u0026rsquo;s. Snel, modern en met automatische documentatie.\nProject opzetten # 1 2 3 4 mkdir mijn-api \u0026amp;\u0026amp; cd mijn-api python -m venv .venv source .venv/bin/activate pip install fastapi uvicorn sqlalchemy Basis applicatie # 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 from fastapi import FastAPI, HTTPException from pydantic import BaseModel app = FastAPI(title=\u0026#34;Mijn API\u0026#34;, version=\u0026#34;1.0.0\u0026#34;) class Item(BaseModel): naam: str prijs: float voorraad: int = 0 items_db: dict[int, Item] = {} @app.get(\u0026#34;/items\u0026#34;) def lijst_items(): return items_db @app.post(\u0026#34;/items/{item_id}\u0026#34;, status_code=201) def maak_item(item_id: int, item: Item): if item_id in items_db: raise HTTPException(status_code=409, detail=\u0026#34;Item bestaat al\u0026#34;) items_db[item_id] = item return item @app.get(\u0026#34;/items/{item_id}\u0026#34;) def haal_item(item_id: int): if item_id not in items_db: raise HTTPException(status_code=404, detail=\u0026#34;Item niet gevonden\u0026#34;) return items_db[item_id] Starten # 1 uvicorn main:app --reload --host 0.0.0.0 --port 8000 Open http://localhost:8000/docs voor de automatische Swagger-documentatie.\nDatabase met SQLAlchemy # 1 2 3 4 5 6 7 8 9 10 11 12 13 from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker DATABASE_URL = \u0026#34;postgresql://user:pass@localhost:5432/mydb\u0026#34; engine = create_engine(DATABASE_URL) SessionLocal = sessionmaker(bind=engine) def get_db(): db = SessionLocal() try: yield db finally: db.close() Docker deployment # 1 2 3 4 5 6 FROM python:3.12-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD [\u0026#34;uvicorn\u0026#34;, \u0026#34;main:app\u0026#34;, \u0026#34;--host\u0026#34;, \u0026#34;0.0.0.0\u0026#34;, \u0026#34;--port\u0026#34;, \u0026#34;8000\u0026#34;] FastAPI + Uvicorn + Docker = snel in productie.\n","date":"1 september 2025","externalUrl":null,"permalink":"/posts/api-ontwerp-fastapi/","section":"Blog","summary":"Hoe ik RESTful API’s bouw met FastAPI — van projectstructuur tot deployment.","title":"API ontwerp met FastAPI en Python","type":"posts"},{"content":"","date":"1 september 2025","externalUrl":null,"permalink":"/tags/backend/","section":"Tags","summary":"","title":"Backend","type":"tags"},{"content":"","date":"1 september 2025","externalUrl":null,"permalink":"/tags/fastapi/","section":"Tags","summary":"","title":"Fastapi","type":"tags"},{"content":"","date":"1 september 2025","externalUrl":null,"permalink":"/tags/python/","section":"Tags","summary":"","title":"Python","type":"tags"},{"content":" Webontwikkeling # Op maat gemaakte websites en webapplicaties. Van een simpele landingspagina tot een compleet SaaS-platform.\nResponsive design Progressive Web Apps (PWA) Headless CMS integratie E-commerce oplossingen API-ontwikkeling # RESTful en GraphQL API\u0026rsquo;s gebouwd met moderne frameworks. Schaalbaar, gedocumenteerd en veilig.\nFastAPI / Django REST Framework API-documentatie met OpenAPI/Swagger Authenticatie (OAuth2, JWT) Rate limiting en caching Cloud \u0026amp; DevOps # Infrastructuur als code, geautomatiseerde deployments en monitoring.\nDocker containerisatie Kubernetes cluster management CI/CD pipelines (GitHub Actions, GitLab CI) Terraform / Pulumi Monitoring met Prometheus en Grafana Hosting \u0026amp; Beheer # Servermanagement en optimalisatie voor bestaande applicaties.\nLinux server hardening SSL/TLS configuratie Database optimalisatie Backup-strategieën 24/7 monitoring Tarieven op aanvraag. Neem gerust contact op voor een vrijblijvend gesprek.\n","externalUrl":null,"permalink":"/services/","section":"Lars van der Berg","summary":"Webontwikkeling # Op maat gemaakte websites en webapplicaties. Van een simpele landingspagina tot een compleet SaaS-platform.\nResponsive design Progressive Web Apps (PWA) Headless CMS integratie E-commerce oplossingen API-ontwikkeling # RESTful en GraphQL API’s gebouwd met moderne frameworks. Schaalbaar, gedocumenteerd en veilig.\nFastAPI / Django REST Framework API-documentatie met OpenAPI/Swagger Authenticatie (OAuth2, JWT) Rate limiting en caching Cloud \u0026 DevOps # Infrastructuur als code, geautomatiseerde deployments en monitoring.\n","title":"Diensten","type":"page"},{"content":"Hallo! Ik ben Lars, freelance webontwikkelaar uit Amsterdam met ruim 8 jaar ervaring in het bouwen van web-applicaties en cloud-infrastructuur.\nWat ik doe # Ik help bedrijven met het ontwikkelen van betrouwbare, schaalbare weboplossingen — van eenvoudige websites tot complexe API-platforms.\nMijn stack:\nPython (FastAPI, Django), Go, TypeScript PostgreSQL, Redis, RabbitMQ Docker, Kubernetes, Terraform AWS, Hetzner Cloud, DigitalOcean Nginx, Caddy, Traefik CI/CD met GitHub Actions en GitLab CI Werkervaring # Voorheen werkte ik als backend developer bij een fintech-startup in Rotterdam. Sinds 2022 werk ik als zelfstandige en help ik klanten in heel Nederland en België.\nContact # Interesse in samenwerking? Stuur een e-mail naar info@example.nl of neem contact op via LinkedIn.\n","externalUrl":null,"permalink":"/about/","section":"Lars van der Berg","summary":"Hallo! Ik ben Lars, freelance webontwikkelaar uit Amsterdam met ruim 8 jaar ervaring in het bouwen van web-applicaties en cloud-infrastructuur.\nWat ik doe # Ik help bedrijven met het ontwikkelen van betrouwbare, schaalbare weboplossingen — van eenvoudige websites tot complexe API-platforms.\nMijn stack:\nPython (FastAPI, Django), Go, TypeScript PostgreSQL, Redis, RabbitMQ Docker, Kubernetes, Terraform AWS, Hetzner Cloud, DigitalOcean Nginx, Caddy, Traefik CI/CD met GitHub Actions en GitLab CI Werkervaring # Voorheen werkte ik als backend developer bij een fintech-startup in Rotterdam. Sinds 2022 werk ik als zelfstandige en help ik klanten in heel Nederland en België.\n","title":"Over mij","type":"page"},{"content":"Een selectie van recente projecten waar ik aan heb gewerkt.\nBestelplatform voor horecabedrijf # Full-stack webapplicatie voor een restaurant in Amsterdam. Online bestellen met real-time tracking.\nStack: FastAPI, Vue.js, PostgreSQL Hosting: Hetzner Cloud, Docker Compose Features: Betalingsintegratie (Mollie), dashboards voor beheerders Monitoring Dashboard voor logistiek # Intern dashboard voor een transportbedrijf. Real-time tracking van vloot en leveringen.\nStack: Go, React, TimescaleDB Hosting: AWS ECS Features: WebSocket updates, kaartintegratie, CSV-export API Gateway voor SaaS-startup # Centrale API gateway die meerdere microservices verbindt. Rate limiting, authenticatie en logging.\nStack: Go, Redis, PostgreSQL Hosting: Kubernetes (DigitalOcean) Features: OAuth2, request/response logging, Grafana dashboards Automatische backup-pipeline # Geautomatiseerd backup-systeem voor een hosting-provider. Dagelijkse snapshots met verificatie.\nStack: Python, Restic, MinIO Hosting: Bare metal servers Features: Encryptie, e-mail notificaties, retentiebeleid Meer weten? Neem contact op.\n","externalUrl":null,"permalink":"/projects/","section":"Lars van der Berg","summary":"Een selectie van recente projecten waar ik aan heb gewerkt.\nBestelplatform voor horecabedrijf # Full-stack webapplicatie voor een restaurant in Amsterdam. Online bestellen met real-time tracking.\nStack: FastAPI, Vue.js, PostgreSQL Hosting: Hetzner Cloud, Docker Compose Features: Betalingsintegratie (Mollie), dashboards voor beheerders Monitoring Dashboard voor logistiek # Intern dashboard voor een transportbedrijf. Real-time tracking van vloot en leveringen.\n","title":"Projecten","type":"page"}]