Files
Momento/GITEA-ACTIONS.md
Antigravity 96e7902f01
Some checks failed
CI / Lint, Unit Tests & Build (push) Failing after 1m22s
CI / Deploy production (on server) (push) Has been skipped
feat: publication IA (magazine/brief/essay) + fixes critique
Publication IA:
- 4 templates (magazine, brief, essay, simple) avec CSS riche
- Rewrite IA (article/exercises/tutorial/reference/mixed)
- Modération avec timeout 12s + fallback safe
- Quotas publish_enhance par tier (basic=2, pro=15, business=100)
- Détection contenu stale (hash)
- Migration DB publishedContent/publishedTemplate/publishedSourceHash

Fixes:
- cheerio v1.2: Element -> AnyNode (domhandler), decodeEntities cast
- _isShared ajouté au type Note (champ virtuel serveur)
- callout colors PDF export: extraction fonction pure testable
- admin/published: guard note.userId null
- Cmd+S fonctionne en mode dialog (pas seulement fullPage)

i18n:
- 23 clés publish* traduites dans les 15 locales
- Extension Web Clipper: 13 locales mise à jour

Tests:
- callout-colors.test.ts (6 tests)
- note-visible-in-view.test.ts (5 tests)
- entitlements.test.ts + byok-entitlements.test.ts: mock usageLog + unstubAllEnvs
- 199/199 tests passent

Tracker: user-stories.md sync avec sprint-status.yaml
2026-06-28 07:32:57 +00:00

184 lines
6.3 KiB
Markdown

