fix: convert deploy.sh CRLF to LF and add executable permission

- Convert Windows CRLF line endings to Unix LF for all deploy.sh files
- Add executable permission to all deploy.sh scripts

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
hailin 2025-12-07 07:00:58 -08:00
parent e76adcbe8d
commit 0c00382a98
14 changed files with 2972 additions and 2990 deletions

View File

@ -1,378 +1,378 @@
#!/bin/bash
# =============================================================================
# RWADurian API Gateway (Kong) - 部署脚本
# =============================================================================
# Usage:
# ./deploy.sh up # 启动网关
# ./deploy.sh down # 停止网关
# ./deploy.sh restart # 重启网关
# ./deploy.sh logs # 查看日志
# ./deploy.sh status # 查看状态
# ./deploy.sh health # 健康检查
# ./deploy.sh reload # 重载 Kong 配置
# ./deploy.sh routes # 查看所有路由
# ./deploy.sh monitoring # 启动监控栈 (Prometheus + Grafana)
# ./deploy.sh metrics # 查看 Prometheus 指标
# =============================================================================
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
# 日志函数
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
# 项目信息
PROJECT_NAME="rwa-api-gateway"
KONG_ADMIN_URL="http://localhost:8001"
KONG_PROXY_URL="http://localhost:8000"
# 脚本目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# 切换到脚本所在目录
cd "$SCRIPT_DIR"
# 加载环境变量
if [ -f ".env" ]; then
log_info "Loading environment from .env file"
set -a
source .env
set +a
elif [ -f ".env.example" ]; then
log_warn ".env file not found!"
log_warn "Creating .env from .env.example..."
cp .env.example .env
log_error "Please edit .env file to configure your environment, then run again"
exit 1
else
log_error "Neither .env nor .env.example found!"
exit 1
fi
# 检查 Docker
check_docker() {
if ! command -v docker &> /dev/null; then
log_error "Docker 未安装"
exit 1
fi
if ! docker info &> /dev/null; then
log_error "Docker 服务未运行"
exit 1
fi
}
# 检查 Docker Compose
check_docker_compose() {
if docker compose version &> /dev/null; then
COMPOSE_CMD="docker compose"
elif command -v docker-compose &> /dev/null; then
COMPOSE_CMD="docker-compose"
else
log_error "Docker Compose 未安装"
exit 1
fi
}
# 检查后端服务连通性(可选)
check_backend() {
local BACKEND_IP="${BACKEND_SERVER_IP:-192.168.1.111}"
log_info "检查后端服务器 $BACKEND_IP 连通性..."
if ping -c 1 -W 2 $BACKEND_IP &> /dev/null; then
log_success "后端服务器可达"
else
log_warn "无法 ping 通后端服务器 $BACKEND_IP"
log_warn "请确保后端服务已启动且网络可达"
fi
}
# 启动服务
cmd_up() {
log_info "启动 Kong API Gateway..."
check_backend
$COMPOSE_CMD up -d
log_info "等待 Kong 启动..."
sleep 10
# 检查状态
if docker ps | grep -q rwa-kong; then
log_success "Kong API Gateway 启动成功!"
echo ""
echo "服务地址:"
echo " Proxy: http://localhost:8000"
echo " Admin API: http://localhost:8001"
echo " Admin GUI: http://localhost:8002"
echo ""
echo "查看路由: ./deploy.sh routes"
else
log_error "Kong 启动失败,查看日志: ./deploy.sh logs"
exit 1
fi
}
# 停止服务
cmd_down() {
log_info "停止 Kong API Gateway..."
$COMPOSE_CMD down
log_success "Kong 已停止"
}
# 重启服务
cmd_restart() {
log_info "重启 Kong API Gateway..."
$COMPOSE_CMD restart
log_success "Kong 已重启"
}
# 查看日志
cmd_logs() {
$COMPOSE_CMD logs -f
}
# 查看状态
cmd_status() {
log_info "Kong API Gateway 状态:"
$COMPOSE_CMD ps
}
# 健康检查
cmd_health() {
log_info "Kong 健康检查..."
# 检查 Kong 状态
response=$(curl -s $KONG_ADMIN_URL/status 2>/dev/null)
if [ $? -eq 0 ]; then
log_success "Kong Admin API 正常"
echo "$response" | python3 -m json.tool 2>/dev/null || echo "$response"
else
log_error "Kong Admin API 不可用"
exit 1
fi
}
# 重载配置 (触发 deck sync)
cmd_reload() {
log_info "重载 Kong 配置..."
$COMPOSE_CMD run --rm kong-config
log_success "配置已重载"
}
# 同步配置到数据库
cmd_sync() {
log_info "同步 kong.yml 配置到数据库..."
$COMPOSE_CMD run --rm kong-config
log_success "配置同步完成"
echo ""
echo "查看路由: ./deploy.sh routes"
}
# 查看所有路由
cmd_routes() {
log_info "Kong 路由列表:"
curl -s $KONG_ADMIN_URL/routes | python3 -m json.tool 2>/dev/null || curl -s $KONG_ADMIN_URL/routes
}
# 查看所有服务
cmd_services() {
log_info "Kong 服务列表:"
curl -s $KONG_ADMIN_URL/services | python3 -m json.tool 2>/dev/null || curl -s $KONG_ADMIN_URL/services
}
# 测试 API
cmd_test() {
log_info "测试 API 路由..."
echo ""
echo "测试 /api/v1/versions (admin-service):"
curl -s -o /dev/null -w " HTTP Status: %{http_code}\n" $KONG_PROXY_URL/api/v1/versions
echo ""
echo "测试 /api/v1/auth (identity-service):"
curl -s -o /dev/null -w " HTTP Status: %{http_code}\n" $KONG_PROXY_URL/api/v1/auth
}
# 清理
cmd_clean() {
log_info "清理 Kong 容器和数据..."
$COMPOSE_CMD down -v --remove-orphans
docker image prune -f
log_success "清理完成"
}
# 启动监控栈
cmd_monitoring_up() {
log_info "启动监控栈 (Prometheus + Grafana)..."
$COMPOSE_CMD -f docker-compose.yml -f docker-compose.monitoring.yml up -d prometheus grafana
log_info "等待服务启动..."
sleep 5
log_success "监控栈启动成功!"
echo ""
echo "监控服务地址:"
echo " Grafana: http://localhost:3030 (admin/admin123)"
echo " Prometheus: http://localhost:9099"
echo " Kong 指标: http://localhost:8001/metrics"
echo ""
}
# 安装监控栈 (包括 Nginx + SSL)
cmd_monitoring_install() {
local domain="${1:-monitor.szaiai.com}"
log_info "安装监控栈..."
if [ ! -f "$SCRIPT_DIR/scripts/install-monitor.sh" ]; then
log_error "安装脚本不存在: scripts/install-monitor.sh"
exit 1
fi
sudo bash "$SCRIPT_DIR/scripts/install-monitor.sh" "$domain"
}
# 停止监控栈
cmd_monitoring_down() {
log_info "停止监控栈..."
docker stop rwa-prometheus rwa-grafana 2>/dev/null || true
docker rm rwa-prometheus rwa-grafana 2>/dev/null || true
log_success "监控栈已停止"
}
# 查看 Prometheus 指标
cmd_metrics() {
log_info "Kong Prometheus 指标概览:"
echo ""
# 获取关键指标
metrics=$(curl -s $KONG_ADMIN_URL/metrics 2>/dev/null)
if [ $? -eq 0 ]; then
echo "=== 请求统计 ==="
echo "$metrics" | grep -E "^kong_http_requests_total" | head -20
echo ""
echo "=== 延迟统计 ==="
echo "$metrics" | grep -E "^kong_latency_" | head -10
echo ""
echo "完整指标: curl $KONG_ADMIN_URL/metrics"
else
log_error "无法获取指标,请确保 Kong 正在运行且 prometheus 插件已启用"
fi
}
# 显示帮助
show_help() {
echo ""
echo "RWADurian API Gateway (Kong) 部署脚本"
echo ""
echo "用法: ./deploy.sh [命令]"
echo ""
echo "命令:"
echo " up 启动 Kong 网关"
echo " down 停止 Kong 网关"
echo " restart 重启 Kong 网关"
echo " logs 查看日志"
echo " status 查看状态"
echo " health 健康检查"
echo " sync 同步 kong.yml 配置到数据库"
echo " reload 重载 Kong 配置 (同 sync)"
echo " routes 查看所有路由"
echo " services 查看所有服务"
echo " test 测试 API 路由"
echo " clean 清理容器和数据"
echo ""
echo "监控命令:"
echo " monitoring install [domain] 一键安装监控 (Nginx+SSL+服务)"
echo " monitoring up 启动监控栈"
echo " monitoring down 停止监控栈"
echo " metrics 查看 Prometheus 指标"
echo ""
echo " help 显示帮助"
echo ""
echo "注意: 需要先启动 backend/services 才能启动 Kong"
echo ""
}
# 主函数
main() {
check_docker
check_docker_compose
case "${1:-help}" in
up)
cmd_up
;;
down)
cmd_down
;;
restart)
cmd_restart
;;
logs)
cmd_logs
;;
status)
cmd_status
;;
health)
cmd_health
;;
sync)
cmd_sync
;;
reload)
cmd_reload
;;
routes)
cmd_routes
;;
services)
cmd_services
;;
test)
cmd_test
;;
clean)
cmd_clean
;;
monitoring)
case "${2:-up}" in
install)
cmd_monitoring_install "$3"
;;
up)
cmd_monitoring_up
;;
down)
cmd_monitoring_down
;;
*)
log_error "未知监控命令: $2"
echo "用法: ./deploy.sh monitoring [install|up|down]"
exit 1
;;
esac
;;
metrics)
cmd_metrics
;;
help|--help|-h)
show_help
;;
*)
log_error "未知命令: $1"
show_help
exit 1
;;
esac
}
main "$@"
#!/bin/bash
# =============================================================================
# RWADurian API Gateway (Kong) - 部署脚本
# =============================================================================
# Usage:
# ./deploy.sh up # 启动网关
# ./deploy.sh down # 停止网关
# ./deploy.sh restart # 重启网关
# ./deploy.sh logs # 查看日志
# ./deploy.sh status # 查看状态
# ./deploy.sh health # 健康检查
# ./deploy.sh reload # 重载 Kong 配置
# ./deploy.sh routes # 查看所有路由
# ./deploy.sh monitoring # 启动监控栈 (Prometheus + Grafana)
# ./deploy.sh metrics # 查看 Prometheus 指标
# =============================================================================
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
# 日志函数
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
# 项目信息
PROJECT_NAME="rwa-api-gateway"
KONG_ADMIN_URL="http://localhost:8001"
KONG_PROXY_URL="http://localhost:8000"
# 脚本目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# 切换到脚本所在目录
cd "$SCRIPT_DIR"
# 加载环境变量
if [ -f ".env" ]; then
log_info "Loading environment from .env file"
set -a
source .env
set +a
elif [ -f ".env.example" ]; then
log_warn ".env file not found!"
log_warn "Creating .env from .env.example..."
cp .env.example .env
log_error "Please edit .env file to configure your environment, then run again"
exit 1
else
log_error "Neither .env nor .env.example found!"
exit 1
fi
# 检查 Docker
check_docker() {
if ! command -v docker &> /dev/null; then
log_error "Docker 未安装"
exit 1
fi
if ! docker info &> /dev/null; then
log_error "Docker 服务未运行"
exit 1
fi
}
# 检查 Docker Compose
check_docker_compose() {
if docker compose version &> /dev/null; then
COMPOSE_CMD="docker compose"
elif command -v docker-compose &> /dev/null; then
COMPOSE_CMD="docker-compose"
else
log_error "Docker Compose 未安装"
exit 1
fi
}
# 检查后端服务连通性(可选)
check_backend() {
local BACKEND_IP="${BACKEND_SERVER_IP:-192.168.1.111}"
log_info "检查后端服务器 $BACKEND_IP 连通性..."
if ping -c 1 -W 2 $BACKEND_IP &> /dev/null; then
log_success "后端服务器可达"
else
log_warn "无法 ping 通后端服务器 $BACKEND_IP"
log_warn "请确保后端服务已启动且网络可达"
fi
}
# 启动服务
cmd_up() {
log_info "启动 Kong API Gateway..."
check_backend
$COMPOSE_CMD up -d
log_info "等待 Kong 启动..."
sleep 10
# 检查状态
if docker ps | grep -q rwa-kong; then
log_success "Kong API Gateway 启动成功!"
echo ""
echo "服务地址:"
echo " Proxy: http://localhost:8000"
echo " Admin API: http://localhost:8001"
echo " Admin GUI: http://localhost:8002"
echo ""
echo "查看路由: ./deploy.sh routes"
else
log_error "Kong 启动失败,查看日志: ./deploy.sh logs"
exit 1
fi
}
# 停止服务
cmd_down() {
log_info "停止 Kong API Gateway..."
$COMPOSE_CMD down
log_success "Kong 已停止"
}
# 重启服务
cmd_restart() {
log_info "重启 Kong API Gateway..."
$COMPOSE_CMD restart
log_success "Kong 已重启"
}
# 查看日志
cmd_logs() {
$COMPOSE_CMD logs -f
}
# 查看状态
cmd_status() {
log_info "Kong API Gateway 状态:"
$COMPOSE_CMD ps
}
# 健康检查
cmd_health() {
log_info "Kong 健康检查..."
# 检查 Kong 状态
response=$(curl -s $KONG_ADMIN_URL/status 2>/dev/null)
if [ $? -eq 0 ]; then
log_success "Kong Admin API 正常"
echo "$response" | python3 -m json.tool 2>/dev/null || echo "$response"
else
log_error "Kong Admin API 不可用"
exit 1
fi
}
# 重载配置 (触发 deck sync)
cmd_reload() {
log_info "重载 Kong 配置..."
$COMPOSE_CMD run --rm kong-config
log_success "配置已重载"
}
# 同步配置到数据库
cmd_sync() {
log_info "同步 kong.yml 配置到数据库..."
$COMPOSE_CMD run --rm kong-config
log_success "配置同步完成"
echo ""
echo "查看路由: ./deploy.sh routes"
}
# 查看所有路由
cmd_routes() {
log_info "Kong 路由列表:"
curl -s $KONG_ADMIN_URL/routes | python3 -m json.tool 2>/dev/null || curl -s $KONG_ADMIN_URL/routes
}
# 查看所有服务
cmd_services() {
log_info "Kong 服务列表:"
curl -s $KONG_ADMIN_URL/services | python3 -m json.tool 2>/dev/null || curl -s $KONG_ADMIN_URL/services
}
# 测试 API
cmd_test() {
log_info "测试 API 路由..."
echo ""
echo "测试 /api/v1/versions (admin-service):"
curl -s -o /dev/null -w " HTTP Status: %{http_code}\n" $KONG_PROXY_URL/api/v1/versions
echo ""
echo "测试 /api/v1/auth (identity-service):"
curl -s -o /dev/null -w " HTTP Status: %{http_code}\n" $KONG_PROXY_URL/api/v1/auth
}
# 清理
cmd_clean() {
log_info "清理 Kong 容器和数据..."
$COMPOSE_CMD down -v --remove-orphans
docker image prune -f
log_success "清理完成"
}
# 启动监控栈
cmd_monitoring_up() {
log_info "启动监控栈 (Prometheus + Grafana)..."
$COMPOSE_CMD -f docker-compose.yml -f docker-compose.monitoring.yml up -d prometheus grafana
log_info "等待服务启动..."
sleep 5
log_success "监控栈启动成功!"
echo ""
echo "监控服务地址:"
echo " Grafana: http://localhost:3030 (admin/admin123)"
echo " Prometheus: http://localhost:9099"
echo " Kong 指标: http://localhost:8001/metrics"
echo ""
}
# 安装监控栈 (包括 Nginx + SSL)
cmd_monitoring_install() {
local domain="${1:-monitor.szaiai.com}"
log_info "安装监控栈..."
if [ ! -f "$SCRIPT_DIR/scripts/install-monitor.sh" ]; then
log_error "安装脚本不存在: scripts/install-monitor.sh"
exit 1
fi
sudo bash "$SCRIPT_DIR/scripts/install-monitor.sh" "$domain"
}
# 停止监控栈
cmd_monitoring_down() {
log_info "停止监控栈..."
docker stop rwa-prometheus rwa-grafana 2>/dev/null || true
docker rm rwa-prometheus rwa-grafana 2>/dev/null || true
log_success "监控栈已停止"
}
# 查看 Prometheus 指标
cmd_metrics() {
log_info "Kong Prometheus 指标概览:"
echo ""
# 获取关键指标
metrics=$(curl -s $KONG_ADMIN_URL/metrics 2>/dev/null)
if [ $? -eq 0 ]; then
echo "=== 请求统计 ==="
echo "$metrics" | grep -E "^kong_http_requests_total" | head -20
echo ""
echo "=== 延迟统计 ==="
echo "$metrics" | grep -E "^kong_latency_" | head -10
echo ""
echo "完整指标: curl $KONG_ADMIN_URL/metrics"
else
log_error "无法获取指标,请确保 Kong 正在运行且 prometheus 插件已启用"
fi
}
# 显示帮助
show_help() {
echo ""
echo "RWADurian API Gateway (Kong) 部署脚本"
echo ""
echo "用法: ./deploy.sh [命令]"
echo ""
echo "命令:"
echo " up 启动 Kong 网关"
echo " down 停止 Kong 网关"
echo " restart 重启 Kong 网关"
echo " logs 查看日志"
echo " status 查看状态"
echo " health 健康检查"
echo " sync 同步 kong.yml 配置到数据库"
echo " reload 重载 Kong 配置 (同 sync)"
echo " routes 查看所有路由"
echo " services 查看所有服务"
echo " test 测试 API 路由"
echo " clean 清理容器和数据"
echo ""
echo "监控命令:"
echo " monitoring install [domain] 一键安装监控 (Nginx+SSL+服务)"
echo " monitoring up 启动监控栈"
echo " monitoring down 停止监控栈"
echo " metrics 查看 Prometheus 指标"
echo ""
echo " help 显示帮助"
echo ""
echo "注意: 需要先启动 backend/services 才能启动 Kong"
echo ""
}
# 主函数
main() {
check_docker
check_docker_compose
case "${1:-help}" in
up)
cmd_up
;;
down)
cmd_down
;;
restart)
cmd_restart
;;
logs)
cmd_logs
;;
status)
cmd_status
;;
health)
cmd_health
;;
sync)
cmd_sync
;;
reload)
cmd_reload
;;
routes)
cmd_routes
;;
services)
cmd_services
;;
test)
cmd_test
;;
clean)
cmd_clean
;;
monitoring)
case "${2:-up}" in
install)
cmd_monitoring_install "$3"
;;
up)
cmd_monitoring_up
;;
down)
cmd_monitoring_down
;;
*)
log_error "未知监控命令: $2"
echo "用法: ./deploy.sh monitoring [install|up|down]"
exit 1
;;
esac
;;
metrics)
cmd_metrics
;;
help|--help|-h)
show_help
;;
*)
log_error "未知命令: $1"
show_help
exit 1
;;
esac
}
main "$@"

