Compare commits
242 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d65b34a605 | |||
| e80f9b6eb8 | |||
| bc51913e94 | |||
| 875378de86 | |||
| efaa3cabfc | |||
| 0fdeb37d85 | |||
| af321e42fd | |||
| aafa7baaff | |||
| 123444aa15 | |||
| 522522b031 | |||
| eccc990416 | |||
| b90021d70b | |||
| b778083e0f | |||
| af352acc62 | |||
| aef1088c95 | |||
| e21c28ce2a | |||
| 4e91044395 | |||
| a42f319f29 | |||
| b091eb48db | |||
| 98389c4a2d | |||
| 556b0b5586 | |||
| 45a2ea1588 | |||
| 9020c2c64f | |||
| c824f9d189 | |||
| 3fe61eefb3 | |||
| cdec479d62 | |||
| 78c1ccdae0 | |||
| 2fba7716da | |||
| bc9e8ad55a | |||
| 4d47bbdd54 | |||
| f06cbe68e4 | |||
| 6eb3f4b99b | |||
| 42682b60b1 | |||
| 438a42bcb3 | |||
| 010584c7e5 | |||
| 6eb6b76db9 | |||
| 4e04d8fe11 | |||
| 5fecf9ba6b | |||
| ecd85f401d | |||
| ee42583c3e | |||
| 2f118450b5 | |||
| d76e447a9c | |||
| 2d69ba148f | |||
| 7f8b674c07 | |||
| 6975217c47 | |||
| 459b6fd81f | |||
| f8edceba3d | |||
| 9e8f15095c | |||
| b36cabfc99 | |||
| 03071d4fd8 | |||
| f9e028ea9d | |||
| 7056efb809 | |||
| 244631b5fa | |||
| c390a7557b | |||
| 68d83c751d | |||
| eeb8b4cc76 | |||
| 09b1b7a1f6 | |||
| c60e0c00c1 | |||
| 5797650363 | |||
| 12de3157ab | |||
| 57062be9ac | |||
| 9ab72d9153 | |||
| edafa6e75e | |||
| d2609f60fe | |||
| 507b446d61 | |||
| fa491a7856 | |||
| dbb4e70922 | |||
| 1c583373d2 | |||
| f3cdd5f241 | |||
| ca8c9772ae | |||
| 0688ef2ea4 | |||
| d60372f9c9 | |||
| fa40e98fb0 | |||
| f3ee9bc683 | |||
| 1df1d6fe77 | |||
| 91f678c127 | |||
| 862a53a6df | |||
| 8e055d082a | |||
| 090da0b113 | |||
| 3117cec29e | |||
| bdf1562b23 | |||
| c1be2b45f0 | |||
| 62577f9473 | |||
| aa792016c1 | |||
| 8e8d0e2463 | |||
| 83d0310088 | |||
| 9ff641ba8b | |||
| f9aeadfc29 | |||
| 925983c63e | |||
| 935ec3dc1f | |||
| b069033829 | |||
| f33e8f3e71 | |||
| d2fbe9f543 | |||
| d5ed66fa23 | |||
| 2821965e11 | |||
| 09352c20ba | |||
| c8094e0344 | |||
| 155bbfd701 | |||
| 90afa9e540 | |||
| 3370f77a68 | |||
| b3c698bd78 | |||
| ad564c09c4 | |||
| 553be86177 | |||
| 273caba9aa | |||
| 0853992070 | |||
| 4a7df84a99 | |||
| 1970176807 | |||
| 29390614b8 | |||
| 88d1db8c73 | |||
| 1d68ae09f4 | |||
| 2f29f6abdd | |||
| fecd295e76 | |||
| da0d04b80f | |||
| 3069b06b3d | |||
| a5c08791df | |||
| fd590de2b9 | |||
| bf3254a11c | |||
| 972ab8d067 | |||
| ef5a5fa79d | |||
| 47285428aa | |||
| c1386a3d1e | |||
| 4317a4ce8d | |||
| be2a6a0574 | |||
| 546681e4a6 | |||
| d09658cec8 | |||
| 05334196be | |||
| c4cbfe2f24 | |||
| f092ea2137 | |||
| c3a422a68c | |||
| a54457e9b0 | |||
| da50082eb6 | |||
| b7fdf3102f | |||
| 324f152880 | |||
| def101c0fa | |||
| 55242e717b | |||
| 6b6d180019 | |||
| 3036937c72 | |||
| 332c4479ad | |||
| da79d44b0a | |||
| 6c9bf4f590 | |||
| b9d358fa27 | |||
| 13ccdbe74a | |||
| 1b6add9256 | |||
| b1846b04b9 | |||
| a1b030d091 | |||
| 0e9b0d09a2 | |||
| 0ccacb1f0c | |||
| 574fffd485 | |||
| c069820354 | |||
| 8a2e6d3ba5 | |||
| 57870709cc | |||
| cbb7107fbc | |||
| 19866f6d00 | |||
| a0b53d0c0f | |||
| 44ac17fc26 | |||
| 6ab8ebd15c | |||
| c9e70f6f2b | |||
| 6bf5b6d438 | |||
| 6440ccc500 | |||
| a683e2a57e | |||
| ef4c6137a1 | |||
| 6c15d4987a | |||
| f4b58b10cb | |||
| f4aa1fcd39 | |||
| aaa9865617 | |||
| 0ad1cc6184 | |||
| fce55a6fe1 | |||
| 3976ab7899 | |||
| 5d8d054bb0 | |||
| bcb44de119 | |||
| 29e92dda9c | |||
| 53389d73fe | |||
| 9bc101ef39 | |||
| cb2d2928f1 | |||
| c94d35a9ae | |||
| f639df9006 | |||
| 765c7b60ac | |||
| 4544d1c76a | |||
| 1ed62d3210 | |||
| cc77f57a0c | |||
| ce8beba2f3 | |||
| f77b83ca15 | |||
| 8f192f2bb2 | |||
| dc749d2b4b | |||
| 7aecfc8807 | |||
| 39c43097de | |||
| 4e70d197f2 | |||
| a51d19777f | |||
| 705b71b8d9 | |||
| 136e3650e0 | |||
| 4f5ba10054 | |||
| 4ebc955fb9 | |||
| a670f624d9 | |||
| 84af094570 | |||
| 62e22785bd | |||
| f619f3964a | |||
| b5049fbad8 | |||
| d4942d89dc | |||
| e6b679ed80 | |||
| f24c05e59b | |||
| 50e91a470d | |||
| 3ef4555baf | |||
| a873013967 | |||
| 83a2382115 | |||
| 4b81c9a3eb | |||
| b6236626a1 | |||
| f054034d73 | |||
| 6f37aac403 | |||
| ad6386032c | |||
| 5b3d840bd1 | |||
| aa2c63ca3e | |||
| cd800567da | |||
| 358db8fe4e | |||
| ba6d609a88 | |||
| cce17eaef3 | |||
| 5ce7992110 | |||
| d355600d92 | |||
| c9d0cdd960 | |||
| f679a6927a | |||
| 22e5198c91 | |||
| e140687828 | |||
| 81fddd20e6 | |||
| f877238962 | |||
| 7372b9b9e2 | |||
| e6a300f5a8 | |||
| 5491a3a92f | |||
| c703b29fed | |||
| 4fd9e2a11e | |||
| e0dab0c272 | |||
| b94ed546a6 | |||
| 45affb50b7 | |||
| bdfade497b | |||
| 8fe7577eae | |||
| 02403552f4 | |||
| 62063da2d7 | |||
| d43f85de3f | |||
| 0dd99c559e | |||
| 7930d13af1 | |||
| 80fce2005d | |||
| 155634429c | |||
| 8604aa2e09 | |||
| 41222212a5 |
@@ -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`.
|
||||
|
||||
76
community_apps/adguard-home/app.json
Normal file
76
community_apps/adguard-home/app.json
Normal 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
|
||||
}
|
||||
]
|
||||
}
|
||||
12
community_apps/adguard-home/docker-compose.yml
Normal file
12
community_apps/adguard-home/docker-compose.yml
Normal 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"
|
||||
52
community_apps/homeassistant/app.json
Normal file
52
community_apps/homeassistant/app.json
Normal 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
|
||||
}
|
||||
]
|
||||
}
|
||||
11
community_apps/homeassistant/docker-compose.yml
Normal file
11
community_apps/homeassistant/docker-compose.yml
Normal 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}
|
||||
64
community_apps/immich/app.json
Normal file
64
community_apps/immich/app.json
Normal 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
|
||||
}
|
||||
]
|
||||
}
|
||||
13
community_apps/immich/docker-compose.yml
Normal file
13
community_apps/immich/docker-compose.yml
Normal 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}
|
||||
58
community_apps/jellyfin/app.json
Normal file
58
community_apps/jellyfin/app.json
Normal 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
|
||||
}
|
||||
]
|
||||
}
|
||||
12
community_apps/jellyfin/docker-compose.yml
Normal file
12
community_apps/jellyfin/docker-compose.yml
Normal 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}
|
||||
64
community_apps/nextcloud/app.json
Normal file
64
community_apps/nextcloud/app.json
Normal 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
|
||||
}
|
||||
]
|
||||
}
|
||||
13
community_apps/nextcloud/docker-compose.yml
Normal file
13
community_apps/nextcloud/docker-compose.yml
Normal 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}
|
||||
70
community_apps/plex/app.json
Normal file
70
community_apps/plex/app.json
Normal 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
|
||||
}
|
||||
]
|
||||
}
|
||||
14
community_apps/plex/docker-compose.yml
Normal file
14
community_apps/plex/docker-compose.yml
Normal 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}
|
||||
51
community_apps/portainer/app.json
Normal file
51
community_apps/portainer/app.json
Normal 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": []
|
||||
}
|
||||
10
community_apps/portainer/docker-compose.yml
Normal file
10
community_apps/portainer/docker-compose.yml
Normal 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"
|
||||
58
community_apps/qbittorrent/app.json
Normal file
58
community_apps/qbittorrent/app.json
Normal 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
|
||||
}
|
||||
]
|
||||
}
|
||||
17
community_apps/qbittorrent/docker-compose.yml
Normal file
17
community_apps/qbittorrent/docker-compose.yml
Normal file
@@ -0,0 +1,17 @@
|
||||
services:
|
||||
qbittorrent:
|
||||
image: lscr.io/linuxserver/qbittorrent:latest
|
||||
container_name: qbittorrent
|
||||
restart: unless-stopped
|
||||
security_opt:
|
||||
- apparmor:unconfined
|
||||
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
|
||||
79
community_apps/retroarch/app.json
Normal file
79
community_apps/retroarch/app.json
Normal file
@@ -0,0 +1,79 @@
|
||||
{
|
||||
"$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.",
|
||||
"image": "lscr.io/linuxserver/retroarch:latest",
|
||||
"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
|
||||
}
|
||||
]
|
||||
}
|
||||
21
community_apps/retroarch/docker-compose.yml
Normal file
21
community_apps/retroarch/docker-compose.yml
Normal 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"
|
||||
67
community_apps/vaultwarden/app.json
Normal file
67
community_apps/vaultwarden/app.json
Normal 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
|
||||
}
|
||||
]
|
||||
}
|
||||
13
community_apps/vaultwarden/docker-compose.yml
Normal file
13
community_apps/vaultwarden/docker-compose.yml
Normal 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}
|
||||
244
schemas/app-template.schema.json
Normal file
244
schemas/app-template.schema.json
Normal 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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user