Skip to content

Commit b3d4017

Browse files
committed
添加更好的身份认证,服务器从机注册系统,更好的配置管理等
1 parent 2f8f5c0 commit b3d4017

File tree

13 files changed

+473
-182
lines changed

13 files changed

+473
-182
lines changed

.dockerignore

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# 版本控制
2+
.git
3+
.gitignore
4+
5+
# 依赖
6+
node_modules
7+
npm-debug.log
8+
yarn-debug.log
9+
yarn-error.log
10+
11+
# 环境文件
12+
.env
13+
.env.local
14+
.env.*.local
15+
16+
# 编辑器文件
17+
.vscode
18+
.idea
19+
*.swp
20+
*.swo
21+
22+
# 系统文件
23+
.DS_Store
24+
Thumbs.db
25+
26+
# 构建输出
27+
build
28+
dist
29+
*.log
30+
31+
# Docker相关
32+
Dockerfile
33+
.dockerignore
34+
docker-compose*.yml

Dockerfile

Lines changed: 17 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -1,115 +1,28 @@
1-
FROM ubuntu:22.04
1+
FROM node:18-slim
22

3-
# 避免交互式提示
4-
ENV DEBIAN_FRONTEND=noninteractive
5-
6-
# 设置时区
7-
ENV TZ=Asia/Shanghai
8-
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
3+
# 设置工作目录
4+
WORKDIR /app
95

10-
# 安装基础工具和依赖
6+
# 安装基本工具
117
RUN apt-get update && apt-get install -y \
12-
sudo \
138
curl \
14-
wget \
15-
git \
16-
vim \
17-
bash \
18-
build-essential \
19-
software-properties-common \
20-
apt-transport-https \
21-
ca-certificates \
22-
gnupg \
23-
lsb-release \
24-
zsh \
25-
tmux \
26-
htop \
27-
tree \
28-
jq \
29-
unzip \
30-
openssh-client \
31-
postgresql-client \
32-
redis-tools \
33-
make \
34-
gcc \
35-
g++ \
36-
libssl-dev \
37-
zlib1g-dev \
38-
libbz2-dev \
39-
libreadline-dev \
40-
libsqlite3-dev \
41-
libncursesw5-dev \
42-
xz-utils \
43-
tk-dev \
44-
libxml2-dev \
45-
libxmlsec1-dev \
46-
libffi-dev \
47-
liblzma-dev \
489
&& rm -rf /var/lib/apt/lists/*
4910

50-
# 创建非root用户
51-
RUN useradd -m -s /bin/bash zerocat \
52-
&& echo "zerocat ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/zerocat \
53-
&& chmod 0440 /etc/sudoers.d/zerocat
54-
55-
# 设置工作目录
56-
WORKDIR /home/zerocat
57-
58-
# 安装 pyenv
59-
USER zerocat
60-
RUN curl https://pyenv.run | bash
61-
ENV PYENV_ROOT="/home/zerocat/.pyenv"
62-
ENV PATH="$PYENV_ROOT/bin:$PATH"
63-
RUN echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc && \
64-
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc && \
65-
echo 'eval "$(pyenv init --path)"' >> ~/.bashrc && \
66-
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
67-
68-
# 使用 pyenv 安装 Python 版本并安装包
69-
SHELL ["/bin/bash", "-l", "-c"]
70-
RUN pyenv install 3.8.18 && \
71-
pyenv install 3.11.8 && \
72-
pyenv global 3.11.8 && \
73-
eval "$(pyenv init -)" && \
74-
eval "$(pyenv init --path)" && \
75-
$PYENV_ROOT/versions/3.11.8/bin/python -m pip install --upgrade pip && \
76-
$PYENV_ROOT/versions/3.11.8/bin/python -m pip install \
77-
ipython \
78-
poetry \
79-
virtualenv \
80-
black \
81-
flake8 \
82-
mypy \
83-
pytest \
84-
requests
85-
86-
# 安装 nvm
87-
ENV NVM_DIR="/home/zerocat/.nvm"
88-
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash \
89-
&& . "$NVM_DIR/nvm.sh" \
90-
&& nvm install 16 \
91-
&& nvm install 18 \
92-
&& nvm alias default 18 \
93-
&& nvm use default \
94-
&& npm install -g yarn pnpm typescript ts-node
95-
96-
# 设置权限
97-
USER root
98-
RUN chown -R zerocat:zerocat /home/zerocat
11+
# 复制package文件
12+
COPY package*.json ./
13+
COPY pnpm-lock.yaml ./
9914

100-
# 切换到非root用户
101-
USER zerocat
15+
# 安装pnpm
16+
RUN npm install -g pnpm
10217

103-
# 设置SHELL环境变量
104-
ENV SHELL=/bin/bash
18+
# 安装依赖
19+
RUN pnpm install
10520

106-
# 配置终端
107-
RUN echo 'export PS1="\[\e[01;32m\]\u@\h\[\e[0m\]:\[\e[01;34m\]\w\[\e[0m\]\$ "' >> ~/.bashrc
21+
# 复制应用代码
22+
COPY . .
10823

109-
# 添加环境变量到 .bashrc
110-
RUN echo 'export NVM_DIR="$HOME/.nvm"' >> ~/.bashrc \
111-
&& echo '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"' >> ~/.bashrc \
112-
&& echo '[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"' >> ~/.bashrc
24+
# 暴露端口
25+
EXPOSE 3000
11326

114-
# 设置容器启动命令
115-
CMD ["/bin/bash", "-l"]
27+
# 启动命令
28+
CMD ["pnpm", "start"]

app.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ const path = require('path');
33
const cookieParser = require('cookie-parser');
44
const logger = require('morgan');
55
const WebSocket = require('ws');
6-
const terminalService = require('./services/terminal');
6+
const { terminalService } = require('./services/terminal');
77
const adminService = require('./services/admin');
88
const { validateToken } = require('./middleware/auth');
99
const jwt = require('jsonwebtoken');
@@ -25,7 +25,7 @@ app.set('view engine', 'ejs');
2525
app.use(logger(config.logging.format));
2626
app.use(express.json());
2727
app.use(express.urlencoded({ extended: false }));
28-
app.use(cookieParser(config.security.cookieSecret));
28+
app.use(cookieParser());
2929
app.use(express.static(path.join(__dirname, 'public')));
3030
app.use(bodyParser.urlencoded({ limit: "100mb", extended: false }));
3131
app.use(bodyParser.json({ limit: "100mb" }));

bin/www

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ const http = require('http');
1212
* Get port from environment and store in Express.
1313
*/
1414

