diff --git a/README.md b/README.md index 999ea4a8e13dc54e10afce3c3cd3f108f56c3935..6c16c9b84ddecb1fa3c86e7054aa82859fd06c00 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ This repo is here to help installing Funkwhale using Docker. It follows the [multi-container installation documentation][docs-multi-container]. +## Usage + To set up your instance, clone this repo and enter the directory, then run the script `./setup.sh`. @@ -13,4 +15,9 @@ pass them to it directly. See the help with this command: ./setup --help ``` +## Developer + +Prerequisites: +* docker-compose + [docs-multi-container]: https://docs.funkwhale.audio/installation/docker.html#docker-multi-container diff --git a/setup.sh b/setup.sh index 05122ff9abf85bf28f1aa6060a4a97bd737f19db..b78efa2219a24dc20703c1acf16ac9a44a1a2eeb 100755 --- a/setup.sh +++ b/setup.sh @@ -6,7 +6,11 @@ funkwhale_version_default=1.2.2 funkwhale_version="${FUNKWHALE_VERSION-$funkwhale_version_default}" funkwhale_hostname="" funkwhale_protocol="https" +funkwhale_username="" +funkwhale_userpasswd="" +funkwhale_useremail="" +# Show an error message and exit. # Params: # 1. message function die @@ -15,11 +19,12 @@ function die exit 1 } +# Get the value out of a "key=value" argument. # Params: -# 1. option, in the format "key=value" +# 1. the option (in the format "key=value") function get_not_empty_arg { - value=${1#*=} + local value=${1#*=} if [ -z $value ]; then die "ERROR: \"${1%%=*}\" requires a non-empty option argument." fi @@ -27,15 +32,20 @@ function get_not_empty_arg echo $value } +# Show the help text. +# No param. function show_help { - bin_name=$(basename $0) + local bin_name=$(basename $0) cat << HELP Usage: $bin_name [OPTION]... - -h, --host=HOST set the hostname (e.g. your.domain.io) + -e, --email=EMAIL set the superuser e-mail --help display this help text and exit - --protocol=PROTOCOL set the protocol (default: https) + -h, --host=HOST set the hostname (e.g. your.domain.io) + -p, --password=PASSWORD set the superuser password + --protocol=PROTOCOL set the protocol (default: $funkwhale_protocol) + -u, --user=USER set the superuser name It is possible to define a specific Funkwhale version by setting the FUNKWHALE_VERSION environment variable before running the script (by @@ -60,13 +70,81 @@ Examples: HELP } +# Run an interactive shell to prompt for a value. +# Params: +# 1. the prompt text +# 2. the variable name +function prompt_value +{ + local input="" + while [ -z "$input" ]; do + read -ep "$1: " input + if [ -z "$input" ]; then + echo "Text can't be empty." + fi + done + + eval $2="$input" +} + +# Run an interactive shell to prompt for a password. +# Params: +# 1. the prompt text +# 2. the variable name +function prompt_password +{ + local passwd="" + local passwd_verif="invalid" + while [ "$passwd" != "$passwd_verif" ]; do + while [ -z "$passwd" ]; do + read -sep "$1: " passwd + + # Newline to replace the one eaten by read. + echo + + if [ -z "$passwd" ]; then + echo "Password can't be empty." + fi + done + + read -sep "$1 (again): " passwd_verif + + # Newline to replace the one eaten by read. + echo + + if [ "$passwd" != "$passwd_verif" ]; then + echo "Passwords don't match." + passwd="" + passwd_verif="invalid" + fi + done + + eval $2="$passwd" +} + # Parse the script options while true; do case $1 in + # Superuser e-mail + -e|--email) + if [ -n "$2" ]; then + funkwhale_useremail=$2 + shift + else + die "ERROR: \"$1\" requires a non-empty option argument." + fi + ;; + --email=*) + funkwhale_useremail=$(get_not_empty_arg $1) + ;; + + # Help --help) show_help exit ;; + + # Hostname -h|--host) if [ -n "$2" ]; then funkwhale_hostname=$2 @@ -78,6 +156,21 @@ while true; do --host=*) funkwhale_hostname=$(get_not_empty_arg $1) ;; + + # Superuser password + -p|--password) + if [ -n "$2" ]; then + funkwhale_userpasswd=$2 + shift + else + die "ERROR: \"$1\" requires a non-empty option argument." + fi + ;; + --password=*) + funkwhale_userpasswd=$(get_not_empty_arg $1) + ;; + + # Protocol --protocol) if [ -n "$2" ]; then funkwhale_protocol=$2 @@ -89,6 +182,20 @@ while true; do --protocol=*) funkwhale_protocol=$(get_not_empty_arg $1) ;; + + # Superuser name + -u|--user) + if [ -n "$2" ]; then + funkwhale_username=$2 + shift + else + die "ERROR: \"$1\" requires a non-empty option argument." + fi + ;; + --user=*) + funkwhale_username=$(get_not_empty_arg $1) + ;; + -?*) echo "ERROR: Unknown option: $1" >&2 show_help @@ -102,12 +209,24 @@ while true; do done # Ensure the hostname is defined -while [ -z $funkwhale_hostname ]; do - read -ep "Please enter your Funkwhale hostname: " funkwhale_hostname - if [ -z $funkwhale_hostname ]; then - echo "Hostname can't be null." - fi -done +if [ -z $funkwhale_hostname ]; then + prompt_value "Please enter the Funkwhale hostname" funkwhale_hostname +fi + +# Ensure the superuser name is defined +if [ -z $funkwhale_username ]; then + prompt_value "Please enter the superuser name" funkwhale_username +fi + +# Ensure the superuser password is defined +if [ -z $funkwhale_userpasswd ]; then + prompt_password "Please enter the superuser password" funkwhale_userpasswd +fi + +# Ensure the superuser password is defined +if [ -z $funkwhale_useremail ]; then + prompt_value "Please enter the superuser e-mail" funkwhale_useremail +fi # Fetch the template files echo -n "Fetching the template files... " @@ -122,6 +241,7 @@ popd > /dev/null echo "done" # Copy the template files to the "funkwhale" directory +echo echo "Copy files to the \"funkwhale\" directory" mkdir -p "funkwhale/nginx" cd "funkwhale" @@ -151,12 +271,17 @@ echo echo "Pull the Docker images" docker-compose pull +echo echo "Run initial DB migrations" docker-compose up -d postgres docker-compose run --rm api python manage.py migrate echo "Create super user" -docker-compose run --rm api python manage.py createsuperuser +docker-compose run --rm \ + -e DJANGO_SUPERUSER_USERNAME="$funkwhale_username" \ + -e DJANGO_SUPERUSER_PASSWORD="$funkwhale_userpasswd" \ + -e DJANGO_SUPERUSER_EMAIL="$funkwhale_useremail" \ + api python manage.py createsuperuser --no-input echo echo "Run the Funkwhale instance"