Aller au contenu principal

Ajouter une Application

Ceci est la référence complète pour ajouter une nouvelle app au Yundera App Store. Pour un aperçu rapide, voir Vue d'ensemble des Contributions.

Template minimal (SSO via AppShield)

Le pattern recommandé : un sidecar AppShield protège votre backend et fournit le SSO Yundera. Le backend n'est jamais exposé directement — seul le sidecar reçoit les labels de routage.

name: myapp # alphanumérique minuscule + tiret, ne commençant pas par un chiffre

services:
myapp: # ← Sidecar AppShield (face publique)
image: ghcr.io/yundera/appshield:2.0.3 # fixer la version ; jamais :latest
container_name: myapp # DOIT être égal au name: de premier niveau
restart: unless-stopped
user: "root"
expose:
- 80
labels:
caddy_0: myapp-${APP_DOMAIN}
caddy_0.import: gateway_tls
caddy_0.reverse_proxy: "{{upstreams 80}}"
caddy_1: myapp-${APP_PUBLIC_IP_DASH}.nip.io
caddy_1.import: gateway_tls
caddy_1.reverse_proxy: "{{upstreams 80}}"
caddy_2: myapp-${APP_PUBLIC_IP_DASH}.sslip.io
caddy_2.reverse_proxy: "{{upstreams 80}}"
environment:
AUTH_HASH: $AUTH_HASH
BACKEND_HOST: "myapp-backend"
BACKEND_PORT: "80"
LISTEN_PORT: "80"
OIDC_REGISTRAR_URL: "http://auth-registrar:9092"
REDIRECT_HOST_SUFFIXES: "${APP_DOMAIN},${APP_PUBLIC_IP_DASH}.nip.io,${APP_PUBLIC_IP_DASH}.sslip.io"
CREDENTIAL_VALIDATE_URL: "http://casaos-oidc-bridge:8090/validate"
depends_on:
- myapp-backend
cpu_shares: 80
networks:
- pcs

myapp-backend: # ← app réelle (interne uniquement)
image: someimage:1.2.3
container_name: myapp-backend
restart: unless-stopped
user: "0:0"
expose:
- 80
environment:
TZ: $TZ
volumes:
- /DATA/AppData/$AppID/data/:/app/data/
cpu_shares: 50
networks:
- pcs

networks:
pcs:
name: pcs
external: true

x-casaos:
architectures:
- amd64
- arm64
main: myapp
index: /?hash=$AUTH_HASH
webui_port: 80
author: Yundera Team
category: Utilities
developer: OriginalDevName
icon: https://cdn.jsdelivr.net/gh/Yundera/AppStore@main/Apps/MyApp/icon.png
thumbnail: https://cdn.jsdelivr.net/gh/Yundera/AppStore@main/Apps/MyApp/thumbnail.png
screenshot_link:
- https://cdn.jsdelivr.net/gh/Yundera/AppStore@main/Apps/MyApp/screenshot-1.png
title:
en_us: My App
tagline:
en_us: One-line description
description:
en_us: |
Full description here.

Convention de nommage (critique)

Le container_name du sidecar doit être égal au name: de premier niveau. C'est structurel : le registrar auth dérive le client_id OIDC du nom du conteneur via une recherche PTR sur le réseau pcs. S'ils ne correspondent pas, l'enregistrement SSO échoue silencieusement.

name: myapp
services:
myapp:
container_name: myapp # ← DOIT être égal à name:

Règles :

  • name: / sidecar container_name : alphanumérique minuscule + tirets, ne commençant pas par un chiffre.
  • Les labels Caddy vont uniquement sur le sidecar — jamais sur le backend.
  • Le backend n'a pas de ports: ni de labels Caddy.
  • Jamais utiliser auth-${APP_DOMAIN} dans un label Caddy — cela entre en conflit avec l'Authelia du PCS.

Référence des variables d'environnement AppShield

VariableRequisObjectif
AUTH_HASHOuiToken injecté ; associer avec index: /?hash=$AUTH_HASH
BACKEND_HOSTOuiNom DNS interne du conteneur protégé
BACKEND_PORTOuiPort d'écoute du backend
LISTEN_PORTOuiPort d'écoute d'AppShield
OIDC_REGISTRAR_URLOuihttp://auth-registrar:9092 — active OIDC
REDIRECT_HOST_SUFFIXESOuiHôtes de redirection OIDC valides
CREDENTIAL_VALIDATE_URLOuiValide la session auprès du bridge PCS
USER / PASSWORDOptionnelPorte d'auth basique supplémentaire (ex. $APP_DEFAULT_PASSWORD)
ALLOWED_PATHSOptionnelChemins accessibles avec seulement le token hash

Chemins de volumes

volumes:
- /DATA/AppData/$AppID/config/:/app/config # config app
- /DATA/AppData/$AppID/data/:/app/data # données app / BDD
- /DATA/Media/Music/:/music:ro # médias partagés (lecture seule)
Important

Ajoutez toujours un / final côté hôte des chemins de volumes. Sans cela, CasaOS ne peut pas résoudre $AppID correctement et crée des fichiers directement dans /DATA/AppData/ au lieu du dossier de l'app.

# Correct
- /DATA/AppData/$AppID/config/:/etc/myapp

# Incorrect — les fichiers se retrouvent dans /DATA/AppData/ directement
- /DATA/AppData/$AppID/config:/etc/myapp

Les répertoires utilisateur (/DATA/Documents/, /DATA/Downloads/, /DATA/Media/, /DATA/Gallery/) nécessitent user: $PUID:$PGID. Les conteneurs AppData uniquement peuvent utiliser user: 0:0.

Limites de ressources

cpu_shares est requis sur chaque service. Pour les backends lourds, définissez aussi des limites strictes :

cpu_sharesCas d'usage
80Sidecars, frontends web
70App principale avec tâches de fond
50Services backend standard
30Bases de données, caches
20ML / traitement par lots
cpu_shares: 50
deploy:
resources:
limits:
memory: 2G
cpus: '1.0'

Commandes de pré-installation

Exécutées sur l'hôte avant le démarrage de tout conteneur :

x-casaos:
pre-install-cmd: |
mkdir -p /DATA/AppData/$AppID/config/ &&
[ -f /DATA/AppData/$AppID/config/settings.ini ] || \
printf '[server]\nport=80\n' > /DATA/AppData/$AppID/config/settings.ini

Règles : idempotent, non interactif, tags d'image fixés, pas de mots de passe codés en dur (utiliser $APP_DEFAULT_PASSWORD).

Variables système

Ces variables sont injectées à l'installation :

VariableExempleUsage
$APP_DOMAINvotrenom.nsl.shhttps://myapp-${APP_DOMAIN}
$APP_PUBLIC_IP_DASH203-0-113-42Labels nip.io / sslip.io
$AUTH_HASH(généré)Token AppShield
$APP_DEFAULT_PASSWORD(généré)Mot de passe admin initial
$APP_EMAILadmin@votrenom.nsl.shEmail administrateur
$AppIDmyappChemins de volumes : /DATA/AppData/$AppID/
$PUID / $PGID1000 / 1000Propriété des fichiers
$TZAsia/SeoulFuseau horaire