用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上。


评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注