next-terminal
next-terminal copied to clipboard
[bug]新建管理员账户无法导出资产
环境介绍
Next Terminal版本:1.3.9,Docker,amd64 数据库:Mysql或sqlite 浏览器:chrome 版本 115.0.5790.114(正式版本) (x86_64)
问题描述
Next Terminal新建一个用户并授予系统管理员
权限,使用这个新建账户登陆并创建资产(使用SSH连接远程VPS),此时点导出备份
,浏览器会弹出下载框,文件名为 export .json
,内容为{"code":403,"message":"permission denied"}
,这是使用新建管理员账户发生的。
使用默认创建的admin账户,点击导出备份
,此时能导出备份,~~但浏览器提示此文件存在危险,因此 Chrome 已将其拦截。
,点击保留危险文件
~~(加上自己的域名下载是安全的),这个文件名为backup_20230827054203.json
,里边是正常的。
发生了什么
Next Terminal新建管理员账户无法导出备份,默认创建的admin账户能导出备份,~~但浏览器提示导出的文件危险~~。
预期发生什么
Next Terminal新建管理员真能正常导出,~~浏览器不提示危险。~~
其他问题
因为想将Next Terminal部署在Fly.io上,但Next Terminal使用两个镜像文件,如何将两个镜像文件合并成一个?我尝试创建Dockerfile 部署过,只有dushixiang/next-terminal:latest
镜像运行,dushixiang/guacd:latest
这个镜像有什么用?没有guacd镜像对我使用SSH连接远程服务器有影响吗?
Next Terminal能使用证书连接mysql数据库吗?我想将数据库创建在planetscale上,planetscale数据库需要证书才能连接。
Dockerfile
FROM dushixiang/guacd:latest
FROM dushixiang/next-terminal:latest
可能与 #340 有关
next-terminal两个镜像合一
通过查询GPT3.5和在网上搜索资料,两个镜像已经可以运行起来了,运行镜像并查询端口占用,8088
和4822
已经被占用,说明dushixiang/guacd:latest
已经运行起来,但guacd无法判断能不能正常工作。
Docker镜像制作
通过Dockerfile 将两个镜像和为一个
# 准备使用`dushixiang/next-terminal:latest`提取next-terminal二进制包
FROM dushixiang/next-terminal:latest AS builder1
# 使用`dushixiang/guacd:latest`作为基础镜像
FROM dushixiang/guacd:latest
# 设置默认环境变量
ENV TZ Asia/Shanghai
ENV DB sqlite
ENV SQLITE_FILE './data/sqlite/next-terminal.db'
ENV SERVER_PORT 8088
ENV SERVER_ADDR 0.0.0.0:$SERVER_PORT
ENV SSHD_PORT 8089
ENV SSHD_ADDR 0.0.0.0:$SSHD_PORT
ENV TIME_ZONE=Asia/Shanghai
# 将从`dushixiang/next-terminal:latest`提取的二进制文件复制到`dushixiang/guacd:latest`中
COPY --from=builder1 /usr/local/next-terminal /usr/local/next-terminal
# 安装supervisord,这部分我折腾好久
#第二次修正,安装tzdata ,用于将VPS强制设置为北京时间
# 第三次修正,用于显示日志
RUN apk --no-cache add \
logrotate \
tzdata \
supervisor && \
rm -rf /var/cache/apk/*
# 将supervisord配置文件复制到容器
COPY config/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
# 将镜像启动脚本复制到容器
COPY config/docker-entrypoint.sh /var/docker-entrypoint.sh
# 第三次修正,用于显示日志
COPY config/logrotate.conf /etc/logrotate.d/logrotate.conf
# 为启动脚本设置运行权限并切将时间设置为北京时间
RUN chmod +x /var/docker-entrypoint.sh && \
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo 'Asia/Shanghai' > /etc/timezone
# 设置镜像运行时脚本路径
ENTRYPOINT /var/docker-entrypoint.sh
启动脚本和supervisord配置文件
在Dockerfile同目录下创建config
文件夹,进入config
文件夹创建supervisord.conf
和docker-entrypoint.sh
,还有logrotate.conf
。
supervisord.conf
# 第三次修正,用于显示日志
[supervisord]
nodaemon=true
user=root
logfile=/dev/null
logfile_maxbytes=0
pidfile=/run/supervisord.pid
# 运行next-terminal二进制文件,占用8088端口
[program:next-terminal]
command=/usr/local/next-terminal/next-terminal
directory=/usr/local/next-terminal/
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
stderr_logfile=/dev/fd/1
stderr_logfile_maxbytes=0
autorestart=true
startretries=0
priority=70
# 运行guacd,占用4822端口
[program:next-guacd]
command=/opt/guacamole/sbin/guacd -b 0.0.0.0 -f
directory=/opt/guacamole/sbin/
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
stderr_logfile=/dev/fd/1
stderr_logfile_maxbytes=0
autorestart=true
startretries=0
priority=150
docker-entrypoint.sh
#!/usr/bin/env sh
/usr/bin/supervisord -c /etc/supervisor/conf.d/supervisord.conf
logrotate.conf
/dev/fd/1 {
rotate 7
daily
compress
missingok
notifempty
}
我测试时使用的环境变量
DB = "sqlite"
# 将数据和日志保存在`/home/terminal`,运行的时候注意把文件夹映射出来,否则容器删除重建,数据会全美的。
SQLITE_FILE = "/home/terminal/sqlite/next-terminal.db"
GUACD_RECORDING = "/home/terminal/recording"
GUACD_DRIVE = "/home/terminal/drive"
SSHD_KEY = "/home/terminal/id_rsa"
# `GUACD_HOSTNAME`要设置成127.0.0.1,否则VNC无法正常工作
# GUACD_HOSTNAME = "guacd"
GUACD_HOSTNAME = "127.0.0.1"
GUACD_PORT = "4822"
问题
- guacd是否正常工作?
我不知道
dushixiang/guacd:latest
是做什么用的,我只使用SSH连接VPS,去掉dushixiang/guacd:latest
镜像也可以连接vps。 - 为什么要安装supervisord?
这是重点,我将
Dockerfile
写好后,发现无论我怎么设置,镜像运行后监测端口占用,要么占用8088
要么占用4822
,两者不能同时占用。
# 占用 4822
CMD ["/bin/sh", "-c", "/opt/guacamole/sbin/guacd -b 0.0.0.0 -L $GUACD_LOG_LEVEL -f && /usr/local/next-terminal/next-terminal"]
# 占用 8088
CMD ["/bin/sh", "-c", "/usr/local/next-terminal/next-terminal &&/ opt/guacamole/sbin/guacd -b 0.0.0.0 -L $GUACD_LOG_LEVEL -f"]
使用ENTRYPOINT命令也一样,Dockerfile只会执行第一条命令,第二条不执行
- 为什么以
dushixiang/guacd:latest
基础镜像? 因为通过问题和仓库代码发现guacd
会有字体显示问题,dushixiang/guacd:latest
里只有二进制文件,复制比较容易,并且还可以自动多架构。
next-terminal强制使用域名访问VPS
vps一般使用ssh通过IP访问,当VPS过多时继续使用IP访问识别就过于困难,因此通过域名访问VPS(Hosts方式)就比较容易解决这个问题。
Docker
docker-compose.yml
volumes:
- /etc/localtime:/etc/localtime
- ./data:/usr/local/next-terminal/data
- ./ssh/id_rsa:/root/.ssh/id_rsa
restart:
always
container_name:
next-terminal
extra_hosts:
#格式
# - 想要的VPS域名:VPS IP
- mariadb.service.app:1.23.3.4
Dockerfile
# 将supervisord配置文件复制到容器
COPY config/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
# 将镜像启动脚本复制到容器
COPY config/docker-entrypoint.sh /var/docker-entrypoint.sh
# 将VPS IP与域名映射导入镜像
COPY config/hosts /etc/hosts
在config
文件夹下创建hosts
# 格式 【VSP IP】 想要的域名
1.23.3.4 mariadb.service.app
next-terminal 使用nginx反代,文档里的示例在某些情况下websocket连接有问题。
location / {
proxy_pass http://127.0.0.1:8088/;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
# 必须添加` proxy_http_version 1.1;`,否则代理Fly.io时Wss连接会出问题,无法SSH连接到VPS。
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
}
dushixiang/guacd:latest
是用于连接RDP、VNC、等图形协议的。
新建的管理员不能导出备份文件是一个已知的bug,尚未处理。
镜像二合一已经测试的项目
- [x] SSh连接远程服务器
- [x] SSH 连接上传文件
- [x] VNC连接vps,我在搬瓦工VPS测试过,可以连接,但显示字体有问题,我不用vnc,这个没管。
@dushixiang 新建管理员不能导出你既然已经知道,这个问题可以关闭,我就不关了。