Skip to content

GitBucket unter Debian als Service installieren

Unser GitBucket soll als Service unter einen None Privilegierten Benutzer laufen, daher erstellen wir uns einen Benutzer und Gruppe gitbucket mit der (U|G)ID 555.

sudo groupadd -g 555 gitbucket
sudo useradd -g gitbucket --no-user-group --home-dir /var/lib/gitbucket --no-create-home --shell /usr/sbin/nologin --system --uid 555 gitbucket

Nun erstellen wir uns die benötigten Verzeichnisse.

sudo mkdir -p /usr/share/gitbucket/{bin,doc,lib}
sudo mkdir -p /var/{lib,log,run}/gitbucket
sudo chown -R gitbucket:gitbucket /var/{lib,log,run}/gitbucket

In /etc/default/gitbucket erstellen wir uns die Defaul Konfiguration, welche von GitBucket verwendet wird.

cat <<'CONFIG' | sudo tee /etc/default/gitbucket >/dev/null
#
# This is the configuration file for the Serverstats service
# (/lib/systemd/system/gitbucket.service)
#

# Bind host, default 0.0.0.0
GITBUCKET_HOST="127.0.0.1"

# Server port, default 8080
GITBUCKET_PORT=8080

# URL prefix for the GitBucket page (http://<host>:<port>/<prefix>/)
GITBUCKET_PREFIX=""

# Other Java option
GITBUCKET_JVM_OPTS="-Xms128m -Xmx256m -Dmail.smtp.starttls.enable=true"

# Data directory, holds repositories
GITBUCKET_HOME="/var/lib/gitbucket"

# Logs directory
GITBUCKET_LOG_DIR="/var/log/gitbucket"

# Directory where GitBucket is installed
# Configuration is stored here:
GITBUCKET_DIR="/usr/share/gitbucket"

# Path to the PID file
GITBUCKET_PID_FILE="/var/run/gitbucket/gitbucket.pid"

# vim: syntax=sh ts=4 sw=4 sts=4 sr noet
CONFIG

Als nächstes erstellen wir und das Startskript startup.sh.

cat <<'STARTSH' | sudo tee /usr/share/gitbucket/bin/startup.sh >/dev/null
#!/bin/bash
# **********************************************************************
# @File: startup.sh
# @Author: Marko Schulz <info@tuxnet24.de> - @Date: 2023-03-09 12:26:09 +0100
# @Description: Startup script for gitbucket service.
# **********************************************************************

# Load configuration, when exists
if [ -r /etc/default/gitbucket ]; then
    . /etc/default/gitbucket
fi

# Set variables from config or default
GITBUCKET_HOME=${GITBUCKET_HOME:-/var/lib/gitbucket}
GITBUCKET_HOST=${GITBUCKET_HOST:-0.0.0.0}
GITBUCKET_PORT=${GITBUCKET_PORT:-8080}
GITBUCKET_PREFIX=${GITBUCKET_PREFIX:-""}
GITBUCKET_LOG_DIR=${GITBUCKET_LOG_DIR:-"/var/log/gitbucket"}
GITBUCKET_DIR=${GITBUCKET_DIR:-"/usr/share/gitbucket"}
GITBUCKET_JVM_OPTS=${GITBUCKET_JVM_OPTS:-"-Dmail.smtp.starttls.enable=true"}
GITBUCKET_PID_FILE=${GITBUCKET_PID_FILE:-"/var/run/gitbucket/gitbucket.pid"}
GITBUCKET_WAR_DIR=$GITBUCKET_DIR/lib
GITBUCKET_LOGFILE="${GITBUCKET_LOG_DIR}/run.log"
JAVA_HOME=${JAVA_HOME:-java}

# Use JAVA_HOME if set, otherwise assume java is in the path.
JAVA=${JAVA_HOME}
if [ -f "${JAVA_HOME}/bin/java" ]; then
    JAVA=${JAVA_HOME}/bin/java
fi

# Remove Logfile at startup
if [ -f "${GITBUCKET_LOGFILE}" ]; then
    rm -f "${GITBUCKET_LOGFILE}"
fi

# Change to cwd of the script
CWD=$(dirname $0)
cd $CWD/
if [ -L $0 ] && ([ -e /bin/readlink ] || [ -e /usr/bin/readlink ]); then
    CWD=$(dirname $(readlink $0)); cd $CWD/
fi

# Build string for java options
START_OPTS=
if [ $GITBUCKET_HOST ]; then
    START_OPTS="${START_OPTS} --host=${GITBUCKET_HOST}"
fi
if [ $GITBUCKET_PORT ]; then
    START_OPTS="${START_OPTS} --port=${GITBUCKET_PORT}"
fi
if [ $GITBUCKET_PREFIX ]; then
    START_OPTS="${START_OPTS} --prefix=${GITBUCKET_PREFIX}"
fi

# Run java process
${JAVA} ${GITBUCKET_JVM_OPTS} -jar ${GITBUCKET_WAR_DIR}/gitbucket.war ${START_OPTS} >>${GITBUCKET_LOGFILE} 2>&1 &
ecode=$?

# Write pid to pidfile if it is defined.
if [ "${GITBUCKET_PID_FILE}" != "" ]; then
    echo $! > ${GITBUCKET_PID_FILE}
