Misskeyのサマリプロキシ(riin-summaly)をDockerで動かす

MisskeyでURL付き(YoutubeとかYahooニュースのリンクなど)の投稿をすると、Webサイトのタイトルやアイコン画像が表示されることがある。
このリンク先のプレビューは、Webサイトに埋め込まれているOGPという情報をMisskeyが内蔵しているサマリプロキシを用いて展開しているのだけど、外付けのサマリプロキシを使うこともできる。
外付けのサマリプロキシを使う利点としてざっくりあげると、次の2点かな。

  • 複数のMisskeyサーバーを運用している場合は、Webサイトへのリクエストをまとめることができるし、キャッシュも効きやすくなる。
  • 内蔵プロキシでは非対応のWebサイトのリンクプレビューも外付けのプロキシなら対応していることがある。

今回は果物リンさんが開発しているサマリプロキシ fruitriin/riin-summaly をDockerで動かす方法についてメモを残す。
READMEを読むと、AmazonやNitoriなどのプレビューにも対応しており、(特に経路情報の学習あたりになってくると)熱意を通り越して執念を感じる。素敵だ。
本家のプロキシを拡張していて様々な機能が追加されているが、私はヨドバシのリンクプレビューを表示できるように、curl_cffiのTLS偽装くらいしか有効化していない。

まずはDockerfileをいい感じに作る。

 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
FROM node:24-bookworm-slim

WORKDIR /app

RUN apt-get update && apt-get install -y \
    curl \
    git \
    ca-certificates \
 && rm -rf /var/lib/apt/lists/*

RUN corepack enable

# uv
RUN curl -LsSf https://astral.sh/uv/install.sh | sh
ENV PATH="/root/.local/bin:${PATH}"

COPY package.json pnpm-lock.yaml ./
RUN pnpm install --frozen-lockfile

COPY . .
RUN pnpm build

# Python deps
WORKDIR /app/tools/curl-cffi-fetcher
RUN uv sync

WORKDIR /app
CMD ["pnpm", "serve", "/config/config.toml"]

次にcompose.ymlを作る。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
services:
  summaly:
    build: .
    container_name: summaly
    restart: unless-stopped
    network_mode: host
    volumes:
      - ./config.toml:/config/config.toml:ro
      - ./data:/app/data
    environment:
      NODE_ENV: production

リバースプロキシの設定も行う。私の環境はCaddyを使っているが、リポジトリにNginxのサンプルがあるのでNginxの方が良いかもしれない。

あとはconfig.tomlを作って、docker compose upして起動すれば完了。
Misskeyのコンパネを開いて、サマリプロキシのURLを指定すれば良い。

うちのconfig.toml 抜粋はこんな感じ。
正しいかは自信がないけど動いてはいる。

 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
48
49
50
51
52
53
54
55
56
57
58
59
[server]
host = "127.0.0.1"
port = 3100

[summaly]

[summaly.cache]
inMemory = true

[summaly.pdf]
enabled = true

[scraping.strategy_cache]
enabled = true

[scraping.proxy]
enabled = false
url = "https://summaly-proxy.<your>.workers.dev"
secret = "..."

[scraping.curl_cffi]
enabled = true
projectDir = "/app/tools/curl-cffi-fetcher"
uvPath = "/root/.local/bin/uv"

[scraping.fallback]
enabled = true

[plugins]
allowed = [
  "amazon",
  "bluesky",
  "wikipedia",
  "branchio-deeplinks",
  "youtube",
  "spotify",
  "twitter",
  "npmjs",
  "nintendo-store",
  "yodobashi",
  "sqex",
  "syosetu",
  "kakuyomu",
  "nitori",
  "dlsite",
  "iwara",
  "komiflo",
  "nijie",
  "dmm",
]


[diagnostics]
parseFailureLog = false

[embed]
enabled = true
publicUrl = "https://example.com"   # https: 必須。embed 機能を使う場合は必須
frameAncestors = ["https://misskey.7ka.org","https://chiranote.com"]
comments powered by Disqus
Hugo で構築されています。
テーマ StackJimmy によって設計されています。