From 6cb3d4239e61e5e27c43da80c00c2b510b3bba0e Mon Sep 17 00:00:00 2001 From: BeauTroll <-> Date: Tue, 16 Dec 2025 19:12:43 +0100 Subject: [PATCH] Restructure project following production-ready standards MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add comprehensive docker-compose configuration with health checks - Create Makefile with 16 utility commands for easy management - Implement robust backup/restore/update scripts with error handling - Add optimized PostgreSQL configuration for Gitea workload - Enhance .env.example with clear dev/prod sections and documentation - Create comprehensive README with installation, configuration, and maintenance guides - Improve .gitignore to exclude all sensitive and generated files - Add Redis persistence (AOF) and memory limits - Configure service dependencies with health conditions đŸ€– Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 --- .env.example | 61 ++++- .gitignore | 52 +++- Makefile | 86 +++++++ README.md | 519 ++++++++++++++++++++++++++++++++++++++ db-config/postgresql.conf | 77 ++++++ docker-compose.yml | 30 ++- scripts/backup.sh | 121 +++++++++ scripts/restore.sh | 191 ++++++++++++++ scripts/update.sh | 106 ++++++++ 9 files changed, 1231 insertions(+), 12 deletions(-) create mode 100644 Makefile create mode 100644 README.md create mode 100644 db-config/postgresql.conf create mode 100755 scripts/backup.sh create mode 100755 scripts/restore.sh create mode 100755 scripts/update.sh diff --git a/.env.example b/.env.example index e75b0f5..bd264e9 100644 --- a/.env.example +++ b/.env.example @@ -1,9 +1,56 @@ -POSTGRES_DATABASE= -POSTGRES_USER= -POSTGRES_PASSWORD= +# ============================================ +# CONFIGURATION GITEA DOCKER +# ============================================ +# Copiez ce fichier vers .env et remplissez les valeurs +# cp .env.example .env -GITEA_DOMAIN=domain.tld -GITEA_SSH_DOMAIN=domain.tld -GITEA_ROOT_URL=https://domain.tld +# ============================================ +# MODE DE DÉPLOIEMENT +# ============================================ +# DĂ©commentez la section qui vous concerne (dev OU prod) -REDIS_PASSWORD= +# --- DÉVELOPPEMENT (local) --- +# GITEA_DOMAIN=localhost +# GITEA_SSH_DOMAIN=localhost +# GITEA_ROOT_URL=http://localhost:3000 + +# --- PRODUCTION --- +GITEA_DOMAIN=git.domain.tld +GITEA_SSH_DOMAIN=git.domain.tld +GITEA_ROOT_URL=https://git.domain.tld + +# ============================================ +# BASE DE DONNÉES POSTGRESQL +# ============================================ +# Nom de la base de donnĂ©es +POSTGRES_DATABASE=gitea + +# Utilisateur PostgreSQL +POSTGRES_USER=gitea + +# Mot de passe PostgreSQL (CHANGEZ-MOI EN PRODUCTION!) +# GĂ©nĂ©rez un mot de passe sĂ©curisĂ©: openssl rand -base64 32 +POSTGRES_PASSWORD=changeme_secure_password_here + +# ============================================ +# CACHE REDIS +# ============================================ +# Mot de passe Redis (CHANGEZ-MOI EN PRODUCTION!) +# GĂ©nĂ©rez un mot de passe sĂ©curisĂ©: openssl rand -base64 32 +REDIS_PASSWORD=changeme_redis_password_here + +# ============================================ +# SAUVEGARDES +# ============================================ +# Nombre de jours de rĂ©tention des sauvegardes +BACKUP_RETENTION_DAYS=7 + +# ============================================ +# NOTES +# ============================================ +# 1. Ne commitez JAMAIS le fichier .env dans Git +# 2. Utilisez des mots de passe forts en production (32+ caractĂšres) +# 3. Pour gĂ©nĂ©rer des mots de passe: openssl rand -base64 32 +# 4. En dĂ©veloppement, Gitea est accessible sur http://localhost:3000 +# 5. SSH est accessible sur le port 2223 (ssh -p 2223 git@localhost) +# 6. En production, utilisez un reverse proxy (nginx/traefik) avec SSL diff --git a/.gitignore b/.gitignore index db65459..b3905cd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,51 @@ -postgres -data +# ============================================ +# Gitea Docker .gitignore +# ============================================ + +# Fichiers de configuration sensibles .env + +# DonnĂ©es de base de donnĂ©es PostgreSQL +postgres/ +*.sql +*.dump + +# DonnĂ©es Gitea (dĂ©pĂŽts, uploads, etc.) +data/ + +# DonnĂ©es Redis +redis/ + +# Sauvegardes +backups/ +*.tar.gz +*.zip + +# Logs +logs/ +*.log + +# Fichiers temporaires +tmp/ +temp/ +*.tmp +*.swp +*.swo +*~ + +# SystĂšme d'exploitation +.DS_Store +Thumbs.db +desktop.ini + +# IDE et Ă©diteurs +.vscode/ +.idea/ +*.iml +.project +.settings/ +.classpath + +# Docker +.docker/ +docker-compose.override.yml diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..c3d8787 --- /dev/null +++ b/Makefile @@ -0,0 +1,86 @@ +.PHONY: help up down restart ps logs logs-f backup restore update health shell-gitea shell-db clean + +# Include .env file if it exists +-include .env +export + +help: ## Afficher cette aide + @echo "Commandes disponibles pour Gitea Docker :" + @echo "" + @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-15s\033[0m %s\n", $$1, $$2}' + +up: ## DĂ©marrer tous les services + @echo "DĂ©marrage des services Gitea..." + @docker compose up -d + @echo "Services dĂ©marrĂ©s. AccĂ©dez Ă  Gitea sur http://localhost:3000" + +down: ## ArrĂȘter tous les services + @echo "ArrĂȘt des services..." + @docker compose down + +restart: ## RedĂ©marrer tous les services + @echo "RedĂ©marrage des services..." + @docker compose restart + +ps: ## Afficher le statut des services + @docker compose ps + +logs: ## Afficher les logs (derniĂšres 100 lignes) + @docker compose logs --tail=100 + +logs-f: ## Suivre les logs en temps rĂ©el + @docker compose logs -f + +backup: ## CrĂ©er une sauvegarde complĂšte (DB + repositories) + @bash scripts/backup.sh + +restore: ## Restaurer depuis une sauvegarde (usage: make restore FILE=backups/gitea_backup_YYYYMMDD_HHMMSS.tar.gz) + @if [ -z "$(FILE)" ]; then \ + echo "Erreur: SpĂ©cifiez le fichier de sauvegarde avec FILE="; \ + echo "Usage: make restore FILE=backups/gitea_backup_YYYYMMDD_HHMMSS.tar.gz"; \ + exit 1; \ + fi + @bash scripts/restore.sh "$(FILE)" + +update: ## Mettre Ă  jour Gitea (avec backup automatique) + @bash scripts/update.sh + +health: ## VĂ©rifier la santĂ© des services + @echo "État de santĂ© des services:" + @echo "" + @docker compose ps --format "table {{.Name}}\t{{.Status}}\t{{.Health}}" + @echo "" + @echo "DĂ©tails des health checks:" + @docker inspect --format='{{.Name}}: {{.State.Health.Status}}' $$(docker compose ps -q) 2>/dev/null || echo "Aucun service en cours d'exĂ©cution" + +shell-gitea: ## Ouvrir un shell dans le conteneur Gitea + @docker compose exec gitea /bin/sh + +shell-db: ## Ouvrir un shell PostgreSQL + @docker compose exec db psql -U $(POSTGRES_USER) -d $(POSTGRES_DATABASE) + +clean: ## Nettoyer les conteneurs arrĂȘtĂ©s et volumes non utilisĂ©s + @echo "Nettoyage des conteneurs arrĂȘtĂ©s..." + @docker compose down -v + @echo "Nettoyage terminĂ©" + +pull: ## TĂ©lĂ©charger les derniĂšres images Docker + @docker compose pull + +build: ## Rebuild les images si nĂ©cessaire + @docker compose build + +config: ## Valider et afficher la configuration docker-compose + @docker compose config + +# Commandes avancĂ©es +admin-create: ## CrĂ©er un utilisateur admin (usage: make admin-create USER=admin EMAIL=admin@example.com) + @if [ -z "$(USER)" ] || [ -z "$(EMAIL)" ]; then \ + echo "Usage: make admin-create USER=username EMAIL=email@example.com"; \ + exit 1; \ + fi + @docker compose exec gitea gitea admin user create --admin --username $(USER) --email $(EMAIL) --password "ChangeMe123!" + @echo "Utilisateur admin créé. Mot de passe par dĂ©faut: ChangeMe123!" + +stats: ## Afficher les statistiques d'utilisation des ressources + @docker stats --no-stream $$(docker compose ps -q) diff --git a/README.md b/README.md new file mode 100644 index 0000000..8497883 --- /dev/null +++ b/README.md @@ -0,0 +1,519 @@ +# Gitea Docker - Instance Auto-hĂ©bergĂ©e + +DĂ©ploiement Docker de Gitea avec PostgreSQL et Redis, conçu pour ĂȘtre stable, maintenable et facilement dĂ©ployable. + +## Table des matiĂšres + +- [Architecture](#architecture) +- [PrĂ©requis](#prĂ©requis) +- [Installation](#installation) +- [Configuration](#configuration) +- [DĂ©marrage](#dĂ©marrage) +- [Maintenance](#maintenance) + - [Sauvegardes](#sauvegardes) + - [Restauration](#restauration) + - [Mises Ă  jour](#mises-Ă -jour) +- [Commandes Make](#commandes-make) +- [DĂ©pannage](#dĂ©pannage) +- [SĂ©curitĂ©](#sĂ©curitĂ©) +- [Structure du projet](#structure-du-projet) + +## Architecture + +Cette installation comprend 3 services Docker orchestrĂ©s : + +### Services + +1. **Gitea** - Serveur Git auto-hĂ©bergĂ© + - Port web: `127.0.0.1:3000` (localhost uniquement) + - Port SSH: `2223` + - Base de donnĂ©es: PostgreSQL + - Cache: Redis + - Health check: API `/api/healthz` + +2. **PostgreSQL 15** - Base de donnĂ©es + - Stockage: `./postgres` + - Configuration personnalisĂ©e: `./db-config/postgresql.conf` + - Health check: `pg_isready` + +3. **Redis** - Cache et sessions + - Stockage: `./redis` (persistence AOF) + - Limite mĂ©moire: 256MB + - Politique d'Ă©viction: allkeys-lru + +### RĂ©seaux + +- **gitea** (bridge) - RĂ©seau interne pour la communication entre services + +## PrĂ©requis + +### Logiciels requis + +- Docker >= 20.10 +- Docker Compose >= 2.0 +- Make (optionnel mais recommandĂ©) +- Bash >= 4.0 + +### Ressources matĂ©rielles recommandĂ©es + +| Composant | Minimum | RecommandĂ© | +| --------- | ------- | ---------- | +| CPU | 2 cƓurs | 4+ cƓurs | +| RAM | 2 GB | 4+ GB | +| Stockage | 10 GB | 50+ GB SSD | + +### SystĂšme d'exploitation + +- Linux (Ubuntu 20.04+, Debian 11+, etc.) +- macOS 10.15+ +- Windows 10/11 avec WSL2 + +## Installation + +### 1. Cloner le dĂ©pĂŽt + +```bash +git clone +cd agence66-gitea +``` + +### 2. CrĂ©er le fichier de configuration + +```bash +cp .env.example .env +``` + +### 3. Configurer les variables d'environnement + +Éditez le fichier `.env` et modifiez les valeurs : + +```bash +nano .env # ou vim, code, etc. +``` + +**IMPORTANT**: Changez tous les mots de passe par dĂ©faut ! + +```bash +# GĂ©nĂ©rer des mots de passe sĂ©curisĂ©s +openssl rand -base64 32 +``` + +## Configuration + +### Variables d'environnement + +| Variable | Description | Exemple | +| ----------------------- | ------------------------- | ------------------------------- | +| `GITEA_DOMAIN` | Domaine principal | `git.example.com` | +| `GITEA_SSH_DOMAIN` | Domaine SSH | `git.example.com` | +| `GITEA_ROOT_URL` | URL complĂšte | `https://git.example.com` | +| `POSTGRES_DATABASE` | Nom de la BDD | `gitea` | +| `POSTGRES_USER` | Utilisateur PostgreSQL | `gitea` | +| `POSTGRES_PASSWORD` | Mot de passe BDD | `changeme_secure_password_here` | +| `REDIS_PASSWORD` | Mot de passe Redis | `changeme_redis_password_here` | +| `BACKUP_RETENTION_DAYS` | RĂ©tention des sauvegardes | `7` | + +### Configuration DĂ©veloppement vs Production + +#### Mode DĂ©veloppement (local) + +Dans `.env`, utilisez : + +```env +GITEA_DOMAIN=localhost +GITEA_SSH_DOMAIN=localhost +GITEA_ROOT_URL=http://localhost:3000 +``` + +AccĂšs : + +- Web: http://localhost:3000 +- SSH: `ssh -p 2223 git@localhost` + +#### Mode Production + +Dans `.env`, utilisez : + +```env +GITEA_DOMAIN=domain.tld +GITEA_SSH_DOMAIN=domain.tld +GITEA_ROOT_URL=https://domain.tld +``` + +**IMPORTANT**: En production, utilisez un reverse proxy (nginx/traefik) avec SSL/TLS. + +### Configuration PostgreSQL + +La configuration optimisĂ©e se trouve dans `db-config/postgresql.conf`. + +Ajustez selon vos ressources : + +- `shared_buffers`: 25% de la RAM disponible +- `effective_cache_size`: 50-75% de la RAM disponible + +## DĂ©marrage + +### PremiĂšre installation + +```bash +# DĂ©marrer tous les services +make up + +# Ou avec docker compose directement +docker compose up -d +``` + +### AccĂ©der Ă  Gitea + +1. Ouvrez votre navigateur sur http://localhost:3000 +2. Suivez l'assistant de configuration initial +3. CrĂ©ez le premier utilisateur administrateur + +**Note**: La plupart des paramĂštres sont dĂ©jĂ  configurĂ©s via les variables d'environnement. + +### VĂ©rifier l'Ă©tat des services + +```bash +make health +``` + +Ou : + +```bash +docker compose ps +``` + +## Maintenance + +### Sauvegardes + +#### CrĂ©er une sauvegarde manuelle + +```bash +make backup +``` + +Ou : + +```bash +bash scripts/backup.sh +``` + +**Contenu de la sauvegarde** : + +- Base de donnĂ©es PostgreSQL (dump compressĂ©) +- DĂ©pĂŽts Git +- Configuration Gitea +- DonnĂ©es utilisateur + +**Emplacement** : `./backups/gitea_backup_YYYYMMDD_HHMMSS.tar.gz` + +#### RĂ©tention automatique + +Les sauvegardes de plus de `BACKUP_RETENTION_DAYS` jours (dĂ©faut: 7) sont automatiquement supprimĂ©es. + +#### Sauvegardes automatiques (cron) + +Ajoutez une tĂąche cron pour des sauvegardes quotidiennes : + +```bash +crontab -e +``` + +Ajoutez : + +```cron +# Sauvegarde quotidienne Ă  3h du matin +0 3 * * * cd /chemin/vers/agence66-gitea && make backup >> /var/log/gitea-backup.log 2>&1 +``` + +### Restauration + +#### Restaurer depuis une sauvegarde + +```bash +make restore FILE=backups/gitea_backup_20240101_120000.tar.gz +``` + +Ou : + +```bash +bash scripts/restore.sh backups/gitea_backup_20240101_120000.tar.gz +``` + +**ATTENTION** : Cette opĂ©ration est destructive et Ă©crasera toutes les donnĂ©es actuelles ! + +Le script vous demandera confirmation avant de procĂ©der. + +#### Processus de restauration + +1. Extraction de l'archive +2. ArrĂȘt des services +3. Restauration de la base de donnĂ©es +4. Restauration des fichiers +5. RedĂ©marrage des services + +### Mises Ă  jour + +#### Mettre Ă  jour Gitea + +```bash +make update +``` + +Ou : + +```bash +bash scripts/update.sh +``` + +**Le script effectue** : + +1. Sauvegarde automatique de sĂ©curitĂ© +2. TĂ©lĂ©chargement des nouvelles images +3. ArrĂȘt des services +4. DĂ©marrage avec les nouvelles versions +5. VĂ©rification de l'Ă©tat + +**En cas de problĂšme**, restaurez la sauvegarde créée automatiquement : + +```bash +make restore FILE=backups/gitea_backup_YYYYMMDD_HHMMSS.tar.gz +``` + +## Commandes Make + +| Commande | Description | +| ----------------------- | ---------------------------------------- | +| `make help` | Afficher l'aide | +| `make up` | DĂ©marrer tous les services | +| `make down` | ArrĂȘter tous les services | +| `make restart` | RedĂ©marrer les services | +| `make ps` | Afficher le statut des services | +| `make logs` | Afficher les logs (100 derniĂšres lignes) | +| `make logs-f` | Suivre les logs en temps rĂ©el | +| `make backup` | CrĂ©er une sauvegarde | +| `make restore FILE=...` | Restaurer une sauvegarde | +| `make update` | Mettre Ă  jour Gitea | +| `make health` | VĂ©rifier la santĂ© des services | +| `make shell-gitea` | Ouvrir un shell dans Gitea | +| `make shell-db` | Ouvrir un shell PostgreSQL | +| `make clean` | Nettoyer les conteneurs arrĂȘtĂ©s | +| `make pull` | TĂ©lĂ©charger les derniĂšres images | +| `make config` | Valider la configuration Docker | +| `make stats` | Afficher les statistiques de ressources | + +### CrĂ©er un utilisateur admin en ligne de commande + +```bash +make admin-create USER=admin EMAIL=admin@example.com +``` + +Le mot de passe par dĂ©faut sera `ChangeMe123!` (Ă  changer immĂ©diatement). + +## DĂ©pannage + +### Gitea ne dĂ©marre pas + +**VĂ©rifier les logs** : + +```bash +make logs-f +``` + +Ou : + +```bash +docker compose logs -f gitea +``` + +**Causes courantes** : + +- Base de donnĂ©es non prĂȘte : attendez que PostgreSQL soit healthy +- Permissions de fichiers : vĂ©rifiez `./data` (UID/GID 1000) +- Port dĂ©jĂ  utilisĂ© : vĂ©rifiez si le port 3000 ou 2223 est disponible + +### Erreurs de base de donnĂ©es + +**VĂ©rifier PostgreSQL** : + +```bash +make shell-db +``` + +**VĂ©rifier la connexion** : + +```bash +docker compose exec db pg_isready -U gitea -d gitea +``` + +### ProblĂšmes de performance + +**VĂ©rifier l'utilisation des ressources** : + +```bash +make stats +``` + +**Optimisations** : + +1. Augmentez `shared_buffers` dans `db-config/postgresql.conf` +2. Ajustez la limite mĂ©moire Redis dans `docker-compose.yml` +3. Activez la compression dans Gitea + +### Redis ne fonctionne pas + +**VĂ©rifier Redis** : + +```bash +docker compose exec redis redis-cli --raw incr ping +``` + +### RĂ©initialisation complĂšte + +**ATTENTION** : Cela supprimera toutes les donnĂ©es ! + +```bash +make down +sudo rm -rf data/ postgres/ redis/ backups/ +make up +``` + +## SĂ©curitĂ© + +### Bonnes pratiques + +1. **Mots de passe forts** : Utilisez des mots de passe de 32+ caractĂšres + + ```bash + openssl rand -base64 32 + ``` + +2. **Fichier .env** : Ne le commitez JAMAIS dans Git (dĂ©jĂ  dans .gitignore) + +3. **Mises Ă  jour rĂ©guliĂšres** : Mettez Ă  jour Gitea rĂ©guliĂšrement + + ```bash + make update + ``` + +4. **Reverse proxy** : En production, utilisez nginx/traefik avec SSL/TLS + +5. **Firewall** : Limitez l'accĂšs aux ports nĂ©cessaires + - 3000 : Web (via reverse proxy uniquement) + - 2223 : SSH Git + +6. **Sauvegardes** : Automatisez les sauvegardes et testez la restauration + +7. **Logs** : Surveillez les logs pour dĂ©tecter les activitĂ©s suspectes + ```bash + make logs-f + ``` + +### Exposition sĂ©curisĂ©e (Production) + +**Avec nginx** : + +```nginx +server { + listen 80; + server_name git.domain.tld; + return 301 https://$server_name$request_uri; +} + +server { + listen 443 ssl http2; + server_name git.domain.tld; + + ssl_certificate /etc/letsencrypt/live/git.domain.tld/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/git.domain.tld/privkey.pem; + + 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; + } +} +``` + +### SSH Git + +Le service SSH Gitea est exposĂ© sur le port **2223**. + +**Cloner un dĂ©pĂŽt** : + +```bash +git clone ssh://git@domain.tld:2223/username/repository.git +``` + +**Configuration SSH** (`~/.ssh/config`) : + +``` +Host git.domain.tld + Port 2223 + User git +``` + +AprĂšs cette configuration : + +```bash +git clone git@git.domain.tld:username/repository.git +``` + +## Structure du projet + +``` +agence66-gitea/ +├── .env # Configuration (ne pas committer) +├── .env.example # Template de configuration +├── .gitignore # Fichiers Ă  ignorer par Git +├── docker-compose.yml # Orchestration Docker +├── Makefile # Commandes simplifiĂ©es +├── README.md # Cette documentation +├── backups/ # Sauvegardes (gĂ©nĂ©rĂ©) +│ └── gitea_backup_*.tar.gz +├── data/ # DonnĂ©es Gitea (gĂ©nĂ©rĂ©) +│ ├── git/ # DĂ©pĂŽts Git +│ ├── gitea/ # Configuration Gitea +│ └── ... +├── db-config/ # Configuration PostgreSQL +│ └── postgresql.conf +├── postgres/ # DonnĂ©es PostgreSQL (gĂ©nĂ©rĂ©) +├── redis/ # DonnĂ©es Redis (gĂ©nĂ©rĂ©) +└── scripts/ # Scripts de maintenance + ├── backup.sh # Sauvegarde complĂšte + ├── restore.sh # Restauration + └── update.sh # Mise Ă  jour +``` + +## Support + +### ProblĂšmes et questions + +- Issues GitHub : CrĂ©ez une issue sur le dĂ©pĂŽt +- Documentation Gitea : https://docs.gitea.io/ +- Docker : https://docs.docker.com/ + +### Logs utiles + +```bash +# Tous les logs +make logs + +# Logs Gitea uniquement +docker compose logs -f gitea + +# Logs PostgreSQL +docker compose logs -f db + +# Logs Redis +docker compose logs -f redis +``` + +--- + +**Auteur** : Agence66 +**Licence** : À dĂ©finir +**Version** : 1.0.0 diff --git a/db-config/postgresql.conf b/db-config/postgresql.conf new file mode 100644 index 0000000..f7e9faf --- /dev/null +++ b/db-config/postgresql.conf @@ -0,0 +1,77 @@ +# ============================================ +# Configuration PostgreSQL optimisĂ©e pour Gitea +# ============================================ +# Cette configuration est adaptĂ©e pour une instance Gitea +# avec une charge modĂ©rĂ©e (petit Ă  moyen serveur) + +# CONNEXIONS +# ------------------------------------------- +max_connections = 100 +superuser_reserved_connections = 3 + +# MÉMOIRE +# ------------------------------------------- +# Ajustez selon la RAM disponible +# Recommandation: 25% de la RAM pour shared_buffers +shared_buffers = 256MB +effective_cache_size = 1GB +maintenance_work_mem = 64MB +work_mem = 4MB + +# WRITE AHEAD LOG (WAL) +# ------------------------------------------- +wal_buffers = 16MB +min_wal_size = 1GB +max_wal_size = 4GB +checkpoint_completion_target = 0.9 + +# QUERY TUNING +# ------------------------------------------- +random_page_cost = 1.1 +effective_io_concurrency = 200 +default_statistics_target = 100 + +# LOGGING +# ------------------------------------------- +logging_collector = on +log_directory = 'log' +log_filename = 'postgresql-%Y-%m-%d.log' +log_rotation_age = 1d +log_rotation_size = 100MB +log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h ' +log_timezone = 'UTC' + +# Logs des requĂȘtes lentes (> 1 seconde) +log_min_duration_statement = 1000 + +# LOCALE ET FORMATAGE +# ------------------------------------------- +datestyle = 'iso, mdy' +timezone = 'UTC' +lc_messages = 'en_US.utf8' +lc_monetary = 'en_US.utf8' +lc_numeric = 'en_US.utf8' +lc_time = 'en_US.utf8' +default_text_search_config = 'pg_catalog.english' + +# AUTOVACUUM +# ------------------------------------------- +# Important pour maintenir les performances +autovacuum = on +autovacuum_max_workers = 3 +autovacuum_naptime = 1min +autovacuum_vacuum_threshold = 50 +autovacuum_analyze_threshold = 50 +autovacuum_vacuum_scale_factor = 0.1 +autovacuum_analyze_scale_factor = 0.05 + +# SÉCURITÉ +# ------------------------------------------- +# Les connexions sont limitĂ©es au rĂ©seau Docker +listen_addresses = '*' +ssl = off + +# AUTRES PARAMÈTRES +# ------------------------------------------- +shared_preload_libraries = '' +dynamic_shared_memory_type = posix diff --git a/docker-compose.yml b/docker-compose.yml index 9e7f348..d8eb8d2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,8 +4,10 @@ services: container_name: gitea restart: unless-stopped depends_on: - - db - - redis + db: + condition: service_healthy + redis: + condition: service_started environment: - USER_UID=1000 - USER_GID=1000 @@ -34,9 +36,16 @@ services: - /etc/localtime:/etc/localtime:ro networks: - gitea + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:3000/api/healthz"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 40s db: image: postgres:15-alpine + container_name: gitea-db restart: unless-stopped environment: - POSTGRES_DB=${POSTGRES_DATABASE} @@ -44,15 +53,30 @@ services: - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} volumes: - ./postgres:/var/lib/postgresql/data + - ./db-config/postgresql.conf:/etc/postgresql/postgresql.conf:ro networks: - gitea + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DATABASE}"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 10s redis: image: redis:alpine + container_name: gitea-redis restart: unless-stopped networks: - gitea - command: redis-server --requirepass ${REDIS_PASSWORD} + command: redis-server --requirepass ${REDIS_PASSWORD} --maxmemory 256mb --maxmemory-policy allkeys-lru --appendonly yes + volumes: + - ./redis:/data + healthcheck: + test: ["CMD", "redis-cli", "--raw", "incr", "ping"] + interval: 10s + timeout: 3s + retries: 5 networks: gitea: diff --git a/scripts/backup.sh b/scripts/backup.sh new file mode 100755 index 0000000..2e7a56e --- /dev/null +++ b/scripts/backup.sh @@ -0,0 +1,121 @@ +#!/bin/bash +# ============================================ +# Script de sauvegarde Gitea +# ============================================ +# Ce script crĂ©e une sauvegarde complĂšte de: +# - Base de donnĂ©es PostgreSQL +# - DĂ©pĂŽts Git +# - Configuration Gitea +# - DonnĂ©es utilisateur + +set -e # ArrĂȘter en cas d'erreur + +# Couleurs pour l'affichage +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# Charger les variables d'environnement +if [ -f .env ]; then + source .env +else + echo -e "${RED}Erreur: Fichier .env non trouvĂ©${NC}" + exit 1 +fi + +# Variables +BACKUP_DIR="./backups" +TIMESTAMP=$(date +%Y%m%d_%H%M%S) +BACKUP_NAME="gitea_backup_${TIMESTAMP}" +TEMP_DIR="${BACKUP_DIR}/${BACKUP_NAME}" +RETENTION_DAYS=${BACKUP_RETENTION_DAYS:-7} + +# VĂ©rifier que les variables nĂ©cessaires sont dĂ©finies +if [ -z "$POSTGRES_DATABASE" ] || [ -z "$POSTGRES_USER" ] || [ -z "$POSTGRES_PASSWORD" ]; then + echo -e "${RED}Erreur: Variables PostgreSQL non dĂ©finies dans .env${NC}" + exit 1 +fi + +# Fonction de nettoyage en cas d'erreur +cleanup() { + if [ -d "$TEMP_DIR" ]; then + echo -e "${YELLOW}Nettoyage des fichiers temporaires...${NC}" + rm -rf "$TEMP_DIR" + fi +} + +# PiĂšge pour nettoyer en cas d'erreur +trap cleanup EXIT + +echo -e "${GREEN}=== DĂ©but de la sauvegarde Gitea ===${NC}" +echo "Timestamp: $TIMESTAMP" + +# CrĂ©er les rĂ©pertoires si nĂ©cessaire +mkdir -p "$BACKUP_DIR" +mkdir -p "$TEMP_DIR" + +# VĂ©rifier que les conteneurs sont en cours d'exĂ©cution +if ! docker compose ps | grep -q "gitea.*running"; then + echo -e "${RED}Erreur: Le conteneur Gitea n'est pas en cours d'exĂ©cution${NC}" + exit 1 +fi + +echo -e "${YELLOW}[1/4] Sauvegarde de la base de donnĂ©es PostgreSQL...${NC}" +# Exporter la base de donnĂ©es +export PGPASSWORD="$POSTGRES_PASSWORD" +docker compose exec -T db pg_dump -U "$POSTGRES_USER" -d "$POSTGRES_DATABASE" \ + --format=custom \ + --compress=9 \ + --no-owner \ + --no-acl \ + > "${TEMP_DIR}/database.dump" + +if [ ! -s "${TEMP_DIR}/database.dump" ]; then + echo -e "${RED}Erreur: Le dump de la base de donnĂ©es est vide${NC}" + exit 1 +fi +echo -e "${GREEN}✓ Base de donnĂ©es sauvegardĂ©e${NC}" + +echo -e "${YELLOW}[2/4] Sauvegarde des dĂ©pĂŽts Git et donnĂ©es...${NC}" +# CrĂ©er une archive des dĂ©pĂŽts et donnĂ©es +docker compose exec -T gitea tar czf - \ + -C /data \ + --exclude='./log' \ + --exclude='./cache' \ + --exclude='./tmp' \ + --exclude='./sessions' \ + . > "${TEMP_DIR}/gitea_data.tar.gz" + +if [ ! -s "${TEMP_DIR}/gitea_data.tar.gz" ]; then + echo -e "${RED}Erreur: L'archive des donnĂ©es est vide${NC}" + exit 1 +fi +echo -e "${GREEN}✓ DĂ©pĂŽts et donnĂ©es sauvegardĂ©s${NC}" + +echo -e "${YELLOW}[3/4] CrĂ©ation de l'archive finale...${NC}" +# CrĂ©er l'archive finale +cd "$BACKUP_DIR" +tar czf "${BACKUP_NAME}.tar.gz" "${BACKUP_NAME}/" + +if [ ! -s "${BACKUP_NAME}.tar.gz" ]; then + echo -e "${RED}Erreur: L'archive finale est vide${NC}" + exit 1 +fi + +# Supprimer le rĂ©pertoire temporaire +rm -rf "${BACKUP_NAME}" +cd - > /dev/null + +BACKUP_SIZE=$(du -h "${BACKUP_DIR}/${BACKUP_NAME}.tar.gz" | cut -f1) +echo -e "${GREEN}✓ Archive créée: ${BACKUP_NAME}.tar.gz (${BACKUP_SIZE})${NC}" + +echo -e "${YELLOW}[4/4] Nettoyage des anciennes sauvegardes (>$RETENTION_DAYS jours)...${NC}" +# Supprimer les sauvegardes plus anciennes que RETENTION_DAYS +find "$BACKUP_DIR" -name "gitea_backup_*.tar.gz" -type f -mtime +$RETENTION_DAYS -delete +REMAINING_BACKUPS=$(find "$BACKUP_DIR" -name "gitea_backup_*.tar.gz" -type f | wc -l) +echo -e "${GREEN}✓ Sauvegardes restantes: $REMAINING_BACKUPS${NC}" + +echo -e "${GREEN}=== Sauvegarde terminĂ©e avec succĂšs ===${NC}" +echo "Fichier: ${BACKUP_DIR}/${BACKUP_NAME}.tar.gz" +echo "Taille: $BACKUP_SIZE" diff --git a/scripts/restore.sh b/scripts/restore.sh new file mode 100755 index 0000000..750e289 --- /dev/null +++ b/scripts/restore.sh @@ -0,0 +1,191 @@ +#!/bin/bash +# ============================================ +# Script de restauration Gitea +# ============================================ +# Ce script restaure une sauvegarde complĂšte de Gitea +# ATTENTION: Cette opĂ©ration est destructive! + +set -e # ArrĂȘter en cas d'erreur + +# Couleurs pour l'affichage +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# VĂ©rifier qu'un fichier de sauvegarde a Ă©tĂ© fourni +if [ -z "$1" ]; then + echo -e "${RED}Erreur: Aucun fichier de sauvegarde spĂ©cifiĂ©${NC}" + echo "Usage: $0 " + echo "Exemple: $0 backups/gitea_backup_20240101_120000.tar.gz" + exit 1 +fi + +BACKUP_FILE="$1" + +# VĂ©rifier que le fichier existe +if [ ! -f "$BACKUP_FILE" ]; then + echo -e "${RED}Erreur: Le fichier $BACKUP_FILE n'existe pas${NC}" + exit 1 +fi + +# VĂ©rifier que c'est bien un fichier gzip +if ! file "$BACKUP_FILE" | grep -q "gzip compressed"; then + echo -e "${RED}Erreur: Le fichier n'est pas une archive gzip valide${NC}" + exit 1 +fi + +# Validation du chemin (sĂ©curitĂ© contre path traversal) +BACKUP_FILE=$(realpath "$BACKUP_FILE") +if [[ "$BACKUP_FILE" == *".."* ]]; then + echo -e "${RED}Erreur: Chemin invalide (path traversal dĂ©tectĂ©)${NC}" + exit 1 +fi + +# Charger les variables d'environnement +if [ -f .env ]; then + source .env +else + echo -e "${RED}Erreur: Fichier .env non trouvĂ©${NC}" + exit 1 +fi + +# VĂ©rifier que les variables nĂ©cessaires sont dĂ©finies +if [ -z "$POSTGRES_DATABASE" ] || [ -z "$POSTGRES_USER" ] || [ -z "$POSTGRES_PASSWORD" ]; then + echo -e "${RED}Erreur: Variables PostgreSQL non dĂ©finies dans .env${NC}" + exit 1 +fi + +# Variables +TEMP_DIR=$(mktemp -d) +BACKUP_NAME=$(basename "$BACKUP_FILE" .tar.gz) + +# Fonction de nettoyage +cleanup() { + if [ -d "$TEMP_DIR" ]; then + echo -e "${YELLOW}Nettoyage des fichiers temporaires...${NC}" + rm -rf "$TEMP_DIR" + fi +} + +# PiĂšge pour nettoyer en cas d'erreur ou d'interruption +trap cleanup EXIT INT TERM + +echo -e "${RED}=== ATTENTION: Restauration de Gitea ===${NC}" +echo "Fichier de sauvegarde: $BACKUP_FILE" +echo -e "${RED}Cette opĂ©ration va ÉCRASER toutes les donnĂ©es actuelles!${NC}" +echo "" +read -p "Êtes-vous sĂ»r de vouloir continuer? (oui/non) " -r +if [[ ! $REPLY =~ ^[Oo][Uu][Ii]$ ]]; then + echo "Restauration annulĂ©e." + exit 0 +fi + +echo -e "${GREEN}=== DĂ©but de la restauration ===${NC}" + +echo -e "${YELLOW}[1/5] Extraction de l'archive...${NC}" +tar xzf "$BACKUP_FILE" -C "$TEMP_DIR" + +# Trouver le rĂ©pertoire de sauvegarde +BACKUP_DIR=$(find "$TEMP_DIR" -maxdepth 1 -type d -name "gitea_backup_*" | head -n 1) +if [ -z "$BACKUP_DIR" ]; then + echo -e "${RED}Erreur: Structure de sauvegarde invalide${NC}" + exit 1 +fi + +# VĂ©rifier que les fichiers nĂ©cessaires existent +if [ ! -f "$BACKUP_DIR/database.dump" ] || [ ! -f "$BACKUP_DIR/gitea_data.tar.gz" ]; then + echo -e "${RED}Erreur: Fichiers de sauvegarde manquants${NC}" + exit 1 +fi +echo -e "${GREEN}✓ Archive extraite${NC}" + +echo -e "${YELLOW}[2/5] ArrĂȘt des services...${NC}" +docker compose down +echo -e "${GREEN}✓ Services arrĂȘtĂ©s${NC}" + +echo -e "${YELLOW}[3/5] DĂ©marrage de la base de donnĂ©es...${NC}" +docker compose up -d db +echo "Attente du dĂ©marrage de PostgreSQL..." +sleep 10 + +# Attendre que PostgreSQL soit prĂȘt +MAX_TRIES=30 +COUNTER=0 +until docker compose exec -T db pg_isready -U "$POSTGRES_USER" > /dev/null 2>&1; do + COUNTER=$((COUNTER + 1)) + if [ $COUNTER -gt $MAX_TRIES ]; then + echo -e "${RED}Erreur: PostgreSQL ne dĂ©marre pas${NC}" + exit 1 + fi + echo "En attente de PostgreSQL... ($COUNTER/$MAX_TRIES)" + sleep 2 +done +echo -e "${GREEN}✓ PostgreSQL prĂȘt${NC}" + +echo -e "${YELLOW}[4/5] Restauration de la base de donnĂ©es...${NC}" +# Supprimer et recrĂ©er la base de donnĂ©es +export PGPASSWORD="$POSTGRES_PASSWORD" +docker compose exec -T db psql -U "$POSTGRES_USER" -d postgres -c "DROP DATABASE IF EXISTS $POSTGRES_DATABASE;" +docker compose exec -T db psql -U "$POSTGRES_USER" -d postgres -c "CREATE DATABASE $POSTGRES_DATABASE OWNER $POSTGRES_USER;" + +# Restaurer le dump +docker compose exec -T db pg_restore \ + -U "$POSTGRES_USER" \ + -d "$POSTGRES_DATABASE" \ + --clean \ + --if-exists \ + --no-owner \ + --no-acl \ + < "$BACKUP_DIR/database.dump" + +echo -e "${GREEN}✓ Base de donnĂ©es restaurĂ©e${NC}" + +echo -e "${YELLOW}[5/5] Restauration des donnĂ©es Gitea...${NC}" +# DĂ©marrer Gitea +docker compose up -d gitea redis + +# Attendre que Gitea soit prĂȘt +echo "Attente du dĂ©marrage de Gitea..." +sleep 15 + +# ArrĂȘter temporairement Gitea pour la restauration des fichiers +docker compose stop gitea + +# Nettoyer les donnĂ©es existantes +if [ -d "./data" ]; then + echo "Suppression des anciennes donnĂ©es..." + rm -rf ./data/* +fi + +# Extraire les donnĂ©es depuis l'archive +mkdir -p ./data +tar xzf "$BACKUP_DIR/gitea_data.tar.gz" -C ./data + +echo -e "${GREEN}✓ DonnĂ©es restaurĂ©es${NC}" + +echo -e "${YELLOW}RedĂ©marrage de tous les services...${NC}" +docker compose up -d + +# Attendre que les services soient prĂȘts +sleep 10 +MAX_TRIES=30 +COUNTER=0 +until docker compose ps | grep -q "gitea.*running"; do + COUNTER=$((COUNTER + 1)) + if [ $COUNTER -gt $MAX_TRIES ]; then + echo -e "${YELLOW}Avertissement: Gitea met du temps Ă  dĂ©marrer${NC}" + break + fi + echo "En attente de Gitea... ($COUNTER/$MAX_TRIES)" + sleep 2 +done + +echo -e "${GREEN}=== Restauration terminĂ©e avec succĂšs ===${NC}" +echo "Gitea devrait ĂȘtre accessible sur: http://localhost:3000" +echo "" +echo "VĂ©rifications recommandĂ©es:" +echo " - VĂ©rifier l'accĂšs web" +echo " - Tester l'authentification" +echo " - VĂ©rifier les dĂ©pĂŽts" +echo " - Consulter les logs: docker compose logs -f gitea" diff --git a/scripts/update.sh b/scripts/update.sh new file mode 100755 index 0000000..e7b3f46 --- /dev/null +++ b/scripts/update.sh @@ -0,0 +1,106 @@ +#!/bin/bash +# ============================================ +# Script de mise Ă  jour Gitea +# ============================================ +# Ce script met Ă  jour Gitea de maniĂšre sĂ©curisĂ©e +# avec une sauvegarde automatique avant la mise Ă  jour + +set -e # ArrĂȘter en cas d'erreur + +# Couleurs pour l'affichage +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# Charger les variables d'environnement +if [ -f .env ]; then + source .env +else + echo -e "${RED}Erreur: Fichier .env non trouvĂ©${NC}" + exit 1 +fi + +# Fonction de nettoyage en cas d'erreur +cleanup() { + echo -e "${YELLOW}Une erreur s'est produite. VĂ©rifiez l'Ă©tat des services.${NC}" + echo "Pour revenir Ă  l'Ă©tat prĂ©cĂ©dent, utilisez la derniĂšre sauvegarde:" + echo " make restore FILE=backups/gitea_backup_*.tar.gz" +} + +trap cleanup ERR + +echo -e "${GREEN}=== Mise Ă  jour de Gitea ===${NC}" +echo "" + +# VĂ©rifier que les services tournent +if ! docker compose ps | grep -q "gitea.*running"; then + echo -e "${YELLOW}Avertissement: Gitea ne semble pas ĂȘtre en cours d'exĂ©cution${NC}" + read -p "Continuer quand mĂȘme? (oui/non) " -r + if [[ ! $REPLY =~ ^[Oo][Uu][Ii]$ ]]; then + echo "Mise Ă  jour annulĂ©e." + exit 0 + fi +fi + +echo -e "${YELLOW}[1/6] CrĂ©ation d'une sauvegarde de sĂ©curitĂ©...${NC}" +if ! bash scripts/backup.sh; then + echo -e "${RED}Erreur: La sauvegarde a Ă©chouĂ©. Mise Ă  jour annulĂ©e.${NC}" + exit 1 +fi +echo -e "${GREEN}✓ Sauvegarde créée${NC}" + +echo -e "${YELLOW}[2/6] TĂ©lĂ©chargement des nouvelles images...${NC}" +docker compose pull +echo -e "${GREEN}✓ Images tĂ©lĂ©chargĂ©es${NC}" + +echo -e "${YELLOW}[3/6] ArrĂȘt des services...${NC}" +docker compose down +echo -e "${GREEN}✓ Services arrĂȘtĂ©s${NC}" + +echo -e "${YELLOW}[4/6] DĂ©marrage avec les nouvelles versions...${NC}" +docker compose up -d +echo -e "${GREEN}✓ Services dĂ©marrĂ©s${NC}" + +echo -e "${YELLOW}[5/6] Attente du dĂ©marrage complet...${NC}" +sleep 10 + +# Attendre que Gitea soit prĂȘt +MAX_TRIES=60 +COUNTER=0 +until docker compose exec -T gitea wget -q --spider http://localhost:3000/api/healthz 2>/dev/null; do + COUNTER=$((COUNTER + 1)) + if [ $COUNTER -gt $MAX_TRIES ]; then + echo -e "${RED}Erreur: Gitea ne rĂ©pond pas aprĂšs la mise Ă  jour${NC}" + echo "VĂ©rifiez les logs: docker compose logs gitea" + exit 1 + fi + echo "En attente de Gitea... ($COUNTER/$MAX_TRIES)" + sleep 2 +done +echo -e "${GREEN}✓ Gitea rĂ©pond${NC}" + +echo -e "${YELLOW}[6/6] VĂ©rification de l'Ă©tat...${NC}" +# Afficher les versions +echo "" +echo "Versions actuelles:" +docker compose images + +echo "" +echo "État des services:" +docker compose ps + +echo "" +echo -e "${GREEN}=== Mise Ă  jour terminĂ©e avec succĂšs ===${NC}" +echo "" +echo "VĂ©rifications recommandĂ©es:" +echo " 1. AccĂ©der Ă  l'interface web: http://localhost:3000" +echo " 2. VĂ©rifier les dĂ©pĂŽts existants" +echo " 3. Tester les fonctionnalitĂ©s principales" +echo " 4. Consulter les logs: docker compose logs -f gitea" +echo "" +echo "En cas de problĂšme, restaurez la sauvegarde:" +LATEST_BACKUP=$(ls -t backups/gitea_backup_*.tar.gz 2>/dev/null | head -n 1) +if [ -n "$LATEST_BACKUP" ]; then + echo " make restore FILE=$LATEST_BACKUP" +fi