Git & deploy·2 min lezen

DirectAdmin Git-API: repositories aanmaken, deployen en webhooks

De ongedocumenteerde Git-API van DirectAdmin: endpoints, velden, deploy en webhook, en de valkuilen met keyfile-paden en subdomeinen.

DirectAdmin heeft sinds versie 1.6x een Git-functie (in Evolution onder Git). Een API-documentatie ervoor vonden we niet. Voor Invoker Link hebben we de calls uitgelezen uit de Evolution-interface zelf en getest op DirectAdmin 1.710. Dit artikel is voor ontwikkelaars en beheerders.

Endpoints

Alle calls draaien als de gebruiker (bijvoorbeeld met een login-key) en praten JSON.

Methode Pad Doel
GET /api/git/domain/{domein} repositories van een domein
POST /api/git/domain/{domein} repository aanmaken
GET /api/git/uuid/{uuid} details
PUT /api/git/uuid/{uuid} branch, deploy-map of keyfile wijzigen
POST /api/git/uuid/{uuid}/fetch nieuwe commits ophalen
POST /api/git/uuid/{uuid}/deploy bestanden neerzetten
DELETE /api/git/uuid/{uuid} repository verwijderen

Aanmaken

curl -X POST -H "Content-Type: application/json" \
  "$DA/api/git/domain/voorbeeld.nl" \
  -d '{"name":"website","remote":"git@github.com:bedrijf/website.git","keyfile":".ssh/deploy-website"}'

Het antwoord bevat onder meer uuid, branches (al opgehaald), webhook_url en valid.

Valkuil: het keyfile-pad moet relatief zijn aan de home-map. Een absoluut pad geeft:

{"message":"invalid create parameters: keyfile: must be relative","type":"BAD_REQUEST"}

Deploy instellen en uitvoeren

curl -X PUT -H "Content-Type: application/json" "$DA/api/git/uuid/$UUID" \
  -d '{"deploy_branch":"main","deploy_dir":"domains/voorbeeld.nl/public_html","keyfile":".ssh/deploy-website"}'
curl -X POST -H "Content-Type: application/json" "$DA/api/git/uuid/$UUID/deploy" -d '{}'

Ook deploy_dir is relatief aan de home-map. Beide calls geven 204 zonder body.

Hoe gedragen deploy en webhook zich?

Wat we vaststelden:

  • Mirror: DirectAdmin maakt een bare mirror in ~/domains/{domein}/{naam}.git en haalt alle branches op.
  • Deploy is een export: de bestanden van de branch komen in de deploy-map, zonder .git-map.
  • Bestaande bestanden blijven staan: een bestand dat niet in de repository staat, wordt niet verwijderd. Gelijknamige bestanden worden overschreven.
  • Webhook = fetch + deploy: een POST op webhook_url haalt op en deployt in één keer. Een bestand dat we uit de deploy-map verwijderden, stond er na de webhook weer.
  • De webhook-URL heeft geen extra authenticatie: de lange uuid erin is de enige bescherming.

Valkuil: subdomeinen

De Git-API werkt alleen op hoofddomeinen. Voor een subdomein krijg je:

{"type":"NOT_FOUND"}

Maak de repository daarom aan onder het hoofddomein en zet deploy_dir op de map van het subdomein. Nieuwere DirectAdmin-versies geven een subdomein een eigen map, bijvoorbeeld domains/status.voorbeeld.nl/public_html.

Deploy keys

GitHub staat een deploy key maar op één repository toe. Maak per repository een eigen sleutel:

ssh-keygen -t ed25519 -N "" -C "deploy website" -f ~/.ssh/deploy-website

Test of GitHub hem accepteert voordat je de repository aanmaakt:

GIT_SSH_COMMAND="ssh -i ~/.ssh/deploy-website -o IdentitiesOnly=yes" git ls-remote git@github.com:bedrijf/website.git
MK
Maarten Keizer

Oprichter van Invoker. Ruim twintig jaar hosting, systeembeheer en webdevelopment; bouwt de Claude-hosting zelf en test alles eerst op de eigen servers.

over maarten