在ClawCloud部署Shynet

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 设置案例