Docker作为目前最流行的虚拟容器平台,用起来真的很方便,且需要长期后台运行的服务用它来管理也更便捷,所以本篇文章参考官方说明中的: 通过Docker安装Misskey

开始安装

按照官方文档的说明进行操作已经足够安装运行Misskey了,但作者还是遇到了一些小坑,在此记录一下。
首先,先贴出官方文档中的所有命令

# Step 1 Clone程序代码至本地
git clone -b master https://github.com/misskey-dev/misskey.git
cd misskey
git checkout master

# Step 2 复制两份默认的配置文件,并按需设置
cp .config/example.yml .config/default.yml
cp .config/docker_example.env .config/docker.env

# Step 3 构建并初始化程序
sudo docker compose build
sudo docker compose up db redis -d  # 这行命令看后面的注意事项
sudo docker compose run --rm web yarn run init

# Step 4 先关闭当前容器
sudo docker compose down

注意事项

作者遇到的一个小坑就是在第三步初始化的时候,此时数据库的Docker容器并没有运行,所以在初始化时会一直提示连接不上数据库,导致初始化无法成功,所以在初始化之前应该先运行相关的数据库容器。容器的名称参考docker-compose.yml文件中的配置。

初始化成功后先关闭当前容器,因为后面我们需要做一个反向代理,因为Misskey是默认运行在3000端口上的,且需要通过https进行访问,所以我们还需要一个域名。

Caddy反向代理

Caddy则成为了我们最好的选择,目前的Caddy2是默认开启https访问且支持自动从http301跳转的,证书来源于Letsencrypt的90天免费证书,且Caddy可以将此证书自动续期,无需自己手动重新申请,可谓是一劳永逸。

Caddy配置文件,放到项目代码的根目录即可,由于后面使用了DockerCompose的link字段,所以此处host应该为web

{
        email youremail
}
yourdomain {
        reverse_proxy http://web:3000
}

由于Misskey的服务和数据库都是通过Docker来运行的,所以此处打算将Caddy也以同样的方式运行,将以下配置填入项目代码的docker-compose.yml中,注意缩进,要和services下面的其他节点保持一致。

  caddy:
    image: caddy:2.5.2-alpine
    container_name: caddy
    links:
      - web
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - ./caddy_data:/data
      - ./caddy_config:/config
      - ./caddy_site:/srv
    ports:
      - "80:80"
      - "443:443"
    restart: unless-stopped
    networks:
      - internal_network
      - external_network
    depends_on:
      - web

后记

搭建过程中发现,官方在docker-compose.yml中配置了networks,会导致web容器在启动时无法访问两个数据库服务,理论上这样设置是没有问题的,但它确实发生了,作者后来将networks节点注释掉就顺利解决了这个问题,如果有知道原因的网友,希望能留言指导一下.

最后附上我这里经过修改后可用的配置文件:docker-compose.yml

version: "3"

services:
  redis:
    restart: always
    image: redis:7.0.4-alpine
    # networks:
    #   - internal_network
    volumes:
      - ./redis:/data
    expose:
      - "6379:6379"
    ports:
      - "6379:6379"

  db:
    restart: always
    image: postgres:14.4-alpine
    # networks:
    #   - internal_network
    env_file:
      - .config/docker.env
    volumes:
      - ./db:/var/lib/postgresql/data
    expose:
      - "5432:5432"
    ports:
      - "5432:5432"

  web:
    build: .
    restart: always
    links:
      - db
      - redis
#      - es
    depends_on:
      - db
      - redis
    expose:
      - "3000:3000"
    ports:
      - "3000:3000"
    # networks:
    #   - internal_network
    #   - external_network
    volumes:
      - ./files:/misskey/files
      - ./.config:/misskey/.config:ro

  caddy:
    image: caddy:2.5.2-alpine
    container_name: caddy
    links:
      - web
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - ./caddy_data:/data
      - ./caddy_config:/config
      - ./caddy_site:/srv
    ports:
      - "80:80"
      - "443:443"
    restart: unless-stopped
    # networks:
    #   - internal_network
    #   - external_network
    depends_on:
      - web

#  es:
#    restart: always
#    image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.4.2
#    environment:
#      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
#      - "TAKE_FILE_OWNERSHIP=111"
#    networks:
#      - internal_network
#    volumes:
#      - ./elasticsearch:/usr/share/elasticsearch/data

networks:
  internal_network:
    internal: true
  external_network:

参考:
https://misskey-hub.net/en/docs/install/docker.html