# PyNextcloud - API FastAPI pour Nextcloud API REST construite avec FastAPI pour interagir avec un serveur Nextcloud et lister les fichiers et dossiers. ## 📋 PrĂ©requis - Python 3.8 ou supĂ©rieur - Un serveur Nextcloud avec accĂšs API - Identifiants Nextcloud (username et password) ## 🚀 Installation ### 1. CrĂ©er un environnement virtuel ```powershell # CrĂ©er l'environnement virtuel python -m venv venv # Activer l'environnement virtuel .\venv\Scripts\Activate.ps1 ``` ### 2. Installer les dĂ©pendances ```powershell pip install -r requirements.txt ``` ### 3. Configuration CrĂ©ez un fichier `.env` Ă  la racine du projet (vous pouvez copier `env.example`) : ```powershell Copy-Item env.example .env ``` Modifiez le fichier `.env` avec vos informations Nextcloud : ```env NEXTCLOUD_URL=https://votre-serveur-nextcloud.com NEXTCLOUD_USERNAME=votre_username NEXTCLOUD_PASSWORD=votre_password APP_HOST=0.0.0.0 APP_PORT=8000 ``` ## 🎯 Utilisation ### DĂ©marrer le serveur ```powershell # MĂ©thode 1 : Avec uvicorn directement uvicorn main:app --reload --host 0.0.0.0 --port 8000 # MĂ©thode 2 : Avec Python python main.py ``` Le serveur dĂ©marre sur `http://localhost:8000` ### Documentation interactive Une fois le serveur dĂ©marrĂ©, accĂ©dez Ă  : - Documentation Swagger UI : `http://localhost:8000/docs` - Documentation ReDoc : `http://localhost:8000/redoc` ## 🐳 DĂ©ploiement avec Docker ### Avec Docker Compose (Local) ```powershell # 1. Assurez-vous que le fichier .env est configurĂ© Copy-Item env.example .env notepad .env # 2. Construire et lancer le conteneur docker-compose up -d # 3. Voir les logs docker-compose logs -f # 4. ArrĂȘter le conteneur docker-compose down ``` L'API sera accessible sur `http://localhost:8000` ### DĂ©ploiement sur Coolify 🚀 **Configuration Coolify :** 1. **Connectez votre repository Git** Ă  Coolify 2. **Variables d'environnement Ă  dĂ©finir dans Coolify :** ``` NEXTCLOUD_URL=https://votre-serveur-nextcloud.com NEXTCLOUD_USERNAME=votre_username NEXTCLOUD_PASSWORD=votre_password APP_HOST=0.0.0.0 APP_PORT=8000 ``` 3. **Coolify dĂ©tectera automatiquement** le `Dockerfile` et le `docker-compose.yml` 4. **Port Ă  exposer :** 8000 5. **Health check :** `/health` (dĂ©jĂ  configurĂ© dans le docker-compose.yml) **Build automatique :** - Coolify construira automatiquement l'image Ă  chaque push sur la branche configurĂ©e - Le conteneur redĂ©marrera automatiquement en cas d'Ă©chec grĂące au health check ### Construire l'image Docker manuellement ```powershell # Construire l'image docker build -t pynextcloud-api . # Lancer le conteneur docker run -d \ -p 8000:8000 \ --env-file .env \ --name pynextcloud \ pynextcloud-api # Voir les logs docker logs -f pynextcloud ``` ## 📡 Endpoints disponibles ### 1. Route racine ``` GET / ``` Retourne un message d'accueil et le lien vers la documentation. ### 2. Health Check ``` GET /health ``` VĂ©rifie l'Ă©tat de l'API et la connexion Ă  Nextcloud. **RĂ©ponse exemple :** ```json { "status": "healthy", "nextcloud_connected": true } ``` ### 3. Lister un rĂ©pertoire ``` GET /list/{path} ``` Liste tous les fichiers et dossiers d'un rĂ©pertoire Nextcloud. **ParamĂštres :** - `path` : Chemin du rĂ©pertoire (utilisez `/` pour la racine) **Exemples :** ```powershell # Lister la racine curl http://localhost:8000/list/ # Lister le dossier Documents curl http://localhost:8000/list/Documents # Lister un sous-dossier curl http://localhost:8000/list/Documents/MonDossier ``` **RĂ©ponse exemple :** ```json { "path": "/Documents", "total_items": 5, "summary": { "directories": 2, "files": 3 }, "items": [ { "name": "rapport.pdf", "path": "/Documents/rapport.pdf", "is_dir": false, "size": 1024567, "content_type": "application/pdf", "last_modified": "2025-10-20T10:30:00", "etag": "abc123" }, { "name": "Images", "path": "/Documents/Images", "is_dir": true, "size": 0, "content_type": null, "last_modified": "2025-10-19T15:20:00", "etag": "def456" } ] } ``` ### 4. Informations sur un fichier/dossier ``` GET /info/{path} ``` Obtient les informations dĂ©taillĂ©es d'un fichier ou dossier spĂ©cifique. **Exemples :** ```powershell curl http://localhost:8000/info/Documents/rapport.pdf ``` ### 5. Upload un fichier ``` POST /upload ``` Upload un fichier vers un dossier Nextcloud. **ParamĂštres (form-data) :** - `file` : Le fichier Ă  uploader **(requis)** - `path` : Chemin du dossier de destination (ex: `/Documents`) **(requis)** - `filename` : Nom du fichier (optionnel, utilise le nom original si non spĂ©cifiĂ©) **Exemples :** ```powershell # Upload simple $file = Get-Item "C:\chemin\vers\monfichier.pdf" $form = @{ file = $file path = "/Documents" } Invoke-WebRequest -Uri "http://localhost:8000/upload" -Method POST -Form $form # Upload avec renommage $form = @{ file = Get-Item "C:\chemin\vers\rapport.pdf" path = "/Documents/Projets" filename = "rapport_annuel_2025.pdf" } Invoke-WebRequest -Uri "http://localhost:8000/upload" -Method POST -Form $form ``` **Dans Postman :** - Method: **POST** - URL: `http://localhost:8000/upload` - Body: **form-data** | Key | Type | Value | |-----|------|-------| | file | File | *[SĂ©lectionnez votre fichier]* | | path | Text | /Documents | | filename | Text | mon_fichier.pdf *(optionnel)* | **RĂ©ponse exemple :** ```json { "success": true, "message": "Fichier uploadĂ© avec succĂšs", "file": { "name": "rapport_annuel_2025.pdf", "path": "/Documents/Projets/rapport_annuel_2025.pdf", "size": 1024567, "content_type": "application/pdf" } } ``` ## 🔧 Structure du projet ``` PyNextcloud/ │ ├── main.py # Application FastAPI avec auto-chargement des contrĂŽleurs ├── config.py # Configuration de l'application ├── utils.py # Fonctions utilitaires ├── controllers/ # 📁 Dossier des contrĂŽleurs (auto-chargĂ©s) │ ├── __init__.py │ ├── root.py # Route racine │ ├── health.py # Health check │ ├── list.py # Lister les fichiers/dossiers │ ├── info.py # Informations d'un fichier/dossier │ ├── upload.py # Upload de fichiers │ └── debug.py # Routes de dĂ©bogage ├── requirements.txt # DĂ©pendances Python ├── env.example # Exemple de fichier de configuration ├── .env # Configuration (Ă  crĂ©er, non versionnĂ©) ├── Dockerfile # 🐳 Image Docker ├── docker-compose.yml # 🐳 Configuration Docker Compose ├── .dockerignore # Fichiers Ă  ignorer pour Docker ├── .gitignore # Fichiers Ă  ignorer pour Git └── README.md # Ce fichier ``` ### 🎯 Architecture modulaire avec auto-chargement Le projet utilise une architecture modulaire oĂč tous les contrĂŽleurs dans le dossier `controllers/` sont **automatiquement chargĂ©s** au dĂ©marrage. **Pour ajouter un nouveau endpoint :** 1. CrĂ©ez un nouveau fichier dans `controllers/`, par exemple `controllers/mon_endpoint.py` 2. CrĂ©ez un `router` FastAPI dans ce fichier 3. C'est tout ! Le contrĂŽleur sera automatiquement chargĂ© au dĂ©marrage **Exemple de nouveau contrĂŽleur :** ```python # controllers/mon_endpoint.py from fastapi import APIRouter router = APIRouter() @router.get("/mon-endpoint") async def mon_endpoint(): return {"message": "Mon nouveau endpoint"} ``` ## đŸ› ïž DĂ©pendances principales - **FastAPI** : Framework web moderne et rapide - **Uvicorn** : Serveur ASGI - **nc-py-api** : Client Python pour l'API Nextcloud - **python-dotenv** : Gestion des variables d'environnement - **pydantic** : Validation des donnĂ©es ## ⚠ Notes importantes 1. **SĂ©curitĂ©** : Ne committez jamais votre fichier `.env` dans Git. Il contient vos identifiants. 2. **Chemins** : Les chemins doivent ĂȘtre relatifs Ă  la racine de votre espace Nextcloud. 3. **Authentification** : L'API utilise l'authentification basique avec username/password. ## 🐛 DĂ©pannage ### Erreur de connexion Ă  Nextcloud - VĂ©rifiez que l'URL de votre serveur Nextcloud est correcte - VĂ©rifiez vos identifiants - Assurez-vous que votre serveur Nextcloud est accessible ### Erreur 404 sur un rĂ©pertoire - VĂ©rifiez que le chemin existe dans votre Nextcloud - Les chemins sont sensibles Ă  la casse ### ProblĂšmes d'activation de l'environnement virtuel Si vous avez une erreur de sĂ©curitĂ© PowerShell, exĂ©cutez : ```powershell Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser ``` ## 📝 Licence Ce projet est libre d'utilisation pour vos besoins personnels et professionnels.