Gitlab (Source) und Ubuntu 16 LTS Update, Backup und Restart per cronjob + E-Mail Log Versand

Die Scripte liegen im Verzeichnis /root/scripts/.
Unter dem User root wird mit crontab -e der cronjob eingerichtet, dabei muss die PATH Variable richtig gesetzt sein.

Auf die Scripte sollte ein chmod 0750 gemacht werden, um sie ausführbar zu machen (-rwxr-x—).


1. Maintenance Das Hauptscript mit E-Mail Verand

Das Hauptscript, welches die anderen Scripten je nach Typ ausführt, die Log Dateien schreibt und das Log per E-Mail versendet.
Die E-Mail Adresse entsprechend anpassen.

maintenance:

#!/bin/bash
echo "++++++ Maintenance Script ++++++"

echo "$(date +'%T') Script ubuntu_update..."
OUTPUT=$(/root/scripts/ubuntu_update)

echo "$(date +'%T') Script gitlab_update_backup..."
OUTPUT="$OUTPUT $(/root/scripts/gitlab_update_backup)"

echo "$(date +'%T') Script gitlab_backup_sync..."
OUTPUT="$OUTPUT $(/root/scripts/gitlab_backup_sync)"

echo "$(date +'%T') Script ubuntu_restart..."
OUTPUT="$OUTPUT $(/root/scripts/ubuntu_restart)"

echo "$(date +'%T') Store log files..."
echo "$OUTPUT" > /var/log/maintenance_last.log
echo "$OUTPUT" >> /var/log/maintenance.log

echo "$(date +'%T') Send mail..."
echo "$OUTPUT" | mail -s "Maintenance Log" mail@domain.de

1.1. Ubuntu Update Komplettes Update und Bereinigen von Ubuntu

Dieses Script aktualisiert Ubuntu komplett, macht auch ein upgrade, falls vorhanden. Es entfernt „Leichen“.

ubuntu_update:

#!/bin/bash
printf "\n"
echo "++++++ Ubuntu-Update ++++++"
echo "$(date +'%T'):"
sudo -- sh -c 'apt-get update; apt-get upgrade -y; apt-get dist-upgrade -y; apt-get autoremove -y; apt-get autoclean -y'

1.2. Gitlab Update + Backup Umfangreiches Aktualisierungs- und Backupscript

Mit diesem Script wird Gitlab und seine Komponenten aktualisiert und gleichzeitig vor dem Update und nach dem Update ein Backup erstellt. Es wird die aktuelle Versionsnummer von Gitlab aus dem Stable Branch ermittelt.
Von Zeit zu Zeit das Script mit der Offiziellen Anleitung auf https://docs.gitlab.com/ee/update/patch_versions.html überprüft und angeglichen werden.

gitlab_update_backup:

#!/bin/bash
printf "\n"
echo "++++++ Gitlab Update+Backup ++++++"
echo "$(date +'%T'):"
cd /home/git/gitlab
gitlab_latest_version=$(/usr/local/bin/git tag -l 'v*.[0-9]' --sort='v:refname' | /usr/bin/tail -n 1)
echo "Gitlab Stable Branch Version: $gitlab_latest_version"

#Backup:
echo "$(date +'%T') Do Backup..."
service gitlab start
cd /home/git/gitlab
sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production

#Stop Server:
echo "$(date +'%T') Stop gitlab..."
service gitlab stop

#Get latest code for the stable branch
echo "$(date +'%T') Get latest code stable..."
cd /home/git/gitlab
sudo -u git -H git fetch --all
sudo -u git -H git checkout -- Gemfile.lock db/schema.rb locale
sudo -u git -H git checkout ${gitlab_latest_version} -b ${gitlab_latest_version}

echo "$(date +'%T') Install libs, migrations, etc..."
cd /home/git/gitlab
# PostgreSQL
sudo -u git -H bundle install --without development test mysql --deployment
# Optional: clean up old gems
sudo -u git -H bundle clean
# Run database migrations
sudo -u git -H bundle exec rake db:migrate RAILS_ENV=production
# Compile GetText PO files
# Internationalization was added in `v9.2.0` so these commands are only
# required for versions equal or major to it.
sudo -u git -H bundle exec rake gettext:pack RAILS_ENV=production
sudo -u git -H bundle exec rake gettext:po_to_json RAILS_ENV=production
# Clean up assets and cache
sudo -u git -H bundle exec rake yarn:install gitlab:assets:clean gitlab:assets:compile cache:clear RAILS_ENV=production NODE_ENV=production

echo "$(date +'%T') Update gitlab-workhorse to the corresponding version..."
cd /home/git/gitlab
sudo -u git -H bundle exec rake "gitlab:workhorse:install[/home/git/gitlab-workhorse]" RAILS_ENV=production

echo "$(date +'%T') Update gitaly to the corresponding version..."
cd /home/git/gitlab
sudo -u git -H bundle exec rake "gitlab:gitaly:install[/home/git/gitaly]" RAILS_ENV=production

echo "$(date +'%T') Update gitlab-shell to the corresponding version..."
cd /home/git/gitlab-shell
sudo -u git -H git fetch --all --tags
sudo -u git -H git checkout v`cat /home/git/gitlab/GITLAB_SHELL_VERSION` -b v`cat /home/git/gitlab/GITLAB_SHELL_VERSION`
sudo -u git -H sh -c 'if [ -x bin/compile ]; then bin/compile; fi'

echo "$(date +'%T') Start application..."
sudo service gitlab start
sudo service apache2 restart

echo "$(date +'%T') Check application status..."
cd /home/git/gitlab
sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production
echo "$(date +'%T') Thorough check..."
sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production

#Backup:
echo "$(date +'%T') Do Backup..."
cd /home/git/gitlab
sudo -u git -H bundle exec rake gitlab:backup:create RAILS_ENV=production

1.3. Backups sichern auf externen Server

Damit Synchronisiere ich die Gitlab Backups mit meinem Backupserver. Die Pfade anpassen.
Im Ziel mache ich noch einen chown. Anpassen oder entfernen.

gitlab_backup_sync:

#!/bin/bash
printf "\n"
echo "++++++ Gitlab-Backup-Sync ++++++"
echo "$(date +'%T'):"
cp -nv /home/git/gitlab/tmp/backups/* /backupsvr/gitlab/
echo "$(date +'%T') chown..."
chown username:group /backupsvr/gitlab/*

1.4. Neustart des Systems

Anschließend fahre ich die Datenbank und Webdienste herunter und starte den Server nach 30 Sekunden neu.

ubuntu_restart:

#!/bin/bash
printf "\n"
echo "++++++ Ubuntu-Restart ++++++"
echo "$(date +'%T') Service gitlab stop..."
service gitlab stop
echo "$(date +'%T') Service apache2 stop..."
service apache2 stop
echo "$(date +'%T') Service mysql stop..."
service mysql stop
echo "$(date +'%T') Service postgresql stop..."
service postgresql stop
echo "$(date +'%T') Restart..."
shutdown -r -t 30

2. Cronjob Automatische Ausführung der Scripte

Crontab Inhalt per Befehl „crontab -e“ unter dem User root.
Wichtig die die PATH Variable. Das Maintenance Script wird jeden Tag um 4 Uhr ausgeführt.

#crontab -e:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
0 4 * * * /bin/bash /root/scripts/maintenance > /var/log/cron_root_last.log 2>&1

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*
*
*