* docs(docker): Recommended image DEFAULT_WORKSPACE * fix(docker): Add default crontab download command Clarify the `/config/ytdl-sub-configs/cron` script with explanatory comments and a default `--dry-run` command. Also change the wrapper script to echo commands for easier debugging. To update an existing script, move the old script aside, restart the container to regenerate it, and edit the new script. Also clarify the Automating page in the Getting Started guide docs. * fix(docker): Unintentional unattended dry runs [PR feedback](https://github.com/jmbannon/ytdl-sub/pull/1321#discussion_r2315215600) prompted me to reconsider having a default command at all. We should assume, unfortunately, that many new users will just skim the docs enough to enable the image's cron integration but not actually incrementally test their configuration. In those cases, they'd end up sending dry-run non-download requests for all their subscriptions every 6 hours for no good reason. There's just no way to provide a default command that isn't also providing a footgun. * docs(docker): More open cron schedule generator From [PR feedback](https://github.com/jmbannon/ytdl-sub/pull/1321#discussion_r2320521024), this seems like less of an ad than the previous and the source for the page is itself open source. * docs(docker): Document image environment footgun From [PR feedback](https://github.com/jmbannon/ytdl-sub/pull/1321#discussion_r2320515419). * docs(automate): Avoid external link 404 responses * docs(automate): False simultaneous run warning * docs(automate): Clarify Docker daemon restarts * docs(automate): Revert run start non-recommended * docs(automate): Remove footgun manual run command Addressing this underlying issue requires more thought and should be a separate PR. * docs(automate): Restore env var footgun in example
86 lines
3.4 KiB
Text
Executable file
86 lines
3.4 KiB
Text
Executable file
#!/usr/bin/with-contenv bash
|
|
|
|
echo "Starting ytdl-sub..."
|
|
|
|
# copy config
|
|
[[ ! -e "$DEFAULT_WORKSPACE/config.yaml" ]] && \
|
|
mkdir -p "$DEFAULT_WORKSPACE" && \
|
|
cp /defaults/config.yaml "$DEFAULT_WORKSPACE/config.yaml"
|
|
[[ ! -e "$DEFAULT_WORKSPACE/subscriptions.yaml" ]] && \
|
|
mkdir -p "$DEFAULT_WORKSPACE" && \
|
|
cp /defaults/subscriptions.yaml "$DEFAULT_WORKSPACE/subscriptions.yaml"
|
|
[[ ! -d "$DEFAULT_WORKSPACE/examples" ]] && \
|
|
mkdir -p "$DEFAULT_WORKSPACE/examples" && \
|
|
cp -r /defaults/examples/* "$DEFAULT_WORKSPACE/examples"
|
|
|
|
[[ ! -e "/config/.bashrc" ]] && \
|
|
echo "alias ls='ls --color=auto'" > /config/.bashrc && \
|
|
echo "cd ." >> /config/.bashrc
|
|
|
|
# always create empty cron log file on start
|
|
echo "" > "$LOGS_TO_STDOUT"
|
|
|
|
# permissions
|
|
chown -R ${PUID:-abc}:${PGID:-abc} \
|
|
/config
|
|
|
|
# update command reference:
|
|
# https://github.com/yt-dlp/yt-dlp/wiki/Installation#with-pip
|
|
if [ "$UPDATE_YT_DLP_ON_START" == "stable" ] ; then
|
|
echo "UPDATE_YT_DLP_ON_START is set to stable, attempting to update to a new stable version of yt-dlp if it exists."
|
|
python3 -m pip install -U "yt-dlp[default]"
|
|
elif [ "$UPDATE_YT_DLP_ON_START" == "nightly" ] ; then
|
|
echo "UPDATE_YT_DLP_ON_START is set to nightly, attempting to update to the latest nightly version of yt-dlp."
|
|
python3 -m pip install -U --pre "yt-dlp[default]"
|
|
elif [ "$UPDATE_YT_DLP_ON_START" == "master" ] ; then
|
|
echo "UPDATE_YT_DLP_ON_START is set to master, pulling yt-dlp's latest commit for install."
|
|
python3 -m pip install -U pip hatchling wheel
|
|
python3 -m pip install --force-reinstall "yt-dlp[default] @ https://github.com/yt-dlp/yt-dlp/archive/master.tar.gz"
|
|
else
|
|
echo "UPDATE_YT_DLP_ON_START is not set, using packaged version."
|
|
fi
|
|
|
|
# set up cron
|
|
if [ "$CRON_SCHEDULE" != "" ] ; then
|
|
[[ ! -e "$CRON_SCRIPT" ]] && \
|
|
cp /defaults/cron "$CRON_SCRIPT"
|
|
|
|
# create cron script wrapper
|
|
echo '#!/bin/bash' > "$CRON_WRAPPER_SCRIPT"
|
|
# Echo commands for easier user debugging:
|
|
echo "set -x" >> "$CRON_WRAPPER_SCRIPT"
|
|
echo "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" >> "$CRON_WRAPPER_SCRIPT"
|
|
echo "cd \"$DEFAULT_WORKSPACE\"" >> "$CRON_WRAPPER_SCRIPT"
|
|
echo ". \"$CRON_SCRIPT\" >> \"$LOGS_TO_STDOUT\" 2>&1" >> "$CRON_WRAPPER_SCRIPT"
|
|
chmod +x "$CRON_WRAPPER_SCRIPT"
|
|
chown abc:abc "$CRON_WRAPPER_SCRIPT"
|
|
|
|
# Set the crontab file to the schedule, cleanly
|
|
CRON_SCHEDULE_CLEAN="${CRON_SCHEDULE//\"/}"
|
|
CRON_SCHEDULE_CLEAN="${CRON_SCHEDULE_CLEAN//\'/}"
|
|
|
|
echo "# min hour day month weekday command" > /config/crontabs/abc
|
|
echo "$CRON_SCHEDULE_CLEAN $CRON_WRAPPER_SCRIPT" >> /config/crontabs/abc
|
|
|
|
chmod +x "$CRON_SCRIPT"
|
|
chown abc:abc "$CRON_SCRIPT"
|
|
|
|
crontab -u abc /config/crontabs/abc
|
|
|
|
CRON_SUCCESS=$?
|
|
if [ $CRON_SUCCESS -eq 0 ] ; then
|
|
echo "Cron enabled with schedule $CRON_SCHEDULE_CLEAN"
|
|
|
|
if [ "$CRON_RUN_ON_START" = true ] ; then
|
|
echo "Running cron script on start in the background"
|
|
# ensure it runs as abc to respect puid/guid with delay for tail to start
|
|
su -s "/bin/bash" -c "sleep 5 && . '$CRON_WRAPPER_SCRIPT'" abc > /dev/null 2>&1 &
|
|
fi
|
|
else
|
|
echo "Error in CRON_SCHEDULE definition, disabling cron."
|
|
exit 1
|
|
fi
|
|
else
|
|
echo "CRON_SCHEDULE not specified, leaving crontabs as-is. Current configuration in /config/crontabs/abc"
|
|
cat /config/crontabs/abc
|
|
fi
|