mirror of
https://github.com/okxlin/appstore.git
synced 2026-09-23 00:00:59 +00:00
127 lines
4.6 KiB
Bash
Executable File
127 lines
4.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
ROOT_PATH="/nexusphp"
|
|
MYSQL_DATA_DIR="/var/lib/mysql"
|
|
REDIS_DATA_DIR="/var/lib/redis"
|
|
LOG_DIR="/tmp/nexus"
|
|
BACKUP_DIR="/tmp/nexusphp_backup"
|
|
FPM_LOG="/var/log/fpm-php.www.log"
|
|
RELEASE_VERSION="${APP_RELEASE_VERSION:-v1.10.2}"
|
|
DOMAIN_NAME="${DOMAIN:-127.0.0.1}"
|
|
BOOTSTRAP_MARKER="${ROOT_PATH}/.appstore-release"
|
|
|
|
run_service() {
|
|
echo "Running service: $1"
|
|
/etc/init.d/"$1" start
|
|
}
|
|
|
|
prepare_runtime_dirs() {
|
|
mkdir -p "$ROOT_PATH" "$MYSQL_DATA_DIR" "$REDIS_DATA_DIR" "$LOG_DIR" "$BACKUP_DIR"
|
|
touch "$FPM_LOG"
|
|
chown -R mysql:mysql "$MYSQL_DATA_DIR"
|
|
chown -R redis:redis "$REDIS_DATA_DIR"
|
|
chown -R www-data:www-data "$ROOT_PATH" "$LOG_DIR" "$BACKUP_DIR" "$FPM_LOG"
|
|
}
|
|
|
|
bootstrap_code_if_needed() {
|
|
if [[ -f "$BOOTSTRAP_MARKER" ]]; then
|
|
current_release="$(cat "$BOOTSTRAP_MARKER" 2>/dev/null || true)"
|
|
if [[ -n "$current_release" && "$current_release" != "$RELEASE_VERSION" ]]; then
|
|
echo "Refusing automatic in-place upgrade from ${current_release} to ${RELEASE_VERSION}."
|
|
echo "Back up APP_DATA_DIR and perform an explicit reviewed upgrade before changing APP_RELEASE_VERSION."
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
if [[ -f "$BOOTSTRAP_MARKER" && -d "${ROOT_PATH}/vendor" && -f "${ROOT_PATH}/artisan" ]]; then
|
|
return
|
|
fi
|
|
|
|
tmpdir="$(mktemp -d)"
|
|
trap 'rm -rf "$tmpdir"' RETURN
|
|
archive="${tmpdir}/release.tar.gz"
|
|
|
|
echo "Bootstrapping NexusPHP release ${RELEASE_VERSION} ..."
|
|
wget -qO "$archive" "https://github.com/xiaomlove/nexusphp/archive/refs/tags/${RELEASE_VERSION}.tar.gz"
|
|
tar -xf "$archive" -C "$tmpdir"
|
|
|
|
src_dir="$(find "$tmpdir" -mindepth 1 -maxdepth 1 -type d -name 'nexusphp-*' | head -n 1)"
|
|
if [[ -z "$src_dir" ]]; then
|
|
echo "Failed to locate extracted NexusPHP release directory."
|
|
exit 1
|
|
fi
|
|
|
|
find "$ROOT_PATH" -mindepth 1 -maxdepth 1 -exec rm -rf {} +
|
|
cp -a "${src_dir}/." "$ROOT_PATH/"
|
|
cp -a "${ROOT_PATH}/nexus/Install/install" "${ROOT_PATH}/public"
|
|
chown -R www-data:www-data "$ROOT_PATH"
|
|
|
|
su -s /bin/sh www-data -c "cd \"$ROOT_PATH\" && composer install --no-interaction --prefer-dist"
|
|
|
|
printf '%s\n' "$RELEASE_VERSION" > "$BOOTSTRAP_MARKER"
|
|
chown www-data:www-data "$BOOTSTRAP_MARKER"
|
|
}
|
|
|
|
ensure_nginx_config() {
|
|
cp /etc/nginx/conf.d/nexusphp.conf.example /etc/nginx/conf.d/nexusphp.conf
|
|
sed -i "s|server_name.*|server_name ${DOMAIN_NAME};|" /etc/nginx/conf.d/nexusphp.conf
|
|
}
|
|
|
|
ensure_internal_database() {
|
|
run_service mysql
|
|
mysql -e "create database if not exists nexusphp default charset=utf8mb4 collate utf8mb4_general_ci;"
|
|
mysql -e "create user if not exists 'nexusphp'@'localhost' identified by 'nexusphp';"
|
|
mysql -e "grant all privileges on nexusphp.* to 'nexusphp'@'localhost'; flush privileges;"
|
|
}
|
|
|
|
patch_env_example() {
|
|
if [[ ! -f "${ROOT_PATH}/.env.example" ]]; then
|
|
return
|
|
fi
|
|
|
|
sed -i "s|^APP_URL=.*|APP_URL=http://${DOMAIN_NAME}|" "${ROOT_PATH}/.env.example"
|
|
sed -i "s|^DB_HOST=.*|DB_HOST=127.0.0.1|" "${ROOT_PATH}/.env.example"
|
|
sed -i "s|^DB_PORT=.*|DB_PORT=3306|" "${ROOT_PATH}/.env.example"
|
|
sed -i "s|^DB_DATABASE=.*|DB_DATABASE=nexusphp|" "${ROOT_PATH}/.env.example"
|
|
sed -i "s|^DB_USERNAME=.*|DB_USERNAME=nexusphp|" "${ROOT_PATH}/.env.example"
|
|
sed -i "s|^DB_PASSWORD=.*|DB_PASSWORD=nexusphp|" "${ROOT_PATH}/.env.example"
|
|
sed -i "s|^REDIS_HOST=.*|REDIS_HOST=127.0.0.1|" "${ROOT_PATH}/.env.example"
|
|
sed -i "s|^REDIS_PORT=.*|REDIS_PORT=6379|" "${ROOT_PATH}/.env.example"
|
|
sed -i "s|^REDIS_DB=.*|REDIS_DB=0|" "${ROOT_PATH}/.env.example"
|
|
sed -i "s|^LOG_FILE=.*|LOG_FILE=/tmp/nexus/nexus.log|" "${ROOT_PATH}/.env.example"
|
|
sed -i "s|^TIMEZONE=.*|TIMEZONE=${TZ:-PRC}|" "${ROOT_PATH}/.env.example"
|
|
}
|
|
|
|
ensure_cron_jobs() {
|
|
local schedule_job="* * * * * www-data cd ${ROOT_PATH} && php artisan schedule:run >> ${LOG_DIR}/nexus_schedule.log"
|
|
local cleanup_job="* * * * * www-data cd ${ROOT_PATH} && php include/cleanup_cli.php >> ${LOG_DIR}/nexus_cleanup.log"
|
|
local prune_logs_job="0 3 * * * www-data find ${LOG_DIR} -mtime +3 |xargs rm -rf"
|
|
|
|
grep -Fqx "$schedule_job" /etc/crontab || echo "$schedule_job" >> /etc/crontab
|
|
grep -Fqx "$cleanup_job" /etc/crontab || echo "$cleanup_job" >> /etc/crontab
|
|
grep -Fqx "$prune_logs_job" /etc/crontab || echo "$prune_logs_job" >> /etc/crontab
|
|
}
|
|
|
|
start_runtime() {
|
|
ensure_cron_jobs
|
|
run_service redis-server
|
|
run_service php8.2-fpm
|
|
run_service nginx
|
|
run_service cron
|
|
|
|
supervisord -c /etc/supervisor/supervisord.conf
|
|
supervisorctl reread
|
|
supervisorctl update
|
|
supervisorctl start nexus-queue:*
|
|
}
|
|
|
|
prepare_runtime_dirs
|
|
bootstrap_code_if_needed
|
|
ensure_nginx_config
|
|
ensure_internal_database
|
|
patch_env_example
|
|
start_runtime
|
|
|
|
tail -f /etc/mysql/mysql.conf.d/mysqld.cnf
|