#!/usr/bin/env bash set -Eeuo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$ROOT_DIR" ENV_FILE="$ROOT_DIR/.env" CREATED_ENV=0 log() { printf '\033[1;34m[laser-data]\033[0m %s\n' "$*" } fail() { printf '\033[1;31m[laser-data] 启动失败:\033[0m%s\n' "$*" >&2 exit 1 } random_value() { if command -v openssl >/dev/null 2>&1; then openssl rand -hex "$1" else head -c "$1" /dev/urandom | od -An -tx1 | tr -d ' \n' fi } env_value() { local key="$1" sed -n "s/^${key}=//p" "$ENV_FILE" | tail -n 1 } ensure_env_value() { local key="$1" local value="$2" if ! grep -q "^${key}=" "$ENV_FILE"; then printf '%s=%s\n' "$key" "$value" >> "$ENV_FILE" fi } on_error() { printf '\n' log "最近的容器日志:" docker compose logs --tail=60 web db 2>/dev/null || true } trap on_error ERR command -v docker >/dev/null 2>&1 || fail "未找到 Docker。请先安装 Docker Desktop:https://www.docker.com/products/docker-desktop/" if ! docker info >/dev/null 2>&1; then if [[ "$(uname -s)" == "Darwin" ]] && [[ -d "/Applications/Docker.app" ]]; then log "Docker Desktop 尚未运行,正在启动..." open -a Docker for _ in $(seq 1 90); do docker info >/dev/null 2>&1 && break sleep 2 done fi fi docker info >/dev/null 2>&1 || fail "Docker 服务未运行,请启动 Docker Desktop 后重新执行 ./start.sh" docker compose version >/dev/null 2>&1 || fail "当前 Docker 未安装 Compose 插件" if [[ ! -f "$ENV_FILE" ]]; then CREATED_ENV=1 ADMIN_PASSWORD="Admin-$(random_value 8)" cat > "$ENV_FILE" </dev/null 2>&1; then HEALTHY=1 break fi sleep 2 done if [[ "$HEALTHY" != "1" ]]; then fail "网站在 120 秒内未通过健康检查,请查看上方日志" fi ADMIN_USERNAME="$(env_value ADMIN_USERNAME)" ADMIN_PASSWORD="$(env_value ADMIN_PASSWORD)" printf '\n' printf '\033[1;32m网站已启动\033[0m\n' printf '访问地址: http://localhost:%s\n' "$APP_PORT" printf '管理员用户名: %s\n' "$ADMIN_USERNAME" if [[ "$CREATED_ENV" == "1" ]]; then printf '管理员初始密码:%s\n' "$ADMIN_PASSWORD" printf '首次登录后请立即修改密码。\n' else printf '管理员密码: 使用现有 .env 中的 ADMIN_PASSWORD\n' fi printf '停止服务: docker compose down\n' printf '查看日志: docker compose logs -f web\n\n' if [[ "$(uname -s)" == "Darwin" ]]; then open "http://localhost:${APP_PORT}" >/dev/null 2>&1 || true elif command -v xdg-open >/dev/null 2>&1; then xdg-open "http://localhost:${APP_PORT}" >/dev/null 2>&1 || true fi