seafile-containerized/launcher

245 lines
6 KiB
Bash
Executable file

#!/bin/bash
usage () {
echo "Usage: launcher COMMAND [--skip-prereqs] [--docker-args STRING]"
echo "Commands:"
echo " start: Start/initialize a container"
echo " stop: Stop a running container"
echo " restart: Restart a container"
echo " destroy: Stop and remove a container"
echo " enter: Open a shell to run commands inside the container"
echo " logs: View the Docker logs for a container"
echo " bootstrap: Bootstrap a container for the config based on a template"
echo " rebuild: Rebuild a container (destroy old, bootstrap, start new)"
echo " cleanup: Remove all containers that have stopped for > 24 hours"
echo
echo "Options:"
echo " --skip-prereqs Don't check launcher prerequisites"
echo " --docker-args Extra arguments to pass when running docker"
exit 1
}
set -e
set -o pipefail
version=6.0.5
image=seafileorg/server:$version
local_image=local_seafile/server:latest
dockerdir=$(cd "$(dirname $0)"; pwd -P)
sharedir=$dockerdir/shared
installdir=/opt/seafile/seafile-server-$version
bootstrap_conf=$dockerdir/bootstrap/bootstrap.conf
cd $dockerdir
dbg() {
if [[ $debug == "true" ]]; then
echo "dbg: $1"
fi
}
install_docker() {
echo "Docker is not installed, you will need to install Docker in order to run Launcher"
echo "See https://docs.docker.com/installation/"
exit 1
}
err_and_quit () {
printf "\n\n\033[33mError: %s\033[m\n\n" "$1"
exit 1
}
init_shared() {
mkdir -p $sharedir/{seafile,db}
mkdir -p $sharedir/logs/{seafile,var-log}
mkdir -p $sharedir/logs/var-log/nginx
touch $sharedir/logs/var-log/syslog
local bash_history=$sharedir/.bash_history
if [[ ! -e $bash_history ]]; then
touch $bash_history
fi
}
set_ports() {
ports=$(docker run $user_args --rm -it \
-v ${dockerdir}/scripts:/scripts \
-v ${dockerdir}/bootstrap:/bootstrap:ro \
$image \
/scripts/bootstrap.py --parse-ports)
}
set_bootstrap_volumes() {
local mounts
init_shared
mounts=(
$sharedir:/shared
$sharedir/logs/var-log:/var/log
$sharedir/db:/var/lib/mysql
$dockerdir/bootstrap:/bootstrap
$dockerdir/scripts:/scripts:ro
$dockerdir/templates:/templates:ro
$dockerdir/scripts/tmp/check_init_admin.py:$installdir/check_init_admin.py:ro
$sharedir/.bash_history:/root/.bash_history
)
volumes=""
local m
for m in ${mounts[*]}; do
volumes="$volumes -v $m"
done
}
set_volumes() {
local mounts
init_shared
mounts=(
$sharedir:/shared
$sharedir/logs/var-log:/var/log
$sharedir/db:/var/lib/mysql
$sharedir/.bash_history:/root/.bash_history
)
volumes=""
local m
for m in ${mounts[*]}; do
volumes="$volumes -v $m"
done
}
set_existing_container() {
existing=$(docker ps -a | awk '{ print $1, $(NF) }' | grep " seafile$" | awk '{ print $1 }' || true)
}
bootstrap() {
if [[ ! -e $bootstrap_conf ]]; then
err_and_quit "The file $bootstrap_conf doesn't exist. Have you run seafile-server-setup?"
fi
# First initialize seafile server and letsencrypt
set_bootstrap_volumes
set_ports
docker run $user_args --rm -it --name seafile-bootstrap -e SEAFILE_BOOTSRAP=1 $volumes $ports $image /sbin/my_init -- /scripts/bootstrap.py
docker build -f bootstrap/generated/Dockerfile -t local_seafile/server:latest .
}
oldstart() {
set_volumes
set_ports
docker run $user_args --rm -it --name seafile $volumes $ports $image \
/sbin/my_init -- bash -l
# /sbin/my_init -- /scripts/start.py
}
start() {
existing=$(docker ps | awk '{ print $1, $(NF) }' | grep " seafile$" | awk '{ print $1 }' || true)
if [[ $existing != "" ]]; then
echo "Nothing to do, your container has already started!"
exit 0
fi
set_existing_container
if [[ $existing != "" ]]; then
echo "starting up existing container"
(
set -x
docker start seafile
)
exit 0
fi
set_volumes
set_ports
local restart_policy attach_on_run
if [[ "${SUPERVISED}" = "true" ]]; then
restart_policy="--restart=no"
attach_on_run="-a stdout -a stderr"
else
attach_on_run="-d"
fi
(
set -x
docker run $user_args $attach_on_run $restart_policy --name seafile $volumes $ports $local_image
)
}
stop() {
set_existing_container
if [[ $existing != "" ]]; then
(
set -x
docker stop -t 10 seafile
)
else
echo "seafile was not started !"
exit 1
fi
}
enter() {
set_existing_container
if [[ $existing != "" ]]; then
(
set -x
docker exec -it seafile /bin/bash
)
else
echo "seafile was not started !"
exit 1
fi
}
restart() {
stop
start
}
check_prereqs() {
if [[ $skip_prereqs == "true" ]]; then
return 0
fi
# check docker
if ! which docker >/dev/null; then
install_docker
fi
# TODO: check git version
}
logs() {
err_and_quit "Not implemented yet"
}
destroy() {
err_and_quit "Not implemented yet"
}
rebuild() {
err_and_quit "Not implemented yet"
}
main() {
local action
while [[ $# -gt 0 ]]
do
case "$1" in
bootstrap|oldstart|start|stop|restart|enter|destroy|logs|rebuild)
action=$1 ; shift 1 ;;
--debug) debug=true ; shift 1 ;;
--skip-prereqs) skip_prereqs=true ; shift 1 ;;
--docker-args) user_args=$2 ; shift 2 ;;
*) err_and_quit "Argument error. Please see help." ;;
esac
done
"$action"
}
check_prereqs
main "$@"