From 3ef75f9f441adcb06e0995879f6371c4372bd862 Mon Sep 17 00:00:00 2001 From: sepehr Date: Sat, 25 Apr 2026 22:30:29 +0200 Subject: [PATCH] docs: add GITEA-ACTIONS.md, fix Resend test mode error message Made-with: Cursor --- GITEA-ACTIONS.md | 150 +++++++++++++++++++++++++++++++++++++++ memento-note/lib/mail.ts | 7 ++ 2 files changed, 157 insertions(+) create mode 100644 GITEA-ACTIONS.md diff --git a/GITEA-ACTIONS.md b/GITEA-ACTIONS.md new file mode 100644 index 0000000..05ccb0c --- /dev/null +++ b/GITEA-ACTIONS.md @@ -0,0 +1,150 @@ +# 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 : **`Momento → 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 : **`Momento → 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 + +### Mode test (sans domaine vérifié) +- Resend ne permet d'envoyer qu'**à l'adresse du compte Resend** (`devparsa75@gmail.com`). +- L'adresse `from` utilisée automatiquement : `Memento `. + +### Mode production (domaine vérifié) +1. Vérifier un domaine sur [resend.com/domains](https://resend.com/domains) +2. Configurer `SMTP_FROM` (variable Gitea) avec une adresse de ce domaine : + ``` + SMTP_FROM = noreply@parsanet.org + ``` +3. Resend utilisera cette adresse et pourra envoyer à n'importe qui. + +--- + +## Déclencher un déploiement + +### Automatique +Chaque `git push` sur la branche `main` déclenche automatiquement le déploiement. + +### Manuel (depuis Gitea) +`Momento → Actions → "Deploy to Production" → Run workflow → Run workflow` + +### Manuel (depuis le terminal) +```bash +cd D:/dev1405/Momento +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/Momento.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';" +``` diff --git a/memento-note/lib/mail.ts b/memento-note/lib/mail.ts index 1b10a71..8f35223 100644 --- a/memento-note/lib/mail.ts +++ b/memento-note/lib/mail.ts @@ -96,6 +96,13 @@ async function sendViaResend(apiKey: string, { to, subject, html, attachments }: }); if (error) { + // Resend test mode: can only send to the Resend account owner's email + if (error.message?.includes('own email address') || error.name === 'validation_error') { + return { + success: false, + error: `Mode test Resend : vous ne pouvez envoyer qu'à l'adresse du compte Resend. Pour envoyer à n'importe qui, vérifiez un domaine sur resend.com/domains et configurez SMTP_FROM avec une adresse de ce domaine.`, + }; + } return { success: false, error: error.message }; }