Direkt zum Hauptinhalt

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.

Als erstes unser Verzeichnis erstellen in root.
Darin liegen unser config Dateien für den container

mkdir -p /root/gitea

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'

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
      - /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"