Dépendance circulaire identifiée avant le rebuild complet : les scripts se téléchargent depuis Gitea, qui est précisément ce qu'on reconstruit. Le proxy a le même problème, puisque c'est lui qui route gitea.arnodo.fr.
Le mécanisme exact, vérifié dans le code : exec_in_lxc() fait le curlsur l'hôte Proxmox puis pousse le script dans le LXC via le tuyau — ça, ça passe. Mais une fois à l'intérieur, le script recharge lib/common.sh tout seul :
Lancé via bash -s, il n'a pas de fichier sur disque et tombe toujours dans la branche curl. Un simple git clone sur pve01 ne suffit donc pas : le conteneur ira quand même taper sur un Gitea mort.
La porte de sortie est déjà dans le code — LIB_COMMON_URL dérive de SCRIPT_URL par deux dirname. Surcharger SCRIPT_URL suffit, sans modification.
Décisions retenues
Pas de pct push : le contournement par SCRIPT_URL est jugé suffisant. Cette issue est purement documentaire.
Miroir git clone --mirror sur pve01 comme filet permanent.
Tailscale installé manuellement avant de lancer les scripts — condition forte, à documenter comme prérequis explicite. Sur pve01 c'est déjà le cas.
Gitea est sauvegardé chaque nuit ; une restauration reste possible en cas de problème.
1. Miroir sur pve01
Documenter la mise en place, à faire pendant que Gitea est vivant :
Prérequis : Tailscale installé et authentifié manuellement sur la machine du proxy avant de lancer le script. Le script réinstallera Tailscale — idempotent, sans effet.
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
Une fois sur le tailnet, MagicDNS résout et la dérivation fonctionne :
Piège à documenter explicitement : utiliser l'IP LAN du poste, pas son nom tailnet. Le LXC fraîchement créé est en DHCP sur vmbr0 et télécharge lib/common.sh tout en haut du script, bien avant la ligne qui installe Tailscale. À cet instant il n'a que le LAN.
Mentionner aussi le pare-feu macOS, qui demandera l'autorisation d'accepter les connexions entrantes pour Python.
4. README racine
Ajouter à la section Philosophy le principe qui sous-tend tout ce qui précède :
Le dépôt qui reconstruit l'infrastructure ne doit pas dépendre de cette infrastructure.
Et une section « Bootstrap / reprise après sinistre » renvoyant vers les README de service.
Fichiers touchés
README.md racine — principe + section bootstrap + mise en place du miroir
proxy/README.md — prérequis Tailscale, override SCRIPT_URL via tailnet
gitea/README.md — procédure serveur HTTP local, piège de l'IP LAN
Critères d'acceptation
La commande de miroir et le cron sont documentés et testés
Chaque README de service a sa section bootstrap avec la commande exacte, copiable telle quelle
Le prérequis Tailscale du proxy est écrit comme condition forte, pas comme suggestion
Le piège IP LAN vs nom tailnet est explicite dans gitea/README.md
Le principe figure dans la section Philosophy du README racine
Aucune modification de code — issue documentaire uniquement
Dépendances
Dépend de #19 pour l'existence de gitea/README.md. Peut être rédigée en parallèle, mergée après.
## Contexte
Dépendance circulaire identifiée avant le rebuild complet : les scripts se téléchargent depuis Gitea, qui est précisément ce qu'on reconstruit. Le proxy a le même problème, puisque c'est lui qui route `gitea.arnodo.fr`.
Le mécanisme exact, vérifié dans le code : `exec_in_lxc()` fait le `curl` **sur l'hôte Proxmox** puis pousse le script dans le LXC via le tuyau — ça, ça passe. Mais une fois à l'intérieur, le script recharge `lib/common.sh` tout seul :
```bash
LIB_COMMON_URL="$(dirname "$(dirname "$SCRIPT_URL")")/lib/common.sh"
source <(curl -fsSL "$LIB_COMMON_URL")
```
Lancé via `bash -s`, il n'a pas de fichier sur disque et tombe **toujours** dans la branche `curl`. Un simple `git clone` sur pve01 ne suffit donc pas : le conteneur ira quand même taper sur un Gitea mort.
La porte de sortie est déjà dans le code — `LIB_COMMON_URL` dérive de `SCRIPT_URL` par deux `dirname`. Surcharger `SCRIPT_URL` suffit, sans modification.
## Décisions retenues
- **Pas de `pct push`** : le contournement par `SCRIPT_URL` est jugé suffisant. Cette issue est purement documentaire.
- **Miroir `git clone --mirror` sur pve01** comme filet permanent.
- **Tailscale installé manuellement** avant de lancer les scripts — condition forte, à documenter comme prérequis explicite. Sur pve01 c'est déjà le cas.
- Gitea est sauvegardé chaque nuit ; une restauration reste possible en cas de problème.
## 1. Miroir sur pve01
Documenter la mise en place, à faire pendant que Gitea est vivant :
```bash
git clone --mirror https://gitea.arnodo.fr/Damien/infra-scripts.git /root/infra-scripts.git
```
Rafraîchissement quotidien par cron :
```
0 3 * * * git -C /root/infra-scripts.git remote update --prune
```
Procédure de reprise :
```bash
git clone /root/infra-scripts.git /root/infra-scripts
cd /root/infra-scripts && python3 -m http.server 8000 &
```
## 2. Bootstrap du proxy
Prérequis : Tailscale installé et authentifié manuellement sur la machine du proxy **avant** de lancer le script. Le script réinstallera Tailscale — idempotent, sans effet.
```bash
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
```
Une fois sur le tailnet, MagicDNS résout et la dérivation fonctionne :
```bash
export SCRIPT_URL="https://gitea.taila5ad8.ts.net/Damien/infra-scripts/raw/branch/main/proxy/install.sh"
bash -c "$(curl -fsSL $SCRIPT_URL)"
```
Documenter que **tous les échanges passent par le tailnet** — c'est une condition forte, pas une commodité.
## 3. Bootstrap de Gitea
Serveur HTTP temporaire sur le poste de travail :
```bash
cd ~/infra-scripts
uv run --no-project python -m http.server 8000
```
Puis depuis pve01 :
```bash
export SCRIPT_URL="http://<ip-lan-du-mac>:8000/gitea/install.sh"
bash -c "$(curl -fsSL $SCRIPT_URL)"
```
**Piège à documenter explicitement** : utiliser l'**IP LAN** du poste, pas son nom tailnet. Le LXC fraîchement créé est en DHCP sur `vmbr0` et télécharge `lib/common.sh` tout en haut du script, bien avant la ligne qui installe Tailscale. À cet instant il n'a que le LAN.
Mentionner aussi le pare-feu macOS, qui demandera l'autorisation d'accepter les connexions entrantes pour Python.
## 4. README racine
Ajouter à la section Philosophy le principe qui sous-tend tout ce qui précède :
> Le dépôt qui reconstruit l'infrastructure ne doit pas dépendre de cette infrastructure.
Et une section « Bootstrap / reprise après sinistre » renvoyant vers les README de service.
## Fichiers touchés
- `README.md` racine — principe + section bootstrap + mise en place du miroir
- `proxy/README.md` — prérequis Tailscale, override `SCRIPT_URL` via tailnet
- `gitea/README.md` — procédure serveur HTTP local, piège de l'IP LAN
## Critères d'acceptation
- [ ] La commande de miroir et le cron sont documentés et testés
- [ ] Chaque README de service a sa section bootstrap avec la commande exacte, copiable telle quelle
- [ ] Le prérequis Tailscale du proxy est écrit comme condition forte, pas comme suggestion
- [ ] Le piège IP LAN vs nom tailnet est explicite dans `gitea/README.md`
- [ ] Le principe figure dans la section Philosophy du README racine
- [ ] Aucune modification de code — issue documentaire uniquement
## Dépendances
Dépend de **#19** pour l'existence de `gitea/README.md`. Peut être rédigée en parallèle, mergée après.
Damien
added this to the gitea-lxc-migration milestone 2026-08-01 07:51:20 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Contexte
Dépendance circulaire identifiée avant le rebuild complet : les scripts se téléchargent depuis Gitea, qui est précisément ce qu'on reconstruit. Le proxy a le même problème, puisque c'est lui qui route
gitea.arnodo.fr.Le mécanisme exact, vérifié dans le code :
exec_in_lxc()fait lecurlsur l'hôte Proxmox puis pousse le script dans le LXC via le tuyau — ça, ça passe. Mais une fois à l'intérieur, le script rechargelib/common.shtout seul :Lancé via
bash -s, il n'a pas de fichier sur disque et tombe toujours dans la branchecurl. Un simplegit clonesur pve01 ne suffit donc pas : le conteneur ira quand même taper sur un Gitea mort.La porte de sortie est déjà dans le code —
LIB_COMMON_URLdérive deSCRIPT_URLpar deuxdirname. SurchargerSCRIPT_URLsuffit, sans modification.Décisions retenues
pct push: le contournement parSCRIPT_URLest jugé suffisant. Cette issue est purement documentaire.git clone --mirrorsur pve01 comme filet permanent.1. Miroir sur pve01
Documenter la mise en place, à faire pendant que Gitea est vivant :
Rafraîchissement quotidien par cron :
Procédure de reprise :
2. Bootstrap du proxy
Prérequis : Tailscale installé et authentifié manuellement sur la machine du proxy avant de lancer le script. Le script réinstallera Tailscale — idempotent, sans effet.
Une fois sur le tailnet, MagicDNS résout et la dérivation fonctionne :
Documenter que tous les échanges passent par le tailnet — c'est une condition forte, pas une commodité.
3. Bootstrap de Gitea
Serveur HTTP temporaire sur le poste de travail :
Puis depuis pve01 :
Piège à documenter explicitement : utiliser l'IP LAN du poste, pas son nom tailnet. Le LXC fraîchement créé est en DHCP sur
vmbr0et téléchargelib/common.shtout en haut du script, bien avant la ligne qui installe Tailscale. À cet instant il n'a que le LAN.Mentionner aussi le pare-feu macOS, qui demandera l'autorisation d'accepter les connexions entrantes pour Python.
4. README racine
Ajouter à la section Philosophy le principe qui sous-tend tout ce qui précède :
Et une section « Bootstrap / reprise après sinistre » renvoyant vers les README de service.
Fichiers touchés
README.mdracine — principe + section bootstrap + mise en place du miroirproxy/README.md— prérequis Tailscale, overrideSCRIPT_URLvia tailnetgitea/README.md— procédure serveur HTTP local, piège de l'IP LANCritères d'acceptation
gitea/README.mdDépendances
Dépend de #19 pour l'existence de
gitea/README.md. Peut être rédigée en parallèle, mergée après.