#!/usr/bin/env bash set -euo pipefail IFS=$'\n\t' # Hesabix one-click deployment script (server-side) # - Clones from: https://source.hesabix.ir/morrning/hesabixArc.git # - Prompts for API/UI domains and branch # - Installs prerequisites, DB, backend (FastAPI), frontend (Flutter Web), Nginx # # Usage: # sudo bash deploy.sh # # or # API_DOMAIN=api.example.com UI_DOMAIN=app.example.com BRANCH=main sudo -E bash deploy.sh # # Notes: # - Designed for Ubuntu 22.04+/Debian 12+ # - Idempotent-ish: safe to re-run; will update and restart services REPO_URL="https://source.hesabix.ir/morrning/hesabixArc.git" APP_ROOT="/opt/hesabix" CHECK_MARK=$'\xE2\x9C\x94' CROSS_MARK=$'\xE2\x9D\x8C' require_cmd() { if ! command -v "$1" >/dev/null 2>&1; then echo "$CROSS_MARK ابزار لازم یافت نشد: $1" exit 1 fi } prompt_vars() { : "${API_DOMAIN:=}" : "${UI_DOMAIN:=}" : "${BRANCH:=main}" if [[ -z "${API_DOMAIN}" ]]; then read -rp "دامنه API (مثال: api.example.com): " API_DOMAIN fi if [[ -z "${UI_DOMAIN}" ]]; then read -rp "دامنه Front (مثال: app.example.com): " UI_DOMAIN fi if [[ -z "${BRANCH}" ]]; then read -rp "نام برنچ (پیش‌فرض main): " BRANCH BRANCH=${BRANCH:-main} fi export API_DOMAIN UI_DOMAIN BRANCH echo "$CHECK_MARK متغیرها:" echo " API_DOMAIN=${API_DOMAIN}" echo " UI_DOMAIN=${UI_DOMAIN}" echo " BRANCH=${BRANCH}" } install_prereqs() { echo ">> نصب پیش‌نیازها..." export DEBIAN_FRONTEND=noninteractive apt-get update -y apt-get install -y git curl unzip xz-utils ca-certificates \ python3.11 python3.11-venv python3-pip build-essential \ nginx mariadb-server echo "$CHECK_MARK پیش‌نیازها نصب شد." } clone_repo() { echo ">> کلون/به‌روزرسانی مخزن..." mkdir -p "${APP_ROOT}" cd "${APP_ROOT}" if [[ ! -d "${APP_ROOT}/app/.git" ]]; then git clone -b "${BRANCH}" --depth=1 "${REPO_URL}" app else cd app git fetch --all --prune git checkout "${BRANCH}" git pull --ff-only fi echo "$CHECK_MARK مخزن آماده است در ${APP_ROOT}/app" } setup_db() { echo ">> پیکربندی دیتابیس (MariaDB/MySQL)..." systemctl enable --now mariadb || systemctl enable --now mysql || true mysql --protocol=socket -uroot <<'SQL' CREATE DATABASE IF NOT EXISTS hesabix CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE USER IF NOT EXISTS 'hesabix'@'localhost' IDENTIFIED BY 'StrongPass#ChangeMe'; GRANT ALL PRIVILEGES ON hesabix.* TO 'hesabix'@'localhost'; FLUSH PRIVILEGES; SQL echo "$CHECK_MARK دیتابیس و کاربر آماده شد." } deploy_backend() { echo ">> استقرار بک‌اند..." local api_dir="${APP_ROOT}/app/hesabixAPI" cd "${api_dir}" # Python venv + install if [[ ! -d ".venv" ]]; then python3.11 -m venv .venv fi # shellcheck disable=SC1091 source .venv/bin/activate pip install --upgrade pip pip install -e . # .env cat > .env < /etc/systemd/system/hesabix-api.service <<'UNIT' [Unit] Description=Hesabix API (FastAPI/Uvicorn) After=network.target mariadb.service mysql.service [Service] User=www-data WorkingDirectory=/opt/hesabix/app/hesabixAPI Environment=PATH=/opt/hesabix/app/hesabixAPI/.venv/bin Environment=PYTHONUNBUFFERED=1 ExecStart=/opt/hesabix/app/hesabixAPI/.venv/bin/uvicorn app.main:app --host 0.0.0.0 --port 8000 --workers 2 Restart=always [Install] WantedBy=multi-user.target UNIT systemctl daemon-reload systemctl enable --now hesabix-api echo "$CHECK_MARK بک‌اند اجرا شد (service: hesabix-api)." } install_flutter_and_build_frontend() { echo ">> نصب Flutter و بیلد فرانت..." local flutter_root="/opt/flutter" if [[ ! -d "${flutter_root}/flutter" ]]; then mkdir -p "${flutter_root}" cd "${flutter_root}" curl -L https://storage.googleapis.com/flutter_infra_release/releases/stable/linux/flutter_linux_3.24.0-stable.tar.xz -o flutter.tar.xz tar -xf flutter.tar.xz fi local flutter_bin="${flutter_root}/flutter/bin/flutter" "${flutter_bin}" --version "${flutter_bin}" config --enable-web local ui_dir="${APP_ROOT}/app/hesabixUI/hesabix_ui" cd "${ui_dir}" "${flutter_bin}" pub get "${flutter_bin}" build web --release mkdir -p "/var/www/${UI_DOMAIN}" rsync -a --delete build/web/ "/var/www/${UI_DOMAIN}/" chown -R www-data:www-data "/var/www/${UI_DOMAIN}" echo "$CHECK_MARK فرانت بیلد و در /var/www/${UI_DOMAIN} مستقر شد." } configure_nginx() { echo ">> پیکربندی Nginx..." cat > /etc/nginx/sites-available/hesabix.conf <