fi
if [ -e /etc/redhat-release ]; then
- # Recognize any service that starts with "nginx"; e.g., nginx16.
- if [ "$WEB_SERVICE" != "${WEB_SERVICE#nginx}" ]; then
- WWW_OWNER=nginx
- else
- WWW_OWNER=apache
- fi
+ case "$WEB_SERVICE" in
+ "") ;;
+ nginx*) WWW_OWNER=nginx ;;
+ *) WWW_OWNER=apache ;;
+ esac
else
# Assume we're on a Debian-based system for now.
# Both Apache and Nginx run as www-data by default.
WWW_OWNER=www-data
fi
- echo
- echo "Assumption: $WEB_SERVICE is configured to serve Rails from"
- echo " $RELEASE_PATH"
- echo "Assumption: $WEB_SERVICE and passenger run as $WWW_OWNER"
- echo
-
- echo -n "Creating symlinks to configuration in $CONFIG_PATH ..."
- setup_confdirs /etc/arvados "$CONFIG_PATH"
- setup_conffile environments/production.rb environments/production.rb.example \
- || true
- setup_extra_conffiles
- echo "... done."
-
# Before we do anything else, make sure some directories and files are in place
if [ ! -e $SHARED_PATH/log ]; then mkdir -p $SHARED_PATH/log; fi
if [ ! -e $RELEASE_PATH/tmp ]; then mkdir -p $RELEASE_PATH/tmp; fi
cd "$RELEASE_PATH"
export RAILS_ENV=production
- # We install Bundler itself in the same place where Bundler will install
- # bundled gems, for a few reasons:
- # 1. Bundler will probably want to do this anyway to run itself with the
- # specific version named in Gemfile.lock.
- # 2. This is nicer to the sysadmin since we avoid messing with global state.
- # 3. We can know exactly where the `bundle` command got installed.
- local bundle_path="$SHARED_PATH/vendor_bundle"
- export GEM_HOME="$bundle_path/ruby/$(ruby -e 'puts RUBY_VERSION')"
- export GEM_PATH="$GEM_HOME"
run_and_report "Installing bundler" gem install --conservative --version '~> 2.4.0' bundler
- local bundle="$GEM_HOME/bin/bundle"
+ local ruby_minor_ver="$(ruby -e 'puts RUBY_VERSION.split(".")[..1].join(".")')"
+ local bundle="$(gem contents --version '~> 2.4.0' bundler | grep -E '/(bin|exe)/bundle$' | tail -n1)"
+ if ! [ -x "$bundle" ]; then
+ # Some distros (at least Ubuntu 24.04) append the Ruby version to the
+ # executable name, but that isn't reflected in the output of
+ # `gem contents`. Check for that version.
+ bundle="$bundle$ruby_minor_ver"
+ if ! [ -x "$bundle" ]; then
+ echo "Error: failed to find \`bundle\` command after installing bundler gem" >&2
+ return 1
+ fi
+ fi
+ local bundle_path="$SHARED_PATH/vendor_bundle"
run_and_report "Running bundle config set --local path $SHARED_PATH/vendor_bundle" \
"$bundle" config set --local path "$bundle_path"
# fail later. Work around this by installing all gems manually.
find vendor/cache -maxdepth 1 -name '*.gem' -print0 \
| run_and_report "Installing bundle gems" xargs -0r \
- gem install --conservative --ignore-dependencies --local --quiet
- # The earlier `bundle config` should have it looking for installed gems in
- # the right place. Unset GEM_* now to be sure.
- unset GEM_HOME GEM_PATH
+ gem install --conservative --ignore-dependencies --local --quiet \
+ --install-dir="$bundle_path/ruby/$ruby_minor_ver.0"
run_and_report "Running bundle install" "$bundle" install --prefer-local --quiet
run_and_report "Verifying bundle is complete" "$bundle" exec true
- echo -n "Ensuring directory and file permissions ..."
- # Ensure correct ownership of a few files
- chown "$WWW_OWNER:" $RELEASE_PATH/config/environment.rb
- chown "$WWW_OWNER:" $RELEASE_PATH/config.ru
- chown "$WWW_OWNER:" $RELEASE_PATH/Gemfile.lock
- chown -R "$WWW_OWNER:" $RELEASE_PATH/tmp || true
- chown -R "$WWW_OWNER:" $SHARED_PATH/log
- # Make sure postgres doesn't try to use a pager.
- export PAGER=
- case "$RAILSPKG_DATABASE_LOAD_TASK" in
- # db:structure:load was deprecated in Rails 6.1 and shouldn't be used.
- db:schema:load | db:structure:load)
- chown "$WWW_OWNER:" $RELEASE_PATH/db/schema.rb || true
- chown "$WWW_OWNER:" $RELEASE_PATH/db/structure.sql || true
- ;;
- esac
- chmod 644 $SHARED_PATH/log/*
- chmod -R 2775 $RELEASE_PATH/tmp || true
- echo "... done."
+ if [ -n "$WWW_OWNER" ]; then
+ cat <<EOF
+
+Assumption: $WEB_SERVICE is configured to serve Rails from
+ $RELEASE_PATH
+Assumption: $WEB_SERVICE and passenger run as $WWW_OWNER
+
+EOF
+
+ echo -n "Creating symlinks to configuration in $CONFIG_PATH ..."
+ setup_confdirs /etc/arvados "$CONFIG_PATH"
+ setup_conffile environments/production.rb environments/production.rb.example \
+ || true
+ setup_extra_conffiles
+ echo "... done."
+
+ echo -n "Ensuring directory and file permissions ..."
+ # Ensure correct ownership of a few files
+ chown "$WWW_OWNER:" $RELEASE_PATH/config/environment.rb
+ chown "$WWW_OWNER:" $RELEASE_PATH/config.ru
+ chown "$WWW_OWNER:" $RELEASE_PATH/Gemfile.lock
+ chown -R "$WWW_OWNER:" $SHARED_PATH/log
+ # Make sure postgres doesn't try to use a pager.
+ export PAGER=
+ case "$RAILSPKG_DATABASE_LOAD_TASK" in
+ # db:structure:load was deprecated in Rails 6.1 and shouldn't be used.
+ db:schema:load | db:structure:load)
+ chown "$WWW_OWNER:" $RELEASE_PATH/db/schema.rb || true
+ chown "$WWW_OWNER:" $RELEASE_PATH/db/structure.sql || true
+ ;;
+ esac
+ chmod 644 $SHARED_PATH/log/*
+ echo "... done."
+ fi
if [ -n "$RAILSPKG_DATABASE_LOAD_TASK" ]; then
prepare_database
APPLICATION_READY=0
fi
- chown -R "$WWW_OWNER:" $RELEASE_PATH/tmp
-
- setup_before_nginx_restart
+ if [ -n "$WWW_OWNER" ]; then
+ chown -R "$WWW_OWNER:" $RELEASE_PATH/tmp
+ chmod -R 2775 $RELEASE_PATH/tmp
+ fi
if [ -n "$SERVICE_MANAGER" ]; then
service_command "$SERVICE_MANAGER" restart "$WEB_SERVICE"