From 13cf1e78a1b88609c31958f7edb688350c11d3e3 Mon Sep 17 00:00:00 2001 From: Trenton Holmes <797416+stumpylog@users.noreply.github.com> Date: Tue, 12 May 2026 06:37:04 -0700 Subject: [PATCH] Experiementation with s6 features --- Dockerfile | 4 +++- .../etc/s6-overlay/s6-rc.d/svc-consumer/finish | 16 ++++++++++++++++ .../etc/s6-overlay/s6-rc.d/svc-flower/finish | 16 ++++++++++++++++ .../rootfs/etc/s6-overlay/s6-rc.d/svc-flower/run | 3 --- .../etc/s6-overlay/s6-rc.d/svc-scheduler/finish | 8 ++++++++ .../etc/s6-overlay/s6-rc.d/svc-webserver/finish | 8 ++++++++ .../s6-rc.d/svc-webserver/notification-fd | 1 + .../etc/s6-overlay/s6-rc.d/svc-webserver/run | 4 ++-- .../etc/s6-overlay/s6-rc.d/svc-worker/finish | 8 ++++++++ .../s6-rc.d/svc-worker/notification-fd | 1 + .../rootfs/etc/s6-overlay/s6-rc.d/svc-worker/run | 4 ++-- 11 files changed, 65 insertions(+), 8 deletions(-) create mode 100755 docker/rootfs/etc/s6-overlay/s6-rc.d/svc-consumer/finish create mode 100755 docker/rootfs/etc/s6-overlay/s6-rc.d/svc-flower/finish create mode 100755 docker/rootfs/etc/s6-overlay/s6-rc.d/svc-scheduler/finish create mode 100755 docker/rootfs/etc/s6-overlay/s6-rc.d/svc-webserver/finish create mode 100644 docker/rootfs/etc/s6-overlay/s6-rc.d/svc-webserver/notification-fd create mode 100755 docker/rootfs/etc/s6-overlay/s6-rc.d/svc-worker/finish create mode 100644 docker/rootfs/etc/s6-overlay/s6-rc.d/svc-worker/notification-fd diff --git a/Dockerfile b/Dockerfile index ed2eee3fe..c2f21b756 100644 --- a/Dockerfile +++ b/Dockerfile @@ -37,7 +37,9 @@ WORKDIR /usr/src/s6 # https://github.com/just-containers/s6-overlay#customizing-s6-overlay-behaviour ENV \ S6_BEHAVIOUR_IF_STAGE2_FAILS=2 \ - S6_CMD_WAIT_FOR_SERVICES_MAXTIME=0 \ + S6_CMD_WAIT_FOR_SERVICES_MAXTIME=60000 \ + S6_KILL_GRACETIME=30000 \ + S6_SERVICES_GRACETIME=30000 \ S6_VERBOSITY=1 \ PATH=/command:$PATH diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-consumer/finish b/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-consumer/finish new file mode 100755 index 000000000..a99847817 --- /dev/null +++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-consumer/finish @@ -0,0 +1,16 @@ +#!/command/with-contenv /usr/bin/bash +# shellcheck shell=bash + +if [[ -n "${PAPERLESS_CONSUMER_DISABLE}" ]]; then + if [[ $1 -eq 0 ]]; then + echo "[svc-consumer] Consumer is disabled, service did not run" + else + echo "[svc-consumer] Consumer is disabled, but service exited with error (exit code: $1, signal: $2)" >&2 + fi +else + if [[ $1 -eq 0 ]]; then + echo "[svc-consumer] Service stopped cleanly (exit code: $1, signal: $2)" + else + echo "[svc-consumer] Service exited with error (exit code: $1, signal: $2)" >&2 + fi +fi diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-flower/finish b/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-flower/finish new file mode 100755 index 000000000..e352687ff --- /dev/null +++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-flower/finish @@ -0,0 +1,16 @@ +#!/command/with-contenv /usr/bin/bash +# shellcheck shell=bash + +if [[ -z "${PAPERLESS_ENABLE_FLOWER}" ]]; then + if [[ $1 -eq 0 ]]; then + echo "[svc-flower] Flower is disabled, service did not run" + else + echo "[svc-flower] Flower is disabled, but service exited with error (exit code: $1, signal: $2)" >&2 + fi +else + if [[ $1 -eq 0 ]]; then + echo "[svc-flower] Service stopped cleanly (exit code: $1, signal: $2)" + else + echo "[svc-flower] Service exited with error (exit code: $1, signal: $2)" >&2 + fi +fi diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-flower/run b/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-flower/run index a3e4b6a3e..3a013ac1f 100755 --- a/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-flower/run +++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-flower/run @@ -6,9 +6,6 @@ declare -r log_prefix="[svc-flower]" echo "${log_prefix} Checking if we should start flower..." if [[ -n "${PAPERLESS_ENABLE_FLOWER}" ]]; then - # Small delay to allow celery to be up first - echo "${log_prefix} Starting flower in 5s" - sleep 5 cd ${PAPERLESS_SRC_DIR} if [[ -n "${USER_IS_NON_ROOT}" ]]; then diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-scheduler/finish b/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-scheduler/finish new file mode 100755 index 000000000..1569c49d6 --- /dev/null +++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-scheduler/finish @@ -0,0 +1,8 @@ +#!/command/with-contenv /usr/bin/bash +# shellcheck shell=bash + +if [[ $1 -eq 0 ]]; then + echo "[svc-scheduler] Service stopped cleanly (exit code: $1, signal: $2)" +else + echo "[svc-scheduler] Service exited with error (exit code: $1, signal: $2)" >&2 +fi diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-webserver/finish b/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-webserver/finish new file mode 100755 index 000000000..a40fce29c --- /dev/null +++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-webserver/finish @@ -0,0 +1,8 @@ +#!/command/with-contenv /usr/bin/bash +# shellcheck shell=bash + +if [[ $1 -eq 0 ]]; then + echo "[svc-webserver] Service stopped cleanly (exit code: $1, signal: $2)" +else + echo "[svc-webserver] Service exited with error (exit code: $1, signal: $2)" >&2 +fi diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-webserver/notification-fd b/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-webserver/notification-fd new file mode 100644 index 000000000..00750edc0 --- /dev/null +++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-webserver/notification-fd @@ -0,0 +1 @@ +3 diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-webserver/run b/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-webserver/run index 64b458150..b83b89eff 100755 --- a/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-webserver/run +++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-webserver/run @@ -14,7 +14,7 @@ if [[ -n "${PAPERLESS_FORCE_SCRIPT_NAME}" ]]; then fi if [[ -n "${USER_IS_NON_ROOT}" ]]; then - exec granian --interface asginl --ws --loop uvloop "paperless.asgi:application" + exec s6-notifyoncheck -d -w 1000 -- curl -sf "http://localhost:${GRANIAN_PORT}/" -- granian --interface asginl --ws --loop uvloop "paperless.asgi:application" else - exec s6-setuidgid paperless granian --interface asginl --ws --loop uvloop "paperless.asgi:application" + exec s6-notifyoncheck -d -w 1000 -- curl -sf "http://localhost:${GRANIAN_PORT}/" -- s6-setuidgid paperless granian --interface asginl --ws --loop uvloop "paperless.asgi:application" fi diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-worker/finish b/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-worker/finish new file mode 100755 index 000000000..236185ee4 --- /dev/null +++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-worker/finish @@ -0,0 +1,8 @@ +#!/command/with-contenv /usr/bin/bash +# shellcheck shell=bash + +if [[ $1 -eq 0 ]]; then + echo "[svc-worker] Service stopped cleanly (exit code: $1, signal: $2)" +else + echo "[svc-worker] Service exited with error (exit code: $1, signal: $2)" >&2 +fi diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-worker/notification-fd b/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-worker/notification-fd new file mode 100644 index 000000000..00750edc0 --- /dev/null +++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-worker/notification-fd @@ -0,0 +1 @@ +3 diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-worker/run b/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-worker/run index 0bf833c56..96548fb66 100755 --- a/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-worker/run +++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-worker/run @@ -4,7 +4,7 @@ cd ${PAPERLESS_SRC_DIR} if [[ -n "${USER_IS_NON_ROOT}" ]]; then - exec /usr/local/bin/celery --app paperless worker --loglevel INFO --without-mingle --without-gossip + exec s6-notifyoncheck -d -w 1000 -- sh -c 'celery --app paperless inspect ping --timeout 1' -- /usr/local/bin/celery --app paperless worker --loglevel INFO --without-mingle --without-gossip else - exec s6-setuidgid paperless /usr/local/bin/celery --app paperless worker --loglevel INFO --without-mingle --without-gossip + exec s6-notifyoncheck -d -w 1000 -- sh -c 'celery --app paperless inspect ping --timeout 1' -- s6-setuidgid paperless /usr/local/bin/celery --app paperless worker --loglevel INFO --without-mingle --without-gossip fi