File diff suppressed because it is too large Load Diff

View File

@ -1,366 +1,366 @@
#!/bin/bash
# =============================================================================
# Admin Service - Deployment Script
# =============================================================================
# 用法: ./deploy.sh <command>
# =============================================================================
set -e
SERVICE_NAME="admin-service"
CONTAINER_NAME="rwa-admin-service"
IMAGE_NAME="services-admin-service"
PORT=3010
HEALTH_ENDPOINT="http://localhost:${PORT}/api/v1/health"
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m'
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[OK]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
log_step() { echo -e "${CYAN}[STEP]${NC} $1"; }
# Get script directory
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SERVICES_DIR="$(dirname "$SCRIPT_DIR")"
# Load environment from parent services directory (shared .env)
load_env() {
if [ -f "$SERVICES_DIR/.env" ]; then
export $(cat "$SERVICES_DIR/.env" | grep -v '^#' | xargs)
log_info "Loaded .env from $SERVICES_DIR"
elif [ -f "$SCRIPT_DIR/.env" ]; then
export $(cat "$SCRIPT_DIR/.env" | grep -v '^#' | xargs)
log_info "Loaded .env from $SCRIPT_DIR"
fi
}
# Show banner
show_banner() {
echo -e "${CYAN}"
echo "╔═══════════════════════════════════════════════════════════════╗"
echo "║ Admin Service Deployment Script ║"
echo "║ Version Management API ║"
echo "╚═══════════════════════════════════════════════════════════════╝"
echo -e "${NC}"
}
case "$1" in
# =========================================================================
# Build Commands
# =========================================================================
build)
show_banner
log_info "Building $SERVICE_NAME Docker image..."
docker build -t "$IMAGE_NAME" "$SCRIPT_DIR"
log_success "$SERVICE_NAME built successfully"
;;
build-no-cache)
show_banner
log_info "Building $SERVICE_NAME (no cache)..."
docker build --no-cache -t "$IMAGE_NAME" "$SCRIPT_DIR"
log_success "$SERVICE_NAME built successfully (no cache)"
;;
# =========================================================================
# Lifecycle Commands
# =========================================================================
start)
show_banner
load_env
log_info "Starting $SERVICE_NAME using shared infrastructure..."
cd "$SERVICES_DIR"
docker compose up -d "$SERVICE_NAME"
log_success "$SERVICE_NAME started"
log_info "Waiting for service to be healthy..."
sleep 5
"$SCRIPT_DIR/deploy.sh" health
;;
stop)
show_banner
log_info "Stopping $SERVICE_NAME..."
docker stop "$CONTAINER_NAME" 2>/dev/null || true
docker rm "$CONTAINER_NAME" 2>/dev/null || true
log_success "$SERVICE_NAME stopped"
;;
restart)
show_banner
"$SCRIPT_DIR/deploy.sh" stop
"$SCRIPT_DIR/deploy.sh" start
;;
up)
show_banner
load_env
log_info "Starting $SERVICE_NAME in foreground..."
cd "$SERVICES_DIR"
docker compose up "$SERVICE_NAME"
;;
down)
show_banner
log_info "Stopping $SERVICE_NAME container..."
docker stop "$CONTAINER_NAME" 2>/dev/null || true
docker rm "$CONTAINER_NAME" 2>/dev/null || true
log_success "$SERVICE_NAME container removed"
;;
# =========================================================================
# Monitoring Commands
# =========================================================================
logs)
docker logs -f "$CONTAINER_NAME"
;;
logs-tail)
docker logs --tail 100 "$CONTAINER_NAME"
;;
logs-all)
cd "$SERVICES_DIR"
docker compose logs -f "$SERVICE_NAME"
;;
status)
show_banner
log_info "Checking $SERVICE_NAME status..."
echo ""
if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
log_success "$SERVICE_NAME is running"
echo ""
docker ps --filter "name=$CONTAINER_NAME" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
else
log_warn "$SERVICE_NAME is not running"
fi
echo ""
log_info "All related containers:"
docker ps --filter "name=rwa-admin" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
;;
health)
log_info "Checking health endpoint..."
if curl -sf "$HEALTH_ENDPOINT" > /dev/null 2>&1; then
log_success "Health check passed"
curl -s "$HEALTH_ENDPOINT" | jq . 2>/dev/null || curl -s "$HEALTH_ENDPOINT"
else
log_error "Health check failed"
exit 1
fi
;;
# =========================================================================
# Database Commands
# =========================================================================
init-db)
show_banner
log_info "Creating database rwa_admin if not exists..."
docker exec rwa-postgres psql -U "${POSTGRES_USER:-rwa_user}" -c "CREATE DATABASE rwa_admin;" 2>/dev/null || log_warn "Database already exists"
log_success "Database ready"
log_info "Running migrations..."
"$SCRIPT_DIR/deploy.sh" migrate
;;
migrate)
show_banner
log_info "Running database migrations (production)..."
docker exec "$CONTAINER_NAME" npx prisma migrate deploy
log_success "Migrations completed"
;;
migrate-dev)
show_banner
log_info "Running database migrations (development)..."
docker exec -it "$CONTAINER_NAME" npx prisma migrate dev
log_success "Dev migrations completed"
;;
migrate-status)
log_info "Checking migration status..."
docker exec "$CONTAINER_NAME" npx prisma migrate status
;;
prisma-studio)
log_info "Starting Prisma Studio..."
log_warn "Make sure DATABASE_URL is set in your environment"
cd "$SCRIPT_DIR"
npx prisma studio
;;
db-push)
log_info "Pushing schema to database (development only)..."
docker exec "$CONTAINER_NAME" npx prisma db push
log_success "Schema pushed to database"
;;
db-seed)
log_info "Seeding database..."
docker exec "$CONTAINER_NAME" npx prisma db seed
log_success "Database seeded"
;;
# =========================================================================
# Development Commands
# =========================================================================
shell)
log_info "Entering $SERVICE_NAME container shell..."
docker exec -it "$CONTAINER_NAME" sh
;;
dev)
show_banner
log_info "Starting development mode..."
cd "$SCRIPT_DIR"
npm run start:dev
;;
test)
show_banner
log_info "Running tests..."
cd "$SCRIPT_DIR"
npm test
;;
test-unit)
log_info "Running unit tests..."
cd "$SCRIPT_DIR"
npm run test:unit
;;
test-integration)
log_info "Running integration tests..."
cd "$SCRIPT_DIR"
npm run test:integration
;;
test-e2e)
log_info "Running E2E tests..."
cd "$SCRIPT_DIR"
npm run test:e2e
;;
lint)
log_info "Running linter..."
cd "$SCRIPT_DIR"
npm run lint
;;
format)
log_info "Formatting code..."
cd "$SCRIPT_DIR"
npm run format
;;
# =========================================================================
# Cleanup Commands
# =========================================================================
clean)
show_banner
log_warn "Cleaning $SERVICE_NAME (removing containers)..."
"$SCRIPT_DIR/deploy.sh" stop
log_success "$SERVICE_NAME cleaned"
;;
clean-all)
show_banner
log_warn "Cleaning $SERVICE_NAME (removing container and image)..."
docker stop "$CONTAINER_NAME" 2>/dev/null || true
docker rm "$CONTAINER_NAME" 2>/dev/null || true
docker rmi "$IMAGE_NAME" 2>/dev/null || true
log_success "$SERVICE_NAME fully cleaned"
;;
prune)
show_banner
log_warn "Pruning unused Docker resources..."
docker system prune -f
log_success "Docker resources pruned"
;;
# =========================================================================
# Info Commands
# =========================================================================
info)
show_banner
echo -e "${CYAN}Service Information:${NC}"
echo " Name: $SERVICE_NAME"
echo " Container: $CONTAINER_NAME"
echo " Image: $IMAGE_NAME"
echo " Port: $PORT"
echo " Health: $HEALTH_ENDPOINT"
echo ""
echo -e "${CYAN}API Endpoints:${NC}"
echo " Health: GET /api/v1/health"
echo " Check Update: GET /api/v1/versions/check-update"
echo " Create: POST /api/v1/versions"
echo ""
echo -e "${CYAN}Environment Files:${NC}"
echo " .env.example - Template"
echo " .env.development - Local development"
echo " .env.production - Production (uses variable references)"
echo " .env.test - Testing"
;;
# =========================================================================
# Help
# =========================================================================
*)
show_banner
echo "Usage: $0 <command>"
echo ""
echo -e "${CYAN}Build Commands:${NC}"
echo " build Build Docker image"
echo " build-no-cache Build Docker image without cache"
echo ""
echo -e "${CYAN}Lifecycle Commands:${NC}"
echo " start Start all services (detached)"
echo " stop Stop all services"
echo " restart Restart all services"
echo " up Start all services (foreground)"
echo " down Stop and remove all containers and volumes"
echo ""
echo -e "${CYAN}Monitoring Commands:${NC}"
echo " logs Follow service logs"
echo " logs-tail Show last 100 lines of logs"
echo " logs-all Follow all container logs"
echo " status Check service status"
echo " health Check health endpoint"
echo ""
echo -e "${CYAN}Database Commands:${NC}"
echo " init-db Create database and run migrations"
echo " migrate Run migrations (production)"
echo " migrate-dev Run migrations (development)"
echo " migrate-status Check migration status"
echo " prisma-studio Open Prisma Studio"
echo " db-push Push schema to database"
echo " db-seed Seed database"
echo ""
echo -e "${CYAN}Development Commands:${NC}"
echo " shell Enter container shell"
echo " dev Start in development mode"
echo " test Run all tests"
echo " test-unit Run unit tests"
echo " test-integration Run integration tests"
echo " test-e2e Run E2E tests"
echo " lint Run linter"
echo " format Format code"
echo ""
echo -e "${CYAN}Cleanup Commands:${NC}"
echo " clean Remove containers"
echo " clean-all Remove containers, volumes, and images"
echo " prune Prune unused Docker resources"
echo ""
echo -e "${CYAN}Info Commands:${NC}"
echo " info Show service information"
exit 1
;;
esac
#!/bin/bash
# =============================================================================
# Admin Service - Deployment Script
# =============================================================================
# 用法: ./deploy.sh <command>
# =============================================================================
set -e
SERVICE_NAME="admin-service"
CONTAINER_NAME="rwa-admin-service"
IMAGE_NAME="services-admin-service"
PORT=3010
HEALTH_ENDPOINT="http://localhost:${PORT}/api/v1/health"
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m'
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[OK]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
log_step() { echo -e "${CYAN}[STEP]${NC} $1"; }
# Get script directory
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SERVICES_DIR="$(dirname "$SCRIPT_DIR")"
# Load environment from parent services directory (shared .env)
load_env() {
if [ -f "$SERVICES_DIR/.env" ]; then
export $(cat "$SERVICES_DIR/.env" | grep -v '^#' | xargs)
log_info "Loaded .env from $SERVICES_DIR"
elif [ -f "$SCRIPT_DIR/.env" ]; then
export $(cat "$SCRIPT_DIR/.env" | grep -v '^#' | xargs)
log_info "Loaded .env from $SCRIPT_DIR"
fi
}
# Show banner
show_banner() {
echo -e "${CYAN}"
echo "╔═══════════════════════════════════════════════════════════════╗"
echo "║ Admin Service Deployment Script ║"
echo "║ Version Management API ║"
echo "╚═══════════════════════════════════════════════════════════════╝"
echo -e "${NC}"
}
case "$1" in
# =========================================================================
# Build Commands
# =========================================================================
build)
show_banner
log_info "Building $SERVICE_NAME Docker image..."
docker build -t "$IMAGE_NAME" "$SCRIPT_DIR"
log_success "$SERVICE_NAME built successfully"
;;
build-no-cache)
show_banner
log_info "Building $SERVICE_NAME (no cache)..."
docker build --no-cache -t "$IMAGE_NAME" "$SCRIPT_DIR"
log_success "$SERVICE_NAME built successfully (no cache)"
;;
# =========================================================================
# Lifecycle Commands
# =========================================================================
start)
show_banner
load_env
log_info "Starting $SERVICE_NAME using shared infrastructure..."
cd "$SERVICES_DIR"
docker compose up -d "$SERVICE_NAME"
log_success "$SERVICE_NAME started"
log_info "Waiting for service to be healthy..."
sleep 5
"$SCRIPT_DIR/deploy.sh" health
;;
stop)
show_banner
log_info "Stopping $SERVICE_NAME..."
docker stop "$CONTAINER_NAME" 2>/dev/null || true
docker rm "$CONTAINER_NAME" 2>/dev/null || true
log_success "$SERVICE_NAME stopped"
;;
restart)
show_banner
"$SCRIPT_DIR/deploy.sh" stop
"$SCRIPT_DIR/deploy.sh" start
;;
up)
show_banner
load_env
log_info "Starting $SERVICE_NAME in foreground..."
cd "$SERVICES_DIR"
docker compose up "$SERVICE_NAME"
;;
down)
show_banner
log_info "Stopping $SERVICE_NAME container..."
docker stop "$CONTAINER_NAME" 2>/dev/null || true
docker rm "$CONTAINER_NAME" 2>/dev/null || true
log_success "$SERVICE_NAME container removed"
;;
# =========================================================================
# Monitoring Commands
# =========================================================================
logs)
docker logs -f "$CONTAINER_NAME"
;;
logs-tail)
docker logs --tail 100 "$CONTAINER_NAME"
;;
logs-all)
cd "$SERVICES_DIR"
docker compose logs -f "$SERVICE_NAME"
;;
status)
show_banner
log_info "Checking $SERVICE_NAME status..."
echo ""
if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
log_success "$SERVICE_NAME is running"
echo ""
docker ps --filter "name=$CONTAINER_NAME" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
else
log_warn "$SERVICE_NAME is not running"
fi
echo ""
log_info "All related containers:"
docker ps --filter "name=rwa-admin" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
;;
health)
log_info "Checking health endpoint..."
if curl -sf "$HEALTH_ENDPOINT" > /dev/null 2>&1; then
log_success "Health check passed"
curl -s "$HEALTH_ENDPOINT" | jq . 2>/dev/null || curl -s "$HEALTH_ENDPOINT"
else
log_error "Health check failed"
exit 1
fi
;;
# =========================================================================
# Database Commands
# =========================================================================
init-db)
show_banner
log_info "Creating database rwa_admin if not exists..."
docker exec rwa-postgres psql -U "${POSTGRES_USER:-rwa_user}" -c "CREATE DATABASE rwa_admin;" 2>/dev/null || log_warn "Database already exists"
log_success "Database ready"
log_info "Running migrations..."
"$SCRIPT_DIR/deploy.sh" migrate
;;
migrate)
show_banner
log_info "Running database migrations (production)..."
docker exec "$CONTAINER_NAME" npx prisma migrate deploy
log_success "Migrations completed"
;;
migrate-dev)
show_banner
log_info "Running database migrations (development)..."
docker exec -it "$CONTAINER_NAME" npx prisma migrate dev
log_success "Dev migrations completed"
;;
migrate-status)
log_info "Checking migration status..."
docker exec "$CONTAINER_NAME" npx prisma migrate status
;;
prisma-studio)
log_info "Starting Prisma Studio..."
log_warn "Make sure DATABASE_URL is set in your environment"
cd "$SCRIPT_DIR"
npx prisma studio
;;
db-push)
log_info "Pushing schema to database (development only)..."
docker exec "$CONTAINER_NAME" npx prisma db push
log_success "Schema pushed to database"
;;
db-seed)
log_info "Seeding database..."
docker exec "$CONTAINER_NAME" npx prisma db seed
log_success "Database seeded"
;;
# =========================================================================
# Development Commands
# =========================================================================
shell)
log_info "Entering $SERVICE_NAME container shell..."
docker exec -it "$CONTAINER_NAME" sh
;;
dev)
show_banner
log_info "Starting development mode..."
cd "$SCRIPT_DIR"
npm run start:dev
;;
test)
show_banner
log_info "Running tests..."
cd "$SCRIPT_DIR"
npm test
;;
test-unit)
log_info "Running unit tests..."
cd "$SCRIPT_DIR"
npm run test:unit
;;
test-integration)
log_info "Running integration tests..."
cd "$SCRIPT_DIR"
npm run test:integration
;;
test-e2e)
log_info "Running E2E tests..."
cd "$SCRIPT_DIR"
npm run test:e2e
;;
lint)
log_info "Running linter..."
cd "$SCRIPT_DIR"
npm run lint
;;
format)
log_info "Formatting code..."
cd "$SCRIPT_DIR"
npm run format
;;
# =========================================================================
# Cleanup Commands
# =========================================================================
clean)
show_banner
log_warn "Cleaning $SERVICE_NAME (removing containers)..."
"$SCRIPT_DIR/deploy.sh" stop
log_success "$SERVICE_NAME cleaned"
;;
clean-all)
show_banner
log_warn "Cleaning $SERVICE_NAME (removing container and image)..."
docker stop "$CONTAINER_NAME" 2>/dev/null || true
docker rm "$CONTAINER_NAME" 2>/dev/null || true
docker rmi "$IMAGE_NAME" 2>/dev/null || true
log_success "$SERVICE_NAME fully cleaned"
;;
prune)
show_banner
log_warn "Pruning unused Docker resources..."
docker system prune -f
log_success "Docker resources pruned"
;;
# =========================================================================
# Info Commands
# =========================================================================
info)
show_banner
echo -e "${CYAN}Service Information:${NC}"
echo " Name: $SERVICE_NAME"
echo " Container: $CONTAINER_NAME"
echo " Image: $IMAGE_NAME"
echo " Port: $PORT"
echo " Health: $HEALTH_ENDPOINT"
echo ""
echo -e "${CYAN}API Endpoints:${NC}"
echo " Health: GET /api/v1/health"
echo " Check Update: GET /api/v1/versions/check-update"
echo " Create: POST /api/v1/versions"
echo ""
echo -e "${CYAN}Environment Files:${NC}"
echo " .env.example - Template"
echo " .env.development - Local development"
echo " .env.production - Production (uses variable references)"
echo " .env.test - Testing"
;;
# =========================================================================
# Help
# =========================================================================
*)
show_banner
echo "Usage: $0 <command>"
echo ""
echo -e "${CYAN}Build Commands:${NC}"
echo " build Build Docker image"
echo " build-no-cache Build Docker image without cache"
echo ""
echo -e "${CYAN}Lifecycle Commands:${NC}"
echo " start Start all services (detached)"
echo " stop Stop all services"
echo " restart Restart all services"
echo " up Start all services (foreground)"
echo " down Stop and remove all containers and volumes"
echo ""
echo -e "${CYAN}Monitoring Commands:${NC}"
echo " logs Follow service logs"
echo " logs-tail Show last 100 lines of logs"
echo " logs-all Follow all container logs"
echo " status Check service status"
echo " health Check health endpoint"
echo ""
echo -e "${CYAN}Database Commands:${NC}"
echo " init-db Create database and run migrations"
echo " migrate Run migrations (production)"
echo " migrate-dev Run migrations (development)"
echo " migrate-status Check migration status"
echo " prisma-studio Open Prisma Studio"
echo " db-push Push schema to database"
echo " db-seed Seed database"
echo ""
echo -e "${CYAN}Development Commands:${NC}"
echo " shell Enter container shell"
echo " dev Start in development mode"
echo " test Run all tests"
echo " test-unit Run unit tests"
echo " test-integration Run integration tests"
echo " test-e2e Run E2E tests"
echo " lint Run linter"
echo " format Format code"
echo ""
echo -e "${CYAN}Cleanup Commands:${NC}"
echo " clean Remove containers"
echo " clean-all Remove containers, volumes, and images"
echo " prune Prune unused Docker resources"
echo ""
echo -e "${CYAN}Info Commands:${NC}"
echo " info Show service information"
exit 1
;;
esac

