36b5760566
Recrée les fichiers de déploiement perdus lors de la restauration du repo.
- docker-compose.deploy.yml : production basée sur les images publiées
(git.maison43gil.com/gilles/home_hub:{backend,frontend}-latest), sans build:,
avec service backend-migrate (alembic upgrade head) avant le démarrage
- .gitea/workflows/build.yml : CI Gitea Actions, build+push des 2 images
- backend/.dockerignore + frontend/.dockerignore : images propres, sans secrets
- .env.example : template complet sans secret réel (placeholder change-me)
- README : section déploiement OCI (build manuel, CI, serveur, note 413 proxy)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
191 lines
7.4 KiB
Markdown
191 lines
7.4 KiB
Markdown
# HomeHub
|
|
|
|
Application d'organisation personnelle auto-hébergée — PWA mobile-first déployée sur Proxmox 9.
|
|
|
|
## Fonctionnalités (v0.5.1)
|
|
|
|
- **Todos** — tâches classées par domaine, priorité, date objectif, photo, GPS. Swipe gauche = éditer, swipe droite = terminer.
|
|
- **Liste de courses** — générée automatiquement depuis les habitudes d'achat (liste magique), mode magasin plein-écran avec Wake Lock, catalogue enrichi avec tags et stats d'achat, bottom sheet multi-select.
|
|
- **Notes** — saisie rapide avec photo (Ctrl+V ou appareil photo), audio, GPS et métadonnées libres.
|
|
- **Paramètres** — thème dark / light / system, taille de police ajustable avec aperçu temps réel.
|
|
- **MCP Server** — expose les données à des agents IA (Hermes, Claude, etc.) — *à venir*
|
|
|
|
### UX mobile
|
|
- Touch targets 48px minimum, swipe gestures sur toutes les listes
|
|
- Bottom sheet qui remonte automatiquement au-dessus du clavier virtuel iOS
|
|
- Collage d'image par Ctrl+V dans les formulaires Todo et Catalogue
|
|
- Wake Lock API (écran allumé en mode magasin)
|
|
|
|
## Stack technique
|
|
|
|
| Composant | Technologie |
|
|
|-----------|-------------|
|
|
| Frontend | React 18 + Vite + TypeScript + Tailwind CSS |
|
|
| Backend | Python 3.12 + FastAPI (async) |
|
|
| Base de données | PostgreSQL 16 (schémas multiples) |
|
|
| Migrations | Alembic |
|
|
| OCR | Tesseract 5 (service Docker dédié, partagé entre modules) |
|
|
| Scan code-barres | zxing-js (frontend, iOS + Android) |
|
|
| Catalogue produits | OpenFoodFacts API (~3M produits alimentaires) |
|
|
| Recherche image | SearXNG (auto-hébergé, fallback image produits) |
|
|
| Déploiement | Docker Compose · Nginx Proxy Manager |
|
|
| Design system | Gruvbox seventies (`design_system/`) |
|
|
|
|
## Démarrage rapide
|
|
|
|
```bash
|
|
cd ~/Documents/projet/home_hub
|
|
|
|
# Lancer l'app (première fois ou après un arrêt)
|
|
docker compose up -d
|
|
|
|
# Frontend → http://localhost:3001 (ou http://<IP-locale>:3001 sur le réseau)
|
|
# API Swagger → http://localhost:8000/docs
|
|
```
|
|
|
|
**Après modification du code :**
|
|
```bash
|
|
# Rebuild + relancer un service
|
|
docker compose build backend && docker compose up -d backend
|
|
docker compose build frontend && docker compose up -d frontend
|
|
|
|
# Rebuild tout
|
|
docker compose build && docker compose up -d
|
|
```
|
|
|
|
**Maintenance :**
|
|
```bash
|
|
docker compose down # Arrêter (données conservées)
|
|
docker compose logs -f # Logs en direct
|
|
docker compose ps # État des conteneurs
|
|
```
|
|
|
|
## Structure du projet
|
|
|
|
```
|
|
home_hub/
|
|
├── ocr/
|
|
│ ├── app.py # Service FastAPI OCR (Tesseract + Pillow)
|
|
│ └── Dockerfile
|
|
├── product-search/
|
|
│ ├── app.py # Client OpenFoodFacts + proxy SearXNG images
|
|
│ └── Dockerfile
|
|
├── backend/
|
|
│ ├── app/
|
|
│ │ ├── api/ # Endpoints par domaine (todos, shopping, notes, media, mcp)
|
|
│ │ ├── core/ # Config, base de données, middleware
|
|
│ │ ├── models/ # Modèles SQLAlchemy
|
|
│ │ ├── schemas/ # Schémas Pydantic
|
|
│ │ └── services/
|
|
│ │ ├── media.py # Upload, compression, génération miniatures (Pillow)
|
|
│ │ ├── ocr.py # Client vers service ocr:8001
|
|
│ │ └── ... # Suggestions shopping, sync calendrier (futur)
|
|
│ ├── alembic/ # Migrations de base de données
|
|
│ ├── Dockerfile
|
|
│ └── requirements.txt
|
|
├── frontend/
|
|
│ ├── src/
|
|
│ │ ├── components/ # Composants React
|
|
│ │ ├── pages/ # Pages par module
|
|
│ │ ├── hooks/ # Hooks personnalisés (camera, geolocation, wake-lock…)
|
|
│ │ └── api/ # Client API typé
|
|
│ ├── public/
|
|
│ │ └── manifest.json
|
|
│ ├── Dockerfile
|
|
│ └── vite.config.ts
|
|
├── design_system/ # Design system Gruvbox seventies (tokens + composants)
|
|
├── docs/
|
|
│ ├── spec.md # Spécification fonctionnelle complète
|
|
│ └── plan.md # Plan de développement par phases
|
|
├── docker-compose.yml
|
|
├── docker-compose.dev.yml
|
|
└── .env.example
|
|
```
|
|
|
|
## Documentation
|
|
|
|
- [Spécification fonctionnelle](docs/spec.md) — features détaillées, schéma DB, interfaces
|
|
- [Plan de développement](docs/plan.md) — phases et tâches
|
|
- [Design system](design_system/README.md) — composants et règles visuelles
|
|
- API REST : `http://localhost:8000/docs` (Swagger auto-généré par FastAPI)
|
|
|
|
## Déploiement (Proxmox)
|
|
|
|
```bash
|
|
# Production
|
|
docker compose up -d
|
|
|
|
# Nginx Proxy Manager pointe vers :
|
|
# homehub.local → frontend:3000
|
|
# homehub.local/api → backend:8000
|
|
# homehub.local/mcp → backend:8000/mcp (pour les agents IA)
|
|
```
|
|
|
|
## Déploiement via registre OCI Gitea
|
|
|
|
Les images finales sont publiées sur le registre OCI privé `git.maison43gil.com`
|
|
(source unique de vérité). Deux images sous le paquet `home_hub`, distinguées par tag :
|
|
|
|
| Image | Tag |
|
|
|-------|-----|
|
|
| Backend (FastAPI) | `git.maison43gil.com/gilles/home_hub:backend-latest` |
|
|
| Frontend (Nginx) | `git.maison43gil.com/gilles/home_hub:frontend-latest` |
|
|
|
|
### Construction & publication (manuel)
|
|
|
|
```bash
|
|
docker login git.maison43gil.com
|
|
|
|
# Backend
|
|
docker build -t git.maison43gil.com/gilles/home_hub:backend-latest ./backend
|
|
docker push git.maison43gil.com/gilles/home_hub:backend-latest
|
|
|
|
# Frontend
|
|
docker build -t git.maison43gil.com/gilles/home_hub:frontend-latest ./frontend
|
|
docker push git.maison43gil.com/gilles/home_hub:frontend-latest
|
|
```
|
|
|
|
> Le registre est derrière Nginx Proxy Manager : pour les gros blobs (image
|
|
> backend ~1.3 Go), régler `client_max_body_size 0;` dans l'onglet Advanced
|
|
> du proxy host `git.maison43gil.com` (sinon erreur `413 Payload Too Large`).
|
|
|
|
### Construction automatique (Gitea Actions)
|
|
|
|
`.gitea/workflows/build.yml` build et push les deux images :
|
|
- push sur `main` → tags `*-latest`
|
|
- tag git `vX.Y.Z` → tags `*-latest` + `*-X.Y.Z`
|
|
|
|
### Déploiement sur le serveur
|
|
|
|
```bash
|
|
# Sur le serveur de production
|
|
git pull # récupère docker-compose.deploy.yml + .env.example
|
|
cp .env.example .env # compléter les secrets (POSTGRES_PASSWORD, MCP_API_KEY…)
|
|
|
|
docker login git.maison43gil.com
|
|
docker compose -f docker-compose.deploy.yml pull
|
|
docker compose -f docker-compose.deploy.yml up -d
|
|
```
|
|
|
|
Le service `backend-migrate` applique automatiquement les migrations Alembic
|
|
(`alembic upgrade head`) avant le démarrage du backend. Aucune image n'est
|
|
reconstruite en production (pas de `build:`).
|
|
|
|
### Environnements
|
|
|
|
| Fichier | Usage | Images |
|
|
|---------|-------|--------|
|
|
| `docker-compose.yml` | Dev (build local) | `build:` |
|
|
| `docker-compose.dev.yml` | Override dev (HMR + `--reload`) | `build:` |
|
|
| `docker-compose.deploy.yml` | **Production** | `image:` (OCI Gitea) |
|
|
|
|
## Évolutions prévues
|
|
|
|
- **Phase 5** — Scan code-barres (zxing-js) + enrichissement catalogue via OpenFoodFacts
|
|
- **Phase 6** — Service OCR dédié (Tesseract 5, conteneur partagé)
|
|
- **Phase 7** — Shopping avancé : OCR étiquettes prix, historique et comparaison prix par magasin
|
|
- **Phase 8** — MCP Server : outils IA (`get_todos`, `add_shopping_item`, `search_notes`…)
|
|
- **Phase 9** — Authentification multi-utilisateurs (JWT)
|
|
- **Phase 10** — Calendrier : sync Google Calendar + CalDAV iOS, intégration Home Assistant, webhooks Gitea
|
|
- **Phase 11** — Vision LLM : analyse frigo → suggestions liste de courses (Hermes/Ollama)
|