You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
144 lines
3.7 KiB
144 lines
3.7 KiB
# NOTE: system package dependency: zip |
|
#!/usr/bin/env bash |
|
set -euo pipefail |
|
|
|
APP_NAME="otb_billing" |
|
APP_USER_DEFAULT="${SUDO_USER:-$USER}" |
|
APP_ROOT_DEFAULT="/opt/otb_billing" |
|
ENV_DIR="/etc/otb_billing" |
|
ENV_FILE="${ENV_DIR}/otb_billing.env" |
|
SERVICE_NAME="otb-billing" |
|
SCHEMA_FILE="sql/schema_v0.0.2.sql" |
|
|
|
if [[ ! -f "$SCHEMA_FILE" ]]; then |
|
echo "ERROR: $SCHEMA_FILE not found. Run this from the repo root." |
|
exit 1 |
|
fi |
|
|
|
echo "==================================================" |
|
echo "OTB Billing installer" |
|
echo "==================================================" |
|
|
|
read -rp "Install app user [${APP_USER_DEFAULT}]: " APP_USER |
|
APP_USER="${APP_USER:-$APP_USER_DEFAULT}" |
|
|
|
read -rp "Install path [${APP_ROOT_DEFAULT}]: " APP_ROOT |
|
APP_ROOT="${APP_ROOT:-$APP_ROOT_DEFAULT}" |
|
|
|
read -rp "MariaDB database name [otb_billing]: " DB_NAME |
|
DB_NAME="${DB_NAME:-otb_billing}" |
|
|
|
read -rp "MariaDB database user [otb_billing]: " DB_USER |
|
DB_USER="${DB_USER:-otb_billing}" |
|
|
|
read -rsp "MariaDB database password: " DB_PASS |
|
echo |
|
if [[ -z "$DB_PASS" ]]; then |
|
echo "ERROR: database password cannot be blank." |
|
exit 1 |
|
fi |
|
|
|
read -rp "App listen host [0.0.0.0]: " APP_HOST |
|
APP_HOST="${APP_HOST:-0.0.0.0}" |
|
|
|
read -rp "App listen port [5050]: " APP_PORT |
|
APP_PORT="${APP_PORT:-5050}" |
|
|
|
echo |
|
echo "Installing system packages..." |
|
sudo apt-get update |
|
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y \ |
|
python3 python3-venv python3-pip mariadb-server rsync |
|
|
|
echo |
|
echo "Creating app directory..." |
|
sudo mkdir -p "$APP_ROOT" |
|
sudo rsync -a --delete \ |
|
--exclude '.git' \ |
|
--exclude '__pycache__' \ |
|
--exclude 'releases' \ |
|
--exclude '*.pyc' \ |
|
./ "$APP_ROOT"/ |
|
|
|
sudo chown -R "$APP_USER":"$APP_USER" "$APP_ROOT" |
|
|
|
echo |
|
echo "Creating Python virtualenv..." |
|
sudo -u "$APP_USER" python3 -m venv "$APP_ROOT/venv" |
|
sudo -u "$APP_USER" "$APP_ROOT/venv/bin/pip" install --upgrade pip |
|
sudo -u "$APP_USER" "$APP_ROOT/venv/bin/pip" install -r "$APP_ROOT/requirements.txt" |
|
|
|
echo |
|
echo "Ensuring MariaDB is running..." |
|
sudo systemctl enable mariadb |
|
sudo systemctl restart mariadb |
|
|
|
echo |
|
echo "Creating MariaDB database and user..." |
|
sudo mysql <<SQL |
|
CREATE DATABASE IF NOT EXISTS \`${DB_NAME}\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; |
|
CREATE USER IF NOT EXISTS '${DB_USER}'@'localhost' IDENTIFIED BY '${DB_PASS}'; |
|
ALTER USER '${DB_USER}'@'localhost' IDENTIFIED BY '${DB_PASS}'; |
|
GRANT ALL PRIVILEGES ON \`${DB_NAME}\`.* TO '${DB_USER}'@'localhost'; |
|
FLUSH PRIVILEGES; |
|
SQL |
|
|
|
echo |
|
echo "Importing schema..." |
|
sudo mysql "$DB_NAME" < "$APP_ROOT/$SCHEMA_FILE" |
|
|
|
echo |
|
echo "Writing environment file..." |
|
sudo mkdir -p "$ENV_DIR" |
|
sudo tee "$ENV_FILE" >/dev/null <<ENVEOF |
|
OTB_BILLING_DB_HOST=127.0.0.1 |
|
OTB_BILLING_DB_PORT=3306 |
|
OTB_BILLING_DB_NAME=${DB_NAME} |
|
OTB_BILLING_DB_USER=${DB_USER} |
|
OTB_BILLING_DB_PASSWORD=${DB_PASS} |
|
FLASK_ENV=production |
|
HOST=${APP_HOST} |
|
PORT=${APP_PORT} |
|
ENVEOF |
|
sudo chmod 600 "$ENV_FILE" |
|
|
|
echo |
|
echo "Creating systemd service..." |
|
sudo tee "/etc/systemd/system/${SERVICE_NAME}.service" >/dev/null <<SERVICEEOF |
|
[Unit] |
|
Description=OTB Billing Flask App |
|
After=network.target mariadb.service |
|
Requires=mariadb.service |
|
|
|
[Service] |
|
Type=simple |
|
User=${APP_USER} |
|
WorkingDirectory=${APP_ROOT} |
|
EnvironmentFile=${ENV_FILE} |
|
ExecStart=${APP_ROOT}/venv/bin/python ${APP_ROOT}/backend/app.py |
|
Restart=always |
|
RestartSec=3 |
|
|
|
[Install] |
|
WantedBy=multi-user.target |
|
SERVICEEOF |
|
|
|
echo |
|
echo "Enabling service..." |
|
sudo systemctl daemon-reload |
|
sudo systemctl enable "${SERVICE_NAME}" |
|
sudo systemctl restart "${SERVICE_NAME}" |
|
|
|
echo |
|
echo "Verifying service..." |
|
sudo systemctl --no-pager --full status "${SERVICE_NAME}" || true |
|
|
|
echo |
|
echo "Installer complete." |
|
echo "App path: ${APP_ROOT}" |
|
echo "Service: ${SERVICE_NAME}" |
|
echo "URL: http://${APP_HOST}:${APP_PORT}" |
|
echo |
|
echo "Useful commands:" |
|
echo " sudo systemctl status ${SERVICE_NAME}" |
|
echo " sudo journalctl -u ${SERVICE_NAME} -f"
|
|
|