View File

@ -1,94 +1,94 @@
#!/bin/bash
# =============================================================================
# Authorization Service - Individual Deployment Script
# =============================================================================
set -e
SERVICE_NAME="authorization-service"
CONTAINER_NAME="rwa-authorization-service"
IMAGE_NAME="services-authorization-service"
PORT=3009
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[OK]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SERVICES_DIR="$(dirname "$SCRIPT_DIR")"
if [ -f "$SERVICES_DIR/.env" ]; then
export $(cat "$SERVICES_DIR/.env" | grep -v '^#' | xargs)
fi
case "$1" in
build)
log_info "Building $SERVICE_NAME..."
docker build -t "$IMAGE_NAME" "$SCRIPT_DIR"
log_success "$SERVICE_NAME built successfully"
;;
build-no-cache)
log_info "Building $SERVICE_NAME (no cache)..."
docker build --no-cache -t "$IMAGE_NAME" "$SCRIPT_DIR"
log_success "$SERVICE_NAME built successfully"
;;
start)
log_info "Starting $SERVICE_NAME..."
cd "$SERVICES_DIR"
docker compose up -d "$SERVICE_NAME"
log_success "$SERVICE_NAME started"
;;
stop)
log_info "Stopping $SERVICE_NAME..."
docker stop "$CONTAINER_NAME" 2>/dev/null || true
docker rm "$CONTAINER_NAME" 2>/dev/null || true
log_success "$SERVICE_NAME stopped"
;;
restart)
$0 stop
$0 start
;;
logs)
docker logs -f "$CONTAINER_NAME"
;;
logs-tail)
docker logs --tail 100 "$CONTAINER_NAME"
;;
status)
if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
log_success "$SERVICE_NAME is running"
docker ps --filter "name=$CONTAINER_NAME" --format "table {{.Status}}\t{{.Ports}}"
else
log_warn "$SERVICE_NAME is not running"
fi
;;
health)
log_info "Checking health of $SERVICE_NAME..."
if curl -sf "http://localhost:$PORT/health" > /dev/null 2>&1; then
log_success "$SERVICE_NAME is healthy"
else
log_error "$SERVICE_NAME health check failed"
exit 1
fi
;;
migrate)
log_info "Running migrations for $SERVICE_NAME..."
docker exec "$CONTAINER_NAME" npx prisma migrate deploy
log_success "Migrations completed"
;;
shell)
docker exec -it "$CONTAINER_NAME" sh
;;
*)
echo "Usage: $0 {build|build-no-cache|start|stop|restart|logs|logs-tail|status|health|migrate|shell}"
exit 1
;;
esac
#!/bin/bash
# =============================================================================
# Authorization Service - Individual Deployment Script
# =============================================================================
set -e
SERVICE_NAME="authorization-service"
CONTAINER_NAME="rwa-authorization-service"
IMAGE_NAME="services-authorization-service"
PORT=3009
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[OK]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SERVICES_DIR="$(dirname "$SCRIPT_DIR")"
if [ -f "$SERVICES_DIR/.env" ]; then
export $(cat "$SERVICES_DIR/.env" | grep -v '^#' | xargs)
fi
case "$1" in
build)
log_info "Building $SERVICE_NAME..."
docker build -t "$IMAGE_NAME" "$SCRIPT_DIR"
log_success "$SERVICE_NAME built successfully"
;;
build-no-cache)
log_info "Building $SERVICE_NAME (no cache)..."
docker build --no-cache -t "$IMAGE_NAME" "$SCRIPT_DIR"
log_success "$SERVICE_NAME built successfully"
;;
start)
log_info "Starting $SERVICE_NAME..."
cd "$SERVICES_DIR"
docker compose up -d "$SERVICE_NAME"
log_success "$SERVICE_NAME started"
;;
stop)
log_info "Stopping $SERVICE_NAME..."
docker stop "$CONTAINER_NAME" 2>/dev/null || true
docker rm "$CONTAINER_NAME" 2>/dev/null || true
log_success "$SERVICE_NAME stopped"
;;
restart)
$0 stop
$0 start
;;
logs)
docker logs -f "$CONTAINER_NAME"
;;
logs-tail)
docker logs --tail 100 "$CONTAINER_NAME"
;;
status)
if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
log_success "$SERVICE_NAME is running"
docker ps --filter "name=$CONTAINER_NAME" --format "table {{.Status}}\t{{.Ports}}"
else
log_warn "$SERVICE_NAME is not running"
fi
;;
health)
log_info "Checking health of $SERVICE_NAME..."
if curl -sf "http://localhost:$PORT/health" > /dev/null 2>&1; then
log_success "$SERVICE_NAME is healthy"
else
log_error "$SERVICE_NAME health check failed"
exit 1
fi
;;
migrate)
log_info "Running migrations for $SERVICE_NAME..."
docker exec "$CONTAINER_NAME" npx prisma migrate deploy
log_success "Migrations completed"
;;
shell)
docker exec -it "$CONTAINER_NAME" sh
;;
*)
echo "Usage: $0 {build|build-no-cache|start|stop|restart|logs|logs-tail|status|health|migrate|shell}"
exit 1
;;
esac

