#!/usr/bin/env bash # One-shot initializer for Seahub (collectstatic, migrate, optional admin creation) # Run under supervisord before starting gunicorn set -Eeuo pipefail SEAFILE_HOME=${SEAFILE_HOME:-/opt/seafile} SEAF_RELEASE_DIR_DEFAULT="${SEAFILE_HOME}/seafile-server-latest" SEAF_RELEASE_DIR="${SEAF_RELEASE_DIR:-$SEAF_RELEASE_DIR_DEFAULT}" SEAFILE_CONF_DIR=${SEAFILE_CONF_DIR:-/data/conf} SEAFILE_DATA_DIR=${SEAFILE_DATA_DIR:-/data/seafile-data} ADMIN_EMAIL=${ADMIN_EMAIL:-} ADMIN_PASSWORD=${ADMIN_PASSWORD:-} MYSQLADMIN_BIN=${MYSQLADMIN_BIN:-/usr/bin/mysqladmin} MYSQL_SOCKET=${MYSQL_SOCKET:-/run/mysqld/mysqld.sock} log() { echo "[seahub-init $(date +'%Y-%m-%dT%H:%M:%S%z')] $*" } wait_for_mariadb() { local timeout="${1:-120}" local i=0 log "Waiting for MariaDB to become ready..." while ! "${MYSQLADMIN_BIN}" ping --silent --protocol=socket --socket="${MYSQL_SOCKET}" >/dev/null 2>&1; do sleep 1 i=$((i+1)) if [[ $i -ge $timeout ]]; then log "MariaDB did not become ready in ${timeout}s" return 1 fi done log "MariaDB is ready." } main() { # Avoid re-running if we've already initialized (basic sentinel) local sentinel="${SEAFILE_CONF_DIR}/.seahub_initialized" if [[ -f "${sentinel}" ]]; then log "Seahub already initialized, nothing to do." return 0 fi wait_for_mariadb || true local venv="${SEAFILE_HOME}/venv" local seahub_dir="${SEAF_RELEASE_DIR}/seahub" if [[ ! -x "${venv}/bin/python" ]]; then log "Python venv missing at ${venv}; skipping init." return 0 fi if [[ ! -d "${seahub_dir}" ]]; then log "Seahub directory missing at ${seahub_dir}; skipping init." return 0 fi pushd "${seahub_dir}" >/dev/null export PYTHONPATH="${SEAF_RELEASE_DIR}:${PYTHONPATH:-}" export DJANGO_SETTINGS_MODULE="seahub.settings" export CCNET_CONF_DIR="${SEAFILE_CONF_DIR}" export SEAFILE_CENTRAL_CONF_DIR="${SEAFILE_CONF_DIR}" export SEAFILE_CONF_DIR="${SEAFILE_CONF_DIR}" export SEAFILE_DATA_DIR="${SEAFILE_DATA_DIR}" log "Running collectstatic --noinput" if ! "${venv}/bin/python" manage.py collectstatic --noinput; then log "collectstatic failed (continuing)" fi log "Running migrate --noinput" if ! "${venv}/bin/python" manage.py migrate --noinput; then log "migrate failed (continuing)" fi if [[ -n "${ADMIN_EMAIL}" && -n "${ADMIN_PASSWORD}" ]]; then log "Ensuring admin user ${ADMIN_EMAIL}" "${venv}/bin/python" manage.py shell </dev/null touch "${sentinel}" log "Seahub initialization complete." } main "$@"