# Configuration Gitea Actions — Memento
Ce document explique comment configurer le déploiement automatique via Gitea Actions.
## Architecture
```
Push sur main
Gitea (gitea.parsanet.org)
│ notifie
Runner Proxmox (ubuntu-24.04)
│ SSH
Serveur Docker (192.168.1.190)
├── Met à jour .env.docker
├── git pull origin main
├── docker compose build memento-note
└── docker compose up -d
```
---
## Variables (non-sensibles)
Aller sur : **`Memento → Settings → Actions → Variables`**
| Nom | Exemple | Description |
|-----|---------|-------------|
| `APP_URL` | `http://192.168.1.190:3000` | URL publique de l'app (NEXTAUTH_URL) |
| `ADMIN_EMAIL` | `admin@example.com` | Email promu ADMIN à l'inscription |
| `ALLOW_REGISTRATION` | `true` | Autoriser les inscriptions publiques |
| `POSTGRES_USER` | `memento` | Utilisateur PostgreSQL |
| `POSTGRES_DB` | `memento` | Nom de la base de données |
| `POSTGRES_PORT` | `5432` | Port PostgreSQL exposé sur l'hôte |
| `AI_PROVIDER_TAGS` | `custom` | Fournisseur IA pour les étiquettes (`ollama`, `openai`, `custom`) |
| `AI_MODEL_TAGS` | `google/gemma-3-27b-it` | Modèle pour les étiquettes |
| `AI_PROVIDER_EMBEDDING` | `custom` | Fournisseur IA pour les embeddings |
| `AI_MODEL_EMBEDDING` | `text-embedding-3-small` | Modèle pour les embeddings |
| `AI_PROVIDER_CHAT` | `custom` | Fournisseur IA pour le chat |
| `AI_MODEL_CHAT` | `google/gemma-3-27b-it` | Modèle pour le chat |
| `CUSTOM_OPENAI_BASE_URL` | `https://openrouter.ai/api/v1` | URL de base du fournisseur custom |
| `OLLAMA_BASE_URL` | `http://ollama:11434` | URL du serveur Ollama |
| `EMAIL_PROVIDER` | `resend` | Fournisseur email (`resend` ou `smtp`) |
| `SMTP_FROM` | `noreply@example.com` | Adresse expéditeur (obligatoire pour Resend en prod) |
| `SMTP_HOST` | `smtp.gmail.com` | Serveur SMTP |
| `SMTP_PORT` | `587` | Port SMTP |
| `SMTP_USER` | `user@gmail.com` | Identifiant SMTP |
| `SMTP_SECURE` | `false` | Forcer TLS/SSL |
| `SMTP_IGNORE_CERT` | `false` | Ignorer les erreurs de certificat |
| `MCP_MODE` | `sse` | Mode du serveur MCP |
| `MCP_PORT` | `3001` | Port du serveur MCP |
| `WEB_SEARCH_PROVIDER` | `searxng` | Fournisseur de recherche web |
| `SEARXNG_URL` | `http://localhost:8080` | URL du serveur SearXNG |
---
## Secrets (sensibles)
Aller sur : **`Memento → Settings → Actions → Secrets`**
| Nom | Description |
|-----|-------------|
| `SSH_PRIVATE_KEY` | Clé SSH privée pour accéder à 192.168.1.190 |
| `NEXTAUTH_SECRET` | Clé secrète NextAuth (générer avec `openssl rand -base64 32`) |
| `POSTGRES_PASSWORD` | Mot de passe PostgreSQL |
| `CUSTOM_OPENAI_API_KEY` | Clé API du fournisseur custom (OpenRouter, etc.) |
| `OPENAI_API_KEY` | Clé API OpenAI (si fournisseur = openai) |
| `RESEND_API_KEY` | Clé API Resend pour l'envoi d'emails |
| `SMTP_PASS` | Mot de passe SMTP |
| `BRAVE_SEARCH_API_KEY` | Clé API Brave Search (optionnel) |
| `JINA_API_KEY` | Clé API Jina (optionnel) |
---
## Comportement
- Si une variable/secret est **vide** dans Gitea → la valeur dans `.env.docker` sur le serveur est **conservée**.
- Si une variable/secret est **renseignée** dans Gitea → elle **écrase** la valeur dans `.env.docker`.
- Le fichier `.env.docker` n'est jamais supprimé, seulement mis à jour ligne par ligne.
---
## Email avec Resend
### Comment ça fonctionne
Resend est un service d'envoi d'emails transactionnels (reset de mot de passe, notifications...).
### Étape 1 — Créer un compte Resend
1. Aller sur [resend.com](https://resend.com) → **Sign up**
2. Copier la clé API : `re_xxxxxxxxxxxx`
3. Ajouter comme secret Gitea : `RESEND_API_KEY = re_xxxxxxxxxxxx`
### Étape 2 — Vérifier votre domaine (obligatoire pour envoyer à tout le monde)
> **Sans domaine vérifié** : Resend ne peut envoyer qu'**à l'adresse email du compte Resend**.
> Cela bloque les emails de reset de mot de passe pour les autres utilisateurs.
1. Aller sur [resend.com/domains](https://resend.com/domains) → **Add Domain**
2. Entrer votre domaine, ex: `mondomaine.com`
3. Resend affiche des enregistrements DNS à ajouter chez votre registrar/Cloudflare :
```
Type Nom Valeur
TXT _dmarc.mondomaine.com v=DMARC1; p=none;
TXT mondomaine.com v=spf1 include:amazonses.com ~all
CNAME resend._domainkey resend._domainkey.mondomaine.com → (valeur fournie par Resend)
MX bounce.mondomaine.com feedback-smtp.us-east-1.amazonses.com
```
4. Attendre 1-5 minutes → le statut passe à **"Verified"** ✅
### Étape 3 — Configurer l'adresse expéditeur
Dans les variables Gitea :
```
SMTP_FROM = noreply@mondomaine.com
```
Ou dans l'interface admin : **Admin → Settings → Configuration Email → Resend**
### Résumé
| Situation | Comportement |
|-----------|-------------|
| Pas de domaine vérifié | Envoi uniquement vers l'email du compte Resend |
| Domaine vérifié + `SMTP_FROM` configuré | Envoi vers n'importe qui ✅ |
| `SMTP_FROM` vide | Utilise `noreply@mondomaine.com` si domaine vérifié, sinon `onboarding@resend.dev` |
---
## Déclencher un déploiement
### Automatique
Chaque `git push` sur la branche `main` déclenche automatiquement le déploiement.
### Manuel (depuis Gitea)
`Memento → Actions → "Deploy to Production" → Run workflow → Run workflow`
### Manuel (depuis le terminal)
```bash
cd D:/dev1405/Memento
git commit --allow-empty -m "ci: trigger deploy"
git push origin main
```
---
## Vérifier le déploiement
1. **Gitea → Actions** : suivre les logs en temps réel
2. **Sur le serveur** :
```bash
docker compose -f /opt/memento/docker-compose.yml ps
docker logs memento-web --tail=50
```
3. **Dans le navigateur** : `http://192.168.1.190:3000`
---
## Premier déploiement sur un nouveau serveur
```bash
# Sur 192.168.1.190 :
mkdir -p /opt/memento
cd /opt/memento
git clone https://gitea.parsanet.org/sepehr/Memento.git .
# Générer les secrets si pas encore configurés dans Gitea :
# openssl rand -base64 32 → NEXTAUTH_SECRET
# openssl rand -hex 16 → POSTGRES_PASSWORD
# Lancer le premier déploiement manuellement depuis Gitea Actions
```
Après le premier déploiement, promouvoir l'admin :
```bash
docker exec memento-postgres psql -U memento -d memento \
-c "UPDATE \"User\" SET role='ADMIN' WHERE email='VOTRE_EMAIL';"
```