使用Docker最小化部署Misskey


继之前的 搭建一只Misskey实例 之后,在持续部署与本地开发的过程中,我又发现了许多之前疏漏的细节问题,例如对于镜像使用的掌握、对于相关参数的设置方案等等。因而觉得有必要重新来整理一下思路,准备更全面更精简的部署方案呢

使用无配置misskey构建的镜像在部署时 可能 会出现包含但不仅限于 无法订阅中继 的问题(未经严格测试,还有待考证),因而如果您使用官方镜像/无配置构建的镜像时出现了类似的异常工作情况,您可以考虑配置完成后先手动构建一份本地镜像,再进行对应的部署操作。

推荐的补充阅读:对文章「使用 Docker 最小化部署 Misskey」的补充 (by ADD-SP)

文章提及了一些配置中的坑,也许可以方便您避免一些可能出现的问题。

首先就是关于Misskey的部署需求。由于我们使用Docker来部署,那么唯一需要在意的就是相关的配置文件。(如果是站点迁移,则还需要db、redis、files三个文件夹,之后会解释为什么)因而我们可以直接忽略程式本体内容,仅处理相关的配置文件:

  1. 进入目标目录(例如~/nyaone/misskey),参照以下样例新建docker-compose.yml文件,请注意仔细检查每一行配置,保证与您的站点配置一致:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    # Misskey minimal deploy config
    version: "3"

    services:
    web:
    restart: always # 自动重启,请注意如果您对您的配置没有信心,请不要开启这个选项,以避免进程崩溃反复重启耗费大量资源!
    image: misskey/misskey:latest # 这里使用了官方镜像,以避免本地构建时资源不足的问题
    container_name: misskey_web # 容器名,方便管理,您可以自行修改为您觉得合适的内容
    links:
    - db
    - redis
    ports:
    - "127.0.0.1:3000:3000"
    networks:
    - internal_network
    - external_network
    volumes:
    - ./config:/misskey/.config:ro # 用于映射配置文件,请根据您的实际配置来决定文件夹名称,设定为只读即可;
    # 由于官方构建镜像时没有您站点的配置,所以对该卷的映射是必需的;
    # 如果您自行构建了含有配置文件的镜像,您可以忽略这块配置。
    # 配置时请记得删掉这些仅有注释的空行,以避免可能出现的问题。
    - ./files:/misskey/files # 用户上传到本地的文件,如果您一开始就接入外部存储(如wasabi或是AWS S3)您可以忽略这块配置

    redis:
    restart: always
    image: redis:latest
    container_name: misskey_redis
    networks:
    - internal_network
    volumes:
    - ./redis:/data # redis数据库的数据文件夹映射,创建后默认在 ./redis 文件夹中

    db:
    restart: always
    image: postgres:12.2-alpine
    container_name: misskey_db
    networks:
    - internal_network
    env_file:
    - ./config/docker.env # 需要使用配置文件中设置的 Docker 环境变量
    volumes:
    - ./db:/var/lib/postgresql/data # 主数据库的数据文件夹映射,创建后默认在 ./db 文件夹中

    networks:
    internal_network: # 内部网络
    internal: true
    external_network: # 外部网络
  2. 新建配置文件夹 (随便叫什么名都可以,请注意和docker-compose.yml中的两处配置项匹配)

    1
    mkdir config
  3. 进入配置文件夹,分别参照example.ymldocker_example.env新建default.ymldocker.env文件,写入各项配置;此处再附上相关的注意事项:

    • default.yml
      这个文件的编辑工作基本与非 Docker 环境的版本相同。
      但请注意, Postgresql 和 Redis 的 主机名(hostname) 配置不应该是 localhost ,它们被设置在 docker-compose.yml 文件中。
      以下是默认的主机名:

      服务 主机名
      Postgresql db
      Redis redis

      文章确实有些年久失修了
      现在部署的时候最好把 Misskey 配置文件的 signToActivityPubGet: true 这一行前面的注释去掉(即启用这个功能),部分 mastodon 实例开启了安全模式,因而如果不开启这个选项对 GET 请求也进行签名的话可能会导致连接障害。

    • docker.env
      在这个文件中配置 Postgresql 。
      至少需要如下这些配置:

      名称 描述
      POSTGRES_PASSWORD 数据库密码
      POSTGRES_USER 数据库用户名
      POSTGRES_DB 数据库名
  4. 初始化数据库

    1
    docker-compose run --rm web yarn run init
  5. 启动容器

    1
    docker-compose up -d
  6. 注册后设置管理员

    1
    docker-compose run --rm web node built/tools/mark-admin @您的用户名
  7. 更新
    由于Misskey官方有配置CI,所以等新版本发布后过几分钟就可以直接使用官方镜像进行更新。而更新起来也非常方便,只需要进入当前路径,运行以下指令即可:

    1
    2
    docker-compose pull
    docker-compose up -d

    请不要使用docker-compose stop来停止容器,因为这么做需要额外的时间等待容器停止;docker-compose up -d直接升级容器时会自动停止并立刻重建新的容器,完全没有必要浪费那些时间。

  8. 删除旧数据
    我曾经用这个方法释放了10+G的旧数据,天知道我经历了些什么(猫咪摊手

    1
    docker system prune

    要求确认时输入y并回车确认即可。

  9. 进阶操作
    例如我们可以编写一个脚本,配合crontab每天定时尝试拉取最新数据并更新;如果已经是最新版本了的话,那就无事发生

    1
    2
    3
    docker-compose -f /root/misskey/docker-compose.yml pull
    docker-compose -f /root/misskey/docker-compose.yml up -d
    docker system prune -f