Comment builder sur Github actions ou Gitlab CI et déployer sur Coolify
J'utilise désormais Coolify sur toutes mes applications, que ce soit hakanai ou writizzy. C'est un excellent PAAS utilisable en self hosted.
Jusqu'à présent, j'avais toujours suivi le même schéma : le build et le run sur la même machine.
C'est pas une bonne pratique, mais sur des applications peu gourmandes et pour des soucis de cout, j'ai souhaité rester simple.
Sauf qu'entre-temps, je suis passé sur Nuxt 4 et les builds Nuxt4 sont significativement plus gourmands. Et quand je dis significativement, ils sont capables de mettre mes serveurs par terre.
Les deux serveurs que j'utilise sont :
- un serveur CPX31 de Hetzner avec 4vCPU et 8Gb de ram
- un serveur CX32 de Hetzner avec 4vCPU et 8Gb de ram
C'est censé être largement suffisant pour mon trafic.
Mais comme vous pouvez le voir sur ce graphique, désormais un build coute très cher et fait plafonner le CPU et la mémoire.

Bref, il est temps de changer de méthode pour builder sur un autre serveur et pour cela, il y a deux méthodes :
- les build serveur
- déléguer ces builds à Github action, Gitlab CI ou tenki.cloud
J'ai déjà deux serveurs, j'ai choisi de ne pas en prendre en plus pour uniquement les builds, ça me semble pas du tout intéressant si on prend en compte que je vais payer pour un usage effectif assez faible.
Bref, voyons comment on peut mettre en place le build sur Github et le déploiement sur Coolify
Créer une nouvelle app Coolify
Malheureusement, il n'est pas possible de convertir une ancienne app coolify qui utilise NixPacks ou un Docker build. Il faut impérativement recréer une ressource et cette fois-ci, il faut choisir l'option Docker Image

Il faut ensuite préciser le nom de son image, de mon côté je vais utiliser une image sur le repo ghcr.io (celui de Github).

Sur l'écran de configuration il faut ensuite recopier exactement tout le reste que vous aviez déjà sur votre ancienne application : le nom, le domaine, le port exposé, les variables d'environnement (!!!).
Dans un premier temps, vous aurez forcément un avertissement car vous répondez sur le même domaine que votre ancienne app, qui est toujours active. Donc il y a conflit de route sur Traefik.
D'ailleurs, pensez à désactiver le build automatique de l'ancienne app. Ma méthode a été de mettre un watch paths d'un dossier inexistant.
Activez les apis Coolify
Par défaut les APIs sont désactivées sur Coolify. Il faut donc d'abord les activer dans settings->advanced->Api settings en cochant la case API Access
Ensuite il faut aller dans Keys & Tokens et créer un token, attention à bien copier le token, vous ne le verrez plus par la suite. Attention il faut bien lui donner le droit "deploy" pour pouvoir déclencher un webhook.
Configurez vos secrets sur Github
Maintenant que l'application est créé, il faut récupérer sa webhook url dans Coolify et nous allons en créer deux secrets dans Github.

Il faut créer deux secrets au total :
- COOLIFY_WEBHOOK qui sera égal à la valeur que vous avez noté auparavant
- COOLIFY_TOKEN qui sera votre token d'api récupéré dans Coolify.
Ensuite il faut ajouter .github/deploy/deploy.yml dans votre repository avec ce contenu :
name: Build & Deploy App
on:
push:
branches: ["main"]
paths:
- '**'
- '.github/workflows/deploy.yml'
env:
REGISTRY: ghcr.io
IMAGE_NAME: "votreuser/votreapp"
jobs:
build-and-deploy:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- uses: actions/checkout@v3
- name: Login to ghcr.io
uses: docker/login-action@v2
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v4
with:
context: .
file: ./Dockerfile
platforms: linux/amd64
push: true
tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest
- name: Deploy to Coolify
run: |
curl --request GET '${{ secrets.COOLIFY_WEBHOOK }}' --header 'Authorization: Bearer ${{ secrets.COOLIFY_TOKEN }}'
Attention, il ne faut pas encore pousser, il vous reste une dernière étape.
Par défaut votre serveur ne peut pas effectuer d'opération sur le registry Github. Pour ça il va falloir faire un premier login dessus.
Il faut se logger en ssh sur votre machine. Ca peut se faire via coolify directement dans servers->terminal.
!
Il faut ensuite se logger sur avec docker login
docker login ghcr.io
- Le login est votre login github
- Le password est un personal access token qu'il faut générer depuis Github en cliquant sur votre image de profil
settings->developper settings->Personal access tokensPersonnellement, j'ai mis "no expiration" malgré le warning et j'ai choisiwrite:packagesen termes de droit.
Et tout devrait être bon. Faites un push sur votre fichier de workflow. Cela doit déclencher un build sur github, puis un deploy sur Coolify. En prime, ça coute pas cher (24 secondes ici)
!
Evidemment, pensez aussi à couper votre ancienne application dans Coolify !


