在ClawCloud部署Shynet

⚠️ This is an article that was created 250 days ago, and the information may have evolved or changed.

ClawCloud 是一个云服务应用部署平台,可以方便快捷地部署docker应用

已经部署一个导航站点和一个github项目的Demo演示站点,直观感受还可以

受限于使用的5美刀免费额度和种种的不可靠因素,已做好站点随时消失的准备。毕竟没氪金和没法氪金

下面内容记录部署Shynet (一款开源的网站统计分析工具)

在ClawCloud部署Shynet

部署Shynet使用PostgreSQL数据库

1、按照ClawCloud的 Migrate from Docker Compose 文档和Shynet的 GUIDE.md 操作步骤,部署Shynet应用后,创建的应用容器可以与创建的PostgreSQL 数据库连通,首次启动会遇到如下提示:

2、提示数据库不存在,这是因为通过ClawCloud平台创建的数据库里面并没有环境变量所设置的Shynet_db的数据库,需要通过connect连接数据库手动创建Shynet_db

3、完成创建Shynet_db数据库后,重启docker应用,打开控制台发现已经能正常运行

部署Shynet使用SQLite数据库

家境贫寒,全靠平台赠送的5美刀,多开一个PostgreSQL就少一个应用可以玩

1、按照ClawCloud的 Migrate from Docker 文档和Shynet的 GUIDE.md 操作步骤,部署Shynet应用后,使用挂载卷挂载目录/var/local/Shynet/db,在控制台查看log会有如下报错信息

……
django.db.utils.OperationalError: unable to open database file 
Migrations failed, exiting”
……

错误原因:在作者构建的docker镜像中,Dockerfile文件里编写了针对/var/local/Shynet/db/目录的用户权限管理,而ClawCloud上设置挂载卷只有容量大小和挂载目录两个选项,无法设置UID/GID ,并且进入控制台全靠运气(时常抽风进不去),目前发现就算进入控制台我也找不着挂载目录和设置方法(不熟kubectl,专业不对口,折腾起来要去速通k8s教程,不想玩这个,也不知道有没有权限进行操作)

根据登陆控制台显示的信息,ClawCloud是以 root 运行容器应用,联想到已部署成功的容器应用,只要绕道修改关于挂载卷权限部分代码,就能成功挂载。至于违反最小权限原则,容器逃逸时攻击者将获得主机 root 权限的问题就交给ClawCloud平台处理,相信他们有这方面的保护措施

为什么设置挂载卷:数据备份,在ClawCloud上可以下载和上传挂载卷的数据库文件

绕道修改SQLite数据库挂载卷权限

操作思路

  1. Fork作者仓库
  2. clone至本地
  3. 修改Dockerfile文件,去除针对/var/local/Shynet/db/目录的用户权限管理
  4. 移除仓库原有的工作流yaml文件,创建自用的构建镜像工作流yaml文件
  5. git push

为什么这么操作

  • 首先,给Shynet作者提issue说ClawCloud平台用不了你这个Shynet镜像,你看他鸟不鸟你
  • 第二,给ClawCloud平台说,你这个平台部署不了Shynet,你看他鸟不鸟你

已经将修改后构建的镜像推送到 docker hub,需要的可自行 docker pull kiraster/Shynet-for-clawcloud:latest

Fork后修改的仓库:https://github.com/kiraster/Shynet

可review后再决定使用,也可以自行Fork作者仓库然后自己构建docker镜像

修改后的Dockerfile 文件

控制台提示两个 Warning

1、对于提示的两个Warning,可通过登陆应用控制台执行以下命令进行设置

  • example@example.com:填写一个邮箱名称用于管理员登陆(仅仅邮箱格式)
  • My Shynet:控制面板的标题(仅仅标题)
 python manage.py python manage.py registeradmin example@example.com
 python manage.py  whitelabel "My Shynet"

2、容器应用控制台执行python manage.py registeradmin myShynet@Shynet.com 后会生成一个密码,该密码用于登陆Shynet(登陆Shynet后自行修改密码)

image-20250521030943843

提示CSRF问题

Public Address填写到环境变量中的ALLOWED_HOSTSCSRF_TRUSTED_ORIGINS即可,注意格式,参照TEMPLATE.env

正常启动控制台显示

登陆Shynet和修改密码

1、在应用详情中,点击Public Address访问应用

2、E-mail为之前设置的registeradmin,Password为控制台返回的密码

设置Shynet

1、点击左侧Create,在右侧填写Name、Link,其他选项看描述操作,最后点击底部的Create按钮

2、将代码嵌入网站,当有网站页面被访问,Shynet应用被触发进行工作

其他操作

设置registeradmin时没有记录密码

解决方法:登陆数据库应用,删除registeradmin时设置的邮箱的数据行(默认ID为1),重新启动容器应用

# 切换到名为 Shynet_db 的数据库
postgres=# \c Shynet_db

# 列出当前数据库中的所有表
Shynet_db=# \dt

# 查看core_user表的数据
Shynet_db=# select * from core_user;

# 删除 id 为 1 的行(默认的就是这行)
Shynet_db=# DELETE FROM core_user  WHERE id = 1;
DELETE 1

Shynet_db=# 

容器应用重启后,登入容器控制台,再次执行 python manage.py python manage.py registeradmin example@example.com命令

若使用SQLite数据库,点击文件管理,下载后上传或直接删除(刚启动应用一般没重要数据)

浏览器的Do Not Track

Shynet 响应“不追踪”(DNT)信号,当浏览器设置发送Do Not Track请求时,Shynet会进行响应。使用这种设置访问网站时,Shynet不会收集访问数据

Do Not Track 设置案例