Path : infrastructure/gitlab
Instance : https://gitlab.lorva.dev
Registry : https://registry.lorva.dev
Hébergement : lorva-infra (VM Proxmox, réseau 10.10.10.x)
| Paramètre | Valeur |
|---|---|
| URL | https://gitlab.lorva.dev |
| Hébergeur | lorva-infra |
| Edition | GitLab CE |
| Token admin | voir Flatnotes (ref-gitlab) |
| SSH config alias | ssh lorva-infra |
Le token personnel GITLAB_LORVA_TOKEN est stocké dans ~/.config/lorva/secrets sur la machine de développement. Ce fichier contient aussi GITHUB_TOKEN et GITLAB_TOKEN_READONLY.
Rappel remote : dans les dépôts situés sous
~/projects/LORVA/, le remote GitLab LORVA s'appellelorva(pasorigin). Toujours vérifier avecgit remote -vavant de pousser.
| Paramètre | Valeur |
|---|---|
| URL | registry.lorva.dev |
| Authentification | variables CI automatiques ($CI_REGISTRY_USER / $CI_REGISTRY_PASSWORD) |
| Image type | $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG + :latest |
La registry est utilisée par tous les projets Taskori PHP/Docker. Les images sont construites dans le job build (stage build, branche main uniquement) et tirées lors du deploy via docker pull.
Tous les runners Taskori sont hébergés sur lorva-infra (10.10.10.10) en conteneurs Docker.
| Paramètre | Valeur |
|---|---|
| Image | gitlab/gitlab-runner:latest |
| GitLab URL | https://gitlab.lorva.dev |
| Configs | /docker/runners/config-<nom>/config.toml |
| Clé SSH de déploiement | /etc/taskori/deploy_key → monté en ro dans /root/.ssh/id_ed25519 |
| Executor | docker (DinD via socket bind) |
| Network mode | host |
La clé SSH de déploiement permet aux runners d'atteindre taskori-prod (10.10.20.10) pour les jobs deploy. Elle est montée en lecture seule dans chaque runner, sauf taskori-runner-main qui n'a pas cette clé.
| Conteneur | Runner name | Notes |
|---|---|---|
taskori-runner-admin |
taskori-admin | Runner dédié taskori-admin |
taskori-runner-auth |
taskori-auth | Runner dédié taskori-auth |
taskori-runner-cron |
taskori-cron | Runner dédié taskori-cron |
taskori-runner-dl |
taskori-dl | Runner dédié dl.taskori.app |
taskori-runner-main |
taskori-main | Pas de deploy_key montée |
taskori-runner-manage |
taskori-manage | Runner dédié taskori-manage |
taskori-runner-portal |
taskori-portal | Runner dédié taskori-portal |
taskori-runner-project |
taskori-project | Runner dédié taskori-project |
taskori-runner-share |
taskori-share | Runner dédié taskori-share |
taskori-runner-sync |
taskori-sync | Config étendue (Rust/Tauri) |
taskori-runner-ts |
taskori-ts | Runner dédié taskori-ts |
Chaque runner est enregistré sur un seul projet GitLab (runner spécifique, pas partagé). Le tag CI du projet correspond au nom du runner (taskori-<service>).
concurrent = 1
check_interval = 0
[[runners]]
name = "taskori-<service>"
url = "https://gitlab.lorva.dev"
executor = "docker"
[runners.docker]
image = "docker:latest"
volumes = [
"/var/run/docker.sock:/var/run/docker.sock",
"/cache",
"/etc/taskori/deploy_key:/root/.ssh/id_ed25519:ro"
]
network_mode = "host"
privileged = false
Le runner taskori-sync dispose de ressources étendues pour la compilation Rust/Tauri (cross-compilation Windows + build Linux natif) :
pull_policy = "if-not-present"
memory = "4g"
memory_swap = "8g"
cpus = "2"
Ces paramètres s'ajoutent à la section [runners.docker] standard.
Utilisé par : taskori-auth, taskori-share, taskori-manage, taskori-admin, taskori-project, taskori-portal, taskori-cron, taskori-ts.
test → build → deploy
default:
tags:
- taskori-<service>
variables:
IMAGE_TAG: "$CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG"
IMAGE_LATEST: "$CI_REGISTRY_IMAGE:latest"
NAME: taskori-<service>
lint:
stage: test
image: php:8.1-cli
script:
- find . -name "*.php" -not -path "*/vendor/*" | xargs php -l
rules:
- if: $CI_COMMIT_BRANCH
build:
stage: build
image: docker:latest
script:
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY"
- docker build -t "$IMAGE_TAG" -t "$IMAGE_LATEST" .
- docker push "$IMAGE_TAG"
- docker push "$IMAGE_LATEST"
rules:
- if: $CI_COMMIT_BRANCH == "main"
deploy:
stage: deploy
image: alpine:latest
before_script:
- apk add --no-cache openssh-client docker-cli docker-compose
- ssh-keyscan $DEPLOY_HOST >> ~/.ssh/known_hosts
script:
- |
env | grep -E '^(DB_|AUTH_|MANAGE_DB_|TS_DB_|SHARE_DB_|PROJECT_DB_|JWT_|MASTER_|APP_URL|SMTP_|TASKORI_|CHATWOOT_|ENCRYPTION_|INTERNAL_|SENTRY_|SUPPORT_)' > .env
- scp .env $DEPLOY_USER@$DEPLOY_HOST:/docker/$NAME/
- scp docker-compose.yml $DEPLOY_USER@$DEPLOY_HOST:/docker/$NAME/
- ssh $DEPLOY_USER@$DEPLOY_HOST "
docker pull $IMAGE_LATEST &&
cd /docker/$NAME &&
docker compose up -d"
rules:
- if: $CI_COMMIT_BRANCH == "main"
Certains projets ont des jobs supplémentaires sur la branche dev :
build-dev:
stage: build
# Push tag $CI_COMMIT_REF_SLUG uniquement (pas :latest)
rules:
- if: $CI_COMMIT_BRANCH == "dev"
deploy-dev:
stage: deploy
# docker stop/rm + docker compose -f docker-compose.dev.yml up -d
# Sans SSH — le runner tourne sur le même host que le service dev
rules:
- if: $CI_COMMIT_BRANCH == "dev"
Fichier : taskori-sync/.gitlab-ci.yml
build → publish
default:
tags:
- taskori-sync
Uniquement sur tag git ($CI_COMMIT_TAG). Aucun pipeline ne se lance sur les commits ordinaires.
workflow:
rules:
- if: $CI_COMMIT_TAG
Cross-compilation NSIS via cargo-xwin (pas de runner Windows natif) :
build-windows:
stage: build
image: rust:1-bookworm
variables:
TAURI_SIGNING_PRIVATE_KEY: $TAURI_SIGNING_PRIVATE_KEY
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ""
before_script:
- apt-get update && apt-get install -y clang lld llvm nsis nodejs npm
- rustup target add x86_64-pc-windows-msvc
- cargo install --locked cargo-xwin
- npm ci
script:
- npm run tauri build -- --runner cargo-xwin --target x86_64-pc-windows-msvc --bundles nsis
artifacts:
paths:
- "**/*.exe"
- "**/*.exe.sig"
Build natif Linux (deb + AppImage) :
build-linux:
stage: build
image: rust:1-bookworm
variables:
APPIMAGE_EXTRACT_AND_RUN: "1"
TAURI_SIGNING_PRIVATE_KEY: $TAURI_SIGNING_PRIVATE_KEY
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ""
before_script:
- apt-get update && apt-get install -y \\
libwebkit2gtk-4.1-dev libgtk-3-dev libayatana-appindicator3-dev \\
librsvg2-dev libssl-dev patchelf file nodejs npm
- npm ci
script:
- npm run tauri build -- --bundles deb,appimage
artifacts:
paths:
- "**/*.deb"
- "**/*.AppImage"
- "**/*.AppImage.sig"
Pas de runner CI pour macOS. Le build macOS se fait localement sur Mac :
npm ci && npm run tauri build
publish:
stage: publish
image: alpine:latest
needs:
- build-windows
- build-linux
before_script:
- apk add --no-cache jq openssh-client
- ssh-keyscan $DEPLOY_HOST >> ~/.ssh/known_hosts
script:
- ssh $DEPLOY_USER@$DEPLOY_HOST "mkdir -p /docker/dl/html/releases/$CI_COMMIT_TAG"
- scp **/*.exe **/*.exe.sig **/*.deb **/*.AppImage **/*.AppImage.sig \\
$DEPLOY_USER@$DEPLOY_HOST:/docker/dl/html/releases/$CI_COMMIT_TAG/
# Génère latest.json et downloads.json
- scp latest.json downloads.json \\
$DEPLOY_USER@$DEPLOY_HOST:/docker/dl/html/
URL publique des releases : https://dl.taskori.app/releases/$CI_COMMIT_TAG/
| Variable | Usage |
|---|---|
$CI_REGISTRY |
URL de la registry (registry.lorva.dev) |
$CI_REGISTRY_USER |
Login registry pour docker login |
$CI_REGISTRY_PASSWORD |
Mot de passe registry pour docker login |
$CI_REGISTRY_IMAGE |
Chemin image complet (registry.lorva.dev/yujji/taskori-<service>) |
$CI_COMMIT_REF_SLUG |
Nom de branche normalisé (tag image dev) |
$CI_COMMIT_TAG |
Tag git (déclenche les pipelines taskori-sync) |
| Variable | Scope | Description |
|---|---|---|
DEPLOY_HOST |
Tous projets | IP/hostname taskori-prod (10.10.20.10) |
DEPLOY_USER |
Tous projets | Utilisateur SSH de déploiement |
TAURI_SIGNING_PRIVATE_KEY |
taskori-sync | Clé minisign pour les .sig updater |
DB_*, AUTH_*, JWT_* |
Par service | Injectées dans .env au moment du deploy |
SMTP_*, TASKORI_*, etc. |
Par service | Idem |
curl -X POST https://gitlab.lorva.dev/api/v4/projects \
-H "PRIVATE-TOKEN: <GITLAB_LORVA_TOKEN>" \
-d "name=taskori-<service>&namespace_id=<group_id>&visibility=private"
Désactiver Auto DevOps immédiatement après création.
reference_taskori_sync_updater_keys) et dans la variable CI TAURI_SIGNING_PRIVATE_KEY (masked+protected).~/projects/LORVA/ → remote lorva → gitlab.lorva.dev.