Automatisch deployen via GitHub Actions naar KeurigOnline

Met GitHub Actions kun je een geautomatiseerde deploymentpijplijn opzetten die je website of applicatie automatisch naar je KeurigOnline-server uploadt bij elke push naar je repository. In dit artikel leggen we stap voor stap uit hoe je dit instelt.

Let op: SSH (en dus automatisch deployen via GitHub Actions) is alleen beschikbaar in het Plus en Pro pakket. Heb je een Start-pakket? Dan kun je upgraden via Mijn KeurigOnline.

Wat heb je nodig?

  • Een KeurigOnline Plus of Pro pakket (SSH-toegang vereist)
  • Een GitHub-repository met je projectcode
  • Je DirectAdmin-gebruikersnaam en de hostnaam van je domein

Stap 1: Maak een SSH-sleutel aan voor GitHub Actions

GitHub Actions heeft een SSH-sleutel nodig om in te loggen op je server. Maak een speciaal sleutelpaar aan op je lokale computer (niet op de server):

ssh-keygen -t ed25519 -C "github-actions-deploy" -f ~/.ssh/github_deploy_key -N ""

Dit maakt twee bestanden aan:

  • github_deploy_key — de privésleutel (geheim, bewaar je voor GitHub)
  • github_deploy_key.pub — de publieke sleutel (zet je op de server)

Stap 2: Voeg de publieke sleutel toe aan je server

Verbind via SSH met je server (gebruik poort 2020):

ssh gebruikersnaam@jouwdomein.nl -p 2020

Voeg vervolgens de inhoud van github_deploy_key.pub toe aan je authorized_keys:

mkdir -p ~/.ssh && chmod 700 ~/.ssh
echo "INHOUD_VAN_PUB_SLEUTEL" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

Je kunt de inhoud van je publieke sleutel bekijken met: cat ~/.ssh/github_deploy_key.pub

Stap 3: Voeg secrets toe aan GitHub

Ga in je GitHub-repository naar Settings → Secrets and variables → Actions en voeg de volgende secrets toe:

Naam Waarde
SSH_PRIVATE_KEY De volledige inhoud van github_deploy_key (inclusief -----BEGIN/END------regels)
SSH_HOST Je domeinnaam, bijv. jouwdomein.nl
SSH_USER Je DirectAdmin-gebruikersnaam

Stap 4: Maak de GitHub Actions workflow aan

Maak in je repository het bestand .github/workflows/deploy.yml aan. Hieronder vind je voorbeelden voor veelgebruikte situaties.

Voorbeeld: Node.js project (React, Vue, Next.js statisch, etc.)

name: Deploy naar KeurigOnline

on:
  push:
    branches:
      - main  # of master, afhankelijk van je repository

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Installeer Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'

      - name: Installeer afhankelijkheden en bouw
        run: |
          npm ci
          npm run build

      - name: Stel SSH-sleutel in
        run: |
          mkdir -p ~/.ssh
          echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/deploy_key
          chmod 600 ~/.ssh/deploy_key
          ssh-keyscan -p 2020 ${{ secrets.SSH_HOST }} >> ~/.ssh/known_hosts

      - name: Deploy via rsync
        run: |
          rsync -avz --delete \
            -e "ssh -i ~/.ssh/deploy_key -p 2020" \
            ./dist/ \
            ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}:/domains/${{ secrets.SSH_HOST }}/public_html/

Pas aan naar je project:

  • ./dist/ — de map met je gebouwde bestanden (bijv. ./build/, ./out/ of ./.next/)
  • npm run build — het bouwcommando van jouw project
  • De branch main — pas aan als jouw hoofdbranch anders heet

Voorbeeld: statische HTML/CSS/JS (geen build-stap)

      - name: Deploy via rsync
        run: |
          rsync -avz --delete \
            -e "ssh -i ~/.ssh/deploy_key -p 2020" \
            ./ \
            ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}:/domains/${{ secrets.SSH_HOST }}/public_html/ \
            --exclude='.git' \
            --exclude='.github' \
            --exclude='node_modules' \
            --exclude='README.md'

Belangrijk: bouw je project in CI, niet op de server

Op KeurigOnline shared hosting is het niet de bedoeling om Node.js-builds of npm install rechtstreeks op de server uit te voeren. Shared hosting heeft beperkte CPU- en geheugenresources; een zware build kan je account overbelasten en leidt tot fouten of tijdelijke blokkades door het LVE-systeem.

De juiste aanpak is altijd:

  1. Bouw je project in GitHub Actions — de CI-runner heeft ruim voldoende resources
  2. Kopieer alleen de eindresultaten (dist/ of build/) naar de server via rsync

Dit geldt ook voor PHP-projecten: voer composer install --no-dev --optimize-autoloader uit in CI en upload de vendor/-map via rsync naar de server.

Veelgestelde vragen

Welke poort moet ik gebruiken voor SSH?

Poort 2020. De standaard SSH-poort 22 werkt niet op onze servers. Vergeet ook de ssh-keyscan -p 2020-stap niet, zodat de host-sleutel geaccepteerd wordt door de runner.

Werkt dit ook met GitLab CI of Bitbucket Pipelines?

Ja, het principe is hetzelfde. Bewaar de privésleutel als CI/CD-variabele en gebruik dezelfde rsync-opdracht met poort 2020. De setup-stappen voor SSH zijn identiek.

Wat is het standaard webpad op de server?

Het standaard webpad op KeurigOnline is /domains/jouwdomein.nl/public_html/. Vervang jouwdomein.nl door je daadwerkelijke domeinnaam. Voor een subdomein gebruik je /domains/sub.jouwdomein.nl/public_html/.

Kan ik ook Git rechtstreeks op de server gebruiken?

Ja, git is beschikbaar via SSH op onze servers. Je kunt een repository eenmalig clonen via:

git clone https://github.com/gebruiker/repo.git /domains/jouwdomein.nl/public_html/

Voor geautomatiseerde deploys raden we GitHub Actions + rsync aan, omdat de build-stap dan buiten de server plaatsvindt en je volledige controle hebt over wat er wordt gedeployd.

Ik krijg een "Permission denied (publickey)" fout

Controleer het volgende:

  • De publieke sleutel staat correct in ~/.ssh/authorized_keys op de server (één sleutel per regel)
  • De rechten: ~/.ssh/ is 700 en authorized_keys is 600
  • De privésleutel in het GitHub-secret is volledig (inclusief de -----BEGIN/END------regels)
  • Je gebruikt de juiste gebruikersnaam in SSH_USER

De rsync-stap mislukt met "No such file or directory"

De doelmap bestaat nog niet. Maak hem aan via SSH:

mkdir -p /domains/jouwdomein.nl/public_html

Of voeg een SSH-stap toe aan de workflow vóór rsync:

ssh -i ~/.ssh/deploy_key -p 2020 ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} "mkdir -p /domains/${{ secrets.SSH_HOST }}/public_html"

Gerelateerde artikelen

Heb je een antwoord op je vraag gekregen? Heel erg bedankt voor je feedback! Er is een probleem opgetreden bij het verzenden van je feedback.

Nog steeds hulp nodig? Neem contact op Neem contact op