View File

@ -259,7 +259,6 @@
"integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@babel/code-frame": "^7.27.1",
"@babel/generator": "^7.28.5",
@ -1763,7 +1762,6 @@
"resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.4.20.tgz",
"integrity": "sha512-hxJxZF7jcKGuUzM9EYbuES80Z/36piJbiqmPy86mk8qOn5gglFebBTvcx7PWVbRNSb4gngASYnefBj/Y2HAzpQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"file-type": "20.4.1",
"iterare": "1.2.1",
@ -1810,7 +1808,6 @@
"integrity": "sha512-kRdtyKA3+Tu70N3RQ4JgmO1E3LzAMs/eppj7SfjabC7TgqNWoS4RLhWl4BqmsNVmjj6D5jgfPVtHtgYkU3AfpQ==",
"hasInstallScript": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@nuxtjs/opencollective": "0.3.2",
"fast-safe-stringify": "2.1.1",
@ -1890,7 +1887,6 @@
"resolved": "https://registry.npmjs.org/@nestjs/microservices/-/microservices-10.4.20.tgz",
"integrity": "sha512-zu/o84Z0uTUClNnGIGfIjcrO3z6T60h/pZPSJK50o4mehbEvJ76fijj6R/WTW0VP+1N16qOv/NsiYLKJA5Cc3w==",
"license": "MIT",
"peer": true,
"dependencies": {
"iterare": "1.2.1",
"tslib": "2.8.1"
@ -1959,7 +1955,6 @@
"resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-10.4.20.tgz",
"integrity": "sha512-rh97mX3rimyf4xLMLHuTOBKe6UD8LOJ14VlJ1F/PTd6C6ZK9Ak6EHuJvdaGcSFQhd3ZMBh3I6CuujKGW9pNdIg==",
"license": "MIT",
"peer": true,
"dependencies": {
"body-parser": "1.20.3",
"cors": "2.8.5",
@ -2467,7 +2462,6 @@
"integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@types/estree": "*",
"@types/json-schema": "*"
@ -2622,7 +2616,6 @@
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.25.tgz",
"integrity": "sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==",
"license": "MIT",
"peer": true,
"dependencies": {
"undici-types": "~6.21.0"
}
@ -2816,7 +2809,6 @@
"integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==",
"dev": true,
"license": "BSD-2-Clause",
"peer": true,
"dependencies": {
"@typescript-eslint/scope-manager": "6.21.0",
"@typescript-eslint/types": "6.21.0",
@ -3174,7 +3166,6 @@
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"dev": true,
"license": "MIT",
"peer": true,
"bin": {
"acorn": "bin/acorn"
},
@ -3188,6 +3179,7 @@
"integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==",
"dev": true,
"license": "MIT",
"peer": true,
"engines": {
"node": ">=10.13.0"
},
@ -3230,7 +3222,6 @@
"integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"fast-deep-equal": "^3.1.1",
"json-schema-traverse": "^1.0.0",
@ -3708,7 +3699,6 @@
}
],
"license": "MIT",
"peer": true,
"dependencies": {
"baseline-browser-mapping": "^2.8.25",
"caniuse-lite": "^1.0.30001754",
@ -3987,15 +3977,13 @@
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz",
"integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==",
"license": "MIT",
"peer": true
"license": "MIT"
},
"node_modules/class-validator": {
"version": "0.14.3",
"resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.3.tgz",
"integrity": "sha512-rXXekcjofVN1LTOSw+u4u9WXVEUvNBVjORW154q/IdmYWy1nMbOU9aNtZB0t8m+FJQ9q91jlr2f9CwwUFdFMRA==",
"license": "MIT",
"peer": true,
"dependencies": {
"@types/validator": "^13.15.3",
"libphonenumber-js": "^1.11.1",
@ -4759,7 +4747,6 @@
"deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.6.1",
@ -4816,7 +4803,6 @@
"integrity": "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ==",
"dev": true,
"license": "MIT",
"peer": true,
"bin": {
"eslint-config-prettier": "bin/cli.js"
},
@ -5485,6 +5471,7 @@
}
],
"license": "MIT",
"peer": true,
"engines": {
"node": ">=4.0"
},
@ -6142,7 +6129,6 @@
"resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.8.2.tgz",
"integrity": "sha512-C6uC+kleiIMmjViJINWk80sOQw5lEzse1ZmvD+S/s8p8CWapftSaC+kocGTx6xrbrJ4WmYQGC08ffHLr6ToR6Q==",
"license": "MIT",
"peer": true,
"dependencies": {
"@ioredis/commands": "1.4.0",
"cluster-key-slot": "^1.1.0",
@ -6425,7 +6411,6 @@
"integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@jest/core": "^29.7.0",
"@jest/types": "^29.6.3",
@ -7270,7 +7255,6 @@
"resolved": "https://registry.npmjs.org/kafkajs/-/kafkajs-2.2.4.tgz",
"integrity": "sha512-j/YeapB1vfPT2iOIUn/vxdyKEuhuY2PxMBvf5JWux6iSaukAccrMtXEY/Lb7OvavDhOWME589bpLrEdnVHjfjA==",
"license": "MIT",
"peer": true,
"engines": {
"node": ">=14.0.0"
}
@ -8147,7 +8131,8 @@
"node_modules/pause": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz",
"integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg=="
"integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==",
"peer": true
},
"node_modules/picocolors": {
"version": "1.1.1",
@ -8274,7 +8259,6 @@
"integrity": "sha512-QgODejq9K3OzoBbuyobZlUhznP5SKwPqp+6Q6xw6o8gnhr4O85L2U915iM2IDcfF2NPXVaM9zlo9tdwipnYwzg==",
"dev": true,
"license": "MIT",
"peer": true,
"bin": {
"prettier": "bin/prettier.cjs"
},
@ -8333,7 +8317,6 @@
"devOptional": true,
"hasInstallScript": true,
"license": "Apache-2.0",
"peer": true,
"dependencies": {
"@prisma/engines": "5.22.0"
},
@ -8378,7 +8361,8 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
"license": "MIT"
"license": "MIT",
"peer": true
},
"node_modules/punycode": {
"version": "2.3.1",
@ -8549,8 +8533,7 @@
"version": "0.1.14",
"resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz",
"integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==",
"license": "Apache-2.0",
"peer": true
"license": "Apache-2.0"
},
"node_modules/repeat-string": {
"version": "1.6.1",
@ -8780,7 +8763,6 @@
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
"integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
"license": "Apache-2.0",
"peer": true,
"dependencies": {
"tslib": "^2.1.0"
}
@ -8836,7 +8818,6 @@
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"fast-deep-equal": "^3.1.1",
"fast-json-stable-stringify": "^2.0.0",
@ -9804,7 +9785,6 @@
"integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@cspotcode/source-map-support": "^0.8.0",
"@tsconfig/node10": "^1.0.7",
@ -9951,7 +9931,6 @@
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"dev": true,
"license": "Apache-2.0",
"peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@ -10248,6 +10227,7 @@
"integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
"dev": true,
"license": "BSD-2-Clause",
"peer": true,
"dependencies": {
"esrecurse": "^4.3.0",
"estraverse": "^4.1.1"
@ -10262,6 +10242,7 @@
"integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
"dev": true,
"license": "BSD-2-Clause",
"peer": true,
"engines": {
"node": ">=4.0"
}
@ -10272,6 +10253,7 @@
"integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@types/json-schema": "^7.0.9",
"ajv": "^8.9.0",

View File

@ -1,94 +1,94 @@
#!/bin/bash
# =============================================================================
# Leaderboard Service - Individual Deployment Script
# =============================================================================
set -e
SERVICE_NAME="leaderboard-service"
CONTAINER_NAME="rwa-leaderboard-service"
IMAGE_NAME="services-leaderboard-service"
PORT=3007
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[OK]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SERVICES_DIR="$(dirname "$SCRIPT_DIR")"
if [ -f "$SERVICES_DIR/.env" ]; then
export $(cat "$SERVICES_DIR/.env" | grep -v '^#' | xargs)
fi
case "$1" in
build)
log_info "Building $SERVICE_NAME..."
docker build -t "$IMAGE_NAME" "$SCRIPT_DIR"
log_success "$SERVICE_NAME built successfully"
;;
build-no-cache)
log_info "Building $SERVICE_NAME (no cache)..."
docker build --no-cache -t "$IMAGE_NAME" "$SCRIPT_DIR"
log_success "$SERVICE_NAME built successfully"
;;
start)
log_info "Starting $SERVICE_NAME..."
cd "$SERVICES_DIR"
docker compose up -d "$SERVICE_NAME"
log_success "$SERVICE_NAME started"
;;
stop)
log_info "Stopping $SERVICE_NAME..."
docker stop "$CONTAINER_NAME" 2>/dev/null || true
docker rm "$CONTAINER_NAME" 2>/dev/null || true
log_success "$SERVICE_NAME stopped"
;;
restart)
$0 stop
$0 start
;;
logs)
docker logs -f "$CONTAINER_NAME"
;;
logs-tail)
docker logs --tail 100 "$CONTAINER_NAME"
;;
status)
if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
log_success "$SERVICE_NAME is running"
docker ps --filter "name=$CONTAINER_NAME" --format "table {{.Status}}\t{{.Ports}}"
else
log_warn "$SERVICE_NAME is not running"
fi
;;
health)
log_info "Checking health of $SERVICE_NAME..."
if curl -sf "http://localhost:$PORT/health" > /dev/null 2>&1; then
log_success "$SERVICE_NAME is healthy"
else
log_error "$SERVICE_NAME health check failed"
exit 1
fi
;;
migrate)
log_info "Running migrations for $SERVICE_NAME..."
docker exec "$CONTAINER_NAME" npx prisma migrate deploy
log_success "Migrations completed"
;;
shell)
docker exec -it "$CONTAINER_NAME" sh
;;
*)
echo "Usage: $0 {build|build-no-cache|start|stop|restart|logs|logs-tail|status|health|migrate|shell}"
exit 1
;;
esac
#!/bin/bash
# =============================================================================
# Leaderboard Service - Individual Deployment Script
# =============================================================================
set -e
SERVICE_NAME="leaderboard-service"
CONTAINER_NAME="rwa-leaderboard-service"
IMAGE_NAME="services-leaderboard-service"
PORT=3007
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[OK]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SERVICES_DIR="$(dirname "$SCRIPT_DIR")"
if [ -f "$SERVICES_DIR/.env" ]; then
export $(cat "$SERVICES_DIR/.env" | grep -v '^#' | xargs)
fi
case "$1" in
build)
log_info "Building $SERVICE_NAME..."
docker build -t "$IMAGE_NAME" "$SCRIPT_DIR"
log_success "$SERVICE_NAME built successfully"
;;
build-no-cache)
log_info "Building $SERVICE_NAME (no cache)..."
docker build --no-cache -t "$IMAGE_NAME" "$SCRIPT_DIR"
log_success "$SERVICE_NAME built successfully"
;;
start)
log_info "Starting $SERVICE_NAME..."
cd "$SERVICES_DIR"
docker compose up -d "$SERVICE_NAME"
log_success "$SERVICE_NAME started"
;;
stop)
log_info "Stopping $SERVICE_NAME..."
docker stop "$CONTAINER_NAME" 2>/dev/null || true
docker rm "$CONTAINER_NAME" 2>/dev/null || true
log_success "$SERVICE_NAME stopped"
;;
restart)
$0 stop
$0 start
;;
logs)
docker logs -f "$CONTAINER_NAME"
;;
logs-tail)
docker logs --tail 100 "$CONTAINER_NAME"
;;
status)
if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
log_success "$SERVICE_NAME is running"
docker ps --filter "name=$CONTAINER_NAME" --format "table {{.Status}}\t{{.Ports}}"
else
log_warn "$SERVICE_NAME is not running"
fi
;;
health)
log_info "Checking health of $SERVICE_NAME..."
if curl -sf "http://localhost:$PORT/health" > /dev/null 2>&1; then
log_success "$SERVICE_NAME is healthy"
else
log_error "$SERVICE_NAME health check failed"
exit 1
fi
;;
migrate)
log_info "Running migrations for $SERVICE_NAME..."
docker exec "$CONTAINER_NAME" npx prisma migrate deploy
log_success "Migrations completed"
;;
shell)
docker exec -it "$CONTAINER_NAME" sh
;;
*)
echo "Usage: $0 {build|build-no-cache|start|stop|restart|logs|logs-tail|status|health|migrate|shell}"
exit 1
;;
esac