15-
const port = normalizePort(process.env.PORT || '3033');
15+
const port = normalizePort(process.env.PORT || '3000');
1616
app.set('port', port);
1717

1818
/**
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
FROM ubuntu:22.04
2+
3+
# 避免交互式提示
4+
ENV DEBIAN_FRONTEND=noninteractive
5+
6+
# 设置时区
7+
ENV TZ=Asia/Shanghai
8+
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
9+
10+
# 安装基础工具和依赖
11+
RUN apt-get update && apt-get install -y \
12+
sudo \
13+
curl \
14+
wget \
15+
git \
16+
vim \
17+
bash \
18+
build-essential \
19+
software-properties-common \
20+
apt-transport-https \
21+
ca-certificates \
22+
gnupg \
23+
lsb-release \
24+
zsh \
25+
tmux \
26+
htop \
27+
tree \
28+
jq \
29+
unzip \
30+
openssh-client \
31+
postgresql-client \
32+
redis-tools \
33+
make \
34+
gcc \
35+
g++ \
36+
libssl-dev \
37+
zlib1g-dev \
38+
libbz2-dev \
39+
libreadline-dev \
40+
libsqlite3-dev \
41+
libncursesw5-dev \
42+
xz-utils \
43+
tk-dev \
44+
libxml2-dev \
45+
libxmlsec1-dev \
46+
libffi-dev \
47+
liblzma-dev \
48+
&& rm -rf /var/lib/apt/lists/*
49+
50+
# 创建非root用户
51+
RUN useradd -m -s /bin/bash zerocat \
52+
&& echo "zerocat ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/zerocat \
53+
&& chmod 0440 /etc/sudoers.d/zerocat
54+
55+
# 设置工作目录
56+
WORKDIR /home/zerocat
57+
58+
# 安装 pyenv
59+
USER zerocat
60+
RUN curl https://pyenv.run | bash
61+
ENV PYENV_ROOT="/home/zerocat/.pyenv"
62+
ENV PATH="$PYENV_ROOT/bin:$PATH"
63+
RUN echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc && \
64+
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc && \
65+
echo 'eval "$(pyenv init --path)"' >> ~/.bashrc && \
66+
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
67+
68+
# 使用 pyenv 安装 Python 版本并安装包
69+
SHELL ["/bin/bash", "-l", "-c"]
70+
RUN pyenv install 3.8.18 && \
71+
pyenv install 3.11.8 && \
72+
pyenv global 3.11.8 && \
73+
eval "$(pyenv init -)" && \
74+
eval "$(pyenv init --path)" && \
75+
$PYENV_ROOT/versions/3.11.8/bin/python -m pip install --upgrade pip && \
76+
$PYENV_ROOT/versions/3.11.8/bin/python -m pip install \
77+
ipython \
78+
poetry \
79+
virtualenv \
80+
black \
81+
flake8 \
82+
mypy \
83+
pytest \
84+
requests
85+
86+
# 安装 nvm
87+
ENV NVM_DIR="/home/zerocat/.nvm"
88+
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash \
89+
&& . "$NVM_DIR/nvm.sh" \
90+
&& nvm install 16 \
91+
&& nvm install 18 \
92+
&& nvm alias default 18 \
93+
&& nvm use default \
94+
&& npm install -g yarn pnpm typescript ts-node
95+
96+
# 设置权限
97+
USER root
98+
RUN chown -R zerocat:zerocat /home/zerocat
99+
100+
# 切换到非root用户
101+
USER zerocat
102+
103+
# 设置SHELL环境变量
104+
ENV SHELL=/bin/bash
105+
106+
# 配置终端
107+
RUN echo 'export PS1="\[\e[01;32m\]\u@\h\[\e[0m\]:\[\e[01;34m\]\w\[\e[0m\]\$ "' >> ~/.bashrc
108+
109+
# 添加环境变量到 .bashrc
110+
RUN echo 'export NVM_DIR="$HOME/.nvm"' >> ~/.bashrc \
111+
&& echo '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"' >> ~/.bashrc \
112+
&& echo '[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"' >> ~/.bashrc
113+
114+
# 设置容器启动命令
115+
CMD ["/bin/bash", "-l"]

config/index.js

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ const config = {
77
},
88

99
jwt: {
10-
secret: process.env.JWT_SECRET || 'G2QSZJiPGnNl4cSbQqw5uwCk9KynJQ',
11-
expiresIn: process.env.JWT_EXPIRES_IN || '24h',
10+
secret: '', // 将从云端获取
11+
expiresIn: '24h',
1212
},
1313

1414
site: {
@@ -28,19 +28,20 @@ const config = {
2828
format: process.env.LOG_FORMAT || 'dev',
2929
},
3030

31-
security: {
32-
cookieSecret: process.env.COOKIE_SECRET || 'your-cookie-secret',
33-
secureCookies: process.env.SECURE_COOKIES === 'true',
31+
admin: {
32+
enabled: process.env.ADMIN_ENABLED !== 'false', // 默认为true
33+
poolSize: parseInt(process.env.ADMIN_POOL_SIZE, 10) || 2,
34+
reportInterval: parseInt(process.env.ADMIN_REPORT_INTERVAL, 10) || 60000,
35+
lastConfigUpdate: new Date(),
36+
lastReport: new Date()
3437
}
3538
};
3639

3740
// 验证必需的配置
3841
function validateConfig() {
3942
const requiredInProduction = [
40-
'JWT_SECRET',
4143
'AUTH_SITE',
42-
'AUTH_TOKEN',
43-
'COOKIE_SECRET'
44+
'AUTH_TOKEN'
4445
];
4546

4647
if (config.server.env === 'production') {
@@ -49,19 +50,15 @@ function validateConfig() {
4950
throw new Error(`Missing required environment variable in production: ${key}`);
5051
}
5152
}
52-
53-
// 在生产环境强制启用安全cookie
54-
config.security.secureCookies = true;
5553
}
5654
}
5755

5856
// 打印配置信息(隐藏敏感信息)
5957
function logConfig() {
6058
const sanitizedConfig = JSON.parse(JSON.stringify(config));
6159
// 隐藏敏感信息
62-
sanitizedConfig.jwt.secret = '***';
6360
sanitizedConfig.site.authToken = '***';
64-
sanitizedConfig.security.cookieSecret = '***';
61+
sanitizedConfig.jwt.secret = '***';
6562

6663
console.log('[Config] 📝 当前配置');
6764
//console.log(JSON.stringify(sanitizedConfig, null, 2));

docker-compose.yml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
version: '3.8'
2+
3+
services:
4+
coderun:
5+
build: .
6+
container_name: coderun
7+
ports:
8+
- "3033:3000"
9+
volumes:
10+
- /var/run/docker.sock:/var/run/docker.sock
11+
- zerocat-coderun-data:/app/data
12+
environment:
13+
- NODE_ENV=production
14+
- DOCKER_SOCKET=/var/run/docker.sock
15+
- AUTH_SITE=http://host.docker.internal:3000
16+
- AUTH_TOKEN=oin8z2di3vzdxoyifj2dp
17+
restart: unless-stopped
18+
networks:
19+
- coderun-net
20+
21+
22+
networks:
23+
coderun-net:
24+
driver: bridge

0 commit comments

Comments
 (0)