Quelltextverwaltung mit Gitea
Gitea ist eine leichtgewichtige Oberfläche zur Verwaltung von Git-Repositories. Eine der besonders hervorzuhebenden Funktionen ist die Migration von Repos aus anderen Tools, wie z.B. GitHub, GitLab, etc., hierbei ist es auch möglich einen Mirror der Repos in Gitea anzulegen. So kann man vom größeren Funktionsumfang der zuvor genannten Tools profitieren, muss aber nicht fürchten, irgendwann einmal nicht mehr an seine Daten zu kommen, z.B. weil der Dienst eingestellt wird.
Die Installation kann mittels Docker erfolgen:
version: "3"
services:
server:
image: gitea/gitea:latest
container_name: gitea
environment:
- USER_UID=1000
- USER_GID=1000
- GITEA__database__DB_TYPE=postgres
- GITEA__database__HOST=db:5432
- GITEA__database__NAME=gitea
- GITEA__database__USER=gitea
- GITEA__database__PASSWD=SECRET
restart: always
volumes:
- /docker/gitea/www:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "3000:3000"
- "8022:22"
depends_on:
- db
db:
image: postgres:14
restart: always
environment:
- POSTGRES_USER=gitea
- POSTGRES_PASSWORD=SECRET
- POSTGRES_DB=gitea
volumes:
- /docker/gitea/postgres:/var/lib/postgresql/data
Der Wert SECRET
bei den Kennwortangaben muss natürlich ersetzt werden, ein entsprechendes Kennwort kann man z.B. mit pwgen -1 64
leicht erzeugen. Die Gitea-Weboberfläche steht nach dem Start (docker-compose up -d
) unter dem Port 3000 zur Verfügung. Hier kann man natürlich auch Port 80 nehmen, falls dieser noch frei ist. Da Port 22 meist bereits belegt sein dürfte, erwartet Gitea - in dieser Konfiguration - Anfragen über SSH auf Port 8022. Alternativ kann die Nutzung von SSH auch in der Gitea Konfiguration komplett abgeschaltet werden, dann kann die Zeile - "8022:22"
bei ports
entfallen.
Eine nginx
Konfiguration (reverse-proxy) könnte wie folgt aussehen:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name gitea.example.org;
ssl_certificate /var/lib/dehydrated/certs/gitea.example.org/fullchain.pem;
ssl_certificate_key /var/lib/dehydrated/certs/gitea.example.org/privkey.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_dhparam /etc/ssl/dhparams.pem;
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;
gzip off;
add_header Strict-Transport-Security "max-age=63072000" always;
ssl_trusted_certificate /var/lib/dehydrated/certs/gitea.example.org/fullchain.pem;
ssl_stapling on;
ssl_stapling_verify on;
resolver 127.0.0.1;
# for letsencrypt
location /.well-known/acme-challenge/ {
root /var/www/html/;
try_files $uri $uri/ =404;
}
client_max_body_size 128M;
location / {
if ($ssl_protocol = "") {
rewrite ^ https://$server_name$request_uri? permanent;
}
proxy_http_version 1.1;
proxy_set_header "Connection" "";
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;
proxy_cookie_domain ~(?P<secure_domain>([-0-9a-z]+\.)?[-0-9a-z]+\.[a-z]+)$ "$secure_domain; secure";
proxy_pass http://127.0.0.1:3000;
}
}