Build from the published sources, not from git
[citadel-docker.git] / run-citadel.sh
index 486a2e4a277fc22df95ea47b35c065f45b57cf8f..3372da677da8c3e33f9b7e364d20bf429121758f 100755 (executable)
@@ -5,22 +5,83 @@
 # The container expects a persistent volume called "citadel-data" in which it will keep everything.
 # The remainder of the container is ephermal and can be deleted at any time.
 
-docker run \
-       --name citadel \
-       -it \
+migrate_mode=false
+database_cleanup_mode=false
+volume_mode=false
+bind_mode=false
+
+# Parse the command line arguments
+while getopts ":mdv:h:" o
+do
+       case "${o}" in
+               m)
+                       echo "migrate mode"
+                       migrate_mode=true
+                       ;;
+               d)
+                       echo "database cleanup mode";
+                       database_cleanup_mode=true
+                       ;;
+               v)
+                       volume_mode=true
+                       CTDL_DIR=${OPTARG}
+                       ;;
+               h)
+                       bind_mode=true
+                       CTDL_DIR=${OPTARG}
+                       ;;
+               *)
+                       echo
+                       echo "$0: usage: $0 [-v volume_name] [-h home_directory] [-m] [-d] container_image_name"
+                       echo "  -v volume_name          Use or create a Citadel database stored in a Docker volume called 'volume_name'"
+                       echo "  -h home_directory       Use or create a Citadel database stored in 'home_directory' on the host system"
+                       echo "  -m                      Enter migrate mode, to copy a remote Citadel installation to this host"
+                       echo "  -d                      Attempt to recover a corrupt database"
+                       exit 1
+                       ;;
+       esac
+done
+shift $((OPTIND-1))
+
+if ( ${volume_mode} && ${bind_mode} ) ; then
+       echo "$0: -v and -h cannot both be specified."
+       exit 2
+fi
+
+if ${volume_mode} ; then
+       CTDL_VOL=volume
+elif ${bind_mode} ; then
+       CTDL_VOL=bind
+else
+       volume_mode=true
+       CTDL_VOL=bind
+       CTDL_DIR=/usr/local/citadel
+       mkdir /usr/local/citadel >/dev/null 2>/dev/null
+fi
+
+if ( ${migrate_mode} && ${database_cleanup_mode} ) ; then
+       echo "$0: -m and -d cannot both be specified."
+       exit 3
+fi
+
+docker run -i --rm citadel -c || exit 1
+
+n_args=""
+c_args=""
+
+if ${migrate_mode} ; then
+       c_args="-m"                             # Tell ctdlvisor to run ctdlmigrate
+elif ${database_cleanup_mode} ; then
+       c_args="-d"                             # Tell ctdlvisor to run database_cleanup.sh
+else
+       n_args="--network=host"                 # Only open ports if we're running in normal mode
+fi
+
+exec docker run \
+       --name=citadel \
+       -i \
        --rm \
-       -p 25:25 \
-       -p 80:80 \
-       -p 110:110 \
-       -p 119:119 \
-       -p 143:143 \
-       -p 443:443 \
-       -p 465:465 \
-       -p 504:504 \
-       -p 563:563 \
-       -p 587:587 \
-       -p 993:993 \
-       -p 995:995 \
-       -p 5222:5222 \
-       --mount type=bind,source=/root/citadel/citadel,target=/citadel-data \
-       $*
+       ${n_args} \
+       --mount type=${CTDL_VOL},source=${CTDL_DIR},target=/citadel-data \
+       citadel \
+       ${c_args}