If you want to host your own Git Server you have multiple possibilities. Here I want to describe how to run GitBucket, an Open Source GitHub like platform.
The focus of this article is to show you how to setup GitBucket as a service (incl. autostart) on a Debian OS.
Table of Contents
Installation in short
Java 8
GitBucket required Java8 to run. So first we install Java8 on the machine if not already done.
echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" | tee /etc/apt/sources.list.d/webupd8team-java.list echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" | tee -a /etc/apt/sources.list.d/webupd8team-java.list apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys EEA14886 apt-get update apt-get install oracle-java8-installer
This will add additional repositories to your system that contains the Java8 installer (not the Java8 binaries). This installer will download Java8 binaries for you and install them correctly. While installing you have to accept the license and after that you can check the java version with the following command:
java --version
For more detailed description see HOW TO INSTALL ORACLE JAVA 8 IN DEBIAN VIA REPOSITORY [JDK8].
User and GitBucket
First of all we should avoid to run services using root user because of security reasons. So we will create a new user, switch to that user and go to the home directory:
adduser gitbucket su gitbucket cd
After that we download the latest version of GitBucket from GitHub Releases:
wget https://github.com/gitbucket/gitbucket/releases/download/4.9/gitbucket.war
Now you can first run GitBucket using the following command:
java -jar gitbucket.war
See GitBucket readme for detailed information.
Run as a service with autostart on boot
Now we want to setup GitBucket as a service with autostart on OS boot.
For that we create two files with the following contents:
File: gitbucket_startscript.sh :
#!/bin/sh
COMMANDLINE_PARAMETERS="${2}" #add any command line parameters you want to pass here
D1=$(readlink -f "$0")
BINARYPATH="$(dirname "${D1}")"
cd "${BINARYPATH}"
LIBRARYPATH="$(pwd)"
BINARYNAME="gitbucket"
case "$1" in
start)
if [ -e gitbucket.pid ]; then
if ( kill -0 $(cat gitbucket.pid) 2> /dev/null ); then
echo "The server is already running, try restart or stop"
exit 1
else
echo "gitbucket.pid found, but no server running. Possibly your previously started server crashed"
echo "Please view the logfile for details."
rm gitbucket.pid
fi
fi
if [ "${UID}" = "0" ]; then
echo WARNING ! For security reasons we advise: DO NOT RUN THE SERVER AS ROOT
c=1
while [ "$c" -le 10 ]; do
echo -n "!"
sleep 1
c=$(($c+1))
done
echo "!"
fi
echo "Starting the GitBucket server"
if [ -e "$BINARYNAME" ]; then
if [ ! -x "$BINARYNAME" ]; then
echo "${BINARYNAME} is not executable, trying to set it"
chmod u+x "${BINARYNAME}"
fi
if [ -x "$BINARYNAME" ]; then
export LD_LIBRARY_PATH="${LIBRARYPATH}:${LD_LIBRARY_PATH}"
nohup java -jar $BINARYNAME $COMMANDLINE_PARAMETERS > /dev/null &
PID=$!
ps -p ${PID} > /dev/null 2>&1
if [ "$?" -ne "0" ]; then
echo "GitBucket server could not start"
else
echo $PID > gitbucket.pid
echo "GitBucket server started, for details please view the log file"
fi
else
echo "${BINARNAME} is not exectuable, cannot start GitBucket server"
fi
else
echo "Could not find binary, aborting"
exit 5
fi
;;
stop)
if [ -e gitbucket.pid ]; then
echo -n "Stopping the GitBucket server"
if ( kill -TERM $(cat gitbucket.pid) 2> /dev/null ); then
c=1
while [ "$c" -le 300 ]; do
if ( kill -0 $(cat gitbucket.pid) 2> /dev/null ); then
echo -n "."
sleep 1
else
break
fi
c=$(($c+1))
done
fi
if ( kill -0 $(cat gitbucket.pid) 2> /dev/null ); then
echo "Server is not shutting down cleanly - killing"
kill -KILL $(cat gitbucket.pid)
else
echo "done"
fi
rm gitbucket.pid
else
echo "No server running (gitbucket.pid is missing)"
exit 7
fi
;;
restart)
$0 stop && $0 start ${COMMANDLINE_PARAMETERS} || exit 1
;;
status)
if [ -e gitbucket.pid ]; then
if ( kill -0 $(cat gitbucket.pid) 2> /dev/null ); then
echo "Server is running"
else
echo "Server seems to have died"
fi
else
echo "No server running (gitbucket.pid is missing)"
fi
;;
*)
echo "Usage: ${0} {start|stop|restart|status}"
exit 2
esac
exit 0
Copy that file to the home directory of the user “gitbucket” /home/gitbucket and execute the following commands:
chown gitbucket:gitbucket /home/gitbucket/gitbucket_startscript.sh chmod u+x /home/gitbucket/gitbucket_startscript.sh
This file contains the logic to start/stop/restart/status commands for GitBucket service.
File: gitbucket :
#! /bin/sh
### BEGIN INIT INFO
# Provides: gitbucket
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: GitBucket Server
# Description: Startup Init-Script for GitBucket Server
### END INIT INFO
# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="GitBucket Server"
NAME=gitbucket
USER=gitbucket
BINARY=gitbucket
BINARY_BIN=/home/gitbucket
DAEMON=gitbucket_startscript.sh
DAEMON_ARGS=
PIDFILE=$BINARY_BIN/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
#
# Function that starts the daemon/service
#
do_start()
{
su $USER -s /bin/sh -c "$BINARY_BIN/$DAEMON start $DAEMON_ARGS"
}
#
# Function that stops the daemon/service
#
do_stop()
{
su $USER -s /bin/sh -c "$BINARY_BIN/$DAEMON stop $DAEMON_ARGS"
}
#
# Function that shows the status of to the daemon/service
#
do_status()
{
su $USER -s /bin/sh -c "$BINARY_BIN/$DAEMON status $DAEMON_ARGS"
}
case "$1" in
start)
log_daemon_msg "Starting $DESC" ""
do_start
case "$?" in
0|1) log_end_msg 0 ;;
2) log_end_msg 1 ;;
esac
;;
stop)
log_daemon_msg "Stopping $DESC" ""
do_stop
case "$?" in
0|1) log_end_msg 0 ;;
2) log_end_msg 1 ;;
esac
;;
status)
do_status
status_of_proc "$BINARY" "$DESC" && exit 0 || exit $?
;;
restart)
log_daemon_msg "Restarting $DESC" ""
do_stop
case "$?" in
0|1)
do_start
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*)
# Failed to stop
log_end_msg 1
;;
esac
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|status|restart}"
exit 3
;;
esac
:
Copy this file to /etc/init.d and execute the following commands:
# set permissions chmod 755 /etc/init.d/gitbucket # register for autostart update-rc.d gitbucket default
This file defines the gitbucket service that can be automatically started.
Now you have to start the service by your own (if you don’t want to restart the complete server):
/etc/init.d/gitbucket start
Gitbucket access on port 80
Here we want to use Gitbucket on port 80 parallel to Apache Webserver using mod_proxy .
Install and enable mod_proxy and mod_proxy_http :
sudo apt-get install libapache2-mod-proxy-html a2enmod proxy proxy_http
Add new VirtualHost configuration (ignore .well-known requests for Let’s Encrypt):
<VirtualHost <HOST_IP>:80> ServerName <DOMAIN> ProxyPreserveHost On ProxyRequests off ProxyPass /.well-known ! ProxyPass / http://localhost:8080/ ProxyPassReverse / http://localhost:8080/ </VirtualHost>
Restart Apache
service apache2 restart
Disable direct access for GitBucket, it should be only accessable over the Proxy. Edit the gitbucket_startscript.sh and change the commandline parameters:
COMMANDLINE_PARAMETERS="--host=localhost""${2}"