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

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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