feat: integrate Leantime project management via MCP (leantime-mcp + MCPO)
- Add leantime-mcp Dockerfile (daniel-eder/leantime-mcp, SSE transport) - Add leantime-mcp service to docker-compose.yml on effi-net - Add Leantime env vars to .env.example (API_KEY, USER_EMAIL, URL) - Update services.md: Leantime + leantime-mcp entries, dependency diagram, resource table - Update mcp-et-n8n.md: MCPO config with leantime SSE server, new leantime-mcp section - Add LEANTIME-INSTALLATION.md: full reinstall guide (XPenology + MCP)
This commit is contained in:
@@ -0,0 +1,286 @@
|
||||
# Installation Leantime + MCP Integration
|
||||
|
||||
Ce document decrit l'installation complete de Leantime sur XPenology NAS et l'integration MCP avec Effi (Open WebUI via MCPO).
|
||||
|
||||
## Architecture
|
||||
|
||||
```
|
||||
Open WebUI (effi-server:3000)
|
||||
→ MCPO (effi-server:8000)
|
||||
→ leantime-mcp (effi-server:8079, SSE)
|
||||
→ Leantime API (XPenology NAS:8380)
|
||||
```
|
||||
|
||||
## Partie 1 : Installation Leantime sur XPenology NAS
|
||||
|
||||
### Prerequis
|
||||
|
||||
- XPenology NAS avec Docker (DSM 7.2+)
|
||||
- Acces SSH au NAS
|
||||
- Reseau local : XPenology sur `192.168.1.25`
|
||||
|
||||
### 1. Creer le repertoire de configuration
|
||||
|
||||
```bash
|
||||
ssh admin@192.168.1.25
|
||||
sudo mkdir -p /volume1/docker/leantime
|
||||
cd /volume1/docker/leantime
|
||||
```
|
||||
|
||||
### 2. Creer le fichier `.env`
|
||||
|
||||
```bash
|
||||
cat > .env << 'EOF'
|
||||
LEANTIME_HOST=http://leantime:8380
|
||||
LEAN_DB_HOST=mysql-leantime
|
||||
LEAN_DB_USER=leantime
|
||||
LEAN_DB_PASSWORD=CHANGEZ_MOI_mot_de_passe_securise
|
||||
LEAN_DB_DATABASE=leantime
|
||||
LEAN_DB_PORT=3306
|
||||
LEAN_DEFAULT_TIMEZONE=Europe/Paris
|
||||
MYSQL_ROOT_PASSWORD=CHANGEZ_MOI_mot_de_passe_root_securise
|
||||
MYSQL_DATABASE=leantime
|
||||
MYSQL_USER=leantime
|
||||
MYSQL_PASSWORD=CHANGEZ_MOI_mot_de_passe_securise
|
||||
EOF
|
||||
```
|
||||
|
||||
**Important :** `LEAN_DB_PASSWORD` et `MYSQL_PASSWORD` doivent etre identiques. `MYSQL_ROOT_PASSWORD` est distinct.
|
||||
|
||||
### 3. Creer le `docker-compose.yml`
|
||||
|
||||
```yaml
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
mysql-leantime:
|
||||
image: mysql:8.4
|
||||
container_name: mysql-leantime
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
|
||||
MYSQL_DATABASE: ${MYSQL_DATABASE}
|
||||
MYSQL_USER: ${MYSQL_USER}
|
||||
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
|
||||
volumes:
|
||||
- leantime-db-data:/var/lib/mysql
|
||||
networks:
|
||||
- leantime-net
|
||||
|
||||
leantime:
|
||||
image: leantime/leantime:latest
|
||||
container_name: leantime
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
- mysql-leantime
|
||||
environment:
|
||||
LEAN_DB_HOST: ${LEAN_DB_HOST}
|
||||
LEAN_DB_USER: ${LEAN_DB_USER}
|
||||
LEAN_DB_PASSWORD: ${LEAN_DB_PASSWORD}
|
||||
LEAN_DB_DATABASE: ${LEAN_DB_DATABASE}
|
||||
LEAN_DB_PORT: ${LEAN_DB_PORT}
|
||||
LEAN_DEFAULT_TIMEZONE: ${LEAN_DEFAULT_TIMEZONE}
|
||||
ports:
|
||||
- "8380:80"
|
||||
networks:
|
||||
- leantime-net
|
||||
|
||||
volumes:
|
||||
leantime-db-data:
|
||||
|
||||
networks:
|
||||
leantime-net:
|
||||
driver: bridge
|
||||
```
|
||||
|
||||
**Notes :**
|
||||
- Port 8380 pour eviter les conflits avec DSM (port 80/443)
|
||||
- Volume nomme `leantime-db-data` (pas bind mount) pour eviter les problemes de permissions Synology
|
||||
- Reseau interne `leantime-net` pour isolation
|
||||
|
||||
### 4. Lancer Leantime
|
||||
|
||||
```bash
|
||||
# Premier lancement (initialisation de la base)
|
||||
docker compose up -d
|
||||
|
||||
# Attendre ~30s que MySQL s'initialise, puis verifier :
|
||||
docker logs mysql-leantime --tail 5
|
||||
docker logs leantime --tail 10
|
||||
```
|
||||
|
||||
### 5. Creer le compte admin
|
||||
|
||||
1. Ouvrir `http://192.168.1.25:8380`
|
||||
2. Suivre l'assistant de premier lancement
|
||||
3. Creer le compte admin
|
||||
|
||||
### 6. Generer la cle API
|
||||
|
||||
1. Se connecter en admin
|
||||
2. Aller dans **Company > API Keys**
|
||||
3. Creer une nouvelle cle
|
||||
4. Noter la cle (elle sera utilisee dans `.env` d'Effi)
|
||||
|
||||
### Problemes connus (XPenology)
|
||||
|
||||
#### Erreur "Access denied for user"
|
||||
- Verifier que `MYSQL_PASSWORD` et `LEAN_DB_PASSWORD` sont identiques
|
||||
- Si la base existe deja, verifier les credentials : `docker exec -it mysql-leantime mysql -u leantime -p`
|
||||
|
||||
#### Erreur "data directory has files"
|
||||
- Utiliser un volume nomme Docker (`leantime-db-data`) au lieu d'un bind mount
|
||||
- Les permissions Synology sont incompatibles avec les bind mounts MySQL
|
||||
|
||||
---
|
||||
|
||||
## Partie 2 : Integration MCP sur effi-server
|
||||
|
||||
### Prerequis
|
||||
|
||||
- effi-server (192.168.1.27) avec docker-compose Effi operationnel
|
||||
- Leantime operationnel sur `http://192.168.1.25:8380`
|
||||
- Cle API Leantime generee
|
||||
|
||||
### 1. Ajouter les variables d'environnement
|
||||
|
||||
Sur effi-server, editer `~/effi/.env` :
|
||||
|
||||
```bash
|
||||
# Leantime MCP
|
||||
LEANTIME_URL=http://192.168.1.25:8380
|
||||
LEANTIME_API_KEY=votre_cle_api_leantime_ici
|
||||
LEANTIME_USER_EMAIL=votre_email@example.com
|
||||
```
|
||||
|
||||
### 2. Construire l'image leantime-mcp
|
||||
|
||||
Le Dockerfile est dans `leantime-mcp/Dockerfile` :
|
||||
|
||||
```dockerfile
|
||||
FROM python:3.12-slim
|
||||
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends git && rm -rf /var/lib/apt/lists/*
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
RUN git clone https://github.com/daniel-eder/leantime-mcp.git && \
|
||||
cd leantime-mcp && \
|
||||
pip install --no-cache-dir fastmcp && \
|
||||
pip install --no-cache-dir -e .
|
||||
|
||||
WORKDIR /app/leantime-mcp
|
||||
|
||||
EXPOSE 8079
|
||||
|
||||
CMD ["fastmcp", "run", "src/leantime_mcp/server.py:app", "--transport", "sse", "--port", "8079", "--host", "0.0.0.0"]
|
||||
```
|
||||
|
||||
**Note :** Le transport SSE est obligatoire car MCPO ne supporte pas StreamableHTTP.
|
||||
|
||||
### 3. Configurer MCPO
|
||||
|
||||
Le fichier `mcpo-config/config.json` (sur le serveur, gitignore) :
|
||||
|
||||
```json
|
||||
{
|
||||
"mcpServers": {
|
||||
"leantime": {
|
||||
"url": "http://leantime-mcp:8079/sse",
|
||||
"transport": "sse"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 4. Lancer les conteneurs
|
||||
|
||||
```bash
|
||||
cd ~/effi
|
||||
|
||||
# Construire leantime-mcp
|
||||
docker compose build leantime-mcp
|
||||
|
||||
# Lancer tout
|
||||
docker compose up -d leantime-mcp mcpo
|
||||
|
||||
# Verifier les logs
|
||||
docker logs effi-leantime-mcp --tail 10
|
||||
docker logs mcpo --tail 15
|
||||
```
|
||||
|
||||
### 5. Verifier la connexion
|
||||
|
||||
```bash
|
||||
# Tester l'endpoint MCPO
|
||||
curl -s http://192.168.1.27:8000/v1/tools | jq '.[].name'
|
||||
|
||||
# Doit retourner les outils Leantime :
|
||||
# list_projects, create_project, list_tickets, etc.
|
||||
```
|
||||
|
||||
### 6. Tester dans Open WebUI
|
||||
|
||||
Dans un chat avec Effi, demander :
|
||||
- "Liste mes projets Leantime"
|
||||
- "Cree un projet blablabla"
|
||||
- "Quelles sont les taches du projet X ?"
|
||||
|
||||
---
|
||||
|
||||
## Problemes connus (MCP)
|
||||
|
||||
#### Erreur 400 Bad Request entre MCPO et leantime-mcp
|
||||
- **Cause** : Incompatibilite de protocole (SSE vs StreamableHTTP)
|
||||
- **Solution** : Verifier que leantime-mcp utilise `--transport sse` dans le Dockerfile et que MCPO pointe vers `/sse`
|
||||
|
||||
#### mcpo-patch.sh est un dossier au lieu d'un fichier
|
||||
- **Cause** : Conflit Docker quand le fichier n'existe pas encore
|
||||
- **Solution** : `docker compose down`, supprimer le dossier, recreer le fichier, puis `docker compose up -d`
|
||||
|
||||
#### Module leantime_mcp introuvable
|
||||
- **Cause** : Mauvais WORKDIR ou mauvais chemin dans CMD
|
||||
- **Solution** : Verifier que WORKDIR est `/app/leantime-mcp` et que le module s'installe avec `pip install -e .`
|
||||
|
||||
---
|
||||
|
||||
## Ports recapitulatifs
|
||||
|
||||
| Service | Hote | Port | Protocole |
|
||||
|---------|------|------|-----------|
|
||||
| Leantime Web UI | XPenology NAS | 8380 | HTTP |
|
||||
| Leantime MySQL | XPenology NAS | 3306 (interne) | MySQL |
|
||||
| leantime-mcp | effi-server | 8079 | SSE (MCP) |
|
||||
| MCPO | effi-server | 8000 | HTTP (OpenAI-compatible) |
|
||||
|
||||
---
|
||||
|
||||
## Reinstallation rapide
|
||||
|
||||
Si vous devez tout reinstaller :
|
||||
|
||||
```bash
|
||||
# Sur effi-server
|
||||
cd ~/effi
|
||||
|
||||
# Arreter les conteneurs concernes
|
||||
docker compose down leantime-mcp mcpo
|
||||
|
||||
# Reconstruire leantime-mcp
|
||||
docker compose build leantime-mcp --no-cache
|
||||
|
||||
# Relancer
|
||||
docker compose up -d leantime-mcp mcpo
|
||||
|
||||
# Verifier
|
||||
docker logs mcpo -f --tail 20
|
||||
```
|
||||
|
||||
```bash
|
||||
# Sur XPenology (si reinstalle completement)
|
||||
cd /volume1/docker/leantime
|
||||
|
||||
# ATTENTION : detruit les donnees
|
||||
docker compose down -v
|
||||
docker compose up -d
|
||||
```
|
||||
Reference in New Issue
Block a user