File size: 4,659 Bytes
7311ade
 
6af0519
 
 
c0928d0
 
 
 
8fa839f
cf4f9f7
 
c0928d0
 
 
cf4f9f7
 
8fa839f
 
 
 
e20f2b9
cf4f9f7
8fa839f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cf4f9f7
6af0519
e20f2b9
cf4f9f7
d3f40ae
c0928d0
 
 
 
 
cd0659b
a671b65
cd0659b
c0928d0
6af0519
67fcd87
 
 
 
 
 
666d2dd
c57e208
8fa839f
 
666d2dd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8fa839f
 
666d2dd
cd0659b
666d2dd
 
 
 
 
 
 
cd0659b
666d2dd
2cb3286
 
 
 
 
666d2dd
 
 
 
 
8fa839f
 
666d2dd
 
c0928d0
6af0519
c0928d0
 
50b9350
c0928d0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c57e208
c0928d0
d3f40ae
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#!/bin/bash

# 打印所有命令,方便调试
set -x

# =========================================================
# 环境变量检查与配置
# =========================================================

# 2. 生成 Cookie Secret (如果未设置)
if [ -z "$OAUTH2_PROXY_COOKIE_SECRET" ]; then
    echo "Generating temporary cookie secret..."
    # 生成 16 字节的随机字符串 (32 字符 hex) 确保符合长度要求
    export OAUTH2_PROXY_COOKIE_SECRET=$(head -c 32 /dev/urandom | base64 | head -c 32)
    echo "Cookie Secret Generated."
fi

# 3. 生成白名单 (支持 Email 和 GitHub Username 混合)
# 使用 /tmp 目录,确保任何用户都可写,避免 Docker 权限问题
AUTH_FILE="/tmp/authenticated_emails.txt"
GITHUB_USERS=""

if [ -n "$ALLOWED_USERS" ]; then
    echo "Processing ALLOWED_USERS: $ALLOWED_USERS"
    
    # 清空文件
    > "$AUTH_FILE"
    
    # 分割并处理每个用户
    IFS=',' read -ra ADDR <<< "$ALLOWED_USERS"
    for user in "${ADDR[@]}"; do
        # 去除首尾空格
        user=$(echo "$user" | xargs)
        
        if [[ "$user" == *"@"* ]]; then
            # 如果包含 @,视为邮箱
            echo "$user" >> "$AUTH_FILE"
        else
            # 如果不含 @,且是 GitHub Provider,视为 GitHub 用户名
            if [ -z "$GITHUB_USERS" ]; then
                GITHUB_USERS="$user"
            else
                GITHUB_USERS="$GITHUB_USERS,$user"
            fi
        fi
    done
else
    echo "Warning: ALLOWED_USERS is not set! Creating empty whitelist."
    touch "$AUTH_FILE"
fi

# =========================================================
# 启动服务
# =========================================================

# 1. 启动 ttyd (本地监听 7681)
# -b /: 设置 Web 终端为根路径,登录即是终端
echo "Starting ttyd on 127.0.0.1:7681..."
ttyd -p 7681 -i 127.0.0.1 -W bash &
TTYD_PID=$!

# 2. OpenClaw 已在降级方案中移除预启动
# (保留手动启动逻辑作为注释参考)
# export OPENCLAW_AUTH_DISABLE=true
# openclaw gateway run &

# 3. 启动 oauth2-proxy (本地监听 4180)
# 回退到稳定模式:根据环境变量智能选择单个 Provider
echo "Starting oauth2-proxy on 127.0.0.1:4180..."

if [ -n "$GITHUB_CLIENT_ID" ] && [ -n "$GITHUB_CLIENT_SECRET" ]; then
    echo "Detected GITHUB_CLIENT_ID/SECRET. Using GitHub Provider."
    export OAUTH2_PROXY_PROVIDER="github"
    export OAUTH2_PROXY_CLIENT_ID="$GITHUB_CLIENT_ID"
    export OAUTH2_PROXY_CLIENT_SECRET="$GITHUB_CLIENT_SECRET"
elif [ -n "$GOOGLE_CLIENT_ID" ] && [ -n "$GOOGLE_CLIENT_SECRET" ]; then
    echo "Detected GOOGLE_CLIENT_ID/SECRET. Using Google Provider."
    export OAUTH2_PROXY_PROVIDER="google"
    export OAUTH2_PROXY_CLIENT_ID="$GOOGLE_CLIENT_ID"
    export OAUTH2_PROXY_CLIENT_SECRET="$GOOGLE_CLIENT_SECRET"
else
    # Fallback to defaults or generic variables
    if [ -z "$OAUTH2_PROXY_PROVIDER" ]; then
        export OAUTH2_PROXY_PROVIDER="github"
    fi
    echo "Using generic/default Provider: $OAUTH2_PROXY_PROVIDER"
fi

# 构建 oauth2-proxy 命令 (标准命令行模式)
# 上游指向 ttyd (127.0.0.1:7681)
CMD="oauth2-proxy \
    --config=oauth2-proxy.cfg \
    --provider=$OAUTH2_PROXY_PROVIDER \
    --client-id=$OAUTH2_PROXY_CLIENT_ID \
    --client-secret=$OAUTH2_PROXY_CLIENT_SECRET \
    --cookie-secret=$OAUTH2_PROXY_COOKIE_SECRET \
    --email-domain=* \
    --upstream=http://127.0.0.1:7681 \
    --http-address=127.0.0.1:4180 \
    --authenticated-emails-file=$AUTH_FILE \
    --custom-sign-in-logo="-" \
    --banner="-" \
    --footer="-" \
    --custom-templates-dir=/var/www/html/theme"

# 如果有 GitHub Users,追加参数
if [ -n "$GITHUB_USERS" ]; then
    echo "Adding GitHub User whitelist: $GITHUB_USERS"
    CMD="$CMD --github-user=$GITHUB_USERS"
fi

# 执行命令
$CMD 2>&1 &
OAUTH2_PROXY_PID=$!

# 4. 健康检查与等待
echo "Waiting for services to start..."

# 等待 oauth2-proxy 启动 (最多 10 秒)
for i in {1..10}; do
    if nc -z 127.0.0.1 4180; then
        echo "oauth2-proxy is up and running!"
        break
    fi
    echo "Waiting for oauth2-proxy (attempt $i/10)..."
    sleep 1
    
    # 检查进程是否还在
    if ! kill -0 $OAUTH2_PROXY_PID 2>/dev/null; then
        echo "CRITICAL: oauth2-proxy failed to start! Checking logs..."
        # 这里的日志已经在上面重定向到 stdout 了,所以会在 Space logs 中显示
        # 我们可以尝试重新启动或直接退出
        echo "Exiting due to oauth2-proxy failure."
        exit 1
    fi
done

# 5. 启动 Nginx (对外监听 7860)
echo "Starting Nginx on port 7860..."
nginx -g "daemon off;"