homelab/fighter/scripts/startup.sh
Joey Hafner d53e974d7e
All checks were successful
Deploy to Fighter / Deploy (push) Successful in 37s
Deploy to Fighter / Notify (push) Successful in 4s
Update fighter startup/shutdown scripts
2024-03-09 01:04:44 -08:00

103 lines
3.3 KiB
Bash

#!/bin/bash
#set -x # debugging flag
# depends on the $COMPOSE_CONFIG_TEXT variable being populated with the compose config to check
function get_shares {
SHARES=$(echo "$COMPOSE_CONFIG_TEXT" |\
grep /mnt/ |\
tr -s ' ' |\
cut -d' ' -f 3 |\
cut -d'/' -f-4 |\
sort -u)
#echo "$SHARES" # Debug echo
}
# depends on the $SHARES variable being populated with the shares to check
function check_shares {
MISSING_SHARES=false
for share in $SHARES; do
#echo -n " ==== Share $share: " # Debug echo
if ! mount | grep -q $share; then
#echo "ONLINE" # Debug echo
MISSING_SHARES=true
#else
#echo "OFFLINE" # Debug echo
fi
done
}
function connect_iscsi {
sudo iscsiadm --mode node --targetname "iqn.2020-03.net.jafner:fighter" --portal "192.168.1.10:3260" --login
}
function mount_iscsi {
sudo mount /mnt/nas/iscsi
}
if [ "$1" = "clean" ]; then
echo " ==== Cleaning up old containers"
# Clean up any remnants from unclean shutdown
docker stop $(docker ps -q) # shut down running containers
docker rm $(docker ps -aq) # remove all containers
fi
# NAS iSCSI
# First check for connection; attempt to connect and mount if not connected
echo " ==== Checking iSCSI..."
if ! sudo iscsiadm -m session | grep -q 'iqn.2020-03.net.jafner:fighter'; then
echo " ====== Attempting to connect and mount iSCSI"
{
connect_iscsi && mount_iscsi && echo " ====== Success!"
} || {
echo " ====== Could not connect and mount iSCSI"
}
fi
# Second check if mounted; attempt to mount if not mounted
if ! mount | grep -q '/mnt/nas/iscsi'; then
echo " ====== Attempting to mount /mnt/nas/iscsi"
{
mount_iscsi && echo " ====== Success!"
} || {
echo " ====== Could not mount /mnt/nas/iscsi"
}
fi
# Regarding the above, we will attempt to re-mount the share if the first step successfully connected and then failed to mount.
# This is because I can't be bother to build more elegant logic.
for stack in /home/admin/homelab/fighter/config/*; do
echo " ==== Processing $stack"
cd $stack
if ! docker compose config > /dev/null; then
echo " ====== Invalid compose config: $stack"
fi
COMPOSE_CONFIG_TEXT=$(docker compose config)
MISSING_SHARES=true # Ensures a failure in the checking logic doesn't online the stack
get_shares
check_shares
if ! $MISSING_SHARES; then
echo " ====== Bringing up"
STACKS_ONLINE+="$(echo $stack | xargs basename)\n"
echo -n " ======== Time: "
( time docker compose --progress quiet up -d ) 2>&1 | grep real | cut -f 2
echo " ====== Done!"
else
echo " ====== Missing needed network shares. Skipping."
STACKS_SKIPPED+="$(echo $stack | xargs basename)\n"
fi
cd /home/admin/homelab/fighter/config/
# make sure to overwrite the config text to prevent leaking secrets
COMPOSE_CONFIG_TEXT=""
done
echo " ==== List of stacks online:"
echo -e "$STACKS_ONLINE"
echo " ==== List of stacks skipped:"
echo -e "$STACKS_SKIPPED"
# extra thing because my keycloak healthcheck doesn't work properly
echo " ==== Wait 15s, then bring Keycloak forwardauth containers online"
cd /home/admin/homelab/fighter/config/keycloak
sleep 15
docker start keycloak_forwardauth keycloak_forwardauth-privileged