text: Title: K8s部署教程
  Body: ### 配置文件
  ```json
  {
      "accounts_urls": [
          {
              "mark": "账号标识，可以设置为空字符串",
              "url": "账号主页链接",
              "tab": "账号主页类型",
              "earliest": "作品最早发布日期",
              "latest": "作品最晚发布日期"
          }
      ],
      "mix_urls": [
          {
              "mark": "合集标识，可以设置为空字符串",
              "url": "合集链接或者作品链接"
          }
      ],
      "owner_url": {
          "mark": "账号标识，可以设置为空字符串",
          "url": "账号主页链接"
      },
      "root": "",
      "folder_name": "Download",
      "name_format": "create_time type nickname desc",
      "date_format": "%Y-%m-%d %H:%M:%S",
      "split": "-",
      "folder_mode": false,
      "music": false,
      "storage_format": "",
      "cookie": "",
      "dynamic_cover": false,
      "original_cover": false,
      "proxies": "",
      "download": true,
      "max_size": 0,
      "chunk": 1048576,
      "max_retry": 5,
      "max_pages": 0,
      "default_mode": "8",
      "ffmpeg": ""
  }
  ```
  
  `default_mode: "8"`
  
  ### Dockerfile
  
  ```Dockerfile
  FROM python:3.12
  
  WORKDIR app
  
  COPY  ./src /app/src
  COPY  ./static /app/static
  COPY  ./templates /app/templates
  COPY  ./Dockerfile /app/Dockerfile
  COPY  ./main.py /app/main.py
  COPY  ./requirements.txt /app/requirements.txt
  # COPY  ./settings.json /app/settings.json 从容易映射进去
  
  RUN  sed -i 's@^.*            if self.console.input(.*$@@'  main.py &&\
       sed -i 's@^.*                    "是否已仔细阅读上述免责声明(YES/NO): ").upper() != "YES":.*$@@'  main.py &&\
       sed -i 's@^.*                return False.*$@@'  main.py &&\
       echo '/bin/bash' >> /entrypoint.sh &&\
       echo 'cd /app' >> /entrypoint.sh &&\
       echo 'echo 5 | /usr/local/bin/python main.py' >> /entrypoint.sh &&\
       chmod +x /entrypoint.sh &&\
      pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
  
  ENTRYPOINT ["/bin/bash", "/entrypoint.sh"]
  ```
  
  ### k8s配置
  
  ```yaml
  # Deployment
  apiVersion: apps/v1
  kind: Deployment
  metadata:
    name: tiktok
    namespace: tool
    labels:
      app: tiktok
  spec:
    replicas: 1
    selector:
      matchLabels:
        app: tiktok
    template:
      metadata:
        labels:
          app: tiktok
      spec:
        volumes:
          - name: tiktok
            persistentVolumeClaim:
              claimName: tiktok
        containers:
          - name: tiktok
            image: 'tiktok:v5.3'
            imagePullPolicy: IfNotPresent
            ports:
              - name: tiktok
                protocol: TCP
                containerPort: 5000
            volumeMounts:
              - name: tiktok
                mountPath: /app/Download
            resources:
              limits:
                cpu: 200m
                memory: 512Mi
              requests:
                cpu: 50m
                memory: 128Mi
  
  ---
  apiVersion: v1
  kind: Service
  metadata:
    name: tiktok
    namespace: tool
    annotations:
      traefik.ingress.kubernetes.io/service.sticky.cookie: "true"
      traefik.ingress.kubernetes.io/service.sticky.cookie.name: "sticky"
      traefik.ingress.kubernetes.io/service.sticky.cookie.secure: "true"
  spec:
    ports:
    - name: http
      protocol: TCP
      port: 5000
    selector:
      app: tiktok
  
  ```
  
  ```yaml
  # PersistentVolume
  apiVersion: v1
  kind: PersistentVolume
  metadata:
    name: tiktok
    namespace: tool
  spec:
    storageClassName: "nfs-storage"
    accessModes:
    - ReadWriteMany
    capacity:
      storage: 10Gi
    persistentVolumeReclaimPolicy: Retain
    nfs:
      path: /data/tiktok
      server: 10.233.1.10
  
  ---
  apiVersion: v1
  kind: PersistentVolumeClaim
  metadata:
    name: tiktok
    namespace: tool
  spec:
    storageClassName: "nfs-storage"
    accessModes:
      - ReadWriteMany
    volumeName: "tiktok"
    resources:
      requests:
        storage: 10Gi
  ```
  
  ```yaml
  # IngressRoute
  
  apiVersion: traefik.io/v1alpha1
  kind: IngressRoute
  metadata:
    name: tiktok
    namespace: tool
  spec:
    entryPoints:
      - websecure
    routes:
      - match: Host(`tiktok.domain.com`) && PathPrefix(`/`)
        kind: Rule
        services:
          - name: tiktok
            port: 5000
    
    tls:
      certResolver: letsencrypt
  ```
  
  ### 附图
  
  ![image](https://github.com/JoeanAmier/TikTokDownloader/assets/16331459/4aa85b93-7064-4029-8fdb-43afec945354)
  