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}.giten 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_urlhaalt 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