View File

@ -1,94 +1,94 @@
#!/bin/bash
# =============================================================================
# Planting Service - Individual Deployment Script
# =============================================================================
set -e
SERVICE_NAME="planting-service"
CONTAINER_NAME="rwa-planting-service"
IMAGE_NAME="services-planting-service"
PORT=3003
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[OK]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SERVICES_DIR="$(dirname "$SCRIPT_DIR")"
if [ -f "$SERVICES_DIR/.env" ]; then
export $(cat "$SERVICES_DIR/.env" | grep -v '^#' | xargs)
fi
case "$1" in
build)
log_info "Building $SERVICE_NAME..."
docker build -t "$IMAGE_NAME" "$SCRIPT_DIR"
log_success "$SERVICE_NAME built successfully"
;;
build-no-cache)
log_info "Building $SERVICE_NAME (no cache)..."
docker build --no-cache -t "$IMAGE_NAME" "$SCRIPT_DIR"
log_success "$SERVICE_NAME built successfully"
;;
start)
log_info "Starting $SERVICE_NAME..."
cd "$SERVICES_DIR"
docker compose up -d "$SERVICE_NAME"
log_success "$SERVICE_NAME started"
;;
stop)
log_info "Stopping $SERVICE_NAME..."
docker stop "$CONTAINER_NAME" 2>/dev/null || true
docker rm "$CONTAINER_NAME" 2>/dev/null || true
log_success "$SERVICE_NAME stopped"
;;
restart)
$0 stop
$0 start
;;
logs)
docker logs -f "$CONTAINER_NAME"
;;
logs-tail)
docker logs --tail 100 "$CONTAINER_NAME"
;;
status)
if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
log_success "$SERVICE_NAME is running"
docker ps --filter "name=$CONTAINER_NAME" --format "table {{.Status}}\t{{.Ports}}"
else
log_warn "$SERVICE_NAME is not running"
fi
;;
health)
log_info "Checking health of $SERVICE_NAME..."
if curl -sf "http://localhost:$PORT/api/v1/health" > /dev/null 2>&1; then
log_success "$SERVICE_NAME is healthy"
else
log_error "$SERVICE_NAME health check failed"
exit 1
fi
;;
migrate)
log_info "Running migrations for $SERVICE_NAME..."
docker exec "$CONTAINER_NAME" npx prisma migrate deploy
log_success "Migrations completed"
;;
shell)
docker exec -it "$CONTAINER_NAME" sh
;;
*)
echo "Usage: $0 {build|build-no-cache|start|stop|restart|logs|logs-tail|status|health|migrate|shell}"
exit 1
;;
esac
#!/bin/bash
# =============================================================================
# Planting Service - Individual Deployment Script
# =============================================================================
set -e
SERVICE_NAME="planting-service"
CONTAINER_NAME="rwa-planting-service"
IMAGE_NAME="services-planting-service"
PORT=3003
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[OK]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SERVICES_DIR="$(dirname "$SCRIPT_DIR")"
if [ -f "$SERVICES_DIR/.env" ]; then
export $(cat "$SERVICES_DIR/.env" | grep -v '^#' | xargs)
fi
case "$1" in
build)
log_info "Building $SERVICE_NAME..."
docker build -t "$IMAGE_NAME" "$SCRIPT_DIR"
log_success "$SERVICE_NAME built successfully"
;;
build-no-cache)
log_info "Building $SERVICE_NAME (no cache)..."
docker build --no-cache -t "$IMAGE_NAME" "$SCRIPT_DIR"
log_success "$SERVICE_NAME built successfully"
;;
start)
log_info "Starting $SERVICE_NAME..."
cd "$SERVICES_DIR"
docker compose up -d "$SERVICE_NAME"
log_success "$SERVICE_NAME started"
;;
stop)
log_info "Stopping $SERVICE_NAME..."
docker stop "$CONTAINER_NAME" 2>/dev/null || true
docker rm "$CONTAINER_NAME" 2>/dev/null || true
log_success "$SERVICE_NAME stopped"
;;
restart)
$0 stop
$0 start
;;
logs)
docker logs -f "$CONTAINER_NAME"
;;
logs-tail)
docker logs --tail 100 "$CONTAINER_NAME"
;;
status)
if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
log_success "$SERVICE_NAME is running"
docker ps --filter "name=$CONTAINER_NAME" --format "table {{.Status}}\t{{.Ports}}"
else
log_warn "$SERVICE_NAME is not running"
fi
;;
health)
log_info "Checking health of $SERVICE_NAME..."
if curl -sf "http://localhost:$PORT/api/v1/health" > /dev/null 2>&1; then
log_success "$SERVICE_NAME is healthy"
else
log_error "$SERVICE_NAME health check failed"
exit 1
fi
;;
migrate)
log_info "Running migrations for $SERVICE_NAME..."
docker exec "$CONTAINER_NAME" npx prisma migrate deploy
log_success "Migrations completed"
;;
shell)
docker exec -it "$CONTAINER_NAME" sh
;;
*)
echo "Usage: $0 {build|build-no-cache|start|stop|restart|logs|logs-tail|status|health|migrate|shell}"
exit 1
;;
esac

View File

@ -1,253 +1,253 @@
#!/bin/bash
# =============================================================================
# Presence Service - Individual Deployment Script
# =============================================================================
# Uses shared infrastructure from main docker-compose.yml
# =============================================================================
set -e
SERVICE_NAME="presence-service"
CONTAINER_NAME="rwa-presence-service"
IMAGE_NAME="services-presence-service"
PORT=3011
HEALTH_ENDPOINT="http://localhost:${PORT}/api/v1/health"
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[OK]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
# Get script directory
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SERVICES_DIR="$(dirname "$SCRIPT_DIR")"
# Load environment from parent services directory (shared .env)
load_env() {
if [ -f "$SERVICES_DIR/.env" ]; then
export $(cat "$SERVICES_DIR/.env" | grep -v '^#' | xargs)
log_info "Loaded .env from $SERVICES_DIR"
elif [ -f "$SCRIPT_DIR/.env.production" ]; then
export $(cat "$SCRIPT_DIR/.env.production" | grep -v '^#' | xargs)
log_info "Loaded .env.production from $SCRIPT_DIR"
fi
}
case "$1" in
build)
log_info "Building $SERVICE_NAME..."
docker build -t "$IMAGE_NAME" "$SCRIPT_DIR"
log_success "$SERVICE_NAME built successfully"
;;
build-no-cache)
log_info "Building $SERVICE_NAME (no cache)..."
docker build --no-cache -t "$IMAGE_NAME" "$SCRIPT_DIR"
log_success "$SERVICE_NAME built successfully"
;;
start)
load_env
log_info "Starting $SERVICE_NAME using shared infrastructure..."
cd "$SERVICES_DIR"
# Use --no-deps to avoid recreating infrastructure that's already running
docker compose up -d --no-deps "$SERVICE_NAME"
log_success "$SERVICE_NAME started"
log_info "Waiting for service to be healthy..."
sleep 5
bash "$SCRIPT_DIR/deploy.sh" health
;;
start-deps)
log_info "Starting dependencies only (for local development)..."
cd "$SCRIPT_DIR"
docker compose -f docker-compose.dev.yml up -d
log_success "Dependencies started"
;;
stop)
log_info "Stopping $SERVICE_NAME..."
docker stop "$CONTAINER_NAME" 2>/dev/null || true
docker rm "$CONTAINER_NAME" 2>/dev/null || true
log_success "$SERVICE_NAME stopped"
;;
stop-deps)
log_info "Stopping dependencies..."
cd "$SCRIPT_DIR"
docker compose -f docker-compose.dev.yml down
log_success "Dependencies stopped"
;;
restart)
bash "$SCRIPT_DIR/deploy.sh" stop
bash "$SCRIPT_DIR/deploy.sh" start
;;
up)
load_env
log_info "Starting $SERVICE_NAME in foreground..."
cd "$SERVICES_DIR"
# Use --no-deps to avoid recreating infrastructure that's already running
docker compose up --no-deps "$SERVICE_NAME"
;;
logs)
docker logs -f "$CONTAINER_NAME"
;;
logs-tail)
docker logs --tail 100 "$CONTAINER_NAME"
;;
logs-all)
cd "$SERVICES_DIR"
docker compose logs -f "$SERVICE_NAME"
;;
status)
if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
log_success "$SERVICE_NAME is running"
docker ps --filter "name=$CONTAINER_NAME" --format "table {{.Status}}\t{{.Ports}}"
else
log_warn "$SERVICE_NAME is not running"
fi
;;
health)
log_info "Checking health of $SERVICE_NAME..."
if curl -sf "$HEALTH_ENDPOINT" > /dev/null 2>&1; then
HEALTH=$(curl -s "$HEALTH_ENDPOINT")
log_success "$SERVICE_NAME is healthy"
echo "$HEALTH" | jq . 2>/dev/null || echo "$HEALTH"
else
log_error "$SERVICE_NAME health check failed"
exit 1
fi
;;
init-db)
log_info "Creating database rwa_presence..."
docker exec rwa-postgres psql -U rwa_user -d postgres -c "CREATE DATABASE rwa_presence;" 2>/dev/null || \
log_warn "Database may already exist"
log_success "Database rwa_presence created (or already exists)"
log_info "Running Prisma db push to create tables..."
docker exec "$CONTAINER_NAME" npx prisma db push --skip-generate 2>/dev/null || \
log_warn "Could not push schema (container may not be running)"
;;
migrate)
log_info "Running migrations for $SERVICE_NAME..."
docker exec "$CONTAINER_NAME" npx prisma migrate deploy
log_success "Migrations completed"
;;
migrate-dev)
log_info "Running dev migrations for $SERVICE_NAME..."
docker exec "$CONTAINER_NAME" npx prisma migrate dev
;;
db-push)
log_info "Pushing schema to database..."
docker exec "$CONTAINER_NAME" npx prisma db push
log_success "Schema pushed"
;;
prisma-studio)
log_info "Starting Prisma Studio..."
docker exec -it "$CONTAINER_NAME" npx prisma studio
;;
shell)
log_info "Opening shell in $SERVICE_NAME container..."
docker exec -it "$CONTAINER_NAME" sh
;;
test)
log_info "Running tests for $SERVICE_NAME..."
cd "$SCRIPT_DIR"
npm test
;;
test-unit)
log_info "Running unit tests..."
cd "$SCRIPT_DIR"
npm run test:unit
;;
test-integration)
log_info "Running integration tests..."
cd "$SCRIPT_DIR"
npm run test:integration
;;
test-e2e)
log_info "Running E2E tests..."
cd "$SCRIPT_DIR"
npm run test:e2e
;;
clean)
log_info "Cleaning up..."
docker stop "$CONTAINER_NAME" 2>/dev/null || true
docker rm "$CONTAINER_NAME" 2>/dev/null || true
log_success "Cleanup completed"
;;
clean-all)
log_info "Cleaning $SERVICE_NAME (removing container and image)..."
docker stop "$CONTAINER_NAME" 2>/dev/null || true
docker rm "$CONTAINER_NAME" 2>/dev/null || true
docker rmi "$IMAGE_NAME" 2>/dev/null || true
log_success "$SERVICE_NAME fully cleaned"
;;
*)
echo "Usage: $0 {command}"
echo ""
echo "Build Commands:"
echo " build - Build Docker image"
echo " build-no-cache - Build Docker image without cache"
echo ""
echo "Service Commands:"
echo " start - Start using shared infrastructure"
echo " start-deps - Start dependencies only (for local development)"
echo " stop - Stop the service container"
echo " stop-deps - Stop dependencies only"
echo " restart - Restart the service"
echo " up - Start in foreground mode"
echo ""
echo "Monitoring Commands:"
echo " logs - Follow logs"
echo " logs-tail - Show last 100 log lines"
echo " logs-all - Follow logs via docker compose"
echo " status - Show service status"
echo " health - Check service health"
echo ""
echo "Database Commands:"
echo " init-db - Create database and push schema"
echo " migrate - Run database migrations (production)"
echo " migrate-dev - Run dev migrations"
echo " db-push - Push Prisma schema to database"
echo " prisma-studio - Open Prisma Studio"
echo ""
echo "Development Commands:"
echo " shell - Open shell in container"
echo " test - Run all tests"
echo " test-unit - Run unit tests only"
echo " test-integration - Run integration tests only"
echo " test-e2e - Run E2E tests only"
echo ""
echo "Maintenance Commands:"
echo " clean - Remove container"
echo " clean-all - Remove container and image"
exit 1
;;
esac
#!/bin/bash
# =============================================================================
# Presence Service - Individual Deployment Script
# =============================================================================
# Uses shared infrastructure from main docker-compose.yml
# =============================================================================
set -e
SERVICE_NAME="presence-service"
CONTAINER_NAME="rwa-presence-service"
IMAGE_NAME="services-presence-service"
PORT=3011
HEALTH_ENDPOINT="http://localhost:${PORT}/api/v1/health"
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[OK]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
# Get script directory
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SERVICES_DIR="$(dirname "$SCRIPT_DIR")"
# Load environment from parent services directory (shared .env)
load_env() {
if [ -f "$SERVICES_DIR/.env" ]; then
export $(cat "$SERVICES_DIR/.env" | grep -v '^#' | xargs)
log_info "Loaded .env from $SERVICES_DIR"
elif [ -f "$SCRIPT_DIR/.env.production" ]; then
export $(cat "$SCRIPT_DIR/.env.production" | grep -v '^#' | xargs)
log_info "Loaded .env.production from $SCRIPT_DIR"
fi
}
case "$1" in
build)
log_info "Building $SERVICE_NAME..."
docker build -t "$IMAGE_NAME" "$SCRIPT_DIR"
log_success "$SERVICE_NAME built successfully"
;;
build-no-cache)
log_info "Building $SERVICE_NAME (no cache)..."
docker build --no-cache -t "$IMAGE_NAME" "$SCRIPT_DIR"
log_success "$SERVICE_NAME built successfully"
;;
start)
load_env
log_info "Starting $SERVICE_NAME using shared infrastructure..."
cd "$SERVICES_DIR"
# Use --no-deps to avoid recreating infrastructure that's already running
docker compose up -d --no-deps "$SERVICE_NAME"
log_success "$SERVICE_NAME started"
log_info "Waiting for service to be healthy..."
sleep 5
bash "$SCRIPT_DIR/deploy.sh" health
;;
start-deps)
log_info "Starting dependencies only (for local development)..."
cd "$SCRIPT_DIR"
docker compose -f docker-compose.dev.yml up -d
log_success "Dependencies started"
;;
stop)
log_info "Stopping $SERVICE_NAME..."
docker stop "$CONTAINER_NAME" 2>/dev/null || true
docker rm "$CONTAINER_NAME" 2>/dev/null || true
log_success "$SERVICE_NAME stopped"
;;
stop-deps)
log_info "Stopping dependencies..."
cd "$SCRIPT_DIR"
docker compose -f docker-compose.dev.yml down
log_success "Dependencies stopped"
;;
restart)
bash "$SCRIPT_DIR/deploy.sh" stop
bash "$SCRIPT_DIR/deploy.sh" start
;;
up)
load_env
log_info "Starting $SERVICE_NAME in foreground..."
cd "$SERVICES_DIR"
# Use --no-deps to avoid recreating infrastructure that's already running
docker compose up --no-deps "$SERVICE_NAME"
;;
logs)
docker logs -f "$CONTAINER_NAME"
;;
logs-tail)
docker logs --tail 100 "$CONTAINER_NAME"
;;
logs-all)
cd "$SERVICES_DIR"
docker compose logs -f "$SERVICE_NAME"
;;
status)
if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
log_success "$SERVICE_NAME is running"
docker ps --filter "name=$CONTAINER_NAME" --format "table {{.Status}}\t{{.Ports}}"
else
log_warn "$SERVICE_NAME is not running"
fi
;;
health)
log_info "Checking health of $SERVICE_NAME..."
if curl -sf "$HEALTH_ENDPOINT" > /dev/null 2>&1; then
HEALTH=$(curl -s "$HEALTH_ENDPOINT")
log_success "$SERVICE_NAME is healthy"
echo "$HEALTH" | jq . 2>/dev/null || echo "$HEALTH"
else
log_error "$SERVICE_NAME health check failed"
exit 1
fi
;;
init-db)
log_info "Creating database rwa_presence..."
docker exec rwa-postgres psql -U rwa_user -d postgres -c "CREATE DATABASE rwa_presence;" 2>/dev/null || \
log_warn "Database may already exist"
log_success "Database rwa_presence created (or already exists)"
log_info "Running Prisma db push to create tables..."
docker exec "$CONTAINER_NAME" npx prisma db push --skip-generate 2>/dev/null || \
log_warn "Could not push schema (container may not be running)"
;;
migrate)
log_info "Running migrations for $SERVICE_NAME..."
docker exec "$CONTAINER_NAME" npx prisma migrate deploy
log_success "Migrations completed"
;;
migrate-dev)
log_info "Running dev migrations for $SERVICE_NAME..."
docker exec "$CONTAINER_NAME" npx prisma migrate dev
;;
db-push)
log_info "Pushing schema to database..."
docker exec "$CONTAINER_NAME" npx prisma db push
log_success "Schema pushed"
;;
prisma-studio)
log_info "Starting Prisma Studio..."
docker exec -it "$CONTAINER_NAME" npx prisma studio
;;
shell)
log_info "Opening shell in $SERVICE_NAME container..."
docker exec -it "$CONTAINER_NAME" sh
;;
test)
log_info "Running tests for $SERVICE_NAME..."
cd "$SCRIPT_DIR"
npm test
;;
test-unit)
log_info "Running unit tests..."
cd "$SCRIPT_DIR"
npm run test:unit
;;
test-integration)
log_info "Running integration tests..."
cd "$SCRIPT_DIR"
npm run test:integration
;;
test-e2e)
log_info "Running E2E tests..."
cd "$SCRIPT_DIR"
npm run test:e2e
;;
clean)
log_info "Cleaning up..."
docker stop "$CONTAINER_NAME" 2>/dev/null || true
docker rm "$CONTAINER_NAME" 2>/dev/null || true
log_success "Cleanup completed"
;;
clean-all)
log_info "Cleaning $SERVICE_NAME (removing container and image)..."
docker stop "$CONTAINER_NAME" 2>/dev/null || true
docker rm "$CONTAINER_NAME" 2>/dev/null || true
docker rmi "$IMAGE_NAME" 2>/dev/null || true
log_success "$SERVICE_NAME fully cleaned"
;;
*)
echo "Usage: $0 {command}"
echo ""
echo "Build Commands:"
echo " build - Build Docker image"
echo " build-no-cache - Build Docker image without cache"
echo ""
echo "Service Commands:"
echo " start - Start using shared infrastructure"
echo " start-deps - Start dependencies only (for local development)"
echo " stop - Stop the service container"
echo " stop-deps - Stop dependencies only"
echo " restart - Restart the service"
echo " up - Start in foreground mode"
echo ""
echo "Monitoring Commands:"
echo " logs - Follow logs"
echo " logs-tail - Show last 100 log lines"
echo " logs-all - Follow logs via docker compose"
echo " status - Show service status"
echo " health - Check service health"
echo ""
echo "Database Commands:"
echo " init-db - Create database and push schema"
echo " migrate - Run database migrations (production)"
echo " migrate-dev - Run dev migrations"
echo " db-push - Push Prisma schema to database"
echo " prisma-studio - Open Prisma Studio"
echo ""
echo "Development Commands:"
echo " shell - Open shell in container"
echo " test - Run all tests"
echo " test-unit - Run unit tests only"
echo " test-integration - Run integration tests only"
echo " test-e2e - Run E2E tests only"
echo ""
echo "Maintenance Commands:"
echo " clean - Remove container"
echo " clean-all - Remove container and image"
exit 1
;;
esac

