Skip to content
This repository has been archived by the owner on Aug 17, 2024. It is now read-only.

[bug]新建管理员账户无法导出资产 #401

Open
aaro-n opened this issue Aug 26, 2023 · 5 comments
Open

[bug]新建管理员账户无法导出资产 #401

aaro-n opened this issue Aug 26, 2023 · 5 comments

Comments

@aaro-n
Copy link

aaro-n commented Aug 26, 2023

环境介绍

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 有关

@aaro-n
Copy link
Author

aaro-n commented Aug 27, 2023

next-terminal两个镜像合一

通过查询GPT3.5和在网上搜索资料,两个镜像已经可以运行起来了,运行镜像并查询端口占用,80884822已经被占用,说明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.confdocker-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里只有二进制文件,复制比较容易,并且还可以自动多架构。

@aaro-n
Copy link
Author

aaro-n commented Aug 27, 2023

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

@aaro-n
Copy link
Author

aaro-n commented Aug 27, 2023

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
Copy link
Owner

dushixiang/guacd:latest 是用于连接RDP、VNC、等图形协议的。

新建的管理员不能导出备份文件是一个已知的bug,尚未处理。

@aaro-n
Copy link
Author

aaro-n commented Aug 27, 2023

镜像二合一已经测试的项目

  • SSh连接远程服务器
  • SSH 连接上传文件
  • VNC连接vps,我在搬瓦工VPS测试过,可以连接,但显示字体有问题,我不用vnc,这个没管。

@dushixiang 新建管理员不能导出你既然已经知道,这个问题可以关闭,我就不关了。

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants