SHA256
84 lines
3.2 KiB
Bash
Executable File
84 lines
3.2 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
ROOT_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
|
|
REMOTE_HOST="${REMOTE_HOST:?REMOTE_HOST is required, example: player@shineup.me}"
|
|
TARGET_DOMAIN="${TARGET_DOMAIN:?TARGET_DOMAIN is required, example: shineup.me}"
|
|
REMOTE_SERVER_DIR="${REMOTE_SERVER_DIR:?REMOTE_SERVER_DIR is required}"
|
|
REMOTE_LOGS_DIR="${REMOTE_LOGS_DIR:-$REMOTE_SERVER_DIR/logs}"
|
|
REMOTE_DATA_DIR="${REMOTE_DATA_DIR:-$REMOTE_SERVER_DIR/data}"
|
|
REMOTE_DM_FILES_DIR="${REMOTE_DM_FILES_DIR:-}"
|
|
REMOTE_SERVICE_NAME="${REMOTE_SERVICE_NAME:?REMOTE_SERVICE_NAME is required}"
|
|
SERVER_PORT="${SERVER_PORT:?SERVER_PORT is required}"
|
|
LOCAL_JAR="${LOCAL_JAR:-$ROOT_DIR/SHiNE-server/build/libs/shine-server.jar}"
|
|
BUILD_JAR="${BUILD_JAR:-1}"
|
|
REQUIRE_BACKUP="${REQUIRE_BACKUP:-0}"
|
|
BACKUP_DIR="${BACKUP_DIR:-$ROOT_DIR/deploy/backup/archive}"
|
|
|
|
if [[ "$REQUIRE_BACKUP" == "1" ]]; then
|
|
if ! find "$BACKUP_DIR" -mindepth 2 -maxdepth 2 -name MANIFEST.txt -print -quit 2>/dev/null | grep -q .; then
|
|
echo "ERROR: для production deploy сначала положите свежий бэкап в $BACKUP_DIR/<date>/MANIFEST.txt" >&2
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
if [[ "$BUILD_JAR" == "1" ]]; then
|
|
echo "==> Building server jar"
|
|
(cd "$ROOT_DIR" && ./gradlew shadowJar)
|
|
fi
|
|
|
|
if [[ ! -f "$LOCAL_JAR" ]]; then
|
|
echo "ERROR: локальный jar не найден: $LOCAL_JAR" >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo "==> Deploy server to $TARGET_DOMAIN ($REMOTE_HOST)"
|
|
ssh -o BatchMode=yes -o ConnectTimeout=20 "$REMOTE_HOST" "echo SSH OK" >/dev/null
|
|
ssh "$REMOTE_HOST" "sudo -n true"
|
|
ssh "$REMOTE_HOST" "java -version >/dev/null 2>&1"
|
|
|
|
TMP_DIR="$(mktemp -d)"
|
|
cleanup() {
|
|
rm -rf "$TMP_DIR"
|
|
}
|
|
trap cleanup EXIT
|
|
|
|
cat >"$TMP_DIR/$REMOTE_SERVICE_NAME.service" <<EOF
|
|
[Unit]
|
|
Description=SHiNE Server ($TARGET_DOMAIN)
|
|
After=network.target
|
|
|
|
[Service]
|
|
Type=simple
|
|
User=player
|
|
Group=player
|
|
WorkingDirectory=$REMOTE_SERVER_DIR
|
|
ExecStart=/usr/bin/java -Dserver.port=$SERVER_PORT${REMOTE_DM_FILES_DIR:+ -Ddm.files.storageDir=$REMOTE_DM_FILES_DIR} -jar $REMOTE_SERVER_DIR/shine-server.jar
|
|
Restart=always
|
|
RestartSec=3
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
EOF
|
|
|
|
if [[ -n "$REMOTE_DM_FILES_DIR" ]]; then
|
|
ssh "$REMOTE_HOST" "mkdir -p '$REMOTE_SERVER_DIR' '$REMOTE_DATA_DIR' '$REMOTE_LOGS_DIR' '$REMOTE_DM_FILES_DIR'"
|
|
else
|
|
ssh "$REMOTE_HOST" "mkdir -p '$REMOTE_SERVER_DIR' '$REMOTE_DATA_DIR' '$REMOTE_LOGS_DIR'"
|
|
fi
|
|
rsync -az --timeout=120 "$LOCAL_JAR" "$REMOTE_HOST:$REMOTE_SERVER_DIR/shine-server.jar"
|
|
rsync -az "$TMP_DIR/$REMOTE_SERVICE_NAME.service" "$REMOTE_HOST:/tmp/$REMOTE_SERVICE_NAME.service"
|
|
|
|
ssh "$REMOTE_HOST" "set -euo pipefail; \
|
|
sudo mv -f '/tmp/$REMOTE_SERVICE_NAME.service' '/etc/systemd/system/$REMOTE_SERVICE_NAME.service'; \
|
|
sudo chown root:root '/etc/systemd/system/$REMOTE_SERVICE_NAME.service'; \
|
|
sudo chown -R player:player '$REMOTE_SERVER_DIR'; \
|
|
sudo systemctl daemon-reload; \
|
|
sudo systemctl enable '$REMOTE_SERVICE_NAME'; \
|
|
sudo systemctl restart '$REMOTE_SERVICE_NAME'; \
|
|
sudo systemctl --no-pager --full status '$REMOTE_SERVICE_NAME' >/dev/null"
|
|
|
|
echo "Всё хорошо: сервер $TARGET_DOMAIN обновлён и сервис $REMOTE_SERVICE_NAME перезапущен"
|