View File

@ -1,94 +1,94 @@
#!/bin/bash
# =============================================================================
# Referral Service - Individual Deployment Script
# =============================================================================
set -e
SERVICE_NAME="referral-service"
CONTAINER_NAME="rwa-referral-service"
IMAGE_NAME="services-referral-service"
PORT=3004
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[OK]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SERVICES_DIR="$(dirname "$SCRIPT_DIR")"
if [ -f "$SERVICES_DIR/.env" ]; then
export $(cat "$SERVICES_DIR/.env" | grep -v '^#' | xargs)
fi
case "$1" in
build)
log_info "Building $SERVICE_NAME..."
docker build -t "$IMAGE_NAME" "$SCRIPT_DIR"
log_success "$SERVICE_NAME built successfully"
;;
build-no-cache)
log_info "Building $SERVICE_NAME (no cache)..."
docker build --no-cache -t "$IMAGE_NAME" "$SCRIPT_DIR"
log_success "$SERVICE_NAME built successfully"
;;
start)
log_info "Starting $SERVICE_NAME..."
cd "$SERVICES_DIR"
docker compose up -d "$SERVICE_NAME"
log_success "$SERVICE_NAME started"
;;
stop)
log_info "Stopping $SERVICE_NAME..."
docker stop "$CONTAINER_NAME" 2>/dev/null || true
docker rm "$CONTAINER_NAME" 2>/dev/null || true
log_success "$SERVICE_NAME stopped"
;;
restart)
$0 stop
$0 start
;;
logs)
docker logs -f "$CONTAINER_NAME"
;;
logs-tail)
docker logs --tail 100 "$CONTAINER_NAME"
;;
status)
if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
log_success "$SERVICE_NAME is running"
docker ps --filter "name=$CONTAINER_NAME" --format "table {{.Status}}\t{{.Ports}}"
else
log_warn "$SERVICE_NAME is not running"
fi
;;
health)
log_info "Checking health of $SERVICE_NAME..."
if curl -sf "http://localhost:$PORT/health" > /dev/null 2>&1; then
log_success "$SERVICE_NAME is healthy"
else
log_error "$SERVICE_NAME health check failed"
exit 1
fi
;;
migrate)
log_info "Running migrations for $SERVICE_NAME..."
docker exec "$CONTAINER_NAME" npx prisma migrate deploy
log_success "Migrations completed"
;;
shell)
docker exec -it "$CONTAINER_NAME" sh
;;
*)
echo "Usage: $0 {build|build-no-cache|start|stop|restart|logs|logs-tail|status|health|migrate|shell}"
exit 1
;;
esac
#!/bin/bash
# =============================================================================
# Referral Service - Individual Deployment Script
# =============================================================================
set -e
SERVICE_NAME="referral-service"
CONTAINER_NAME="rwa-referral-service"
IMAGE_NAME="services-referral-service"
PORT=3004
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[OK]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SERVICES_DIR="$(dirname "$SCRIPT_DIR")"
if [ -f "$SERVICES_DIR/.env" ]; then
export $(cat "$SERVICES_DIR/.env" | grep -v '^#' | xargs)
fi
case "$1" in
build)
log_info "Building $SERVICE_NAME..."
docker build -t "$IMAGE_NAME" "$SCRIPT_DIR"
log_success "$SERVICE_NAME built successfully"
;;
build-no-cache)
log_info "Building $SERVICE_NAME (no cache)..."
docker build --no-cache -t "$IMAGE_NAME" "$SCRIPT_DIR"
log_success "$SERVICE_NAME built successfully"
;;
start)
log_info "Starting $SERVICE_NAME..."
cd "$SERVICES_DIR"
docker compose up -d "$SERVICE_NAME"
log_success "$SERVICE_NAME started"
;;
stop)
log_info "Stopping $SERVICE_NAME..."
docker stop "$CONTAINER_NAME" 2>/dev/null || true
docker rm "$CONTAINER_NAME" 2>/dev/null || true
log_success "$SERVICE_NAME stopped"
;;
restart)
$0 stop
$0 start
;;
logs)
docker logs -f "$CONTAINER_NAME"
;;
logs-tail)
docker logs --tail 100 "$CONTAINER_NAME"
;;
status)
if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
log_success "$SERVICE_NAME is running"
docker ps --filter "name=$CONTAINER_NAME" --format "table {{.Status}}\t{{.Ports}}"
else
log_warn "$SERVICE_NAME is not running"
fi
;;
health)
log_info "Checking health of $SERVICE_NAME..."
if curl -sf "http://localhost:$PORT/health" > /dev/null 2>&1; then
log_success "$SERVICE_NAME is healthy"
else
log_error "$SERVICE_NAME health check failed"
exit 1
fi
;;
migrate)
log_info "Running migrations for $SERVICE_NAME..."
docker exec "$CONTAINER_NAME" npx prisma migrate deploy
log_success "Migrations completed"
;;
shell)
docker exec -it "$CONTAINER_NAME" sh
;;
*)
echo "Usage: $0 {build|build-no-cache|start|stop|restart|logs|logs-tail|status|health|migrate|shell}"
exit 1
;;
esac

View File

@ -1,94 +1,94 @@
#!/bin/bash
# =============================================================================
# Reporting Service - Individual Deployment Script
# =============================================================================
set -e
SERVICE_NAME="reporting-service"
CONTAINER_NAME="rwa-reporting-service"
IMAGE_NAME="services-reporting-service"
PORT=3008
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[OK]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SERVICES_DIR="$(dirname "$SCRIPT_DIR")"
if [ -f "$SERVICES_DIR/.env" ]; then
export $(cat "$SERVICES_DIR/.env" | grep -v '^#' | xargs)
fi
case "$1" in
build)
log_info "Building $SERVICE_NAME..."
docker build -t "$IMAGE_NAME" "$SCRIPT_DIR"
log_success "$SERVICE_NAME built successfully"
;;
build-no-cache)
log_info "Building $SERVICE_NAME (no cache)..."
docker build --no-cache -t "$IMAGE_NAME" "$SCRIPT_DIR"
log_success "$SERVICE_NAME built successfully"
;;
start)
log_info "Starting $SERVICE_NAME..."
cd "$SERVICES_DIR"
docker compose up -d "$SERVICE_NAME"
log_success "$SERVICE_NAME started"
;;
stop)
log_info "Stopping $SERVICE_NAME..."
docker stop "$CONTAINER_NAME" 2>/dev/null || true
docker rm "$CONTAINER_NAME" 2>/dev/null || true
log_success "$SERVICE_NAME stopped"
;;
restart)
$0 stop
$0 start
;;
logs)
docker logs -f "$CONTAINER_NAME"
;;
logs-tail)
docker logs --tail 100 "$CONTAINER_NAME"
;;
status)
if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
log_success "$SERVICE_NAME is running"
docker ps --filter "name=$CONTAINER_NAME" --format "table {{.Status}}\t{{.Ports}}"
else
log_warn "$SERVICE_NAME is not running"
fi
;;
health)
log_info "Checking health of $SERVICE_NAME..."
if curl -sf "http://localhost:$PORT/health" > /dev/null 2>&1; then
log_success "$SERVICE_NAME is healthy"
else
log_error "$SERVICE_NAME health check failed"
exit 1
fi
;;
migrate)
log_info "Running migrations for $SERVICE_NAME..."
docker exec "$CONTAINER_NAME" npx prisma migrate deploy
log_success "Migrations completed"
;;
shell)
docker exec -it "$CONTAINER_NAME" sh
;;
*)
echo "Usage: $0 {build|build-no-cache|start|stop|restart|logs|logs-tail|status|health|migrate|shell}"
exit 1
;;
esac
#!/bin/bash
# =============================================================================
# Reporting Service - Individual Deployment Script
# =============================================================================
set -e
SERVICE_NAME="reporting-service"
CONTAINER_NAME="rwa-reporting-service"
IMAGE_NAME="services-reporting-service"
PORT=3008
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[OK]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SERVICES_DIR="$(dirname "$SCRIPT_DIR")"
if [ -f "$SERVICES_DIR/.env" ]; then
export $(cat "$SERVICES_DIR/.env" | grep -v '^#' | xargs)
fi
case "$1" in
build)
log_info "Building $SERVICE_NAME..."
docker build -t "$IMAGE_NAME" "$SCRIPT_DIR"
log_success "$SERVICE_NAME built successfully"
;;
build-no-cache)
log_info "Building $SERVICE_NAME (no cache)..."
docker build --no-cache -t "$IMAGE_NAME" "$SCRIPT_DIR"
log_success "$SERVICE_NAME built successfully"
;;
start)
log_info "Starting $SERVICE_NAME..."
cd "$SERVICES_DIR"
docker compose up -d "$SERVICE_NAME"
log_success "$SERVICE_NAME started"
;;
stop)
log_info "Stopping $SERVICE_NAME..."
docker stop "$CONTAINER_NAME" 2>/dev/null || true
docker rm "$CONTAINER_NAME" 2>/dev/null || true
log_success "$SERVICE_NAME stopped"
;;
restart)
$0 stop
$0 start
;;
logs)
docker logs -f "$CONTAINER_NAME"
;;
logs-tail)
docker logs --tail 100 "$CONTAINER_NAME"
;;
status)
if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
log_success "$SERVICE_NAME is running"
docker ps --filter "name=$CONTAINER_NAME" --format "table {{.Status}}\t{{.Ports}}"
else
log_warn "$SERVICE_NAME is not running"
fi
;;
health)
log_info "Checking health of $SERVICE_NAME..."
if curl -sf "http://localhost:$PORT/health" > /dev/null 2>&1; then
log_success "$SERVICE_NAME is healthy"
else
log_error "$SERVICE_NAME health check failed"
exit 1
fi
;;
migrate)
log_info "Running migrations for $SERVICE_NAME..."
docker exec "$CONTAINER_NAME" npx prisma migrate deploy
log_success "Migrations completed"
;;
shell)
docker exec -it "$CONTAINER_NAME" sh
;;
*)
echo "Usage: $0 {build|build-no-cache|start|stop|restart|logs|logs-tail|status|health|migrate|shell}"
exit 1
;;
esac

