Files
db-backup/scripts/setup-cloudflare-r2.sh
Lucilio Correia 5a8c4c1b1a
Some checks failed
Caprover: Build & Deploy (backup-databases) / build (push) Failing after 7s
add: allow informing user and group id or name
2024-11-24 21:21:53 -03:00

116 lines
3.2 KiB
Bash
Executable File

#! /bin/sh
#
# Connect to a Cloudflare's R2 storage using mochoa/s3fs
#
# Run this script on the Docker HOST to bind buckets using "cloudflare-r2"
# -- Or any alias you give with "--alias" option -- driver name.
# Please refer to https://hub.docker.com/r/mochoa/s3fs-volume-plugin.
# You may bind to different buckets using different aliases.
#
# parse args
while test $# -ne 0; do
if test -n "$(echo $1 | grep "=")"; then
key=${1%=*};
value=${1#*=};
else
key=$1;
value=$2
shift
fi
if test "${key}" = "-k" || test "${key}" = "--key"; then
ACCESS_KEY="${value}";
elif test "${key}" = "-s" || test "${key}" = "--secret"; then
ACCESS_SECRET="${value}";
elif test "${key}" = "-l" || test "${key}" = "--location"; then
ACCOUNT_ID="${value}";
elif test "${key}" = "-i" || test "${key}" = "--account-id"; then
ACCOUNT_ID="${value}";
elif test "${key}" = "-a" || test "${key}" = "--alias"; then
PLUGIN_ALIAS="${value}";
elif test "${key}" = "-u" || test "${key}" = "--user"; then
passwdEntry=$(getent passwd ${value} || echo ":NOT_FOUND:");
if test "${passwdEntry}" = ":NOT_FOUND:"; then
USER_ID="$(id -u)";
else
USER_ID=$(echo $passwdEntry | cut -d ':' -f 3);
fi
elif test "${key}" = "-g" || test "${key}" = "--group"; then
groupEntry=$(getent group ${value} || echo ":NOT_FOUND:");
if test "${groupEntry}" = ":NOT_FOUND:"; then
GROUP_ID="$(id -g)";
else
GROUP_ID=$(echo $groupEntry | cut -d ':' -f 3);
fi
else
echo "Invalid \"${key}\" option";
exit 1;
fi
shift
done;
if test -z "${PLUGIN_ALIAS}"; then
PLUGIN_ALIAS='r2storage';
fi
if test -z "${ACCOUNT_ID}" || test -z "${ACCOUNT_ID}"; then
echo "You must provide the \"--account-id\" of the R2 bucket";
exit 1;
fi
if test -z "${ACCESS_KEY}" || test -z "${ACCESS_SECRET}"; then
echo "You must provide both \"--key\" and \"--secret\" options";
exit 1;
fi
# test plugin
PLUGIN_ALIAS="${PLUGIN_ALIAS}";
PLUGIN_STATUS="$(docker plugin list \
| grep "${PLUGIN_ALIAS}" \
| rev \
| cut -d " " -f 1 \
| rev \
)";
# install s3fs-volume-plugin if not installed and disable it
if test -z "${PLUGIN_STATUS}"; then
docker plugin install \
mochoa/s3fs-volume-plugin \
--alias "${PLUGIN_ALIAS}" \
--grant-all-permissions \
--disable;
fi
# disable plugin to allow update settings
docker volume ls | while read volume_info; do
volume_driver="$(echo "${volume_info}" | xargs | cut -d " " -f 1)"
volume_name="$(echo "${volume_info}" | xargs | cut -d " " -f 2)"
if test -n "$(echo $volume_driver | grep "${PLUGIN_ALIAS}")"; then
docker volume rm "${volume_name}" > /dev/null;
fi
done
if test "${PLUGIN_STATUS}" = "true"; then
docker plugin disable "${PLUGIN_ALIAS}" \
> /dev/null \
|| exit 1;
fi
# set service
SERVICE_DOMAIN="${SERVICE_DOMAIN:-r2.cloudflarestorage.com}";
URL="https://${ACCOUNT_ID}.${SERVICE_DOMAIN}";
DEFAULT_S3FSOPTS="url=${URL}/";
# set credentials
docker plugin set \
"${PLUGIN_ALIAS}" AWSACCESSKEYID="${ACCESS_KEY}";
docker plugin set \
"${PLUGIN_ALIAS}" AWSSECRETACCESSKEY="${ACCESS_SECRET}";
# set permissions
DEFAULT_S3FSOPTS="uid=33,gid=33,allow_other,${DEFAULT_S3FSOPTS}";
docker plugin set "${PLUGIN_ALIAS}" DEFAULT_S3FSOPTS="${DEFAULT_S3FSOPTS}";
# enable plugin
docker plugin enable "${PLUGIN_ALIAS}";