576 lines
14 KiB
Markdown
576 lines
14 KiB
Markdown
# Déploiement Forgejo depuis les sources avec Ansible
|
|
|
|
Projet Ansible complet pour déployer [Forgejo](https://forgejo.org) (forge Git auto-hébergée) sur des serveurs Linux, avec compilation depuis les sources et pipeline CI/CD intégré.
|
|
|
|
## Qu'est-ce que Forgejo ?
|
|
|
|
Forgejo est une forge Git libre et auto-hébergée (fork communautaire de Gitea). Il permet d'héberger vos dépôts Git, gérer les pull requests, issues, CI/CD, packages, etc. C'est une alternative open-source à GitHub, GitLab ou Bitbucket.
|
|
|
|
## Caractéristiques de ce projet
|
|
|
|
- ✅ **Compilation depuis les sources** - Contrôle total sur la version et les options
|
|
- ✅ **Installation automatique de Go** (1.22.2) et Node.js (20.x)
|
|
- ✅ **CI/CD intégré** - Forgejo Actions avec runner configuré
|
|
- ✅ **Base de données SQLite** - Aucune dépendance externe
|
|
- ✅ **Service systemd** - Démarrage automatique au boot
|
|
- ✅ **Idempotent** - Réexécution sans risque
|
|
- ✅ **Multi-serveurs** - Déploiement sur plusieurs machines
|
|
- ✅ **Makefile complet** - Commandes simples et intuitives
|
|
|
|
## Prérequis
|
|
|
|
### Sur votre machine locale (de contrôle)
|
|
- Python 3.8 ou supérieur
|
|
- Git
|
|
- Connexion internet
|
|
|
|
### Sur le(s) serveur(s) cible(s)
|
|
- Ubuntu 20.04+ ou Debian 11+ (autres distributions non testées)
|
|
- Minimum 2 Go RAM, 2 CPU cores
|
|
- 10 Go d'espace disque libre
|
|
- Accès root via SSH avec clé
|
|
- Ports ouverts : 3000 (HTTP), 2222 (SSH Git)
|
|
|
|
## Installation rapide
|
|
|
|
```bash
|
|
# 1. Générer le projet
|
|
python3 create_forgejo_project.py
|
|
cd forgejo-deploy
|
|
|
|
# 2. Installer les dépendances
|
|
make install
|
|
make install-collections
|
|
|
|
# 3. Configurer le serveur cible
|
|
make setup
|
|
# Vous serez invité à saisir :
|
|
# - IP du serveur
|
|
# - Chemin de la clé SSH
|
|
# - Utilisateur SSH (défaut: root)
|
|
|
|
# 4. Tester la connexion
|
|
make test-connection
|
|
|
|
# 5. Déployer
|
|
make deploy
|
|
```
|
|
|
|
**Ou tout en une commande** :
|
|
```bash
|
|
python3 create_forgejo_project.py && cd forgejo-deploy && make prod
|
|
```
|
|
|
|
## Guide d'installation détaillé
|
|
|
|
### Étape 1 : Générer le projet
|
|
|
|
```bash
|
|
# Générer avec le nom par défaut
|
|
python3 create_forgejo_project.py
|
|
|
|
# Ou avec un nom personnalisé
|
|
python3 create_forgejo_project.py --project-name ma-forge
|
|
```
|
|
|
|
Cela crée un répertoire contenant :
|
|
```
|
|
forgejo-deploy/
|
|
├── Makefile # Commandes make
|
|
├── playbook.yml # Playbook Ansible principal
|
|
├── ansible.cfg # Configuration Ansible
|
|
├── roles/
|
|
│ └── forgejo/ # Rôle de déploiement
|
|
├── scripts/
|
|
└── README.md
|
|
```
|
|
|
|
### Étape 2 : Installer les prérequis
|
|
|
|
```bash
|
|
cd forgejo-deploy
|
|
|
|
# Crée un virtualenv et installe Ansible
|
|
make install
|
|
|
|
# Installe les collections Ansible nécessaires
|
|
make install-collections
|
|
```
|
|
|
|
### Étape 3 : Configurer l'inventaire
|
|
|
|
```bash
|
|
make setup
|
|
```
|
|
|
|
Vous serez invité à saisir :
|
|
- **IP du serveur** : L'adresse IP de votre serveur (ex: 192.168.1.100)
|
|
- **Clé SSH** : Chemin vers votre clé privée (défaut: ~/.ssh/id_rsa)
|
|
- **Utilisateur SSH** : Utilisateur pour la connexion (défaut: root)
|
|
|
|
Cela crée le fichier `inventory.ini` :
|
|
```ini
|
|
[forgejo_servers]
|
|
forgejo_prod ansible_host=192.168.1.100 ansible_user=root ansible_ssh_private_key_file=/home/user/.ssh/id_rsa
|
|
|
|
[forgejo_servers:vars]
|
|
ansible_python_interpreter=/usr/bin/python3
|
|
```
|
|
|
|
### Étape 4 : Tester la connexion
|
|
|
|
```bash
|
|
make test-connection
|
|
```
|
|
|
|
Si le test échoue, vérifiez :
|
|
- L'IP du serveur est correcte
|
|
- La clé SSH a les bonnes permissions (`chmod 600 ~/.ssh/id_rsa`)
|
|
- L'utilisateur a les droits sudo/root
|
|
- Le pare-feu autorise SSH (port 22)
|
|
|
|
### Étape 5 : Déployer Forgejo
|
|
|
|
```bash
|
|
make deploy
|
|
```
|
|
|
|
Le déploiement prend environ 10-15 minutes et effectue :
|
|
1. Installation des dépendances système
|
|
2. Installation de Node.js 20.x
|
|
3. Installation de Go 1.22.2
|
|
4. Création de l'utilisateur système `git`
|
|
5. Clonage du code source Forgejo
|
|
6. Compilation (backend Go + frontend Node.js)
|
|
7. Configuration du service systemd
|
|
8. Installation du runner CI/CD
|
|
9. Démarrage des services
|
|
|
|
### Étape 6 : Accéder à Forgejo
|
|
|
|
Une fois le déploiement terminé :
|
|
|
|
```bash
|
|
# Vérifier que le service tourne
|
|
make status
|
|
|
|
# Consulter les logs si besoin
|
|
make logs
|
|
```
|
|
|
|
Accédez à Forgejo via votre navigateur :
|
|
```
|
|
http://<IP_SERVEUR>:3000
|
|
```
|
|
|
|
**Première connexion** :
|
|
- Utilisateur : `admin`
|
|
- Mot de passe : `ChangeMe123!`
|
|
|
|
**Important** : Changez immédiatement le mot de passe admin après la première connexion.
|
|
|
|
## Commandes disponibles
|
|
|
|
Toutes les commandes disponibles via `make` :
|
|
|
|
```bash
|
|
make help # Affiche toutes les commandes
|
|
make install # Installe les prérequis Python/Ansible
|
|
make install-collections # Installe les collections Ansible
|
|
make check # Vérifie la syntaxe du playbook
|
|
make setup # Configure l'inventaire (IP + clé SSH)
|
|
make test-connection # Test la connexion SSH au serveur
|
|
make deploy # Déploie Forgejo complet
|
|
make deploy-ci # Déploie uniquement le pipeline CI/CD
|
|
make prod # Installation complète (install + deploy)
|
|
make status # Vérifie le statut du service Forgejo
|
|
make logs # Affiche les logs du service
|
|
make update-forgejo # Met à jour Forgejo vers une nouvelle version
|
|
make backup # Crée une sauvegarde de Forgejo
|
|
make clean # Nettoie les fichiers générés (venv, inventory)
|
|
```
|
|
|
|
## Configuration avancée
|
|
|
|
### Personnaliser les variables
|
|
|
|
Éditez `roles/forgejo/defaults/main.yml` pour modifier :
|
|
|
|
```yaml
|
|
# Version de Forgejo
|
|
forgejo_version: "8.0.3"
|
|
|
|
# Ports
|
|
forgejo_port: 3000 # Port HTTP
|
|
forgejo_ssh_port: 2222 # Port SSH Git
|
|
|
|
# Répertoires
|
|
forgejo_home: "/opt/forgejo"
|
|
forgejo_data_dir: "/var/lib/forgejo"
|
|
|
|
# Utilisateur
|
|
forgejo_user: "git"
|
|
forgejo_group: "git"
|
|
|
|
# Credentials admin (à changer !)
|
|
forgejo_admin_user: "admin"
|
|
forgejo_admin_password: "VotreMotDePasseSecurisé"
|
|
forgejo_admin_email: "admin@example.com"
|
|
|
|
# Base de données
|
|
forgejo_db_type: "sqlite3" # Ou "postgres", "mysql"
|
|
|
|
# CI/CD
|
|
forgejo_enable_actions: true
|
|
```
|
|
|
|
Après modification, redéployez :
|
|
```bash
|
|
make deploy
|
|
```
|
|
|
|
### Déployer sur plusieurs serveurs
|
|
|
|
Éditez `inventory.ini` pour ajouter plusieurs serveurs :
|
|
|
|
```ini
|
|
[forgejo_servers]
|
|
forge-prod ansible_host=192.168.1.10 ansible_user=root ansible_ssh_private_key_file=~/.ssh/id_rsa
|
|
forge-staging ansible_host=192.168.1.20 ansible_user=root ansible_ssh_private_key_file=~/.ssh/id_rsa
|
|
forge-dev ansible_host=192.168.1.30 ansible_user=root ansible_ssh_private_key_file=~/.ssh/id_rsa
|
|
```
|
|
|
|
Déployer sur tous :
|
|
```bash
|
|
make deploy
|
|
```
|
|
|
|
Déployer sur un seul :
|
|
```bash
|
|
venv/bin/ansible-playbook -i inventory.ini playbook.yml --limit forge-staging
|
|
```
|
|
|
|
### Utiliser PostgreSQL au lieu de SQLite
|
|
|
|
Dans `roles/forgejo/defaults/main.yml` :
|
|
|
|
```yaml
|
|
forgejo_db_type: "postgres"
|
|
forgejo_db_host: "localhost"
|
|
forgejo_db_name: "forgejo"
|
|
forgejo_db_user: "forgejo"
|
|
forgejo_db_password: "VotreMotDePasse"
|
|
```
|
|
|
|
Ajoutez l'installation de PostgreSQL dans les tâches si nécessaire.
|
|
|
|
## Utilisation du CI/CD
|
|
|
|
### Activer Forgejo Actions dans un dépôt
|
|
|
|
Créez `.forgejo/workflows/ci.yml` dans votre dépôt :
|
|
|
|
```yaml
|
|
name: CI
|
|
on: [push, pull_request]
|
|
|
|
jobs:
|
|
test:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v3
|
|
|
|
- name: Run tests
|
|
run: |
|
|
echo "Running tests..."
|
|
# Vos commandes de test ici
|
|
|
|
- name: Build
|
|
run: |
|
|
echo "Building..."
|
|
# Vos commandes de build ici
|
|
```
|
|
|
|
Le runner Forgejo exécutera automatiquement ce workflow à chaque push.
|
|
|
|
### Exemples de workflows
|
|
|
|
**Python** :
|
|
```yaml
|
|
name: Python CI
|
|
on: [push]
|
|
jobs:
|
|
test:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v3
|
|
- uses: actions/setup-python@v4
|
|
with:
|
|
python-version: '3.11'
|
|
- run: pip install -r requirements.txt
|
|
- run: pytest
|
|
```
|
|
|
|
**Node.js** :
|
|
```yaml
|
|
name: Node.js CI
|
|
on: [push]
|
|
jobs:
|
|
test:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v3
|
|
- uses: actions/setup-node@v3
|
|
with:
|
|
node-version: '20'
|
|
- run: npm install
|
|
- run: npm test
|
|
```
|
|
|
|
## Maintenance
|
|
|
|
### Mettre à jour Forgejo
|
|
|
|
```bash
|
|
# Éditer la version dans roles/forgejo/defaults/main.yml
|
|
forgejo_version: "8.1.0" # Nouvelle version
|
|
|
|
# Redéployer
|
|
make deploy
|
|
```
|
|
|
|
### Sauvegardes
|
|
|
|
```bash
|
|
# Créer une sauvegarde
|
|
make backup
|
|
```
|
|
|
|
Pour une sauvegarde complète manuelle :
|
|
```bash
|
|
ssh root@<ip_serveur>
|
|
tar -czf /root/forgejo-backup-$(date +%Y%m%d).tar.gz /var/lib/forgejo /opt/forgejo/forgejo /etc/systemd/system/forgejo.service
|
|
```
|
|
|
|
### Consulter les logs
|
|
|
|
```bash
|
|
# Via make
|
|
make logs
|
|
|
|
# Directement sur le serveur
|
|
ssh root@<ip_serveur>
|
|
journalctl -u forgejo -f # Logs en temps réel
|
|
journalctl -u forgejo -n 100 # 100 dernières lignes
|
|
journalctl -u forgejo-runner -f # Logs du runner CI/CD
|
|
```
|
|
|
|
### Redémarrer le service
|
|
|
|
```bash
|
|
ssh root@<ip_serveur>
|
|
systemctl restart forgejo
|
|
systemctl status forgejo
|
|
```
|
|
|
|
## Dépannage
|
|
|
|
### Le déploiement échoue lors de la compilation
|
|
|
|
**Erreur** : `node: not found`
|
|
|
|
**Solution** : Assurez-vous que Node.js est installé. Regénérez le projet avec la dernière version du script.
|
|
|
|
**Erreur** : `Go version too old`
|
|
|
|
**Solution** : Le playbook installe automatiquement Go 1.22.2. Si l'erreur persiste, supprimez `/usr/local/go` sur le serveur et relancez.
|
|
|
|
### Le service ne démarre pas
|
|
|
|
```bash
|
|
# Vérifier les logs
|
|
make logs
|
|
|
|
# Vérifier la configuration
|
|
ssh root@<ip_serveur>
|
|
/opt/forgejo/forgejo doctor check --all
|
|
|
|
# Vérifier les permissions
|
|
ls -la /opt/forgejo
|
|
ls -la /var/lib/forgejo
|
|
```
|
|
|
|
### Impossible de se connecter
|
|
|
|
**Port 3000 non accessible** :
|
|
|
|
```bash
|
|
# Sur le serveur, vérifier que le service écoute
|
|
ss -tlnp | grep 3000
|
|
|
|
# Vérifier le pare-feu
|
|
ufw status
|
|
# Autoriser le port si nécessaire
|
|
ufw allow 3000/tcp
|
|
```
|
|
|
|
### Erreur "dubious ownership in repository"
|
|
|
|
```bash
|
|
# Sur le serveur
|
|
git config --global --add safe.directory /opt/forgejo/src
|
|
chown -R git:git /opt/forgejo/src
|
|
```
|
|
|
|
### Le runner CI/CD ne fonctionne pas
|
|
|
|
```bash
|
|
# Vérifier le statut du runner
|
|
ssh root@<ip_serveur>
|
|
systemctl status forgejo-runner
|
|
|
|
# Voir les logs
|
|
journalctl -u forgejo-runner -n 50
|
|
```
|
|
|
|
## Architecture technique
|
|
|
|
### Structure des fichiers
|
|
|
|
```
|
|
Serveur Forgejo :
|
|
/opt/forgejo/
|
|
├── forgejo # Binaire principal
|
|
├── src/ # Code source
|
|
└── go/ # GOPATH
|
|
|
|
/var/lib/forgejo/
|
|
├── forgejo.db # Base de données SQLite
|
|
├── repositories/ # Dépôts Git
|
|
├── actions/ # Données CI/CD
|
|
├── custom/
|
|
│ └── conf/
|
|
│ └── app.ini # Configuration
|
|
└── runners/ # Configuration runner
|
|
|
|
/var/log/forgejo/ # Logs
|
|
```
|
|
|
|
### Services systemd
|
|
|
|
- `forgejo.service` - Service principal Forgejo
|
|
- `forgejo-runner.service` - Runner pour CI/CD
|
|
|
|
### Ports utilisés
|
|
|
|
- `3000` - Interface web HTTP
|
|
- `2222` - SSH Git (pour git clone/push)
|
|
- `22` - SSH système (administration)
|
|
|
|
### Technologies
|
|
|
|
- **Backend** : Go 1.22.2
|
|
- **Frontend** : Node.js 20.x, npm
|
|
- **Base de données** : SQLite 3 (par défaut)
|
|
- **CI/CD** : Forgejo Actions (compatible GitHub Actions)
|
|
- **Orchestration** : Ansible 2.10+
|
|
- **OS** : Systemd-based Linux
|
|
|
|
## Sécurité
|
|
|
|
### Recommandations post-installation
|
|
|
|
1. **Changez le mot de passe admin** immédiatement après l'installation
|
|
|
|
2. **Configurez HTTPS** avec un reverse proxy (nginx/caddy) :
|
|
```nginx
|
|
server {
|
|
listen 443 ssl http2;
|
|
server_name git.example.com;
|
|
|
|
ssl_certificate /etc/letsencrypt/live/git.example.com/fullchain.pem;
|
|
ssl_certificate_key /etc/letsencrypt/live/git.example.com/privkey.pem;
|
|
|
|
location / {
|
|
proxy_pass http://localhost: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;
|
|
}
|
|
}
|
|
```
|
|
|
|
3. **Configurez le pare-feu** :
|
|
```bash
|
|
ufw allow 22/tcp # SSH
|
|
ufw allow 80/tcp # HTTP (redirect vers HTTPS)
|
|
ufw allow 443/tcp # HTTPS
|
|
ufw allow 2222/tcp # SSH Git
|
|
ufw enable
|
|
```
|
|
|
|
4. **Activez les sauvegardes automatiques** :
|
|
```bash
|
|
# Cron quotidien
|
|
0 2 * * * tar -czf /backup/forgejo-$(date +\%Y\%m\%d).tar.gz /var/lib/forgejo
|
|
```
|
|
|
|
5. **Désactivez l'inscription publique** si non nécessaire (dans `app.ini`) :
|
|
```ini
|
|
[service]
|
|
DISABLE_REGISTRATION = true
|
|
```
|
|
|
|
6. **Activez 2FA** pour les comptes administrateurs
|
|
|
|
## FAQ
|
|
|
|
**Q : Puis-je utiliser MySQL/PostgreSQL au lieu de SQLite ?**
|
|
R : Oui, modifiez les variables dans `roles/forgejo/defaults/main.yml` et ajoutez l'installation du serveur de base de données.
|
|
|
|
**Q : Combien de temps prend le déploiement ?**
|
|
R : Environ 10-15 minutes (compilation comprise).
|
|
|
|
**Q : Puis-je déployer plusieurs instances Forgejo ?**
|
|
R : Oui, ajoutez plusieurs serveurs dans `inventory.ini`.
|
|
|
|
**Q : Comment migrer depuis Gitea ?**
|
|
R : Forgejo est un fork de Gitea et est compatible. Copiez simplement les données.
|
|
|
|
**Q : Forgejo Actions est-il compatible avec GitHub Actions ?**
|
|
R : Oui, la plupart des workflows GitHub Actions fonctionnent sans modification.
|
|
|
|
**Q : Puis-je utiliser ce script en production ?**
|
|
R : Oui, mais ajoutez HTTPS, des sauvegardes automatiques et durcissez la sécurité.
|
|
|
|
**Q : Comment contribuer à ce projet ?**
|
|
R : Les pull requests sont bienvenues ! Voir CONTRIBUTING.md.
|
|
|
|
## Ressources
|
|
|
|
- [Documentation officielle Forgejo](https://forgejo.org/docs/)
|
|
- [Documentation Forgejo Actions](https://forgejo.org/docs/latest/user/actions/)
|
|
- [Code source Forgejo](https://codeberg.org/forgejo/forgejo)
|
|
- [Forum communautaire](https://codeberg.org/forgejo/discussions)
|
|
|
|
## Licence
|
|
|
|
Ce projet de déploiement est sous licence MIT.
|
|
|
|
Forgejo lui-même est sous licence MIT : https://codeberg.org/forgejo/forgejo/src/branch/forgejo/LICENSE
|
|
|
|
## Auteur
|
|
|
|
Généré par create_forgejo_project.py - Projet de déploiement Ansible pour Forgejo
|
|
|
|
## Support
|
|
|
|
Pour toute question ou problème :
|
|
- Ouvrez une issue dans le dépôt
|
|
- Consultez la documentation Forgejo officielle
|
|
- Rejoignez la communauté Forgejo
|
|
|
|
---
|
|
|
|
**Note importante sur l'intervention humaine** : Ce système nécessite **toujours** une intervention humaine pour déclencher un déploiement. Aucun déploiement automatique n'est effectué. Chaque commande `make deploy` est un acte délibéré et conscient de l'opérateur.
|