52
.claude/deploy-memory.md
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
# Deploy memory — rubis
|
||||||
|
|
||||||
|
## Infra
|
||||||
|
- Namespace : `rubis`
|
||||||
|
- Deployment : `rubis`
|
||||||
|
- Container : `rubis`
|
||||||
|
- NodePort : `30109`
|
||||||
|
- Image : `git.arthurbarre.fr/ordinarthur/rubis`
|
||||||
|
- Domaine : https://rubis.arthurbarre.fr (sous-domaine **temporaire** — domaine définitif pas encore acheté)
|
||||||
|
- Manifests : `k3s/` (namespace.yml, deployment.yml, service.yml)
|
||||||
|
- Route Traefik : `~/dev/perso/proxmox/ansible/roles/traefik/templates/rubis.yml.j2`
|
||||||
|
- Repo Gitea : https://git.arthurbarre.fr/ordinarthur/rubis (remote `gitea`)
|
||||||
|
|
||||||
|
## Mise à jour (à suivre pour les prochains /deploy)
|
||||||
|
|
||||||
|
1. **Voie normale — push git, le CI build + rollout auto** :
|
||||||
|
```bash
|
||||||
|
git push gitea main
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Voie manuelle** (si Docker Desktop tourne sur le Mac) :
|
||||||
|
```bash
|
||||||
|
TAG=$(git rev-parse --short HEAD)
|
||||||
|
docker build --platform linux/amd64 -t git.arthurbarre.fr/ordinarthur/rubis:$TAG .
|
||||||
|
docker push git.arthurbarre.fr/ordinarthur/rubis:$TAG
|
||||||
|
kubectl --kubeconfig ~/dev/perso/proxmox/k3s/kubeconfig.yaml \
|
||||||
|
-n rubis set image deploy/rubis rubis=git.arthurbarre.fr/ordinarthur/rubis:$TAG
|
||||||
|
kubectl --kubeconfig ~/dev/perso/proxmox/k3s/kubeconfig.yaml \
|
||||||
|
-n rubis rollout status deploy/rubis
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Si changement route/domaine : `cd ~/dev/perso/proxmox/ansible && ansible-playbook playbooks/gateway.yml`
|
||||||
|
|
||||||
|
4. Vérif : `curl -I https://rubis.arthurbarre.fr`
|
||||||
|
|
||||||
|
## Quand le domaine définitif sera acheté
|
||||||
|
|
||||||
|
1. Créer le record A chez OVH (ou autre registrar) : `<nouveau-domaine>` → `51.38.62.199`
|
||||||
|
2. Modifier la rule du fichier `~/dev/perso/proxmox/ansible/roles/traefik/templates/rubis.yml.j2` :
|
||||||
|
`Host(\`<nouveau-domaine>\`)`
|
||||||
|
3. Relancer le playbook `gateway.yml`
|
||||||
|
4. (Optionnel) supprimer le record DNS `rubis.arthurbarre.fr` si plus utilisé
|
||||||
|
|
||||||
|
## Stack
|
||||||
|
Landing statique, servie par **nginx:1.27-alpine** (Dockerfile à la racine, sert `public/`).
|
||||||
|
Le rebuild est rapide (pas de bundler).
|
||||||
|
|
||||||
|
## Déjà fait — NE PAS refaire
|
||||||
|
Dockerfile, manifests K3s, route Traefik (`rubis.yml.j2` + tâche dans `tasks/main.yml`),
|
||||||
|
DNS OVH (A record `rubis.arthurbarre.fr` id 5413044152), repo Gitea + secrets CI
|
||||||
|
(`KUBECONFIG`, `REGISTRY_PASSWORD`), namespace + secret registry K3s.
|
||||||
|
Les prochains `/deploy` font uniquement build + rollout via push git.
|
||||||
@ -3,7 +3,8 @@
|
|||||||
.claude
|
.claude
|
||||||
.DS_Store
|
.DS_Store
|
||||||
docs/
|
docs/
|
||||||
assets/
|
public/
|
||||||
landing.html
|
|
||||||
*.md
|
*.md
|
||||||
k3s/
|
k3s/
|
||||||
|
Dockerfile
|
||||||
|
.dockerignore
|
||||||
|
|||||||
20
CLAUDE.md
@ -118,21 +118,35 @@ Ce qu'on sait : TypeScript, le reste à formaliser (framework, DB, OCR provider,
|
|||||||
| Fichier | Rôle |
|
| Fichier | Rôle |
|
||||||
|---|---|
|
|---|---|
|
||||||
| `/CLAUDE.md` (ce fichier) | Contexte top-level, toujours en tête |
|
| `/CLAUDE.md` (ce fichier) | Contexte top-level, toujours en tête |
|
||||||
| `/landing.html` | Landing page brand-applied, prête à déployer (waitlist V1) |
|
| `/landing/index.html` | Landing page brand-applied, déployée (waitlist V1) |
|
||||||
|
| `/landing/favicon.{svg,ico,png}` | Set complet de favicons + apple-touch-icon |
|
||||||
|
| `/landing/site.webmanifest` | Manifest PWA (theme `#9F1239`, background `#FAF7F2`) |
|
||||||
|
| `/landing/assets/logo.png` | Logo Rubis original (généré, source pour les favicons) |
|
||||||
| `/docs/produit.md` | Spec produit détaillée (features, flows, IN/OUT V1) |
|
| `/docs/produit.md` | Spec produit détaillée (features, flows, IN/OUT V1) |
|
||||||
| `/docs/marque.md` | Référence marque écrite (palette, typo, voix, do/don't) |
|
| `/docs/marque.md` | Référence marque écrite (palette, typo, voix, do/don't) |
|
||||||
| `/docs/decisions.md` | Log de décisions avec rationale (format ADR-light) |
|
| `/docs/decisions.md` | Log de décisions avec rationale (format ADR-light) |
|
||||||
| `/docs/wireframes-mvp.html` | Wireframes low-fi des 13 écrans MVP |
|
| `/docs/wireframes-mvp.html` | Wireframes low-fi des 13 écrans MVP |
|
||||||
| `/docs/brand-identity.html` | Présentation visuelle de la marque (4 logos, applications) |
|
| `/docs/brand-identity.html` | Présentation visuelle de la marque (4 logos, applications) |
|
||||||
| `/docs/munitions-marketing.md` | Stats marché, concurrents, positionnement, copy |
|
| `/docs/munitions-marketing.md` | Stats marché, concurrents, positionnement, copy |
|
||||||
|
| `/Dockerfile` | Build nginx-alpine servant `/landing/` sur port 80 |
|
||||||
|
| `/k3s/` | Manifests Kubernetes (namespace, deployment, service) |
|
||||||
|
| `/.claude/deploy-memory.md` | Procédure de déploiement (Gitea CI ou manuel) |
|
||||||
|
|
||||||
|
## Déploiement
|
||||||
|
|
||||||
|
- **Image** : `git.arthurbarre.fr/ordinarthur/rubis:latest`
|
||||||
|
- **Domaine actuel** (temporaire) : https://rubis.arthurbarre.fr
|
||||||
|
- **Build** : `COPY landing/` → nginx servi sur port 80
|
||||||
|
- Voir `.claude/deploy-memory.md` pour la procédure complète.
|
||||||
|
|
||||||
## Questions ouvertes
|
## Questions ouvertes
|
||||||
|
|
||||||
- **Stack technique** à formaliser
|
- **Stack technique app produit** à formaliser (la landing tourne en static nginx, mais le SaaS lui-même reste à scoper)
|
||||||
- **Conversion 1 rubis = 10 min** validée mais à confirmer en user testing après MVP
|
- **Conversion 1 rubis = 10 min** validée mais à confirmer en user testing après MVP
|
||||||
- **Wordmark "rubis" avec gem-i** (direction C) à monter en complément du logo A à un moment
|
- **Wordmark "rubis" avec gem-i** (direction C) à monter en complément du logo A à un moment
|
||||||
- **Provider OCR** à benchmarker (Mindee, Document AI, Textract, Tesseract)
|
- **Provider OCR** à benchmarker (Mindee, Document AI, Textract, Tesseract)
|
||||||
- **Endpoint waitlist** à câbler dans `landing.html` (Resend, Formspree, ou API perso)
|
- **Endpoint waitlist** à câbler dans `/landing/index.html` (Resend, Formspree, ou API perso)
|
||||||
|
- **Domaine définitif** à acheter (le sous-domaine actuel est temporaire)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@ -1,14 +1,14 @@
|
|||||||
FROM nginx:1.27-alpine
|
FROM nginx:1.27-alpine
|
||||||
|
|
||||||
COPY public/ /usr/share/nginx/html/
|
COPY landing/ /usr/share/nginx/html/
|
||||||
|
|
||||||
RUN printf 'server {\n\
|
RUN printf 'server {\n\
|
||||||
listen 80;\n\
|
listen 80;\n\x
|
||||||
server_name _;\n\
|
server_name _;\n\
|
||||||
root /usr/share/nginx/html;\n\
|
root /usr/share/nginx/html;\n\
|
||||||
index index.html;\n\
|
index index.html;\n\
|
||||||
\n\
|
\n\
|
||||||
location / {\n\
|
location / {\n\x
|
||||||
try_files $uri $uri/ /index.html;\n\
|
try_files $uri $uri/ /index.html;\n\
|
||||||
}\n\
|
}\n\
|
||||||
\n\
|
\n\
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 846 KiB After Width: | Height: | Size: 846 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 1.1 MiB |
@ -2409,12 +2409,13 @@
|
|||||||
<span class="name">Plan Business</span>
|
<span class="name">Plan Business</span>
|
||||||
<span class="price-small">49 €<span class="per">/mois</span></span>
|
<span class="price-small">49 €<span class="per">/mois</span></span>
|
||||||
</div>
|
</div>
|
||||||
<div class="qualifier">Pour les équipes 5+, avec onboarding humain</div>
|
<div class="qualifier">Pour les équipes</div>
|
||||||
<p>Vous êtes plusieurs dans la boîte ? Business ajoute le <b>multi-utilisateurs</b>, votre adresse
|
<p>Vous pouvez générer autant de relances actives que vous voulez.
|
||||||
<code>compta@votre-entreprise.fr</code>, et — V2 — le <b>SMS de relance</b>. On cale aussi un onboarding
|
<br />
|
||||||
sur-mesure ensemble.
|
Vous avez la possibilité d'avoir 5 utilisateurs.
|
||||||
|
<br />
|
||||||
</p>
|
</p>
|
||||||
<span class="aside-cta">Caler 30 min avec Arthur <span class="arrow">→</span></span>
|
<span class="aside-cta">Démarrer Business <span class="arrow">→</span></span>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 309 KiB After Width: | Height: | Size: 309 KiB |