View File

@ -1,94 +1,94 @@
#!/bin/bash
# =============================================================================
# Reward Service - Individual Deployment Script
# =============================================================================
set -e
SERVICE_NAME="reward-service"
CONTAINER_NAME="rwa-reward-service"
IMAGE_NAME="services-reward-service"
PORT=3005
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[OK]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SERVICES_DIR="$(dirname "$SCRIPT_DIR")"
if [ -f "$SERVICES_DIR/.env" ]; then
export $(cat "$SERVICES_DIR/.env" | grep -v '^#' | xargs)
fi
case "$1" in
build)
log_info "Building $SERVICE_NAME..."
docker build -t "$IMAGE_NAME" "$SCRIPT_DIR"
log_success "$SERVICE_NAME built successfully"
;;
build-no-cache)
log_info "Building $SERVICE_NAME (no cache)..."
docker build --no-cache -t "$IMAGE_NAME" "$SCRIPT_DIR"
log_success "$SERVICE_NAME built successfully"
;;
start)
log_info "Starting $SERVICE_NAME..."
cd "$SERVICES_DIR"
docker compose up -d "$SERVICE_NAME"
log_success "$SERVICE_NAME started"
;;
stop)
log_info "Stopping $SERVICE_NAME..."
docker stop "$CONTAINER_NAME" 2>/dev/null || true
docker rm "$CONTAINER_NAME" 2>/dev/null || true
log_success "$SERVICE_NAME stopped"
;;
restart)
$0 stop
$0 start
;;
logs)
docker logs -f "$CONTAINER_NAME"
;;
logs-tail)
docker logs --tail 100 "$CONTAINER_NAME"
;;
status)
if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
log_success "$SERVICE_NAME is running"
docker ps --filter "name=$CONTAINER_NAME" --format "table {{.Status}}\t{{.Ports}}"
else
log_warn "$SERVICE_NAME is not running"
fi
;;
health)
log_info "Checking health of $SERVICE_NAME..."
if curl -sf "http://localhost:$PORT/health" > /dev/null 2>&1; then
log_success "$SERVICE_NAME is healthy"
else
log_error "$SERVICE_NAME health check failed"
exit 1
fi
;;
migrate)
log_info "Running migrations for $SERVICE_NAME..."
docker exec "$CONTAINER_NAME" npx prisma migrate deploy
log_success "Migrations completed"
;;
shell)
docker exec -it "$CONTAINER_NAME" sh
;;
*)
echo "Usage: $0 {build|build-no-cache|start|stop|restart|logs|logs-tail|status|health|migrate|shell}"
exit 1
;;
esac
#!/bin/bash
# =============================================================================
# Reward Service - Individual Deployment Script
# =============================================================================
set -e
SERVICE_NAME="reward-service"
CONTAINER_NAME="rwa-reward-service"
IMAGE_NAME="services-reward-service"
PORT=3005
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[OK]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SERVICES_DIR="$(dirname "$SCRIPT_DIR")"
if [ -f "$SERVICES_DIR/.env" ]; then
export $(cat "$SERVICES_DIR/.env" | grep -v '^#' | xargs)
fi
case "$1" in
build)
log_info "Building $SERVICE_NAME..."
docker build -t "$IMAGE_NAME" "$SCRIPT_DIR"
log_success "$SERVICE_NAME built successfully"
;;
build-no-cache)
log_info "Building $SERVICE_NAME (no cache)..."
docker build --no-cache -t "$IMAGE_NAME" "$SCRIPT_DIR"
log_success "$SERVICE_NAME built successfully"
;;
start)
log_info "Starting $SERVICE_NAME..."
cd "$SERVICES_DIR"
docker compose up -d "$SERVICE_NAME"
log_success "$SERVICE_NAME started"
;;
stop)
log_info "Stopping $SERVICE_NAME..."
docker stop "$CONTAINER_NAME" 2>/dev/null || true
docker rm "$CONTAINER_NAME" 2>/dev/null || true
log_success "$SERVICE_NAME stopped"
;;
restart)
$0 stop
$0 start
;;
logs)
docker logs -f "$CONTAINER_NAME"
;;
logs-tail)
docker logs --tail 100 "$CONTAINER_NAME"
;;
status)
if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
log_success "$SERVICE_NAME is running"
docker ps --filter "name=$CONTAINER_NAME" --format "table {{.Status}}\t{{.Ports}}"
else
log_warn "$SERVICE_NAME is not running"
fi
;;
health)
log_info "Checking health of $SERVICE_NAME..."
if curl -sf "http://localhost:$PORT/health" > /dev/null 2>&1; then
log_success "$SERVICE_NAME is healthy"
else
log_error "$SERVICE_NAME health check failed"
exit 1
fi
;;
migrate)
log_info "Running migrations for $SERVICE_NAME..."
docker exec "$CONTAINER_NAME" npx prisma migrate deploy
log_success "Migrations completed"
;;
shell)
docker exec -it "$CONTAINER_NAME" sh
;;
*)
echo "Usage: $0 {build|build-no-cache|start|stop|restart|logs|logs-tail|status|health|migrate|shell}"
exit 1
;;
esac

View File

@ -1,94 +1,94 @@
#!/bin/bash
# =============================================================================
# Wallet Service - Individual Deployment Script
# =============================================================================
set -e
SERVICE_NAME="wallet-service"
CONTAINER_NAME="rwa-wallet-service"
IMAGE_NAME="services-wallet-service"
PORT=3001
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[OK]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SERVICES_DIR="$(dirname "$SCRIPT_DIR")"
if [ -f "$SERVICES_DIR/.env" ]; then
export $(cat "$SERVICES_DIR/.env" | grep -v '^#' | xargs)
fi
case "$1" in
build)
log_info "Building $SERVICE_NAME..."
docker build -t "$IMAGE_NAME" "$SCRIPT_DIR"
log_success "$SERVICE_NAME built successfully"
;;
build-no-cache)
log_info "Building $SERVICE_NAME (no cache)..."
docker build --no-cache -t "$IMAGE_NAME" "$SCRIPT_DIR"
log_success "$SERVICE_NAME built successfully"
;;
start)
log_info "Starting $SERVICE_NAME..."
cd "$SERVICES_DIR"
docker compose up -d "$SERVICE_NAME"
log_success "$SERVICE_NAME started"
;;
stop)
log_info "Stopping $SERVICE_NAME..."
docker stop "$CONTAINER_NAME" 2>/dev/null || true
docker rm "$CONTAINER_NAME" 2>/dev/null || true
log_success "$SERVICE_NAME stopped"
;;
restart)
$0 stop
$0 start
;;
logs)
docker logs -f "$CONTAINER_NAME"
;;
logs-tail)
docker logs --tail 100 "$CONTAINER_NAME"
;;
status)
if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
log_success "$SERVICE_NAME is running"
docker ps --filter "name=$CONTAINER_NAME" --format "table {{.Status}}\t{{.Ports}}"
else
log_warn "$SERVICE_NAME is not running"
fi
;;
health)
log_info "Checking health of $SERVICE_NAME..."
if curl -sf "http://localhost:$PORT/health" > /dev/null 2>&1; then
log_success "$SERVICE_NAME is healthy"
else
log_error "$SERVICE_NAME health check failed"
exit 1
fi
;;
migrate)
log_info "Running migrations for $SERVICE_NAME..."
docker exec "$CONTAINER_NAME" npx prisma migrate deploy
log_success "Migrations completed"
;;
shell)
docker exec -it "$CONTAINER_NAME" sh
;;
*)
echo "Usage: $0 {build|build-no-cache|start|stop|restart|logs|logs-tail|status|health|migrate|shell}"
exit 1
;;
esac
#!/bin/bash
# =============================================================================
# Wallet Service - Individual Deployment Script
# =============================================================================
set -e
SERVICE_NAME="wallet-service"
CONTAINER_NAME="rwa-wallet-service"
IMAGE_NAME="services-wallet-service"
PORT=3001
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[OK]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SERVICES_DIR="$(dirname "$SCRIPT_DIR")"
if [ -f "$SERVICES_DIR/.env" ]; then
export $(cat "$SERVICES_DIR/.env" | grep -v '^#' | xargs)
fi
case "$1" in
build)
log_info "Building $SERVICE_NAME..."
docker build -t "$IMAGE_NAME" "$SCRIPT_DIR"
log_success "$SERVICE_NAME built successfully"
;;
build-no-cache)
log_info "Building $SERVICE_NAME (no cache)..."
docker build --no-cache -t "$IMAGE_NAME" "$SCRIPT_DIR"
log_success "$SERVICE_NAME built successfully"
;;
start)
log_info "Starting $SERVICE_NAME..."
cd "$SERVICES_DIR"
docker compose up -d "$SERVICE_NAME"
log_success "$SERVICE_NAME started"
;;
stop)
log_info "Stopping $SERVICE_NAME..."
docker stop "$CONTAINER_NAME" 2>/dev/null || true
docker rm "$CONTAINER_NAME" 2>/dev/null || true
log_success "$SERVICE_NAME stopped"
;;
restart)
$0 stop
$0 start
;;
logs)
docker logs -f "$CONTAINER_NAME"
;;
logs-tail)
docker logs --tail 100 "$CONTAINER_NAME"
;;
status)
if docker ps --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; then
log_success "$SERVICE_NAME is running"
docker ps --filter "name=$CONTAINER_NAME" --format "table {{.Status}}\t{{.Ports}}"
else
log_warn "$SERVICE_NAME is not running"
fi
;;
health)
log_info "Checking health of $SERVICE_NAME..."
if curl -sf "http://localhost:$PORT/health" > /dev/null 2>&1; then
log_success "$SERVICE_NAME is healthy"
else
log_error "$SERVICE_NAME health check failed"
exit 1
fi
;;
migrate)
log_info "Running migrations for $SERVICE_NAME..."
docker exec "$CONTAINER_NAME" npx prisma migrate deploy
log_success "Migrations completed"
;;
shell)
docker exec -it "$CONTAINER_NAME" sh
;;
*)
echo "Usage: $0 {build|build-no-cache|start|stop|restart|logs|logs-tail|status|health|migrate|shell}"
exit 1
;;
esac

View File

