Skip to content

GitHub Documentation

GHCR

Commands

Generate a Personal Access Token (PAT)

In GitHub settings, generat a PAT with the right packages.

Connect to GitHub account, Settings, Developer settings. In Developer settings, in Personal access tokens choose Tokens (classic) and generate a new token with rights (duration and authorization read:packages)

Login to GHCR with Docker

sh
echo "<TOKEN>" | docker login ghcr.io -u <USERNAME> --password-stdin

Download and execute an image

sh
docker pull ghcr.io/<USERNAME>/<IMAGE_NAME>
docker run -d -p <PORT_HOST>:<PORT_CONTAINER> ghcr.io/<USERNAME>/<IMAGE_NAME>

Logout from GHCR

sh
docker logout ghcr.io

GitHub Actions

Push and deploy images with GHCR

Create a workflow .github/workflows/ghcr.yaml.

yml
name: GitHub Container Registry

on:
  push:
    branches:
      - main

jobs:
  ghcr:
    runs-on: ubuntu-latest
    permissions:
      contents: write
      packages: write
      attestations: write
      id-token: write

    # Verify the repository
    steps:
    - name: Checkout repository
      uses: actions/checkout@v4

    # Login GHCR
    - name: Login to GitHub Container Registry
      uses: docker/login-action@v3
      with:
        registry: ghcr.io
        username: ${{ github.actor }}
        password: ${{ secrets.GITHUB_TOKEN }}

    - name: Build and push Api Docker image
      run: |
        docker build -t ghcr.io/${{ vars.REPO_OWNER }}/<TAG_NAME>:latest ./<APP_CODE>
        docker push ghcr.io/${{ vars.REPO_OWNER }}/<TAG_NAME>:latest

    # Logout GHCR
    - name: Logout from GHCR
      run: docker logout ghcr.io

Déployer sur un VPS
Pour le déploiment avec SSH nous utiliserons l’utilitaire GitHub Actions, appleboy.

Connexion avec identifiant et mot de passe
.github/workflows/ghcr.yaml
name: GitHub Container Registry

on:
  push:
    branches:
      - main

jobs:
  ghcr:
    runs-on: ubuntu-latest
    permissions:
      contents: write
      packages: write
      attestations: write
      id-token: write

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

    - name: Log in to GitHub Container Registry
      uses: docker/login-action@v3
      with:
        registry: ghcr.io
        username: ${{ github.actor }}
        password: ${{ secrets.GITHUB_TOKEN }}

    - name: Set lowercase repository owner
      run: echo "REPO_OWNER=$(echo ${{ github.repository_owner }} | tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV

    - name: Build and push Api Docker image
      run: |
        docker build -t ghcr.io/${{ env.REPO_OWNER }}/<TAG_NAME>:latest ./<APP_CODE>
        docker push ghcr.io/${{ env.REPO_OWNER }}/<TAG_NAME>:latest

    - name: Logout from GHCR
      run: docker logout ghcr.io

  deploy:
    needs: [ghcr]
    runs-on: ubuntu-latest
    steps:
        - name: Deploy using ssh
          uses: appleboy/ssh-action@v1.0.3
          with:
            host: ${{ secrets.SSH_HOST }}
            username: ${{ secrets.SSH_USERNAME }}
            password: ${{ secrets.SSH_PASSWORD }}
            port: ${{ secrets.SSH_PORT }}
            script: |
              echo ${{ secrets.GHCR_PAT }} | docker login ghcr.io -u ${{ github.REPOSITORY_OWNER }} --password-stdin
              docker pull ghcr.io/${{ vars.REPO_OWNER }}/<TAG_NAME>:latest
              docker compose.prod.yaml
              docker logout ghcr.io

Connexion avec identifiant et clé privée ssh Au préalable, configurer les clés sur le VPS, vous pouvez créer des clés dans votre VPS Ubuntu avec la documentation dans la section Clés et ajouter le secret SSH_KEY dans le répertoire GitHub (clé privée).

yml
.github/workflows/ghcr.yaml
...

  deploy:
    needs: [ghcr]
    runs-on: ubuntu-latest
    steps:
        - name: Deploy using ssh
          uses: appleboy/ssh-action@v1.0.3
          with:
            host: ${{ secrets.SSH_HOST }}
            username: ${{ secrets.SSH_USERNAME }}
            key: ${{ secrets.SSH_KEY }}
            port: ${{ secrets.SSH_PORT }}
            script: |
              echo ${{ secrets.GHCR_PAT }} | docker login ghcr.io -u ${{ github.REPOSITORY_OWNER }} --password-stdin
              docker pull ghcr.io/${{ env.REPO_OWNER }}/<TAG_NAME>:latest
              docker compose compose.prod.yaml
              docker logout ghcr.io

Configurer les clés ssh pour GitHub documentation.

Configurer sur le VPS
Créer un fichier compose.prod.yaml
./PROJECT_NAME/compose.prod.yaml
services:
  app:
    image: ghcr.io/${{ env.REPO_OWNER }}/<TAG_NAME>:latest
    ports:
    - "XXXX:XXXX"