Compare commits

..

110 Commits

Author SHA1 Message Date
324f152880 schema: update app-template.schema.json for v1.7.3 2026-09-30 18:37:53 +02:00
def101c0fa docs: update CONTRIBUTING_APPS.md for v1.7.3 2026-09-30 18:37:52 +02:00
55242e717b chore(store): sync vaultwarden/docker-compose.yml for v1.7.3 2026-09-30 18:37:51 +02:00
6b6d180019 chore(store): sync vaultwarden/app.json for v1.7.3 2026-09-30 18:37:50 +02:00
3036937c72 chore(store): sync retroarch/docker-compose.yml for v1.7.3 2026-09-30 18:37:49 +02:00
332c4479ad chore(store): sync retroarch/app.json for v1.7.3 2026-09-30 18:37:48 +02:00
da79d44b0a chore(store): sync qbittorrent/docker-compose.yml for v1.7.3 2026-09-30 18:37:47 +02:00
6c9bf4f590 chore(store): sync qbittorrent/app.json for v1.7.3 2026-09-30 18:37:46 +02:00
b9d358fa27 chore(store): sync portainer/docker-compose.yml for v1.7.3 2026-09-30 18:37:45 +02:00
13ccdbe74a chore(store): sync portainer/app.json for v1.7.3 2026-09-30 18:37:44 +02:00
1b6add9256 chore(store): sync plex/docker-compose.yml for v1.7.3 2026-09-30 18:37:43 +02:00
b1846b04b9 chore(store): sync plex/app.json for v1.7.3 2026-09-30 18:37:41 +02:00
a1b030d091 chore(store): sync nextcloud/docker-compose.yml for v1.7.3 2026-09-30 18:37:40 +02:00
0e9b0d09a2 chore(store): sync nextcloud/app.json for v1.7.3 2026-09-30 18:37:39 +02:00
0ccacb1f0c chore(store): sync jellyfin/docker-compose.yml for v1.7.3 2026-09-30 18:37:38 +02:00
574fffd485 chore(store): sync jellyfin/app.json for v1.7.3 2026-09-30 18:37:37 +02:00
c069820354 chore(store): sync immich/docker-compose.yml for v1.7.3 2026-09-30 18:37:36 +02:00
8a2e6d3ba5 chore(store): sync immich/app.json for v1.7.3 2026-09-30 18:37:35 +02:00
57870709cc chore(store): sync homeassistant/docker-compose.yml for v1.7.3 2026-09-30 18:37:34 +02:00
cbb7107fbc chore(store): sync homeassistant/app.json for v1.7.3 2026-09-30 18:37:33 +02:00
19866f6d00 chore(store): sync adguard-home/docker-compose.yml for v1.7.3 2026-09-30 18:37:32 +02:00
a0b53d0c0f chore(store): sync adguard-home/app.json for v1.7.3 2026-09-30 18:37:31 +02:00
44ac17fc26 schema: update app-template.schema.json for v1.7.2 2026-09-30 15:39:50 +02:00
6ab8ebd15c docs: update CONTRIBUTING_APPS.md for v1.7.2 2026-09-30 15:39:49 +02:00
c9e70f6f2b chore(store): sync vaultwarden/docker-compose.yml for v1.7.2 2026-09-30 15:39:48 +02:00
6bf5b6d438 chore(store): sync vaultwarden/app.json for v1.7.2 2026-09-30 15:39:47 +02:00
6440ccc500 chore(store): sync retroarch/docker-compose.yml for v1.7.2 2026-09-30 15:39:46 +02:00
a683e2a57e chore(store): sync retroarch/app.json for v1.7.2 2026-09-30 15:39:45 +02:00
ef4c6137a1 chore(store): sync qbittorrent/docker-compose.yml for v1.7.2 2026-09-30 15:39:44 +02:00
6c15d4987a chore(store): sync qbittorrent/app.json for v1.7.2 2026-09-30 15:39:42 +02:00
f4b58b10cb chore(store): sync portainer/docker-compose.yml for v1.7.2 2026-09-30 15:39:41 +02:00
f4aa1fcd39 chore(store): sync portainer/app.json for v1.7.2 2026-09-30 15:39:40 +02:00
aaa9865617 chore(store): sync plex/docker-compose.yml for v1.7.2 2026-09-30 15:39:39 +02:00
0ad1cc6184 chore(store): sync plex/app.json for v1.7.2 2026-09-30 15:39:38 +02:00
fce55a6fe1 chore(store): sync nextcloud/docker-compose.yml for v1.7.2 2026-09-30 15:39:36 +02:00
3976ab7899 chore(store): sync nextcloud/app.json for v1.7.2 2026-09-30 15:39:35 +02:00
5d8d054bb0 chore(store): sync jellyfin/docker-compose.yml for v1.7.2 2026-09-30 15:39:34 +02:00
bcb44de119 chore(store): sync jellyfin/app.json for v1.7.2 2026-09-30 15:39:33 +02:00
29e92dda9c chore(store): sync immich/docker-compose.yml for v1.7.2 2026-09-30 15:39:32 +02:00
53389d73fe chore(store): sync immich/app.json for v1.7.2 2026-09-30 15:39:31 +02:00
9bc101ef39 chore(store): sync homeassistant/docker-compose.yml for v1.7.2 2026-09-30 15:39:30 +02:00
cb2d2928f1 chore(store): sync homeassistant/app.json for v1.7.2 2026-09-30 15:39:29 +02:00
c94d35a9ae chore(store): sync adguard-home/docker-compose.yml for v1.7.2 2026-09-30 15:39:28 +02:00
f639df9006 chore(store): sync adguard-home/app.json for v1.7.2 2026-09-30 15:39:27 +02:00
765c7b60ac schema: update app-template.schema.json for v1.7.1 2026-09-30 12:56:52 +02:00
4544d1c76a docs: update CONTRIBUTING_APPS.md for v1.7.1 2026-09-30 12:56:51 +02:00
1ed62d3210 chore(store): sync vaultwarden/docker-compose.yml for v1.7.1 2026-09-30 12:56:49 +02:00
cc77f57a0c chore(store): sync vaultwarden/app.json for v1.7.1 2026-09-30 12:56:48 +02:00
ce8beba2f3 chore(store): sync retroarch/docker-compose.yml for v1.7.1 2026-09-30 12:56:47 +02:00
f77b83ca15 chore(store): sync retroarch/app.json for v1.7.1 2026-09-30 12:56:47 +02:00
8f192f2bb2 chore(store): sync qbittorrent/docker-compose.yml for v1.7.1 2026-09-30 12:56:45 +02:00
dc749d2b4b chore(store): sync qbittorrent/app.json for v1.7.1 2026-09-30 12:56:44 +02:00
7aecfc8807 chore(store): sync portainer/docker-compose.yml for v1.7.1 2026-09-30 12:56:43 +02:00
39c43097de chore(store): sync portainer/app.json for v1.7.1 2026-09-30 12:56:41 +02:00
4e70d197f2 chore(store): sync plex/docker-compose.yml for v1.7.1 2026-09-30 12:56:41 +02:00
a51d19777f chore(store): sync plex/app.json for v1.7.1 2026-09-30 12:56:40 +02:00
705b71b8d9 chore(store): sync nextcloud/docker-compose.yml for v1.7.1 2026-09-30 12:56:39 +02:00
136e3650e0 chore(store): sync nextcloud/app.json for v1.7.1 2026-09-30 12:56:38 +02:00
4f5ba10054 chore(store): sync jellyfin/docker-compose.yml for v1.7.1 2026-09-30 12:56:37 +02:00
4ebc955fb9 chore(store): sync jellyfin/app.json for v1.7.1 2026-09-30 12:56:36 +02:00
a670f624d9 chore(store): sync immich/docker-compose.yml for v1.7.1 2026-09-30 12:56:34 +02:00
84af094570 chore(store): sync immich/app.json for v1.7.1 2026-09-30 12:56:33 +02:00
62e22785bd chore(store): sync homeassistant/docker-compose.yml for v1.7.1 2026-09-30 12:56:32 +02:00
f619f3964a chore(store): sync homeassistant/app.json for v1.7.1 2026-09-30 12:56:31 +02:00
b5049fbad8 chore(store): sync adguard-home/docker-compose.yml for v1.7.1 2026-09-30 12:56:30 +02:00
d4942d89dc chore(store): sync adguard-home/app.json for v1.7.1 2026-09-30 12:56:29 +02:00
e6b679ed80 schema: update app-template.schema.json for v1.7.1 2026-09-30 12:44:26 +02:00
f24c05e59b docs: update CONTRIBUTING_APPS.md for v1.7.1 2026-09-30 12:44:25 +02:00
50e91a470d chore(store): sync vaultwarden/docker-compose.yml for v1.7.1 2026-09-30 12:44:24 +02:00
3ef4555baf chore(store): sync vaultwarden/app.json for v1.7.1 2026-09-30 12:44:23 +02:00
a873013967 chore(store): sync retroarch/docker-compose.yml for v1.7.1 2026-09-30 12:44:21 +02:00
83a2382115 chore(store): sync retroarch/app.json for v1.7.1 2026-09-30 12:44:20 +02:00
4b81c9a3eb chore(store): sync qbittorrent/docker-compose.yml for v1.7.1 2026-09-30 12:44:19 +02:00
b6236626a1 chore(store): sync qbittorrent/app.json for v1.7.1 2026-09-30 12:44:18 +02:00
f054034d73 chore(store): sync portainer/docker-compose.yml for v1.7.1 2026-09-30 12:44:16 +02:00
6f37aac403 chore(store): sync portainer/app.json for v1.7.1 2026-09-30 12:44:15 +02:00
ad6386032c chore(store): sync plex/docker-compose.yml for v1.7.1 2026-09-30 12:44:13 +02:00
5b3d840bd1 chore(store): sync plex/app.json for v1.7.1 2026-09-30 12:44:12 +02:00
aa2c63ca3e chore(store): sync nextcloud/docker-compose.yml for v1.7.1 2026-09-30 12:44:11 +02:00
cd800567da chore(store): sync nextcloud/app.json for v1.7.1 2026-09-30 12:44:10 +02:00
358db8fe4e chore(store): sync jellyfin/docker-compose.yml for v1.7.1 2026-09-30 12:44:08 +02:00
ba6d609a88 chore(store): sync jellyfin/app.json for v1.7.1 2026-09-30 12:44:07 +02:00
cce17eaef3 chore(store): sync immich/docker-compose.yml for v1.7.1 2026-09-30 12:44:06 +02:00
5ce7992110 chore(store): sync immich/app.json for v1.7.1 2026-09-30 12:44:05 +02:00
d355600d92 chore(store): sync homeassistant/docker-compose.yml for v1.7.1 2026-09-30 12:44:04 +02:00
c9d0cdd960 chore(store): sync homeassistant/app.json for v1.7.1 2026-09-30 12:44:02 +02:00
f679a6927a chore(store): sync adguard-home/docker-compose.yml for v1.7.1 2026-09-30 12:44:02 +02:00
22e5198c91 chore(store): sync adguard-home/app.json for v1.7.1 2026-09-30 12:44:00 +02:00
e140687828 schema: update app-template.schema.json for v1.7.0 2026-09-29 19:45:59 +02:00
81fddd20e6 docs: update CONTRIBUTING_APPS.md for v1.7.0 2026-09-29 19:45:58 +02:00
f877238962 chore(store): sync vaultwarden/docker-compose.yml for v1.7.0 2026-09-29 19:45:57 +02:00
7372b9b9e2 chore(store): sync vaultwarden/app.json for v1.7.0 2026-09-29 19:45:56 +02:00
e6a300f5a8 chore(store): sync retroarch/docker-compose.yml for v1.7.0 2026-09-29 19:45:55 +02:00
5491a3a92f chore(store): sync retroarch/app.json for v1.7.0 2026-09-29 19:45:53 +02:00
c703b29fed chore(store): sync qbittorrent/docker-compose.yml for v1.7.0 2026-09-29 19:45:52 +02:00
4fd9e2a11e chore(store): sync qbittorrent/app.json for v1.7.0 2026-09-29 19:45:51 +02:00
e0dab0c272 chore(store): sync portainer/docker-compose.yml for v1.7.0 2026-09-29 19:45:50 +02:00
b94ed546a6 chore(store): sync portainer/app.json for v1.7.0 2026-09-29 19:45:49 +02:00
45affb50b7 chore(store): sync plex/docker-compose.yml for v1.7.0 2026-09-29 19:45:48 +02:00
bdfade497b chore(store): sync plex/app.json for v1.7.0 2026-09-29 19:45:46 +02:00
8fe7577eae chore(store): sync nextcloud/docker-compose.yml for v1.7.0 2026-09-29 19:45:45 +02:00
02403552f4 chore(store): sync nextcloud/app.json for v1.7.0 2026-09-29 19:45:43 +02:00
62063da2d7 chore(store): sync jellyfin/docker-compose.yml for v1.7.0 2026-09-29 19:45:41 +02:00
d43f85de3f chore(store): sync jellyfin/app.json for v1.7.0 2026-09-29 19:45:40 +02:00
0dd99c559e chore(store): sync immich/docker-compose.yml for v1.7.0 2026-09-29 19:45:38 +02:00
7930d13af1 chore(store): sync immich/app.json for v1.7.0 2026-09-29 19:45:35 +02:00
80fce2005d chore(store): sync homeassistant/docker-compose.yml for v1.7.0 2026-09-29 19:45:33 +02:00
155634429c chore(store): sync homeassistant/app.json for v1.7.0 2026-09-29 19:45:31 +02:00
8604aa2e09 chore(store): sync adguard-home/docker-compose.yml for v1.7.0 2026-09-29 19:45:25 +02:00
41222212a5 chore(store): sync adguard-home/app.json for v1.7.0 2026-09-29 19:45:22 +02:00
22 changed files with 1112 additions and 49 deletions

