SHA256
Навести порядок в deploy и документации проекта
This commit is contained in:
Executable
+81
@@ -0,0 +1,81 @@
|
||||
#!/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_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 -jar $REMOTE_SERVER_DIR/shine-server.jar
|
||||
Restart=always
|
||||
RestartSec=3
|
||||
StandardOutput=append:$REMOTE_LOGS_DIR/app.log
|
||||
StandardError=append:$REMOTE_LOGS_DIR/app.log
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
|
||||
ssh "$REMOTE_HOST" "mkdir -p '$REMOTE_SERVER_DIR' '$REMOTE_DATA_DIR' '$REMOTE_LOGS_DIR'"
|
||||
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'; \
|
||||
touch '$REMOTE_LOGS_DIR/app.log'; \
|
||||
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 перезапущен"
|
||||
Reference in New Issue
Block a user