Gitea Docker installation mit mariadb und SSL
Beschreibung:
Ein Docker Container mit gitea. Der als Datenbank mariaDB benutzt und ein Lets Encrypt SSL Certificate holt oder ein selbstsigniertes SSL Certificate erstellt.
Docker compose mit Lets Encrypt:
Der Domainname sollte bereits auf den Server per IP a oder AAA record linken. Je nachdem ob ipv4 oder ipv6.
Genauso sollte docker compose auch installiert sein.
apt install docker.io docker-compose
Falls apparmor auf dem system nicht installiert ist
# AppArmor installieren, falls es nicht installiert ist
apt-get install apparmor apparmor-utils
Als erstes unser Verzeichnis erstellen in root.
Darin liegen unser config Dateien für den container
mkdir -p /root/gitea/mariadb
mkdir -p /root/gitea/data
mkdir -p /root/gitea/certbot
DIe .env Datei
# Gitea Einstellungen
USER_UID=1000
USER_GID=1000
# Datenbank Einstellungen
DB_ROOT_PASS=rootpassword
DB_USER=gitea
DB_PASSWD=gitea
DB_NAME=gitea
# Port Einstellungen
GITEA_HTTP_PORT=3000
GITEA_SSH_PORT=222
# Volume directories
#Pfade mit Slash vorran. Denn die werden dann zusmmanegbaut
BASE_PATH_DIR=/root/gitea
MARIADB_VOLUME_DIR=/mariadb
DATA_VOLUME_DIR=/data
CERTBOT_VOLUME_DIR=/certbot
# Domain and email for Let's Encrypt
DOMAIN_NAME=ihredomain.de
LETSENCRYPT_EMAIL=ihre-email@beispiel.de
app.ini für gitea und dem SSL-Cert, diese nicht abändern das macht dann ein script für uns.
[server]
PROTOCOL = https
DOMAIN = yourdomain.com
HTTP_PORT = 443
ROOT_URL = https://yourdomain.com
CERT_FILE = /etc/letsencrypt/live/yourdomain.com/fullchain.pem
KEY_FILE = /etc/letsencrypt/live/yourdomain.com/privkey.pem
Kleines script das die app.ini anpasst
#!/bin/bash
# Lade die Umgebungsvariablen aus der .env-Datei
set -a # Export all variables created next
source .env
set +a
# Pfad zur app.ini Datei
APP_INI_PATH="app.ini"
# Prüfe, ob die app.ini Datei existiert
if [ ! -f "$APP_INI_PATH" ]; then
echo "Die app.ini Datei unter $APP_INI_PATH wurde nicht gefunden."
exit 1
fi
# Ersetze den Platzhalter 'yourdomain.com' durch den Wert der DOMAIN_NAME Variable aus der .env Datei
sed -i "s/yourdomain.com/$DOMAIN_NAME/g" $APP_INI_PATH
sed -i "s/443/$GITEA_HTTP_PORT/g" $APP_INI_PATH
echo "Die Domain wurde erfolgreich in der app.ini zu '$DOMAIN_NAME' aktualisiert."
Die Composer Datei
version: '3.8'
services:
server:
image: gitea/gitea:latest
environment:
- USER_UID=${USER_UID}
- USER_GID=${USER_GID}
- DB_TYPE=mysql
- DB_HOST=db:3306
- DB_NAME=${DB_NAME}
- DB_USER=${DB_USER}
- DB_PASSWD=${DB_PASSWD}
restart: always
volumes:
- ${BASE_PATH_DIR}${DATA_VOLUME_DIR}:/data
- ${BASE_PATH_DIR}${DATA_VOLUME_DIR}/app.ini:/data/custom/conf.app.ini:ro
- /etc/letsencrypt/live/${DOMAIN_NAME}:/etc/letsencrypt/live/${DOMAIN_NAME}:ro
- /etc/letsencrypt/archive/${DOMAIN_NAME}:/etc/letsencrypt/archive/${DOMAIN_NAME}:ro
ports:
- "${GITEA_HTTP_PORT}:443"
- "${GITEA_SSH_PORT}:22"
depends_on:
- db
db:
image: mariadb:latest
restart: always
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASS}
MYSQL_USER: ${DB_USER}
MYSQL_PASSWORD: ${DB_PASSWD}
MYSQL_DATABASE: ${DB_NAME}
volumes:
- ${BASE_PATH_DIR}${MARIADB_VOLUME_DIR}:/var/lib/mysql
certbot:
image: certbot/certbot
volumes:
- ${BASE_PATH_DIR}${CERTBOT_VOLUME_DIR}-etc:/etc/letsencrypt
- ${BASE_PATH_DIR}${CERTBOT_VOLUME_DIR}-www:/var/www/certbot
- ${BASE_PATH_DIR}${CERTBOT_VOLUME_DIR}-log:/var/log/letsencrypt
entrypoint: '/bin/sh -c'
webserver:
image: nginx:alpine
restart: unless-stopped
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ${BASE_PATH_DIR}${CERTBOT_VOLUME_DIR}-etc:/etc/letsencrypt
- ${BASE_PATH_DIR}${CERTBOT_VOLUME_DIR}-www:/var/www/certbot
- ${BASE_PATH_DIR}${CERTBOT_VOLUME_DIR}-log:/var/log/letsencrypt
- ./nginx-log:/var/log/nginx
ports:
- "80:80"
- "443:443"
Init script, erstellt die nginx config und holt erstmals das certificate
#!/bin/bash
# Laden der Umgebungsvariablen aus der .env-Datei
if [ -f .env ]; then
export $(grep -v '^#' .env | xargs)
else
echo ".env-Datei nicht gefunden!"
exit 1
fi
# Überprüfen, ob DOMAIN_NAME und LETSENCRYPT_EMAIL gesetzt sind
if [ -z "$DOMAIN_NAME" ] || [ -z "$LETSENCRYPT_EMAIL" ]; then
echo "DOMAIN_NAME und/oder LETSENCRYPT_EMAIL sind in der .env-Datei nicht gesetzt!"
exit 1
fi
# Erstellen der benötigten Verzeichnisse
mkdir -p ./certbot-etc
mkdir -p ./certbot-www
mkdir -p ./certbot-log
mkdir -p ./nginx-log
# Erstellen der Nginx-Konfigurationsdatei für den ersten Lauf (ohne SSL)
cat << EOF > ./nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '\$remote_addr - \$remote_user [\$time_local] "\$request" '
'\$status \$body_bytes_sent "\$http_referer" '
'"\$http_user_agent" "\$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
server {
listen 80;
server_name ${DOMAIN_NAME};
location /.well-known/acme-challenge/ {
root /var/www/certbot;
try_files \$uri =404;
}
}
}
EOF
# Starten des Webserver-Containers (erster Lauf ohne SSL)
echo "Starte Webserver-Container..."
docker-compose down
docker-compose up -d webserver
# Warten, um sicherzustellen, dass Nginx vollständig gestartet ist
echo "Warte auf Webserver..."
sleep 5
# Ausführen des Certbot für den ersten Lauf
echo "Starte Certbot..."
docker-compose run --rm --entrypoint "" certbot certbot certonly --webroot --webroot-path=/var/www/certbot \
--email ${LETSENCRYPT_EMAIL} --agree-tos --no-eff-email \
--domain ${DOMAIN_NAME} --rsa-key-size 4096
# Aktualisieren Sie die Nginx-Konfigurationsdatei, um SSL zu aktivieren
cat << EOF > ./nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '\$remote_addr - \$remote_user [\$time_local] "\$request" '
'\$status \$body_bytes_sent "\$http_referer" '
'"\$http_user_agent" "\$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
server {
listen 80;
server_name ${DOMAIN_NAME};
location /.well-known/acme-challenge/ {
root /var/www/certbot;
try_files \$uri =404;
}
location / {
return 301 https://\$host\$request_uri;
}
}
server {
listen 443 ssl;
server_name ${DOMAIN_NAME};
ssl_certificate /etc/letsencrypt/live/${DOMAIN_NAME}/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/${DOMAIN_NAME}/privkey.pem;
location / {
proxy_pass http://gitea:${GITEA_HTTP_PORT};
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;
client_max_body_size 100M;
}
}
}
EOF
# Starten Sie den Webserver-Container neu, um die aktualisierte Konfiguration zu verwenden
echo "Starte Webserver-Container neu..."
docker-compose down
docker-compose up -d webserver
echo "Setup abgeschlossen. Bitte überprüfen und anpassen Sie die nginx.conf entsprechend."