View File

@@ -4,6 +4,24 @@ Merci de contribuer à l'écosystème **Irbis OS** ! ❄️
L'App Store d'Irbis OS est conçu pour permettre à la communauté de proposer de nouvelles applications conteneurisées (Docker) via une simple **Pull Request** sur notre dépôt public Gitea : **[https://git.nebulia.tech/SlyderSlash/Irbis_OS-Release](https://git.nebulia.tech/SlyderSlash/Irbis_OS-Release)**.
Dès que votre Pull Request est validée et fusionnée sur ce dépôt public, votre application apparaît **instantanément dans l'App Store de tous les serveurs Irbis OS connectés**, sans qu'aucune mise à jour de l'OS ne soit nécessaire !
---
## 📁 Nouvelle Architecture : 1 Dossier par Application
Chaque application possède son propre sous-dossier dans `community_apps/` nommé selon son identifiant en minuscules :
```text
community_apps/
└── mon-application/
├── app.json # Fiche descriptive de l'application & paramètres UI
├── docker-compose.yml # Stack Docker technique (services, images, réseaux, volumes)
├── icon.png # Image de garde (icône PNG ou SVG carré)
├── screenshot1.png # Capture d'écran de démo #1
└── screenshot2.png # Capture d'écran de démo #2
```
---
## 📋 Comment proposer une nouvelle application ?
@@ -13,79 +31,100 @@ L'App Store d'Irbis OS est conçu pour permettre à la communauté de proposer d
git checkout -b app/mon-application
```
2. **Créez un fichier JSON** dans le dossier `community_apps/` nommé selon l'identifiant de votre application en minuscules (ex: `community_apps/mon-application.json`).
2. **Créez un dossier** dans `community_apps/` au nom de votre application en minuscules (ex: `community_apps/mon-application/`).
3. **Remplissez la définition** en suivant le schéma officiel [`schemas/app-template.schema.json`](./schemas/app-template.schema.json).
3. **Créez le fichier `app.json`** en vous basant sur le modèle ci-dessous et le schéma officiel [`schemas/app-template.schema.json`](./schemas/app-template.schema.json).
4. **Validez localement** votre fichier avec la commande :
4. **Créez le fichier `docker-compose.yml`** contenant la définition officielle de vos conteneurs. Toutes les informations techniques lourdes (images, réseaux, restart policy) sont déléguées à ce fichier Docker Compose afin de ne pas doubler les demandes.
5. **Ajoutez vos visuels** dans le dossier (`icon.png` et les éventuelles captures de démo).
6. **Validez localement** votre application avec la commande :
```bash
pnpm validate:apps
```
5. **Ouvrez votre Pull Request** sur Gitea (`https://git.nebulia.tech/SlyderSlash/Irbis_OS-Release/pulls`) en décrivant brièvement l'application et en confirmant qu'elle a été testée localement sur Irbis OS. Dès que la PR est validée et fusionnée, l'application apparaît automatiquement dans l'App Store de tous les serveurs Irbis OS connectés !
7. **Ouvrez votre Pull Request** sur Gitea (`https://git.nebulia.tech/SlyderSlash/Irbis_OS-Release/pulls`).
---
## 🛠️ Structure du fichier JSON d'une application
Voici un modèle complet commenté :
## 🛠️ 1. Modèle de `app.json`
```json
{
"$schema": "../schemas/app-template.schema.json",
"$schema": "../../schemas/app-template.schema.json",
"id": "mon-application",
"name": "Mon Application",
"tagline": "Une phrase d'accroche courte et percutante (max 150 caractères)",
"description": "Description concise de l'application affichée sur la vignette du magasin.",
"description": "Description concise affichée sur la vignette du magasin.",
"longDescription": "Description détaillée expliquant les fonctionnalités principales, les cas d'usage et les avantages pour un serveur NAS ou Home Lab.",
"icon": "https://example.com/logo-mon-application.png",
"screenshots": [
"https://example.com/screenshot1.png"
],
"category": "productivity",
"version": "1.0.0",
"developer": "Nom du Créateur ou Projet Open Source",
"developer": "Nom du Développeur ou Équipe Open Source",
"website": "https://mon-application.org",
"rating": 4.9,
"downloads": "500K",
"sizeMb": 250,
"downloads": "250K",
"sizeMb": 180,
"license": "MIT",
"image": "mon-organisation/mon-application:latest",
"defaultPort": 8080,
"icon": "icon.png",
"screenshots": [
"screenshot1.png",
"screenshot2.png"
],
"firstStartTip": "Lors du premier accès, utilisez l'identifiant par défaut 'admin' et suivez l'assistant de configuration initial pour sécuriser vos accès.",
"composeFile": "docker-compose.yml",
"nginx": {
"recommendedSubdomain": "monapp",
"enableSsl": true,
"mainPort": 80
},
"ports": [
{
"privatePort": 8080,
"name": "Interface Web",
"description": "Port HTTP principal d'administration",
"privatePort": 80,
"defaultPublicPort": 8080,
"description": "Interface Web d'administration",
"type": "tcp"
"type": "tcp",
"protocol": "http",
"isDefaultNginxTarget": true
},
{
"name": "API & WebSocket",
"description": "Flux temps réel et synchronisation",
"privatePort": 3000,
"defaultPublicPort": 3000,
"type": "tcp",
"protocol": "http",
"isDefaultNginxTarget": false
}
],
"volumes": [
{
"defaultHostPath": "/mnt/storage/mon-application/data",
"containerPath": "/data",
"description": "Dossier de stockage persistant",
"description": "Données persistantes de l'application",
"required": true
},
{
"defaultHostPath": "/mnt/storage/configs/mon-application",
"containerPath": "/config",
"description": "Fichiers de configuration",
"required": false
}
],
"env": [
{
"key": "ADMIN_USER",
"defaultValue": "admin",
"label": "Nom d'utilisateur administrateur",
"required": true
},
{
"key": "TZ",
"defaultValue": "Europe/Paris",
"label": "Fuseau Horaire",
"label": "Fuseau horaire",
"required": false
},
{
"key": "ADMIN_PASSWORD",
"defaultValue": "",
"label": "Mot de passe administrateur initial",
"required": true
}
]
}
@@ -93,22 +132,30 @@ Voici un modèle complet commenté :
---
## 🏷️ Catégories supportées
## 🐳 2. Modèle de `docker-compose.yml`
- `media` : Streaming, serveurs multimédia (Plex, Jellyfin, Navidrome...)
- `cloud` : Stockage distant, synchronisation (Nextcloud, Owncloud, Seafile...)
- `productivity` : Bureautique, notes, automatisation (Home Assistant, N8N...)
- `security` : Mots de passe, VPN, gestionnaires de secrets (Vaultwarden, WireGuard...)
- `utilities` : Téléchargements, sauvegardes, bases de données (qBittorrent, Duplicati...)
- `development` : Outils de dev, IDE web, CI/CD (Gitea, Code-Server...)
- `home_automation` : Domotique, gestion IoT (Zigbee2MQTT, Node-RED...)
- `network` : Serveurs DNS, proxys, pare-feu (AdGuard Home, Nginx Proxy Manager...)
```yaml
services:
mon-application:
image: mon-organisation/mon-application:latest
container_name: mon-application
restart: unless-stopped
ports:
- "${MON_APP_PORT:-8080}:80"
- "${MON_APP_API_PORT:-3000}:3000"
volumes:
- "${MON_APP_DATA_PATH:-/mnt/storage/mon-application/data}:/data"
environment:
- ADMIN_USER=${ADMIN_USER:-admin}
- TZ=${TZ:-Europe/Paris}
```
---
## 🔒 Règles et Bonnes Pratiques
## 🔒 3. Critères d'Acceptation d'une Pull Request
- **Images Docker vérifiées** : Utilisez de préférence les images officielles Docker Hub ou LinuxServer.io (`lscr.io/linuxserver/...`, `ghcr.io/...`).
- **Chemins de volumes** : Les chemins hôtes par défaut doivent impérativement commencer par `/mnt/storage/` afin d'exploiter la partition de stockage principale du NAS.
- **Ports sans collision** : Veillez à ce que le `defaultPort` n'entre pas en conflit direct avec les services système fondamentaux d'Irbis OS (`4000`, `22`, `80`, `443`).
- **Icône de qualité** : Fournissez une URL HTTPS directe vers une image PNG ou SVG au format carré (au moins 128x128 px).
Pour être validée et publiée, toute application doit :
- Utiliser une image Docker publique, réputée et maintenue.
- Ne pas nécessiter de droits root privilégiés (`privileged: true`) sauf besoin matériel justifié.
- Persister ses données sous `/mnt/storage/<id>/` pour garantir la compatibilité avec les snapshots Btrfs et les sauvegardes du NAS.
- Être validée avec succès par `pnpm validate:apps`.

View File

@@ -0,0 +1,76 @@
{
"$schema": "../../schemas/app-template.schema.json",
"id": "adguard-home",
"name": "AdGuard Home",
"tagline": "Serveur DNS anti-publicités et protection réseau",
"description": "Bloquez les publicités, trackers et logiciels malveillants sur l'ensemble de votre réseau local sans installer d'extension.",
"longDescription": "AdGuard Home fonctionne comme un résolveur DNS local qui redirige les domaines publicitaires et espions vers un trou noir. Contrôle parental, chiffrement DNS-over-HTTPS (DoH) et DNS-over-TLS (DoT) intégrés.",
"category": "network",
"version": "v0.107.52",
"developer": "AdGuard",
"website": "https://adguard.com/adguard-home.html",
"rating": 4.9,
"downloads": "2.1M",
"sizeMb": 95,
"license": "GPLv3",
"icon": "https://lh3.googleusercontent.com/aida-public/AB6AXuCBj60zmHuzKE1qGtiHzWbH-r-GphCWZzJ38IEgFQU7bjZjZVmDasLyDQNkw6nx7k_z-fil8QsDR_6FGAMYzV3ZUSkadmoELAxpSLzc3zM5mejhGTJaO4PnPmSGwz0l6PfEEC7JSWREk2-ZVqjW9ZCmNrmYsYsjseUJD1eMZgaCxJbM6T6WXvSkkpq3V2P8jR-aAhVNkcQWyaS7R1wYwS7jHi5ZJEpJ_HxYwCaUmsXCXkzlEB1x8zCH8Wc5zee3oPoZQMw",
"screenshots": [],
"firstStartTip": "Accédez au port 3000 lors du premier lancement pour suivre l'assistant d'installation et configurer vos règles de filtrage.",
"composeFile": "docker-compose.yml",
"nginx": {
"recommendedSubdomain": "adguard",
"enableSsl": true,
"mainPort": 80
},
"ports": [
{
"name": "Assistant Initial",
"description": "Assistant de bienvenue",
"privatePort": 3000,
"defaultPublicPort": 3000,
"type": "tcp",
"protocol": "http",
"isDefaultNginxTarget": false
},
{
"name": "Web UI",
"description": "Tableau de bord d'administration",
"privatePort": 80,
"defaultPublicPort": 8086,
"type": "tcp",
"protocol": "http",
"isDefaultNginxTarget": true
},
{
"name": "Serveur DNS",
"description": "Port DNS standard",
"privatePort": 53,
"defaultPublicPort": 53,
"type": "udp",
"protocol": "udp",
"isDefaultNginxTarget": false
}
],
"volumes": [
{
"defaultHostPath": "/mnt/storage/configs/adguard/work",
"containerPath": "/opt/adguardhome/work",
"description": "Statistiques et base de données de filtrage",
"required": true
},
{
"defaultHostPath": "/mnt/storage/configs/adguard/conf",
"containerPath": "/opt/adguardhome/conf",
"description": "Configuration YAML AdGuard",
"required": true
}
],
"env": [
{
"key": "TZ",
"defaultValue": "Europe/Paris",
"label": "Fuseau Horaire",
"required": false
}
]
}

View File

@@ -0,0 +1,12 @@
services:
adguard-home:
image: adguard/adguardhome:latest
container_name: adguard-home
restart: unless-stopped
ports:
- "${ADGUARD_SETUP_PORT:-3000}:3000"
- "${ADGUARD_WEBUI_PORT:-8086}:80"
- "53:53/udp"
volumes:
- "${ADGUARD_WORK_PATH:-/mnt/storage/adguard/work}:/opt/adguardhome/work"
- "${ADGUARD_CONF_PATH:-/mnt/storage/adguard/conf}:/opt/adguardhome/conf"

View File

@@ -0,0 +1,52 @@
{
"$schema": "../../schemas/app-template.schema.json",
"id": "homeassistant",
"name": "Home Assistant",
"tagline": "Domotique open-source et automatisation résidentielle locale",
"description": "Contrôlez vos objets connectés et automatisez votre maison avec un respect total de la vie privée.",
"longDescription": "Home Assistant est la référence de la domotique open-source axée sur le contrôle local et la confidentialité. Compatible avec Zigbee, Z-Wave, Matter, Thread, Philips Hue, Shelly et plus de 2000 intégrations.",
"category": "productivity",
"version": "2024.9.0",
"developer": "Nabu Casa",
"website": "https://home-assistant.io",
"rating": 4.9,
"downloads": "1.8M",
"sizeMb": 720,
"license": "Apache-2.0",
"icon": "https://lh3.googleusercontent.com/aida/AEtjO1WjnP_HXgGADBVTJOn5RqmjguJrbPFWKEFCaOvwv0rLwfj-RewhnFICVeVLWTXcCYR1nMfkOUpyJElogpPjD1PF6RQyGuTXroITu211LaHhu0Pq5PUMn5aOUz8XpZGyLRhjqL4MLwIS4ysK6TVBwcJGwTJ3Nnqh3Gn3ZR4jpzGO3DE8eNOvTgqJo8JDbJVKulZpsp8P--d3l1xIdRpEZkVvl_H_ESPZ5iI0Pwe_w3X8iUuv3PmxIrM75fM",
"screenshots": [],
"firstStartTip": "La découverte automatique des appareils de votre réseau local démarrera dès que vous aurez créé votre compte administrateur.",
"composeFile": "docker-compose.yml",
"nginx": {
"recommendedSubdomain": "domotique",
"enableSsl": true,
"mainPort": 8123
},
"ports": [
{
"name": "Web UI",
"description": "Interface Web Lovelace",
"privatePort": 8123,
"defaultPublicPort": 8123,
"type": "tcp",
"protocol": "http",
"isDefaultNginxTarget": true
}
],
"volumes": [
{
"defaultHostPath": "/mnt/storage/configs/homeassistant",
"containerPath": "/config",
"description": "Fichiers YAML et intégrations",
"required": true
}
],
"env": [
{
"key": "TZ",
"defaultValue": "Europe/Paris",
"label": "Fuseau Horaire",
"required": false
}
]
}

View File

@@ -0,0 +1,11 @@
services:
homeassistant:
image: ghcr.io/home-assistant/home-assistant:stable
container_name: homeassistant
restart: unless-stopped
ports:
- "${HASS_PORT:-8123}:8123"
volumes:
- "${HASS_CONFIG_PATH:-/mnt/storage/homeassistant}:/config"
environment:
- TZ=${TZ:-Europe/Paris}

View File

@@ -0,0 +1,64 @@
{
"$schema": "../../schemas/app-template.schema.json",
"id": "immich",
"name": "Immich",
"tagline": "Solution de sauvegarde et gestion de photos auto-hébergée haute performance",
"description": "Alternative moderne à Google Photos avec reconnaissance faciale IA, géolocalisation et sauvegarde mobile transparente.",
"longDescription": "Immich est une solution ultra-rapide de sauvegarde et de gestion de photos et vidéos conçue pour les serveurs NAS. Elle intègre des algorithmes d'apprentissage automatique pour la détection des visages, la recherche sémantique par mots-clés et l'affichage chronologique instantané.",
"category": "media",
"version": "v1.118.0",
"developer": "FUTO / Immich Team",
"website": "https://immich.app",
"rating": 4.9,
"downloads": "1.4M",
"sizeMb": 850,
"license": "AGPLv3",
"icon": "https://lh3.googleusercontent.com/aida-public/AB6AXuAy_b2LhyUHS-M_nrXk8hHugSt-bppiAhq8zmutrhlxbvrjvwluPLGolxCoPWALQt6I66jPVrEiIrrbDLH_mmuKSriJLUOGh2dYOlGA6lgfXNQEYKHSektq5UmPU0lLaG6u8TWE9m9VDeQM2MwD_jSg60NFvQUNwYRkgJzt0Fj-HFrAI401LhBpZIXikMI1JR9k2-GL2qIOnbNYWqc8tRiQ2zPvJDlJ_wYmNMeGdv-Rfg89FEBjuKA9_g",
"screenshots": [],
"firstStartTip": "Téléchargez l'application mobile Immich (iOS / Android) et connectez-vous avec l'URL de votre serveur pour activer la sauvegarde automatique de vos photos.",
"composeFile": "docker-compose.yml",
"nginx": {
"recommendedSubdomain": "photos",
"enableSsl": true,
"mainPort": 2283
},
"ports": [
{
"name": "Web UI & API",
"description": "Interface Web et API mobile",
"privatePort": 2283,
"defaultPublicPort": 2283,
"type": "tcp",
"protocol": "http",
"isDefaultNginxTarget": true
}
],
"volumes": [
{
"defaultHostPath": "/mnt/storage/photos",
"containerPath": "/usr/src/app/upload",
"description": "Dossier de stockage principal des photos",
"required": true
},
{
"defaultHostPath": "/mnt/storage/database/immich",
"containerPath": "/var/lib/postgresql/data",
"description": "Base de données PostgreSQL/pgvector",
"required": true
}
],
"env": [
{
"key": "DB_DATABASE_NAME",
"defaultValue": "immich",
"label": "Nom de base de données",
"required": true
},
{
"key": "TZ",
"defaultValue": "Europe/Paris",
"label": "Fuseau Horaire",
"required": false
}
]
}

View File

@@ -0,0 +1,13 @@
services:
immich:
image: ghcr.io/immich-app/immich-server:release
container_name: immich
restart: unless-stopped
ports:
- "${IMMICH_PORT:-2283}:2283"
volumes:
- "${IMMICH_PHOTOS_PATH:-/mnt/storage/photos}:/usr/src/app/upload"
- "${IMMICH_DB_PATH:-/mnt/storage/database/immich}:/var/lib/postgresql/data"
environment:
- DB_DATABASE_NAME=${DB_DATABASE_NAME:-immich}
- TZ=${TZ:-Europe/Paris}

View File

@@ -0,0 +1,58 @@
{
"$schema": "../../schemas/app-template.schema.json",
"id": "jellyfin",
"name": "Jellyfin Media Server",
"tagline": "Système multimédia 100% open-source sans abonnement",
"description": "Streamez tous vos films, séries, musiques et livres audio sur n'importe quel appareil sans tracking ni frais.",
"longDescription": "Jellyfin est le système multimédia gratuit qui vous donne le contrôle total de vos médias. Aucune formule payante, aucune collecte de données télémétriques, transcodage matériel Nvidia/Intel/VAAPI inclus.",
"category": "media",
"version": "10.9.11",
"developer": "Jellyfin Project",
"website": "https://jellyfin.org",
"rating": 4.9,
"downloads": "1.1M",
"sizeMb": 390,
"license": "GPLv2",
"icon": "https://lh3.googleusercontent.com/aida-public/AB6AXuAy_b2LhyUHS-M_nrXk8hHugSt-bppiAhq8zmutrhlxbvrjvwluPLGolxCoPWALQt6I66jPVrEiIrrbDLH_mmuKSriJLUOGh2dYOlGA6lgfXNQEYKHSektq5UmPU0lLaG6u8TWE9m9VDeQM2MwD_jSg60NFvQUNwYRkgJzt0Fj-HFrAI401LhBpZIXikMI1JR9k2-GL2qIOnbNYWqc8tRiQ2zPvJDlJ_wYmNMeGdv-Rfg89FEBjuKA9_g",
"screenshots": [],
"firstStartTip": "Suivez l'assistant de configuration initial pour désigner vos dossiers de films, séries et musiques situés sur /mnt/storage.",
"composeFile": "docker-compose.yml",
"nginx": {
"recommendedSubdomain": "media",
"enableSsl": true,
"mainPort": 8096
},
"ports": [
{
"name": "Web UI",
"description": "Interface Web Jellyfin HTTP",
"privatePort": 8096,
"defaultPublicPort": 8096,
"type": "tcp",
"protocol": "http",
"isDefaultNginxTarget": true
}
],
"volumes": [
{
"defaultHostPath": "/mnt/storage/media",
"containerPath": "/media",
"description": "Dossier de stockage des médias",
"required": true
},
{
"defaultHostPath": "/mnt/storage/configs/jellyfin",
"containerPath": "/config",
"description": "Configurations & Cache",
"required": true
}
],
"env": [
{
"key": "JELLYFIN_PUBLISHED_SERVER_URL",
"defaultValue": "",
"label": "URL publique du serveur",
"required": false
}
]
}

View File

@@ -0,0 +1,12 @@
services:
jellyfin:
image: jellyfin/jellyfin:latest
container_name: jellyfin
restart: unless-stopped
ports:
- "${JELLYFIN_PORT:-8096}:8096"
volumes:
- "${JELLYFIN_CONFIG_PATH:-/mnt/storage/jellyfin/config}:/config"
- "${JELLYFIN_MEDIA_PATH:-/mnt/storage/media}:/media"
environment:
- TZ=${TZ:-Europe/Paris}

View File

@@ -0,0 +1,64 @@
{
"$schema": "../../schemas/app-template.schema.json",
"id": "nextcloud",
"name": "Nextcloud Hub",
"tagline": "Suite collaborative complète et cloud souverain privé",
"description": "Stockage de fichiers sécurisé, partage, agenda, contacts, suite bureautique et synchronisation multi-appareils.",
"longDescription": "Nextcloud Hub offre une plateforme de productivité sécurisée et souveraine sur votre propre matériel. Synchronisez automatiquement vos documents, photos et projets en toute confidentialité avec chiffrement de bout en bout.",
"category": "cloud",
"version": "29.0.5",
"developer": "Nextcloud GmbH",
"website": "https://nextcloud.com",
"rating": 4.9,
"downloads": "3.2M",
"sizeMb": 520,
"license": "AGPLv3",
"icon": "https://lh3.googleusercontent.com/aida/AEtjO1VKuphtTswgrzdubG5GP40se6rWNSEDBpT8yQaRKXCe1I4viol3q2Mf8MfVnMl7zLeHPaLKIKYiHxqE3e6wDEch1xMM4UL64N6nb-g1TaPZKldlBTdBl13Acbg7Yj1S1nRZWEToR6HcqdipU2wKDL3OJskj2RDyhWO0eQ_WsjGevNiB8CJ8l76mcBY6Oq1LEEqcg6NuUArWe5tV-wEYlnf33Rpdz5hwAK8J3giORtJIW5ewwRdW",
"screenshots": [],
"firstStartTip": "Lors de la première ouverture, créez votre compte administrateur. Vos fichiers sont automatiquement sauvegardés sur /mnt/storage/cloud.",
"composeFile": "docker-compose.yml",
"nginx": {
"recommendedSubdomain": "cloud",
"enableSsl": true,
"mainPort": 80
},
"ports": [
{
"name": "Interface Web",
"description": "Port HTTP Nextcloud",
"privatePort": 80,
"defaultPublicPort": 8080,
"type": "tcp",
"protocol": "http",
"isDefaultNginxTarget": true
}
],
"volumes": [
{
"defaultHostPath": "/mnt/storage/cloud/data",
"containerPath": "/var/www/html/data",
"description": "Répertoire des fichiers utilisateurs",
"required": true
},
{
"defaultHostPath": "/mnt/storage/cloud/config",
"containerPath": "/var/www/html/config",
"description": "Configuration du serveur",
"required": true
}
],
"env": [
{
"key": "MYSQL_DATABASE",
"defaultValue": "nextcloud",
"label": "Base de données",
"required": true
},
{
"key": "OVERWRITEPROTOCOL",
"defaultValue": "https",
"label": "Protocole forcé",
"required": false
}
]
}

View File

@@ -0,0 +1,13 @@
services:
nextcloud:
image: nextcloud:apache
container_name: nextcloud
restart: unless-stopped
ports:
- "${NEXTCLOUD_PORT:-8080}:80"
volumes:
- "${NEXTCLOUD_DATA_PATH:-/mnt/storage/cloud/data}:/var/www/html/data"
- "${NEXTCLOUD_CONFIG_PATH:-/mnt/storage/cloud/config}:/var/www/html/config"
environment:
- MYSQL_DATABASE=${MYSQL_DATABASE:-nextcloud}
- OVERWRITEPROTOCOL=${OVERWRITEPROTOCOL:-https}

View File

@@ -0,0 +1,70 @@
{
"$schema": "../../schemas/app-template.schema.json",
"id": "plex",
"name": "Plex Media Server",
"tagline": "Plateforme multimédia de streaming personnel et transcodage",
"description": "Organisez vos collections vidéo et audio avec transcodage matériel haute définition et accès à distance.",
"longDescription": "Plex organise vos vidéos, musiques et photos et vous permet de les diffuser sur smart TV, smartphones, tablettes et ordinateurs avec récupération automatique des jaquettes et résumés.",
"category": "media",
"version": "1.40.4",
"developer": "Plex Inc.",
"website": "https://plex.tv",
"rating": 4.8,
"downloads": "2.5M",
"sizeMb": 450,
"license": "Propriétaire",
"icon": "https://lh3.googleusercontent.com/aida-public/AB6AXuDie89CF9NDXhXh2iF45jSzhlPVthvKISdkuigCYrgE2MDuWB9vM5PDXW9YveUs6cYM3N7jcJeIc65oJA0o3RdU7zkxBxfMyrkY-ptnzW0oXmrabRFTNjb-yZhouMULt5WPh6VkbJikBwx4UlY-w5Nq9Dgn1HpG2n9VQQ_gC9mX38oC3J2PucdHllx8ar_NpLd5VwRI76ay0YCV8fwy9-B8MdkeDjvKcCn4ty9O5_te_7Cj32fLFDH8eQ",
"screenshots": [],
"firstStartTip": "Connectez votre compte Plex et associez votre serveur pour profiter du transcodage et de l'accès distant.",
"composeFile": "docker-compose.yml",
"nginx": {
"recommendedSubdomain": "plex",
"enableSsl": true,
"mainPort": 32400
},
"ports": [
{
"name": "Web UI",
"description": "Interface Web Plex",
"privatePort": 32400,
"defaultPublicPort": 32400,
"type": "tcp",
"protocol": "http",
"isDefaultNginxTarget": true
}
],
"volumes": [
{
"defaultHostPath": "/mnt/storage/media/movies",
"containerPath": "/movies",
"description": "Films & Vidéos",
"required": true
},
{
"defaultHostPath": "/mnt/storage/media/tv",
"containerPath": "/tv",
"description": "Séries TV",
"required": true
},
{
"defaultHostPath": "/mnt/storage/configs/plex",
"containerPath": "/config",
"description": "Métadonnées et base Plex",
"required": true
}
],
"env": [
{
"key": "VERSION",
"defaultValue": "docker",
"label": "Version channel",
"required": false
},
{
"key": "PLEX_CLAIM",
"defaultValue": "",
"label": "Code Claim Plex.tv",
"required": false
}
]
}

View File

@@ -0,0 +1,14 @@
services:
plex:
image: lscr.io/linuxserver/plex:latest
container_name: plex
restart: unless-stopped
ports:
- "${PLEX_PORT:-32400}:32400"
volumes:
- "${PLEX_CONFIG_PATH:-/mnt/storage/plex/config}:/config"
- "${PLEX_MEDIA_PATH:-/mnt/storage/media}:/media"
environment:
- PUID=1000
- PGID=1000
- TZ=${TZ:-Europe/Paris}

View File

@@ -0,0 +1,51 @@
{
"$schema": "../../schemas/app-template.schema.json",
"id": "portainer",
"name": "Portainer CE",
"tagline": "Gestionnaire et tableau de bord de conteneurs Docker",
"description": "Interface graphique intuitive pour gérer vos conteneurs, images, volumes et réseaux Docker.",
"longDescription": "Portainer Community Edition est l'outil visuel le plus populaire pour gérer facilement les environnements Docker. Déployez des stacks Docker Compose, visualisez les logs en temps réel et surveillez l'utilisation des ressources.",
"category": "utilities",
"version": "2.21.3",
"developer": "Portainer.io",
"website": "https://portainer.io",
"rating": 4.9,
"downloads": "4.5M",
"sizeMb": 280,
"license": "zlib",
"icon": "https://lh3.googleusercontent.com/aida/AEtjO1VKuphtTswgrzdubG5GP40se6rWNSEDBpT8yQaRKXCe1I4viol3q2Mf8MfVnMl7zLeHPaLKIKYiHxqE3e6wDEch1xMM4UL64N6nb-g1TaPZKldlBTdBl13Acbg7Yj1S1nRZWEToR6HcqdipU2wKDL3OJskj2RDyhWO0eQ_WsjGevNiB8CJ8l76mcBY6Oq1LEEqcg6NuUArWe5tV-wEYlnf33Rpdz5hwAK8J3giORtJIW5ewwRdW",
"screenshots": [],
"firstStartTip": "Créez votre mot de passe administrateur dans les 5 minutes suivant le premier démarrage pour sécuriser l'accès.",
"composeFile": "docker-compose.yml",
"nginx": {
"recommendedSubdomain": "portainer",
"enableSsl": true,
"mainPort": 9443
},
"ports": [
{
"name": "Web UI",
"description": "Interface d'administration HTTPS",
"privatePort": 9443,
"defaultPublicPort": 9443,
"type": "tcp",
"protocol": "https",
"isDefaultNginxTarget": true
}
],
"volumes": [
{
"defaultHostPath": "/var/run/docker.sock",
"containerPath": "/var/run/docker.sock",
"description": "Socket Docker de l'hôte",
"required": true
},
{
"defaultHostPath": "/mnt/storage/configs/portainer",
"containerPath": "/data",
"description": "Données et configuration de Portainer",
"required": true
}
],
"env": []
}

View File

@@ -0,0 +1,10 @@
services:
portainer:
image: portainer/portainer-ce:latest
container_name: portainer
restart: unless-stopped
ports:
- "${PORTAINER_PORT:-9443}:9443"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
- "${PORTAINER_DATA_PATH:-/mnt/storage/portainer/data}:/data"

View File

@@ -0,0 +1,58 @@
{
"$schema": "../../schemas/app-template.schema.json",
"id": "qbittorrent",
"name": "qBittorrent Web",
"tagline": "Client BitTorrent haute performance avec interface web",
"description": "Téléchargez vos fichiers et distributions Linux avec gestion avancée des vitesses et planificateur.",
"longDescription": "Client BitTorrent open source écrit en C++ avec interface web réactive, support du chiffrement, gestion des flux RSS et moteur de recherche intégré.",
"category": "utilities",
"version": "4.6.6",
"developer": "qBittorrent Project",
"website": "https://qbittorrent.org",
"rating": 4.8,
"downloads": "1.3M",
"sizeMb": 110,
"license": "GPLv2",
"icon": "https://lh3.googleusercontent.com/aida-public/AB6AXuCT_RD64GcIA6XYx304uhwSN58YeNQYcgKoGBcwIaVjUusiCgx6GeRuwQ8D58ToYJhxmiS-mJynVz630mZ3kT1bgJe4-qtEbJsMWZYSIxb7aPk-Q3zpoDxfBkEk3vrUM1qznvIDP6KMVounJoAVpka5oKZSrk6pZxlXV3mIMg5yDNqkD39D_Fg4tTStU2T5k2F1SyIYrHRcyAswaevLJDGxlEujRu6GP1CadLUl9gul1c4MheqSMKE4eg",
"screenshots": [],
"firstStartTip": "Identifiants par défaut : Nom d'utilisateur 'admin' et mot de passe temporaire affiché dans les logs du conteneur.",
"composeFile": "docker-compose.yml",
"nginx": {
"recommendedSubdomain": "torrents",
"enableSsl": true,
"mainPort": 8080
},
"ports": [
{
"name": "Web UI",
"description": "Interface Web qBittorrent",
"privatePort": 8080,
"defaultPublicPort": 8085,
"type": "tcp",
"protocol": "http",
"isDefaultNginxTarget": true
}
],
"volumes": [
{
"defaultHostPath": "/mnt/storage/downloads",
"containerPath": "/downloads",
"description": "Dossier des téléchargements",
"required": true
},
{
"defaultHostPath": "/mnt/storage/configs/qbittorrent",
"containerPath": "/config",
"description": "Configuration client",
"required": true
}
],
"env": [
{
"key": "WEBUI_PORT",
"defaultValue": "8080",
"label": "Port interne WebUI",
"required": false
}
]
}

View File

@@ -0,0 +1,15 @@
services:
qbittorrent:
image: lscr.io/linuxserver/qbittorrent:latest
container_name: qbittorrent
restart: unless-stopped
ports:
- "${QBIT_WEBUI_PORT:-8085}:8080"
volumes:
- "${QBIT_CONFIG_PATH:-/mnt/storage/qbittorrent/config}:/config"
- "${QBIT_DOWNLOADS_PATH:-/mnt/storage/downloads}:/downloads"
environment:
- PUID=1000
- PGID=1000
- TZ=${TZ:-Europe/Paris}
- WEBUI_PORT=8080

View File

@@ -0,0 +1,78 @@
{
"$schema": "../../schemas/app-template.schema.json",
"id": "retroarch",
"name": "RetroArch Cloud Gaming",
"tagline": "Émulateur multi-système avec streaming Web & saves serveur",
"description": "Jouez à vos classiques rétro (SNES, GBA, PS1, Mega Drive, Arcade) directement dans votre navigateur avec vos sauvegardes centralisées sur Irbis OS.",
"longDescription": "RetroArch est le frontend de référence pour les émulateurs de jeux vidéo. Cette intégration Docker conteneurisée pour Irbis OS permet de lancer vos jeux stockés sur le serveur tout en conservant toutes vos sauvegardes et savestates sur votre NAS, avec accès web KasmVNC/WebGL et support complet des manettes de jeu.",
"category": "media",
"version": "1.19.1",
"developer": "Libretro Team",
"website": "https://www.retroarch.com",
"rating": 4.9,
"downloads": "850K",
"sizeMb": 420,
"license": "GPLv3",
"icon": "https://raw.githubusercontent.com/libretro/RetroArch/master/media/retroarch.png",
"screenshots": [],
"firstStartTip": "Ouvrez l'application Irbis Games pour configurer votre dossier de jeux et lancer vos ROMs d'un simple clic.",
"composeFile": "docker-compose.yml",
"nginx": {
"recommendedSubdomain": "games",
"enableSsl": true,
"mainPort": 3000
},
"ports": [
{
"name": "Web UI",
"description": "Interface Web RetroArch KasmVNC HTTP",
"privatePort": 3000,
"defaultPublicPort": 3000,
"type": "tcp",
"protocol": "http",
"isDefaultNginxTarget": true
},
{
"name": "HTTPS UI",
"description": "Interface Web RetroArch HTTPS",
"privatePort": 3001,
"defaultPublicPort": 3001,
"type": "tcp",
"protocol": "https"
}
],
"volumes": [
{
"defaultHostPath": "/mnt/storage/games/roms",
"containerPath": "/roms",
"description": "Dossier des ROMs de jeux",
"required": true
},
{
"defaultHostPath": "/mnt/storage/games/saves",
"containerPath": "/saves",
"description": "Dossier des sauvegardes de jeux",
"required": true
},
{
"defaultHostPath": "/mnt/storage/configs/retroarch",
"containerPath": "/config",
"description": "Configuration & Cores RetroArch",
"required": true
}
],
"env": [
{
"key": "CUSTOM_USER",
"defaultValue": "",
"label": "Utilisateur KasmVNC (Optionnel)",
"required": false
},
{
"key": "PASSWORD",
"defaultValue": "",
"label": "Mot de passe Web (Optionnel)",
"required": false
}
]
}

View File

@@ -0,0 +1,21 @@
services:
retroarch:
image: lscr.io/linuxserver/retroarch:latest
container_name: retroarch
restart: unless-stopped
security_opt:
- seccomp:unconfined
environment:
- PUID=1000
- PGID=1000
- TZ=${TZ:-Europe/Paris}
- CUSTOM_USER=${CUSTOM_USER:-}
- PASSWORD=${PASSWORD:-}
volumes:
- "${RETROARCH_CONFIG_PATH:-/mnt/storage/configs/retroarch}:/config"
- "${RETROARCH_ROMS_PATH:-/mnt/storage/games/roms}:/roms"
- "${RETROARCH_SAVES_PATH:-/mnt/storage/games/saves}:/saves"
ports:
- "${RETROARCH_PORT:-3000}:3000"
- "${RETROARCH_HTTPS_PORT:-3001}:3001"
shm_size: "1gb"

View File

@@ -0,0 +1,67 @@
{
"$schema": "../../schemas/app-template.schema.json",
"id": "vaultwarden",
"name": "Vaultwarden",
"tagline": "Gestionnaire de mots de passe Bitwarden auto-hébergé léger",
"description": "Coffre-fort chiffré de bout en bout pour vos identifiants, cartes bancaires et notes sécurisées.",
"longDescription": "Implémentation alternative et ultra-légère de l'API Bitwarden en Rust. Compatible avec toutes les extensions officielles de navigateur, applications iOS, Android et ordinateurs de bureau.",
"category": "security",
"version": "1.32.1",
"developer": "Dani Garcia",
"website": "https://github.com/dani-garcia/vaultwarden",
"rating": 4.9,
"downloads": "950K",
"sizeMb": 85,
"license": "AGPLv3",
"icon": "https://lh3.googleusercontent.com/aida-public/AB6AXuCBj60zmHuzKE1qGtiHzWbH-r-GphCWZzJ38IEgFQU7bjZjZVmDasLyDQNkw6nx7k_z-fil8QsDR_6FGAMYzV3ZUSkadmoELAxpSLzc3zM5mejhGTJaO4PnPmSGwz0l6PfEEC7JSWREk2-ZVqjW9ZCmNrmYsYsjseUJD1eMZgaCxJbM6T6WXvSkkpq3V2P8jR-aAhVNkcQWyaS7R1wYwS7jHi5ZJEpJ_HxYwCaUmsXCXkzlEB1x8zCH8Wc5zee3oPoZQMw",
"screenshots": [],
"firstStartTip": "Pour une sécurité optimale, utilisez un nom de domaine avec SSL (HTTPS obligatoire pour le chiffrement Bitwarden). Créez ensuite votre coffre-fort.",
"composeFile": "docker-compose.yml",
"nginx": {
"recommendedSubdomain": "vault",
"enableSsl": true,
"mainPort": 80
},
"ports": [
{
"name": "Web UI & API",
"description": "Interface Web & API Vault",
"privatePort": 80,
"defaultPublicPort": 8000,
"type": "tcp",
"protocol": "http",
"isDefaultNginxTarget": true
},
{
"name": "WebSocket",
"description": "Notifications temps réel",
"privatePort": 3012,
"defaultPublicPort": 3012,
"type": "tcp",
"protocol": "http",
"isDefaultNginxTarget": false
}
],
"volumes": [
{
"defaultHostPath": "/mnt/storage/vaultwarden/data",
"containerPath": "/data",
"description": "Base SQLite chiffrée",
"required": true
}
],
"env": [
{
"key": "WEBSOCKET_ENABLED",
"defaultValue": "true",
"label": "Support WebSocket en direct",
"required": false
},
{
"key": "SIGNUPS_ALLOWED",
"defaultValue": "true",
"label": "Autoriser les inscriptions",
"required": false
}
]
}

View File

@@ -0,0 +1,13 @@
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
ports:
- "${VAULTWARDEN_PORT:-8000}:80"
- "${VAULTWARDEN_WS_PORT:-3012}:3012"
volumes:
- "${VAULTWARDEN_DATA_PATH:-/mnt/storage/vaultwarden/data}:/data"
environment:
- WEBSOCKET_ENABLED=${WEBSOCKET_ENABLED:-true}
- SIGNUPS_ALLOWED=${SIGNUPS_ALLOWED:-true}

View File

@@ -0,0 +1,244 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "https://irbis-os.org/schemas/app-template.schema.json",
"title": "Irbis OS Application Template",
"description": "Schéma de définition pour les applications communautaires de l'App Store Irbis OS",
"type": "object",
"required": [
"id",
"name",
"tagline",
"description",
"category",
"version",
"developer"
],
"additionalProperties": false,
"properties": {
"$schema": {
"type": "string",
"description": "URI du schéma JSON utilisé pour l'auto-complétion et la validation"
},
"id": {
"type": "string",
"pattern": "^[a-z0-9-]+$",
"minLength": 2,
"maxLength": 64,
"description": "Identifiant unique de l'application en minuscules (ex: nextcloud, homeassistant)"
},
"name": {
"type": "string",
"minLength": 2,
"maxLength": 100,
"description": "Nom complet d'affichage de l'application"
},
"tagline": {
"type": "string",
"minLength": 5,
"maxLength": 150,
"description": "Accroche courte résumant la fonction principale de l'application"
},
"description": {
"type": "string",
"minLength": 10,
"maxLength": 500,
"description": "Description concise de l'application (affichée sur la carte)"
},
"longDescription": {
"type": "string",
"minLength": 20,
"maxLength": 4000,
"description": "Description détaillée affichée dans la modale de l'App Store"
},
"icon": {
"type": "string",
"description": "Nom du fichier d'icône/image de garde (ex: icon.png) ou URL directe"
},
"screenshots": {
"type": "array",
"items": {
"type": "string"
},
"description": "Noms des fichiers de captures d'écran de démo (ex: screenshot1.png) ou URLs directes"
},
"firstStartTip": {
"type": "string",
"description": "Astuce et guide de premier démarrage affichés après l'installation"
},
"composeFile": {
"type": "string",
"description": "Nom du fichier Docker Compose dans le dossier de l'app (défaut: docker-compose.yml)"
},
"nginx": {
"type": "object",
"description": "Configuration du domaine et reverse proxy Nginx automatique",
"properties": {
"recommendedSubdomain": {
"type": "string",
"description": "Sous-domaine recommandé (ex: cloud, vault, media)"
},
"enableSsl": {
"type": "boolean",
"description": "Activer le certificat SSL Let's Encrypt / HTTPS par défaut"
},
"mainPort": {
"type": "integer",
"description": "Port cible principal pour le reverse proxy Nginx"
}
}
},
"category": {
"type": "string",
"enum": ["media", "cloud", "productivity", "security", "utilities", "development", "home_automation", "network"],
"description": "Catégorie de l'application dans l'App Store"
},
"version": {
"type": "string",
"pattern": "^[a-zA-Z0-9.-]+$",
"description": "Version du paquet ou du conteneur (ex: 1.0.0, stable, 2024.9.0)"
},
"developer": {
"type": "string",
"minLength": 2,
"maxLength": 100,
"description": "Nom de l'auteur, de l'entreprise ou du projet open source"
},
"website": {
"type": "string",
"format": "uri",
"description": "Site web officiel ou dépôt GitHub de l'application"
},
"rating": {
"type": "number",
"minimum": 1.0,
"maximum": 5.0,
"description": "Note moyenne indicative (entre 1.0 et 5.0)"
},
"downloads": {
"type": "string",
"description": "Indication du volume d'utilisateurs ou téléchargements (ex: 1.2M, 500K)"
},
"sizeMb": {
"type": "number",
"minimum": 1,
"maximum": 50000,
"description": "Taille estimée de l'image Docker en mégaoctets"
},
"license": {
"type": "string",
"description": "Licence logicielle (ex: MIT, AGPLv3, Apache-2.0, Propriétaire)"
},
"image": {
"type": "string",
"minLength": 3,
"maxLength": 255,
"description": "Image Docker officielle ou vérifiée (ex: nextcloud:apache, lscr.io/linuxserver/plex:latest)"
},
"defaultPort": {
"type": "integer",
"minimum": 1,
"maximum": 65535,
"description": "Port d'écoute public principal par défaut"
},
"ports": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": ["privatePort", "defaultPublicPort"],
"additionalProperties": false,
"properties": {
"name": {
"type": "string",
"description": "Nom lisible du service réseau (ex: Web UI, API, DNS)"
},
"privatePort": {
"type": "integer",
"minimum": 1,
"maximum": 65535,
"description": "Port interne du conteneur Docker"
},
"defaultPublicPort": {
"type": "integer",
"minimum": 1,
"maximum": 65535,
"description": "Port hôte suggéré par défaut"
},
"description": {
"type": "string",
"description": "Description du rôle du port (ex: Interface Web, Flux RTSP, WebSocket)"
},
"type": {
"type": "string",
"enum": ["tcp", "udp"],
"description": "Protocole de transport réseau du port"
},
"protocol": {
"type": "string",
"enum": ["http", "https", "tcp", "udp"],
"description": "Protocole applicatif pour la redirection Nginx"
},
"isDefaultNginxTarget": {
"type": "boolean",
"description": "Indique si ce port est la cible principale du domaine Nginx automatique"
}
}
}
},
"volumes": {
"type": "array",
"items": {
"type": "object",
"required": ["defaultHostPath", "containerPath", "required"],
"additionalProperties": false,
"properties": {
"defaultHostPath": {
"type": "string",
"pattern": "^/.*",
"description": "Chemin hôte recommandé pour les données persistantes (généralement sous /mnt/storage/...)"
},
"containerPath": {
"type": "string",
"pattern": "^/.*",
"description": "Chemin absolu de destination à l'intérieur du conteneur"
},
"description": {
"type": "string",
"description": "Explication de la destination (ex: Répertoire des photos, Base de données)"
},
"required": {
"type": "boolean",
"description": "Indique si ce volume est indispensable au bon fonctionnement"
}
}
}
},
"env": {
"type": "array",
"items": {
"type": "object",
"required": ["key", "defaultValue", "label", "required"],
"additionalProperties": false,
"properties": {
"key": {
"type": "string",
"pattern": "^[A-Z0-9_]+$",
"description": "Nom de la variable d'environnement (ex: TZ, DB_NAME)"
},
"defaultValue": {
"type": "string",
"description": "Valeur par défaut ou exemple"
},
"label": {
"type": "string",
"description": "Nom convivial affiché dans l'interface"
},
"required": {
"type": "boolean",
"description": "Indique si la variable est obligatoire"
}
}
}
}
}
}