用 K8S 搭建小雅 Alist

赛博菩萨系列

这不是今年,哦,去年,买了个小主机嘛,这不是就在自己折腾 K8S 嘛。

既然已经能比较熟练地部署 Jellyfin 了,那么也差不多能比较轻而易举地将 Docker「升级」成 K8S 部署了。


小雅,又名小雅 AList 、小雅超集,大概干的事情是将 AList 魔改一番,然后做了网盘聚合,传言里面大概有 200T 的各种资源。

我馋这东西好久了,之前一直没看懂。然后最近按照官方教程上尝试了一下,嗯,原来还是蛮简单的,写几个配置文件就好了。官方有一键搭建脚本,里面是在宿主机上起 Docker,但我不是想把所有东西都 K8S 化嘛,所以就有了本期的折腾。


获取各种 Token

按照小雅指南(小雅官方教程),我们需要获取下面几个东西:

项目文件
阿里云盘的 Tokenmytoken.txt
阿里云盘 Open Tokenmyopentoken.txt
转存目录 ID(转存一下这个temp_transfer_folder_id.txt
内网访问地址
我用 ingress 加了个域名,是 xiaoya.homelab
docker_address.txt
内容为 http://xiaoya.homelab

将这三个东西按照要求,分别保存成文本文件。

配置清单

我是把所有东西放在了 apps 这个 namespace 下。

大致干的事情,就是把官方的「一行」就能完成的 Docker 启动,变成 100 多行的 K8S 配置清单。

PVC,用于存储配置文件

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: xiaoya
  namespace: apps
spec:
  resources:
    requests:
      storage: 1Gi
  accessModes:
    - ReadWriteMany

到这里,你的集群的默认存储设备上已经有一个空的文件夹了。你需要把上面自己创建的那些文件复制进去。直接放在这个文件夹里面就好

Deployment,用于真正起服务

apiVersion: apps/v1
kind: Deployment
metadata:
  name: xiaoya
  namespace: apps
spec:
  replicas: 1
  selector:
    matchLabels:
      app: xiaoya
  template:
    metadata:
      labels:
        app: xiaoya
    spec:
      containers:
        - name: xiaoya
          image: xiaoyaliu/alist:latest
          imagePullPolicy: IfNotPresent
          ports:
            - name: http # 这个是日常访问端口
              containerPort: 80
              protocol: TCP
            - name: http-manage # 这个是管理端口,平常用不到
              containerPort: 5244
              protocol: TCP
          securityContext:
            privileged: true 
          volumeMounts:
            - mountPath: /data
              name: xiaoya-config
      volumes:
        - name: xiaoya-config
          persistentVolumeClaim:
            claimName: xiaoya
      restartPolicy: Always

Service,我也不知道到底是干啥的。大概是对外暴露那些端口

kind: Service
apiVersion: v1
metadata:
  name: xiaoya
  namespace: apps
spec:
  selector:
    app: xiaoya
  ports:
    - port: 80
      targetPort: 80
      name: http
      protocol: TCP
  type: LoadBalancer
  sessionAffinity: ClientIP

Ingress,用于配置域名访问。由于管理端口一般用不到,所以我就没做映射

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: xiaoya
  namespace: apps
spec:
  rules:
    - host: xiaoya.homelab
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: xiaoya
                port:
                  name: http

为了能顺利自动重启,需要先增加一个权限

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: apps
  name: deployment-manager
rules:
- apiGroups: ["apps"]
  resources: ["deployments"]
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: deployment-manager-binding
  namespace: apps
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: deployment-manager
subjects:
- kind: ServiceAccount
  name: default
  namespace: docker

每日自动重启(更新资源、自动签到)

apiVersion: batch/v1
kind: CronJob
metadata:
  name: xiaoya
  namespace: apps
spec:
  schedule: "0 2 * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: kubectl
            image: bitnami/kubectl
            args:
            - rollout 
            - restart 
            - deployment/xiaoya
          restartPolicy: OnFailure

好了,到这里,大功告成。等个 5 分钟左右,看到 Log 里面获取更新完毕,就可以打开浏览器,输入 http://xiaoya.homelab 使用了。

除了官方推荐的「Docker 重启大法」,其实还有个办法可以更新:在根目录下,有个叫 updateall 的东西,定时运行它也是可以的。

其他配置

TVBox 如何配置

填这个地址:

http://xiaoya.homelab/tvbox/my.json

如何进管理页面

首先,我们需要获取密码。按照 alist 的官方教程,我们需要进入到容器 shell 内,然后执行

./alist password

即可看到用户名和密码。我这里遇到了一点点报错,说 ALIST_开头的环境变量解析错误。自己手动 export 一下即可。

还记得有个 5244 端口不?对,就它。可以用 Lens 之类的东西直接映射一下,就可以打开了。

最近发现好像完全把管理界面给干掉了?那么可以直接用 sqlite3 查看 data.db 修改全部内容。不过,似乎也没啥好修改的。

平时怎么维护

小雅指南上说要每天重启 Docker 以更新目录。 emm,咱已经拿 K8S 的定时任务给解决了。

我看它的原理似乎是将你想看的文件转存到自己的阿里云盘上,然后获取文件地址播放。所以你的阿里云盘转存文件夹里将会有所有浏览过的文件。平时闲着无聊的话,登录上去,删删文件,就好了。

我看到有个叫做 aliyun_cleaner 的脚本,似乎可以用。但是这个东西写得有点复杂,里面一大堆自动升级、签到、安装定时任务啥啥啥的,加上我对 sh 不熟悉,看得比较晕。

所以我也自己拿 go 写了个脚本。大致思路是用 refresh token 换 access token(并把新拿到的 refresh token 写回原来的文件里),然后调用对应的 API,列出目录、判断文件创建时间、删除 2 天前的文件。把这个文件放到/data,设置好执行权限,然后写了个 CronJob:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: xiaoya-cleaner
  namespace: docker
spec:
  schedule: "30 1 * * *"
  concurrencyPolicy: Replace
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: kubectl
            image: bitnami/kubectl
            command:
            - /bin/bash
            - -c
            - |
              pods=$(kubectl get pods -l app=xiaoya -o=jsonpath='{.items[*].metadata.name}' -n docker)
              for pod in $pods; do
                kubectl exec $pod -n docker -- /bin/bash -c "cd /data && ./XiaoyaCleaner"
              done
          restartPolicy: OnFailure

然后我发现,API 方面其实可以有两套方案:用网页 API(mytoken.txt),或者用 OpenAPI(myopentoken.txt)。区别不大。

其他高级功能怎么用

看官方文档去吧。虽然不太好读,但凑合能用。

Jellyfin/Emby 怎么挂载

不会,还没研究。

官方有另一个脚本(仔细看了下其实是脚本套脚本),一键安装 emby,顺带安装 resiliosync 用于同步元数据。

看其他人的说明,似乎是要把元数据下载并解压到 Jellyfin/Emby 的某个目录中。但毕竟 Jellyfin 可是我的 K8S 中最最核心(使用频率最高)的应用呢。它要是挂了,我会很不爽。有空的话看看官方教程里面是怎么做的,也给「移植」到 k8s 上。