# Memento - Guide de deploiement complet

## Table des matieres
1. [Architecture](#architecture)
2. [Setup du serveur 192.168.1.190](#setup-serveur)
3. [Installation de Gitea Runner](#gitea-runner)
4. [CI/CD automatique](#cicd)
5. [Nginx reverse proxy](#nginx)
6. [Checklist](#checklist)

---

## Architecture

```
Internet/LAN
     |
  [Nginx] ── port 80/443 ── notes.parsanet.org
     |
     ├── / ──► [memento-web] ── port 3000 ── Next.js App
     |
     └── /mcp ──► [memento-mcp] ── port 3001 ── MCP Server (SSE)
                     |
                  [postgres] ── port 5432 (127.0.0.1 seulement)

=== Machine 192.168.1.190 ===
  - Docker + Docker Compose (les 3 conteneurs)
  - act_runner (Gitea Runner) --> build + deploy en local
  - Nginx reverse proxy

=== Serveur Gitea (gitea.parsanet.org) ===
  - Gitea seulement (pas de runner)
  - Envoie les events push au runner via API
```

Le Runner est installe sur **192.168.1.190** directement. Pas besoin de SSH.

---

## Setup serveur

### 1. Creer l'utilisateur de deploiement

```bash
# Sur 192.168.1.190, en root :
useradd -m -s /bin/bash memento-deploy
usermod -aG docker memento-deploy
mkdir -p /opt/memento
chown memento-deploy:memento-deploy /opt/memento
```

### 2. Cloner le repo

```bash
su - memento-deploy
cd /opt/memento
git clone https://gitea.parsanet.org/sepehr/Momento.git .
git config credential.helper store
# Le premier pull demandera les identifiants Gitea
```

### 3. Generer le .env.docker

```bash
cd /opt/memento
bash scripts/deploy.sh --full
```

Le script demande interactivement :
- URL (mettre `http://192.168.1.190` ou `http://notes.parsanet.org`)
- Provider AI + cle API
- Email (optionnel)

Il genere automatiquement NEXTAUTH_SECRET et POSTGRES_PASSWORD.

### 4. Premier deploiement

```bash
cd /opt/memento
bash scripts/deploy.sh --build
docker compose ps
# Les 3 conteneurs doivent etre "healthy"
```

### 5. Creer le premier admin

```bash
# S'inscrire sur http://192.168.1.190/register
# Puis promouvoir en admin :
docker compose exec -T postgres psql -U memento -d memento \
  -c "UPDATE \"User\" SET role='ADMIN' WHERE email='VOTRE_EMAIL';"
```

---

## Gitea Runner

### 1. Activer Actions dans Gitea

Dans `app.ini` du serveur Gitea :

```ini
[actions]
ENABLED = true
```

Redemarrer Gitea.

### 2. Recuperer le token d'enregistrement

Aller sur : **gitea.parsanet.org > Momento > Settings > Actions > Runners > "New Runner"**
Copier le token affiche.

### 3. Installer act_runner sur 192.168.1.190

```bash
# Sur 192.168.1.190, en root :

# Telecharger
wget https://gitea.com/gitea/act_runner/releases/latest/download/act_runner-linux-amd64
chmod +x act_runner-linux-amd64
mv act_runner-linux-amd64 /usr/local/bin/act_runner

# Verifier
act_runner --version

# Generer la config
mkdir -p /etc/act_runner
act_runner generate-config > /etc/act_runner/config.yaml
```

### 4. Enregistrer le runner

```bash
act_runner register \
  --no-interactive \
  --instance https://gitea.parsanet.org \
  --token VOTRE_TOKEN_ICI \
  --name memento-deploy \
  --labels "ubuntu-latest:docker://docker.gitea.com/runner-images:ubuntu-latest,docker-host:host"
```

Les labels sont importants :
- `ubuntu-latest` : pour les jobs dans un conteneur Docker (checkout, etc.)
- `docker-host` : pour les jobs directement sur la machine (acces Docker)

### 5. Creer le service systemd

```bash
cat > /etc/systemd/system/gitea-runner.service << 'EOF'
[Unit]
Description=Gitea Actions Runner
After=network.target docker.service
Requires=docker.service

[Service]
Type=simple
User=memento-deploy
WorkingDirectory=/home/memento-deploy
ExecStart=/usr/local/bin/act_runner daemon --config /etc/act_runner/config.yaml
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable gitea-runner
systemctl start gitea-runner
systemctl status gitea-runner
```

### 6. Verifier

```bash
systemctl status gitea-runner
# Doit etre "active (running)"

# Sur gitea.parsanet.org > Momento > Settings > Actions > Runners
# Le runner "memento-deploy" doit apparaitre avec le label "docker-host"
```

---

## CI/CD

Le workflow est dans `.gitea/workflows/deploy.yaml`.

### Ce qui se passe a chaque push sur `main` :

1. Gitea notifie le Runner sur 192.168.1.190
2. Le Runner checkout le code
3. `rsync` vers `/opt/memento/` (exclut node_modules, .git, .next)
4. `docker compose build --parallel`
5. `docker compose up -d --remove-orphans`
6. Attend que les 3 conteneurs soient healthy
7. Nettoie les vieilles images

### Pas de secrets a configurer

Le `.env.docker` est deja sur le serveur. Le workflow n'a pas besoin de secrets SSH
puisque tout se passe en local sur 192.168.1.190.

### Tester le CI/CD

```bash
# Faire un push test depuis votre machine :
echo "# test" >> README.md
git add README.md
git commit -m "test: CI/CD deploy"
git push origin main

# Verifier sur gitea.parsanet.org > Momento > Actions
# Le job doit apparaitre et se terminer en succes
```

---

## Nginx

### Installation

```bash
apt install -y nginx
```

### Configuration

```bash
cat > /etc/nginx/sites-available/memento << 'EOF'
server {
    listen 80;
    server_name notes.parsanet.org 192.168.1.190;

    # Next.js app
    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_read_timeout 86400;
    }

    # MCP Server (SSE - long-lived connections)
    location /mcp {
        proxy_pass http://127.0.0.1:3001/mcp;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_read_timeout 86400;
        proxy_buffering off;
        proxy_cache off;
    }
}
EOF

ln -sf /etc/nginx/sites-available/memento /etc/nginx/sites-enabled/memento
rm -f /etc/nginx/sites-enabled/default
nginx -t && systemctl reload nginx
```

### HTTPS (plus tard)

```bash
apt install -y certbot python3-certbot-nginx
certbot --nginx -d notes.parsanet.org

# Puis mettre a jour NEXTAUTH_URL :
cd /opt/memento
nano .env.docker
# Changer : NEXTAUTH_URL="https://notes.parsanet.org"
docker compose restart memento-note
```

---

## Checklist

### Premier deploiement

- [ ] Creer `memento-deploy` sur 192.168.1.190
- [ ] Cloner le repo dans `/opt/memento`
- [ ] `bash scripts/deploy.sh --full`
- [ ] 3 conteneurs healthy
- [ ] S'inscrire, puis promouvoir en ADMIN via SQL
- [ ] Configurer Nginx

### CI/CD (une seule fois)

- [ ] Activer Actions dans Gitea (`app.ini`)
- [ ] Installer `act_runner` sur 192.168.1.190
- [ ] Enregistrer avec le token Gitea
- [ ] Creer le service systemd
- [ ] Verifier le runner apparait dans Gitea
- [ ] Push test > verifier dans Actions

### Apres chaque push sur main (automatique)

- [ ] Le Runner detecte le push
- [ ] rsync vers /opt/memento
- [ ] docker compose build + up
- [ ] Conteneurs healthy