@ -1,216 +1,216 @@
#!/bin/bash
# RWADurian Admin Web 一键部署脚本
# 使用方法: ./deploy.sh [命令]
# 命令:
# build - 仅构建镜像
# start - 构建并启动服务
# stop - 停止服务
# restart - 重启服务
# logs - 查看日志
# clean - 清理容器和镜像
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 项目信息
PROJECT_NAME="rwadurian-admin-web"
IMAGE_NAME="rwadurian-admin-web"
CONTAINER_NAME="rwadurian-admin-web"
DEFAULT_PORT=3000
# 日志函数
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# 检查 Docker 是否安装
check_docker() {
if ! command -v docker &> /dev/null; then
log_error "Docker 未安装,请先安装 Docker"
exit 1
fi
if ! docker info &> /dev/null; then
log_error "Docker 服务未运行,请启动 Docker"
exit 1
fi
log_success "Docker 检查通过"
}
# 检查 Docker Compose 是否安装
check_docker_compose() {
if docker compose version &> /dev/null; then
COMPOSE_CMD="docker compose"
elif command -v docker-compose &> /dev/null; then
COMPOSE_CMD="docker-compose"
else
log_error "Docker Compose 未安装"
exit 1
fi
log_success "Docker Compose 检查通过 ($COMPOSE_CMD)"
}
# 构建镜像
build() {
log_info "开始构建 Docker 镜像..."
$COMPOSE_CMD build --no-cache
log_success "镜像构建完成"
}
# 启动服务
start() {
log_info "开始部署服务..."
# 检查端口是否被占用
PORT=${PORT:-$DEFAULT_PORT}
if lsof -Pi :$PORT -sTCP:LISTEN -t >/dev/null 2>&1; then
log_warn "端口 $PORT 已被占用,尝试停止旧服务..."
stop
fi
# 构建并启动
$COMPOSE_CMD up -d --build
# 等待服务启动
log_info "等待服务启动..."
sleep 5
# 检查服务状态
if docker ps | grep -q $CONTAINER_NAME; then
log_success "服务部署成功!"
log_info "访问地址: http://localhost:$PORT"
else
log_error "服务启动失败,请查看日志: ./deploy.sh logs"
exit 1
fi
}
# 停止服务
stop() {
log_info "停止服务..."
$COMPOSE_CMD down
log_success "服务已停止"
}
# 重启服务
restart() {
log_info "重启服务..."
stop
start
}
# 查看日志
logs() {
$COMPOSE_CMD logs -f
}
# 清理
clean() {
log_info "清理容器和镜像..."
# 停止并删除容器
$COMPOSE_CMD down --rmi local --volumes --remove-orphans
# 删除悬空镜像
docker image prune -f
log_success "清理完成"
}
# 显示状态
status() {
log_info "服务状态:"
docker ps -a --filter "name=$CONTAINER_NAME" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
}
# 显示帮助
show_help() {
echo ""
echo "RWADurian Admin Web 部署脚本"
echo ""
echo "使用方法: ./deploy.sh [命令]"
echo ""
echo "命令:"
echo " build 仅构建 Docker 镜像"
echo " start 构建并启动服务 (默认)"
echo " stop 停止服务"
echo " restart 重启服务"
echo " logs 查看服务日志"
echo " status 查看服务状态"
echo " clean 清理容器和镜像"
echo " help 显示此帮助信息"
echo ""
echo "环境变量:"
echo " PORT 服务端口 (默认: 3000)"
echo ""
echo "示例:"
echo " ./deploy.sh start # 默认端口 3000 启动"
echo " PORT=8080 ./deploy.sh start # 指定端口 8080 启动"
echo ""
}
# 主函数
main() {
# 切换到脚本所在目录
cd "$(dirname "$0")"
# 检查环境
check_docker
check_docker_compose
# 执行命令
case "${1:-start}" in
build)
build
;;
start)
start
;;
stop)
stop
;;
restart)
restart
;;
logs)
logs
;;
status)
status
;;
clean)
clean
;;
help|--help|-h)
show_help
;;
*)
log_error "未知命令: $1"
show_help
exit 1
;;
esac
}
main "$@"
#!/bin/bash
# RWADurian Admin Web 一键部署脚本
# 使用方法: ./deploy.sh [命令]
# 命令:
# build - 仅构建镜像
# start - 构建并启动服务
# stop - 停止服务
# restart - 重启服务
# logs - 查看日志
# clean - 清理容器和镜像
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 项目信息
PROJECT_NAME="rwadurian-admin-web"
IMAGE_NAME="rwadurian-admin-web"
CONTAINER_NAME="rwadurian-admin-web"
DEFAULT_PORT=3000
# 日志函数
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# 检查 Docker 是否安装
check_docker() {
if ! command -v docker &> /dev/null; then
log_error "Docker 未安装,请先安装 Docker"
exit 1
fi
if ! docker info &> /dev/null; then
log_error "Docker 服务未运行,请启动 Docker"
exit 1
fi
log_success "Docker 检查通过"
}
# 检查 Docker Compose 是否安装
check_docker_compose() {
if docker compose version &> /dev/null; then
COMPOSE_CMD="docker compose"
elif command -v docker-compose &> /dev/null; then
COMPOSE_CMD="docker-compose"
else
log_error "Docker Compose 未安装"
exit 1
fi
log_success "Docker Compose 检查通过 ($COMPOSE_CMD)"
}
# 构建镜像
build() {
log_info "开始构建 Docker 镜像..."
$COMPOSE_CMD build --no-cache
log_success "镜像构建完成"
}
# 启动服务
start() {
log_info "开始部署服务..."
# 检查端口是否被占用
PORT=${PORT:-$DEFAULT_PORT}
if lsof -Pi :$PORT -sTCP:LISTEN -t >/dev/null 2>&1; then
log_warn "端口 $PORT 已被占用,尝试停止旧服务..."
stop
fi
# 构建并启动
$COMPOSE_CMD up -d --build
# 等待服务启动
log_info "等待服务启动..."
sleep 5
# 检查服务状态
if docker ps | grep -q $CONTAINER_NAME; then
log_success "服务部署成功!"
log_info "访问地址: http://localhost:$PORT"
else
log_error "服务启动失败,请查看日志: ./deploy.sh logs"
exit 1
fi
}
# 停止服务
stop() {
log_info "停止服务..."
$COMPOSE_CMD down
log_success "服务已停止"
}
# 重启服务
restart() {
log_info "重启服务..."
stop
start
}
# 查看日志
logs() {
$COMPOSE_CMD logs -f
}
# 清理
clean() {
log_info "清理容器和镜像..."
# 停止并删除容器
$COMPOSE_CMD down --rmi local --volumes --remove-orphans
# 删除悬空镜像
docker image prune -f
log_success "清理完成"
}
# 显示状态
status() {
log_info "服务状态:"
docker ps -a --filter "name=$CONTAINER_NAME" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
}
# 显示帮助
show_help() {
echo ""
echo "RWADurian Admin Web 部署脚本"
echo ""
echo "使用方法: ./deploy.sh [命令]"
echo ""
echo "命令:"
echo " build 仅构建 Docker 镜像"
echo " start 构建并启动服务 (默认)"
echo " stop 停止服务"
echo " restart 重启服务"
echo " logs 查看服务日志"
echo " status 查看服务状态"
echo " clean 清理容器和镜像"
echo " help 显示此帮助信息"
echo ""
echo "环境变量:"
echo " PORT 服务端口 (默认: 3000)"
echo ""
echo "示例:"
echo " ./deploy.sh start # 默认端口 3000 启动"
echo " PORT=8080 ./deploy.sh start # 指定端口 8080 启动"
echo ""
}
# 主函数
main() {
# 切换到脚本所在目录
cd "$(dirname "$0")"
# 检查环境
check_docker
check_docker_compose
# 执行命令
case "${1:-start}" in
build)
build
;;
start)
start
;;
stop)
stop
;;
restart)
restart
;;
logs)
logs
;;
status)
status
;;
clean)
clean
;;
help|--help|-h)
show_help
;;
*)
log_error "未知命令: $1"
show_help
exit 1
;;
esac
}
main "$@"

View File

@ -1,216 +1,216 @@
#!/bin/bash
# RWADurian Mobile Upgrade 一键部署脚本
# 使用方法: ./deploy.sh [命令]
# 命令:
# build - 仅构建镜像
# start - 构建并启动服务
# stop - 停止服务
# restart - 重启服务
# logs - 查看日志
# clean - 清理容器和镜像
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 项目信息
PROJECT_NAME="rwadurian-mobile-upgrade"
IMAGE_NAME="rwadurian-mobile-upgrade"
CONTAINER_NAME="rwadurian-mobile-upgrade"
DEFAULT_PORT=3020
# 日志函数
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# 检查 Docker 是否安装
check_docker() {
if ! command -v docker &> /dev/null; then
log_error "Docker 未安装,请先安装 Docker"
exit 1
fi
if ! docker info &> /dev/null; then
log_error "Docker 服务未运行,请启动 Docker"
exit 1
fi
log_success "Docker 检查通过"
}
# 检查 Docker Compose 是否安装
check_docker_compose() {
if docker compose version &> /dev/null; then
COMPOSE_CMD="docker compose"
elif command -v docker-compose &> /dev/null; then
COMPOSE_CMD="docker-compose"
else
log_error "Docker Compose 未安装"
exit 1
fi
log_success "Docker Compose 检查通过 ($COMPOSE_CMD)"
}
# 构建镜像
build() {
log_info "开始构建 Docker 镜像..."
$COMPOSE_CMD build --no-cache
log_success "镜像构建完成"
}
# 启动服务
start() {
log_info "开始部署服务..."
# 检查端口是否被占用
PORT=${PORT:-$DEFAULT_PORT}
if lsof -Pi :$PORT -sTCP:LISTEN -t >/dev/null 2>&1; then
log_warn "端口 $PORT 已被占用,尝试停止旧服务..."
stop
fi
# 构建并启动
$COMPOSE_CMD up -d --build
# 等待服务启动
log_info "等待服务启动..."
sleep 5
# 检查服务状态
if docker ps | grep -q $CONTAINER_NAME; then
log_success "服务部署成功!"
log_info "访问地址: http://localhost:$PORT"
else
log_error "服务启动失败,请查看日志: ./deploy.sh logs"
exit 1
fi
}
# 停止服务
stop() {
log_info "停止服务..."
$COMPOSE_CMD down
log_success "服务已停止"
}
# 重启服务
restart() {
log_info "重启服务..."
stop
start
}
# 查看日志
logs() {
$COMPOSE_CMD logs -f
}
# 清理
clean() {
log_info "清理容器和镜像..."
# 停止并删除容器
$COMPOSE_CMD down --rmi local --volumes --remove-orphans
# 删除悬空镜像
docker image prune -f
log_success "清理完成"
}
# 显示状态
status() {
log_info "服务状态:"
docker ps -a --filter "name=$CONTAINER_NAME" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
}
# 显示帮助
show_help() {
echo ""
echo "RWADurian Mobile Upgrade 部署脚本"
echo ""
echo "使用方法: ./deploy.sh [命令]"
echo ""
echo "命令:"
echo " build 仅构建 Docker 镜像"
echo " start 构建并启动服务 (默认)"
echo " stop 停止服务"
echo " restart 重启服务"
echo " logs 查看服务日志"
echo " status 查看服务状态"
echo " clean 清理容器和镜像"
echo " help 显示此帮助信息"
echo ""
echo "环境变量:"
echo " PORT 服务端口 (默认: 3020)"
echo ""
echo "示例:"
echo " ./deploy.sh start # 默认端口 3020 启动"
echo " PORT=8080 ./deploy.sh start # 指定端口 8080 启动"
echo ""
}
# 主函数
main() {
# 切换到脚本所在目录
cd "$(dirname "$0")"
# 检查环境
check_docker
check_docker_compose
# 执行命令
case "${1:-start}" in
build)
build
;;
start)
start
;;
stop)
stop
;;
restart)
restart
;;
logs)
logs
;;
status)
status
;;
clean)
clean
;;
help|--help|-h)
show_help
;;
*)
log_error "未知命令: $1"
show_help
exit 1
;;
esac
}
main "$@"
#!/bin/bash
# RWADurian Mobile Upgrade 一键部署脚本
# 使用方法: ./deploy.sh [命令]
# 命令:
# build - 仅构建镜像
# start - 构建并启动服务
# stop - 停止服务
# restart - 重启服务
# logs - 查看日志
# clean - 清理容器和镜像
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 项目信息
PROJECT_NAME="rwadurian-mobile-upgrade"
IMAGE_NAME="rwadurian-mobile-upgrade"
CONTAINER_NAME="rwadurian-mobile-upgrade"
DEFAULT_PORT=3020
# 日志函数
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# 检查 Docker 是否安装
check_docker() {
if ! command -v docker &> /dev/null; then
log_error "Docker 未安装,请先安装 Docker"
exit 1
fi
if ! docker info &> /dev/null; then
log_error "Docker 服务未运行,请启动 Docker"
exit 1
fi
log_success "Docker 检查通过"
}
# 检查 Docker Compose 是否安装
check_docker_compose() {
if docker compose version &> /dev/null; then
COMPOSE_CMD="docker compose"
elif command -v docker-compose &> /dev/null; then
COMPOSE_CMD="docker-compose"
else
log_error "Docker Compose 未安装"
exit 1
fi
log_success "Docker Compose 检查通过 ($COMPOSE_CMD)"
}
# 构建镜像
build() {
log_info "开始构建 Docker 镜像..."
$COMPOSE_CMD build --no-cache
log_success "镜像构建完成"
}
# 启动服务
start() {
log_info "开始部署服务..."
# 检查端口是否被占用
PORT=${PORT:-$DEFAULT_PORT}
if lsof -Pi :$PORT -sTCP:LISTEN -t >/dev/null 2>&1; then
log_warn "端口 $PORT 已被占用,尝试停止旧服务..."
stop
fi
# 构建并启动
$COMPOSE_CMD up -d --build
# 等待服务启动
log_info "等待服务启动..."
sleep 5
# 检查服务状态
if docker ps | grep -q $CONTAINER_NAME; then
log_success "服务部署成功!"
log_info "访问地址: http://localhost:$PORT"
else
log_error "服务启动失败,请查看日志: ./deploy.sh logs"
exit 1
fi
}
# 停止服务
stop() {
log_info "停止服务..."
$COMPOSE_CMD down
log_success "服务已停止"
}
# 重启服务
restart() {
log_info "重启服务..."
stop
start
}
# 查看日志
logs() {
$COMPOSE_CMD logs -f
}
# 清理
clean() {
log_info "清理容器和镜像..."
# 停止并删除容器
$COMPOSE_CMD down --rmi local --volumes --remove-orphans
# 删除悬空镜像
docker image prune -f
log_success "清理完成"
}
# 显示状态
status() {
log_info "服务状态:"
docker ps -a --filter "name=$CONTAINER_NAME" --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
}
# 显示帮助
show_help() {
echo ""
echo "RWADurian Mobile Upgrade 部署脚本"
echo ""
echo "使用方法: ./deploy.sh [命令]"
echo ""
echo "命令:"
echo " build 仅构建 Docker 镜像"
echo " start 构建并启动服务 (默认)"
echo " stop 停止服务"
echo " restart 重启服务"
echo " logs 查看服务日志"
echo " status 查看服务状态"
echo " clean 清理容器和镜像"
echo " help 显示此帮助信息"
echo ""
echo "环境变量:"
echo " PORT 服务端口 (默认: 3020)"
echo ""
echo "示例:"
echo " ./deploy.sh start # 默认端口 3020 启动"
echo " PORT=8080 ./deploy.sh start # 指定端口 8080 启动"
echo ""
}
# 主函数
main() {
# 切换到脚本所在目录
cd "$(dirname "$0")"
# 检查环境
check_docker
check_docker_compose
# 执行命令
case "${1:-start}" in
build)
build
;;
start)
start
;;
stop)
stop
;;
restart)
restart
;;
logs)
logs
;;
status)
status
;;
clean)
clean
;;
help|--help|-h)
show_help
;;
*)
log_error "未知命令: $1"
show_help
exit 1
;;
esac
}
main "$@"