first commit
This commit is contained in:
84
scripts/install.sh
Executable file
84
scripts/install.sh
Executable file
@ -0,0 +1,84 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
SOURCE_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
||||
|
||||
SERVICE_NAME="${SERVICE_NAME:-skd}"
|
||||
SERVICE_USER="${SERVICE_USER:-skd}"
|
||||
SERVICE_GROUP="${SERVICE_GROUP:-$SERVICE_USER}"
|
||||
INSTALL_DIR="${INSTALL_DIR:-/opt/sk}"
|
||||
ENV_DIR="/etc/${SERVICE_NAME}"
|
||||
ENV_FILE="${ENV_DIR}/env"
|
||||
SYSTEMD_PATH="/etc/systemd/system/${SERVICE_NAME}.service"
|
||||
|
||||
log() {
|
||||
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"
|
||||
}
|
||||
|
||||
require_cmd() {
|
||||
if ! command -v "$1" >/dev/null 2>&1; then
|
||||
echo "Required command not found: $1" >&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
log "Ensuring service user/group (${SERVICE_USER}) exist..."
|
||||
if ! getent group "${SERVICE_GROUP}" >/dev/null 2>&1; then
|
||||
sudo groupadd -r "${SERVICE_GROUP}"
|
||||
fi
|
||||
if ! id -u "${SERVICE_USER}" >/dev/null 2>&1; then
|
||||
sudo useradd -r -s /usr/sbin/nologin -d "${INSTALL_DIR}" -g "${SERVICE_GROUP}" "${SERVICE_USER}"
|
||||
log "Created system user ${SERVICE_USER}"
|
||||
fi
|
||||
|
||||
require_cmd rsync
|
||||
|
||||
log "Syncing project to ${INSTALL_DIR}..."
|
||||
sudo mkdir -p "${INSTALL_DIR}"
|
||||
sudo rsync -a --delete --exclude '.venv' "${SOURCE_DIR}/" "${INSTALL_DIR}/"
|
||||
sudo chown -R "${SERVICE_USER}:${SERVICE_GROUP}" "${INSTALL_DIR}"
|
||||
|
||||
log "Creating/refreshing virtualenv in ${INSTALL_DIR}..."
|
||||
sudo -u "${SERVICE_USER}" PROJECT_ROOT="${INSTALL_DIR}" "${SOURCE_DIR}/scripts/create_venv.sh"
|
||||
|
||||
log "Preparing environment file..."
|
||||
sudo mkdir -p "${ENV_DIR}"
|
||||
if [[ ! -f "${ENV_FILE}" ]]; then
|
||||
if [[ -f "${SOURCE_DIR}/env.example" ]]; then
|
||||
sudo cp "${SOURCE_DIR}/env.example" "${ENV_FILE}"
|
||||
log "Copied env.example to ${ENV_FILE}; edit SKD_AUTH_TOKEN and SKD_ALLOWED_USERS."
|
||||
else
|
||||
sudo touch "${ENV_FILE}"
|
||||
log "Created empty ${ENV_FILE}; populate required variables."
|
||||
fi
|
||||
sudo chmod 640 "${ENV_FILE}"
|
||||
sudo chown root:"${SERVICE_GROUP}" "${ENV_FILE}"
|
||||
fi
|
||||
|
||||
log "Writing systemd unit to ${SYSTEMD_PATH}..."
|
||||
sudo tee "${SYSTEMD_PATH}" >/dev/null <<EOF
|
||||
[Unit]
|
||||
Description=Safe Kiddo Daemon
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=${SERVICE_USER}
|
||||
Group=${SERVICE_GROUP}
|
||||
WorkingDirectory=${INSTALL_DIR}
|
||||
EnvironmentFile=${ENV_FILE}
|
||||
ExecStart=${INSTALL_DIR}/.venv/bin/uvicorn backend.app:app --host 0.0.0.0 --port 8000
|
||||
Restart=on-failure
|
||||
RestartSec=3
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
|
||||
log "Enabling and starting service..."
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl enable "${SERVICE_NAME}.service"
|
||||
sudo systemctl restart "${SERVICE_NAME}.service"
|
||||
|
||||
log "Installation finished. Check status: sudo systemctl status ${SERVICE_NAME}.service"
|
||||
Reference in New Issue
Block a user