billing frontend for mariadb. setup as otb_billing for outsidethebox.top accounting. also involved with outsidethedb
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

# 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"