diff --git a/Dockerfile b/Dockerfile index 02f7328..1c96f1f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -23,7 +23,7 @@ ENV TZ=UTC ENV LOG_LEVEL=9 #Get required packages -RUN apk update && apk add tzdata curl shadow bash xz git procps nodejs npm nano +RUN apk update && apk add --no-cache tzdata curl shadow bash xz git procps nodejs npm nano openssl ca-certificates #Make folders RUN mkdir /config && \ @@ -39,13 +39,18 @@ RUN curl -fsSL "https://github.com/just-containers/s6-overlay/releases/download/ curl -fsSL "https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-symlinks-arch.tar.xz" | tar Jpxf - -C / ENV S6_BEHAVIOUR_IF_STAGE2_FAILS=2 S6_CMD_WAIT_FOR_SERVICES_MAXTIME=0 S6_VERBOSITY=1 -#Install Cronicle -RUN mkdir /app/cronicle && \ +#Install Cronicle & tidy up things I don't want +RUN apk add --no-cache --virtual .jq jq && \ + mkdir /app/cronicle && \ cd /app/cronicle && \ wget https://github.com/cronicle-edge/cronicle-edge/archive/refs/tags/v${CRONICLE_EDGE_VERSION}.tar.gz && \ tar -xf v${CRONICLE_EDGE_VERSION}.tar.gz --strip-components 1 && \ - rm -rf Docker* .gitignore Readme.md .vscode && \ - rm -rf v${CRONICLE_EDGE_VERSION}.tar.gz + rm -rf Docker* .gitignore Readme.md .vscode sample_conf/examples/backup sample_conf/examples/docker.sh && \ + jq 'del(.storage[] | select(contains(["global/conf_keys"])))' sample_conf/setup.json >> sample_conf/setup-new.json && \ + rm sample_conf/setup.json && \ + mv sample_conf/setup-new.json sample_conf/setup.json && \ + rm -rf v${CRONICLE_EDGE_VERSION}.tar.gz && \ + apk del .jq WORKDIR /app/cronicle RUN npm install && \ @@ -57,5 +62,6 @@ RUN chmod +x /cronicle-prepare.sh && \ chown -R ${PUID}:${PGID} /app /config EXPOSE 3012 +EXPOSE 3013 ENTRYPOINT [ "/init" ] \ No newline at end of file diff --git a/README.md b/README.md index e5d0041..b74d41a 100644 --- a/README.md +++ b/README.md @@ -92,6 +92,8 @@ services: This container automatically checks for scripts in `/config/init` and runs them at startup. This could be useful if you need to install additional applications into a worker container so it can execute jobs. +Note that any scripts will be run as `root` before permissions are altered in `/app` and `/config`. Anything that an init script does in either of these folders will be owned by `cronicle` when the container continues. + ## Reverse Proxying For a single manager behind a reverse proxy, you may need to specify a specific route for the web-socket connections. diff --git a/root/container-init.sh b/root/container-init.sh index ce9909a..5516571 100644 --- a/root/container-init.sh +++ b/root/container-init.sh @@ -39,15 +39,30 @@ else exit 1 fi +#Importing and running additional scripts placed in /config/init +if [ -d /config/init ]; then + if [ "$(ls -A /config/init)" ]; then + echo "Running additional startup scripts." + for f in /config/init/*.sh; do + bash "$f" + done + else + echo "/config/init is empty - no additional startup scripts detected." + fi +else + echo "Directory /config/init not found. Creating." + mkdir /config/init && chown -R cronicle:cronicle /config/init +fi + echo "Checking permissions in /config and /app." -if [ ! "$(stat -c %u /app)" -eq "${PUID}" ] || [ ! "$(stat -c %g /app)" -eq "${PGID}" ] +if [ -n "$(find /app \! -user ${PUID})" ] || [ -n "$(find /app \! -group ${PGID})" ] then echo "Fixing permissions for /app (this can take some time)." chown -R cronicle:cronicle /app fi -if [ ! "$(stat -c %u /config)" -eq "${PUID}" ] || [ ! "$(stat -c %g /config)" -eq "${PGID}" ] +if [ -n "$(find /config \! -user ${PUID})" ] || [ -n "$(find /config \! -group ${PGID})" ] then echo "Fixing permissions for /config (this can take some time)." chown -R cronicle:cronicle /config diff --git a/root/cronicle-prepare.sh b/root/cronicle-prepare.sh index 699fae4..09eb0d8 100644 --- a/root/cronicle-prepare.sh +++ b/root/cronicle-prepare.sh @@ -3,34 +3,13 @@ echo "Preparing Cronicle" -#Importing and running additional scripts placed in /config/init -if [ -d /config/init ] -then - if [ "$(ls -A /config/init)" ] - then - - echo "Running additional startup scripts." - - bash /config/init/* - - else - - echo "/config/init is empty - no additional startup scripts detected." - - fi -else - - echo "Directory /config/init not found. Creating." - - mkdir /config/init - -fi - if [ ! -d /config/cronicle ] then + echo "Directory /config/cronicle not found. Creating." mkdir /config/cronicle + fi #Detecting what mode Cronicle should be started in @@ -48,15 +27,27 @@ then cp -r /app/cronicle/conf /config/cronicle/conf rm -rf /app/cronicle/conf ln -s /config/cronicle/conf /app/cronicle/conf + else echo "Config dir already exists. Doesn't need creating." echo "Linking persistent config dir back into Cronicle." + rm -rf /app/cronicle/conf ln -s /config/cronicle/conf /app/cronicle/conf fi + if [ ! -f /config/cronicle/conf/ssl.crt ] || [ ! -f /config/cronicle/conf/ssl.key ] + then + + echo "One or both SSL components are missing. Generating." + + rm -f /config/cronicle/conf/ssl.crt /config/cronicle/conf/ssl.key + openssl req -x509 -newkey rsa:4096 -keyout /config/cronicle/conf/ssl.key -out /config/cronicle/conf/ssl.crt -sha256 -days 3650 -nodes -subj "/C=XX/ST=StateName/L=CityName/O=CompanyName/OU=CompanySectionName/CN=CommonNameOrHostname" + + fi + if [ ! -f /config/cronicle/data/.setup_done ] then @@ -84,24 +75,32 @@ then echo "Cronicle is running in 'worker' mode." + #Copying config directory to /config/cronicle/conf if not already there, then linking back into Cronicle if [ ! -f /config/cronicle/conf/config.json ] then echo "No config found. Copy config.json from the manager server and place it in /config/cronicle/conf dir." - mkdir -p /config/cronicle/conf - exit 0 + cp -R /app/cronicle/conf /config/cronicle/conf + rm -rf /config/cronicle/conf/config.json + echo '' + echo '' + echo '*************************************' + exit 1 else - #Removing default config.json and linking provided one back into Cronicle - rm -rf /app/cronicle/conf/config.json - ln -s /config/cronicle/conf/config.json /app/cronicle/conf/config.json + echo "Config is present." + echo "Linking persistent config dir back into Cronicle." + + rm -rf /app/cronicle/conf + ln -s /config/cronicle/conf /app/cronicle/conf fi else - echo "'$MODE' is not a recognised appion for the MODE environment variable. Accepted appions are 'manager' and 'worker'." + echo "'$MODE' is not a recognised appion for the MODE environment variable. Accepted options are 'manager' and 'worker'." + exit 1 fi @@ -114,10 +113,12 @@ then cp -r /app/cronicle/logs /config/cronicle/logs rm -rf /app/cronicle/logs ln -s /config/cronicle/logs /app/cronicle/logs + else echo "Logs dir already exists. Doesn't need creating." echo "Linking persistent logs dir back into Cronicle." + rm -rf /app/cronicle/logs ln -s /config/cronicle/logs /app/cronicle/logs