fi

if [ $ecode -eq 0 ]; then
    echo Gitbucket service successfuly started [PID $!, ${GITBUCKET_LOGFILE}]
fi

exit $ecode

# vim: syntax=sh ts=4 sw=4 sts=4 sr noet
STARTSH

Danach erstellen wir noch das Stopskript shutdown.sh.

cat <<'STOPSH' | sudo tee /usr/share/gitbucket/bin/shutdown.sh >/dev/null
#!/bin/bash
# **********************************************************************
# @File: shutdown.sh
# @Author: Marko Schulz <info@tuxnet24.de> - @Date: 2023-03-09 12:26:09 +0100
# @Description: Shutdown script for gitbucket service.
# **********************************************************************

# Load configuration, when exists
if [ -r /etc/default/gitbucket ]; then
    . /etc/default/gitbucket
fi

# Set variables from config or default
GITBUCKET_LOG_DIR=${GITBUCKET_LOG_DIR:-"/var/log/gitbucket"}
GITBUCKET_PID_FILE=${GITBUCKET_PID_FILE:-"/var/run/gitbucket.pid"}
GITBUCKET_LOGFILE="${GITBUCKET_LOG_DIR}/run.log"

# Terminate gitbucket process
if [ -f "${GITBUCKET_PID_FILE}" ]; then
    kill $(cat $GITBUCKET_PID_FILE 2>/dev/null) >>$GITBUCKET_LOGFILE 2>&1
else
    PID=`ps aux | grep 'java' | grep -v 'grep' | grep gitbucket.war | awk '{print $2}'`
    kill ${PID} >>$GITBUCKET_LOGFILE 2>&1
fi

# Delete PID file, if exists
if [ -f "${GITBUCKET_PID_FILE}" ]; then
    rm -f ${GITBUCKET_PID_FILE}
fi

exit $ecode

# vim: syntax=sh ts=4 sw=4 sts=4 sr noet
STOPSH

Nun laden wir GitBucket von https://github.com/gitbucket/gitbucket/releases herunter.

cd /usr/share/gitbucket/lib/ && \
  sudo wget https://github.com/gitbucket/gitbucket/releases/download/4.38.4/gitbucket.war

Optional erstellen wir uns im Verzeichnis /usr/share/gitbucket/doc die zwei Beispieldateien für die Datenbank Konfiguration und auch die README Datei.

Beispiel der internen Datenbank H2.

cat <<'DB1' | sudo tee /usr/share/gitbucket/doc/database-h2.conf >/dev/null
db {
  url = "jdbc:h2:${DatabaseHome};MVCC=true"
  user = "sa"
  password = "sa"
}
DB1

Beispiel der mysql Datenbank.

cat <<'DB2' | sudo tee /usr/share/gitbucket/doc/database-mysql.conf >/dev/null
db {
  url = "jdbc:mysql://<HOSTNAME>/<DATABASE>?useUnicode=true&characterEncoding=utf8"
  user = "<MYSQLUSERNAME>"
  password = "<MYSQLPASSWORD>"
}
DB2

Erstellen der README Datei.

cat <<'README' | sudo tee /usr/share/gitbucket/doc/README >/dev/null
1. Setup your database

To set you database you have to copy the doc/database-h2.conf to $GITBUCKET_HOME/database.conf

        cp doc/database-h2.conf $GITBUCKET_HOME/database.conf

or for mysql you have to copy the doc/database-mysql.conf to $GITBUCKET_HOME/database.conf

        cp doc/database-mysql.conf $GITBUCKET_HOME/database.conf

Replace the placeholder like <HOSTNAME>, <DATABASE> etc.

1.1. Create MySQL User and Database

        mysql -u root -p
        mysql> create database gitbucket;
        mysql> grant all privileges on `gitbucket`.* to testuser@localhost identified by 'testpassword';
        mysql> flush privileges;
        mysql> quit;

2. Enable and start the gitbucker.service

        systemctl enable gitbucket.service
        systemctl start gitbucket.service

More documentation on official GitBucket Wiki

        https://github.com/gitbucket/gitbucket/wiki

README

Setzen die Berechtigungen auf das Verzeichnis /usr/share/gitbucket.

chown -R gitbucket:gitbucket /usr/share/gitbucket

Dann erstellen wir die Service Unit Datei.

cat <<'SERVICE' | sudo tee /lib/systemd/system/gitbucket.service >/dev/null
[Unit]
Description=GitBucket Server
After=remote-fs.target network.target

[Service]
Type=oneshot
User=gitbucket
Group=gitbucket
ExecStart=/bin/sh -c "/usr/share/gitbucket/bin/startup.sh"
ExecStop=/bin/sh -c "/usr/share/gitbucket/bin/shutdown.sh"
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
SERVICE

Wir aktualisieren den SystemV Daemon, aktivieren unsere Service Unit und starten GitBucket.

sudo systemctl daemon-reload
sudo systemctl enable gitbucket
sudo systemctl start gitbucket

Prüfen, ob der GiBucket Service läuft, lässt sich wie folgt.

systemctl status gitbucket

Nun können wir uns unter den definieren Port uns an GitBucket anmelden. Der Default Administrator und das Passwort ist root.

Login to http://IP_ADRESS_OF_RPI:8080/