#!/bin/bash
#############################################################
# Author: Taryel Hlontsi, 2023
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see
#############################################################
#############################################################
# SETUP SECTION, use "sudo" to run the script
#############################################################
# if set to true, ssh login only with ssh key which must(!) be configured upfront
NO_PASSWORD_SSH=true
# user for gitea, and DB password that should be entered on the initialization web page
HOST_USER='git' # better don't change it
DB_PASSWORD='PasswordGoesHere'
GITEA_URL='https://dl.gitea.com/gitea/1.19.3/gitea-1.19.3-linux-arm64'
# change the IP. If domain is used then set it here as the server name
OS_SERVER_NAME="gitea.local"
OS_IP="192.168.0.10"
OS_COUNTRY="PL"
# may be left as is
LOG_DIR="/home/${SUDO_USER}"
LOG="${LOG_DIR}/log.txt"
#############################################################
# HELPER FUNCTIONS
#############################################################
warn() {
PURPLE='\033[1;35m'
NC='\033[0m'
echo -e "${PURPLE}$1${NC}"
echo -e "WARN:\t$1" >> $LOG
}
info() {
GREEN='\033[1;32m'
NC='\033[0m'
echo -e "${GREEN}$1${NC}"
echo -e "INFO:\t$1" >> $LOG
}
trace() {
YELLOW='\033[1;33m'
NC='\033[0m'
echo -e "${YELLOW}$1${NC}"
echo -e "TRACE:\t$1" >> $LOG
}
error() {
RED='\033[1;31m'
NC='\033[0m'
echo -e "${RED}$1${NC}"
echo -e "ERROR:\t$1" >> $LOG
}
not_set() {
count=$(grep -Pcx "$1" "$2")
code=$?
if [[ $code == 2 ]] && [[ -z "$count" ]]; then
echo "not_set() func or its caller contains a bug that has to be fixed! param1=${1} param2=${2} code=${code} count=${count}. Exiting!"
exit -1
fi
[[ $count == 0 ]] && [[ $code == 1 ]] && return 0
return 1
}
not_exist() {
if [[ ! -e "$2" ]]; then
warn "file does not exist: $2"
return 0
else
count=$(grep -Pc "$1" "$2")
code=$?
[[ $count == 0 ]] && [[ $code == 1 ]] && return 0
return 1
fi
}
configure() {
if not_exist "$1" "$3"; then
warn "setting \"$1\" is not in the file, thus won't be changed"
return 1
else
if not_set "$2" "$3"; then
sed -i "s~.*${1}.*~${2}~gi" "$3" &&
trace "\"$1\" set to \"$2\"" &&
return 0
else
warn "\"$2\" already set in \"$3\""
return 2
fi
fi
}
#############################################################
# 1 - ADD USER
#############################################################
add_user() {
info "STEP 1 Adding a user for container"
sudo adduser \
--system \
--shell /bin/bash \
--gecos 'Git Version Control' \
--group \
--disabled-password \
--home /home/git \
git
[[ $? -gt 0 ]] && { error 'Check git user setup, stopping now'; exit 1; }
info "STEP 1 done"
warn "Press enter to proceed with the next step"; read
}
#############################################################
# 2 - CHANGE SERVER NAME
#############################################################
change_servername() {
info "STEP 2 Changing server name to ${OS_SERVER_NAME}"
echo $OS_SERVER_NAME > /etc/hostname
hostentry="127.0.1.1\t${OS_SERVER_NAME}"
if not_set "$hostentry" "/etc/hosts"; then
echo -e "$hostentry" >> /etc/hosts
else
warn "\"$hostentry\" already set in \"/etc/hosts\""
fi
info "STEP 2 done"
warn "Press enter to proceed with the next step"; read
}
#############################################################
# 3 - INSTALL MARIADB
#############################################################
install_mariadb() {
info "STEP 3 Installing Maria DB"
apt-get -y install mariadb-server > /dev/null
systemctl --quiet is-active mariadb || systemctl start mariadb
systemctl --quiet is-enabled mariadb || systemctl enable mariadb
mysql -u root < /dev/null
systemctl --quiet is-active nginx || systemctl start nginx
ufw allow 'Nginx Full'
trace "Rewriting default /etc/nginx/nginx.conf"
cat < /dev/null
wget --continue $GITEA_URL --output-document gitea
chmod +x gitea
chown git:git gitea
trace 'Creating nessesary directories with git owner'
mkdir -p /var/lib/gitea/{custom,data,log}
chown -Rv git:git /var/lib/gitea/
chmod -Rv 750 /var/lib/gitea/
mkdir /etc/gitea
chown root:git /etc/gitea
chmod 770 /etc/gitea
cp --force gitea /usr/local/bin/gitea
cat < /dev/null
systemctl --quiet is-active sshd || systemctl start sshd
systemctl --quiet is-enabled sshd || systemctl enable sshd
SSH_CFG="/etc/ssh/sshd_config"
SSH_CFG_BACK="${LOG_DIR}/sshd_config.backup"
trace "Going to rewrite ${SSH_CFG}"
trace "Backup will be here: ${SSH_CFG_BACK}"
if [[ -e "$SSH_CFG_BACK" ]]; then
warn "SSH config backup is already there!"
else
cp $SSH_CFG $SSH_CFG_BACK
cat <> $SSH_CFG
fi
fi
trace "Installing fail2ban..."
apt-get install -y fail2ban > /dev/null
systemctl --quiet is-active fail2ban || systemctl start fail2ban
systemctl --quiet is-enabled fail2ban || systemctl enable fail2ban
fail2ban-client status
F2B_CFG_ORIG="/etc/fail2ban/jail.conf"
F2B_CFG_COPY="/etc/fail2ban/jail.local"
if [[ -e "$F2B_CFG_COPY" ]]; then
warn "Fail2ban was already set up"
else
cp $F2B_CFG_ORIG $F2B_CFG_COPY
trace "Setting up ${F2B_CFG_COPY}"
configure 'bantime = 10m' 'bantime = 60m' $F2B_CFG_COPY
configure 'maxretry = 5' 'maxretry = 20' $F2B_CFG_COPY
fi
trace "Configuring ufw..."
ufw --force enable
ufw allow 'OpenSSH'
ufw status
info "STEP 6 done"
warn "Press enter to proceed with the next step"; read
}
#############################################################
# 7 - MAKE AN UPDATE HELPER (AS A SCRIPT)
#############################################################
create_updater() {
info 'Step 7 Create an updater for gitea (small helper utility)'
MY_HOME="/home/${SUDO_USER}"
SCRIPT='/usr/local/bin/gitea-update'
cat < /dev/null
cd "${MY_HOME}"
gitea --version
wget --continue \$1 --output-document gitea
systemctl stop gitea
chmod +x gitea
chown git:git gitea
cp --force gitea /usr/local/bin/gitea
systemctl restart gitea
gitea --version
EOF
chmod +x $SCRIPT
trace "Updater has been created. call it 'sudo gitea-update url_to_new_version'"
info 'Step 7 done'
}
#############################################################
# RUN SECTION
#############################################################
user=$(whoami)
if [ $user != root ]; then
error "You are using a non-privileged account"
exit 1
fi
echo $(date +'%Y-%m-%d %H:%M') > $LOG
info "Hiya!"
sudo apt update
sudo apt upgrade -y
add_user
change_servername
install_mariadb
install_nginx
install_gitea
secure_server
create_updater
info "Don't forget to reboot"
info "Bye!"
info "PS. Log is here: ${LOG}"
warn "REBOOT NOW!!!"
exit 0
# restart is mandatory!!!
# if a real domain is available - a certificate can be obtained, for examle:
# sudo apt install certbot python3-certbot-nginx
# sudo certbot --nginx -d gittar.crabdance.com
# sudo certbot renew --dry-run
# gitea can be upgraded or downgraded by executing
# sudo gitea-update 'https://dl.gitea.com/gitea/1.19.3/gitea-1.19.3-linux-arm64'
# however before running it ensure there is no old gitea file in the home dir
# otherwise it will install the same version again (such 'safety' measure;))