Commencez par mettre à jour votre système et installer Git, qui est indispensable au fonctionnement de Gitea.
apt update && apt upgrade -y
apt install git wget sqlite3 -y
Pour des raisons de sécurité, Gitea ne doit pas tourner avec les droits root. On crée un utilisateur dédié nommé git.
adduser \
--system \
--shell /bin/bash \
--gecos 'Git Version Control' \
--group \
--disabled-password \
--home /home/git \
git
Rendez-vous sur la page de téléchargement de Gitea pour récupérer la dernière version stable (remplacez 1.22.0 par la version actuelle si nécessaire).
wget -O /usr/local/bin/gitea https://dl.gitea.com/gitea/1.22.0/gitea-1.22.0-linux-amd64
chmod +x /usr/local/bin/gitea
Il faut préparer les dossiers où Gitea stockera vos dépôts et sa configuration.
mkdir -p /var/lib/gitea/{custom,data,log}
chown -R git:git /var/lib/gitea/
chmod -R 750 /var/lib/gitea/
mkdir /etc/gitea
chown root:git /etc/gitea
chmod 770 /etc/gitea
Pour que Gitea se lance automatiquement au démarrage de la VM, créez un fichier de service.
nano /etc/systemd/system/gitea.service
[Unit]
Description=Gitea (Git with a cup of tea)
After=network.target
[Service]
RestartSec=2s
Type=simple
User=git
Group=git
WorkingDirectory=/var/lib/gitea/
ExecStart=/usr/local/bin/gitea web --config /etc/gitea/app.ini
Restart=always
Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/var/lib/gitea
[Install]
WantedBy=multi-user.target
Enregistrez et lancez le service :
systemctl enable --now gitea
Si ce n'est pas déjà fait, installez le serveur MariaDB sur votre VM Debian :
apt update
apt install mariadb-server -y
Une fois installé, sécurisez l'installation (définissez un mot de passe root si demandé, supprimez les utilisateurs anonymes, etc.) :
mariadb_secure_installation
Connectez-vous à la console MariaDB en tant que root :
mariadb -u root
Une fois dans le shell MariaDB, exécutez les commandes suivantes pour créer la base, l'utilisateur et lui donner les droits. Important : Remplacez 'votre_mot_de_passe' par un mot de passe solide.
CREATE DATABASE gitea DEFAULT CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_unicode_ci';
CREATE USER 'gitea'@'localhost' IDENTIFIED BY 'votre_mot_de_passe';
GRANT ALL PRIVILEGES ON gitea.* TO 'gitea'@'localhost';
FLUSH PRIVILEGES;
EXIT;
Maintenant que la base est prête, retournez sur l'interface web de Gitea : http://IP_DE_VOTRE_VM:3000
Dans la section Configuration de la base de données, remplissez les champs ainsi :
Type de base de données : MySQL (MariaDB utilise le protocole MySQL)
Hôte : 127.0.0.1:3306
Utilisateur : gitea
Mot de passe : votre_mot_de_passe (celui défini à l'étape précédente)
Nom de la base de données : gitea
Une fois l'installation terminée via le navigateur, Gitea va écrire sa configuration dans /etc/gitea/app.ini. Pour des raisons de sécurité, il est conseillé de passer ce fichier en lecture seule pour l'utilisateur git :
chmod 440 /etc/gitea/app.ini
chown root:git /etc/gitea/app.ini
Pour un serveur privé, une fois que les deux comptes administrateur et utilisateur sont créés, supprimes la possibilité de s'inscrire.
nano /etc/gitea/app.ini
[service]
(...)
DISABLE_REGISTRATION = true
(...)
#toujours dans service
SHOW_REGISTRATION_BUTTON = false
systemctl restart gitea
Pour un accès local mais chiffré avec un certificat autosigné :
# On définit le format de log pour mieux voir les accès (optionnel)
log_format gitea_format '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name gitea.local; # Remplacez par votre IP ou nom d'hôte local
access_log /var/log/nginx/gitea_access.log gitea_format;
error_log /var/log/nginx/gitea_error.log;
# --- Certificats SSL (ECDSA généré précédemment) ---
ssl_certificate /etc/nginx/ssl/gitea.crt;
ssl_certificate_key /etc/nginx/ssl/gitea.key;
# --- Optimisation SSL & Protocoles ---
ssl_session_timeout 1d;
ssl_session_cache shared:GiteaSSL:10m; # Environ 40 000 sessions
ssl_session_tickets off;
# Protocoles modernes uniquement
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# --- En-têtes de sécurité (Hardening) ---
# Empêche le site d'être affiché dans une iframe (protection Clickjacking)
add_header X-Frame-Options "SAMEORIGIN" always;
# Empêche le navigateur de deviner le type de contenu (protection MIME sniffing)
add_header X-Content-Type-Options "nosniff" always;
# Active la protection XSS des navigateurs anciens
add_header X-XSS-Protection "1; mode=block" always;
# Politique de referer restreinte
add_header Referrer-Policy "no-referrer-when-downgrade" always;
# HSTS (6 mois) - Force le navigateur à utiliser HTTPS
# Attention: ne l'activez que si vous êtes sûr que votre SSL fonctionne bien
add_header Strict-Transport-Security "max-age=15768000" always;
# --- Proxy Gitea ---
location / {
# Restriction IP : n'autorise que le réseau local
# Remplacez 192.168.1.0/24 par votre propre plage IP locale
allow 192.168.1.0/24;
allow 127.0.0.1;
deny all;
# Taille maximale des fichiers (important pour les gros git push)
client_max_body_size 512M;
# Paramètres de transfert du proxy
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;
# Optimisations pour les connexions longues (LFS ou gros dépôts)
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
}
}
# Redirection automatique HTTP -> HTTPS
server {
listen 80;
listen [::]:80;
server_name gitea.local;
return 301 https://$host$request_uri;
}
Il est crucial d'informer Gitea qu'il est désormais derrière un proxy et qu'il doit utiliser du HTTPS pour générer ses liens internes.
Modifiez votre fichier app.ini (souvent dans /etc/gitea/app.ini) :
[server]
PROTOCOL = http
DOMAIN = gitea.local
# Force Gitea à n'écouter que la machine elle-même
HTTP_ADDR = 127.0.0.1
HTTP_PORT = 3000
# L'URL externe que l'utilisateur voit
ROOT_URL = https://gitea.local/