HedgeDocをオンプレで動かす


2024/12/01
最初はHedgeDocをオンプレでセルフホストしようという名前だったのですが、
よくよく考えたらこれ頭痛が痛いだとなり、変更

この記事はcoins Advent Calendar 20241日目の記事です。

推奨タグは#coinsアドベントカレンダー2024らしいです。

HedgeDocとは?

公式サイト マークダウンで書け、ログイン認証システム、共有システム、共同編集システムを兼ね備えたセルフホスト型のHackMDみたいなものです。

グローバルIPがなくても運用できるようにします

大体セルフホストではVPSを借りるなどしてグローバルIPを降らせる必要がありますが、CloudflareTunnelを使用して貫通させ、ホストします。ドメインの管理をCloudflareの管轄にする必要があります。

インストールしよう

まず適当なサーバーを一台用意してください。 前提としてdockerをインストールしておいてください。 自分はProxmox上にUbntu24.04のサーバーを立てました 多分dockerを動かすならば、2コア2GB以上のRAMがあると良いと思います。

CloudflareTunnelを貫通

これはCloudflareのダッシュボードでTunnelを作成したときに出てくるセットアップのコードをそのままコピペするだけなので詳しくは解説しません。

dockerのセットアップ

sudo usermod -aG docker $USER

でまずグループに現在のユーザーを追加します(まだやっていない場合)

次にdocker-compose.ymlを作成します

nano docker-compose.yml

ymlに以下の内容を記述します

version: '3'
services:
  database:
    image: postgres:13.4-alpine
    environment:
      - POSTGRES_USER=hedgedoc
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=hedgedoc
    volumes:
      - database:/var/lib/postgresql/data
    restart: always
  app:
    image: quay.io/hedgedoc/hedgedoc:1.9.9
    environment:
      - CMD_DB_URL=postgres://hedgedoc:password@database:5432/hedgedoc
      - CMD_DOMAIN={your-cloudflare-domain}
      - CMD_PROTOCOL_USESSL=true
      - CMD_URL_ADDPORT=false
      - CMD_TRUST_PROXY=true
      - CMD_CSP_ENABLE=true
      - CMD_CSP_REPORT_ONLY=false
      - "CMD_CSP=default-src 'self' https://{your-cloudflare-domain} https://*.cloudflareusercontent.com; connect-src 'self' https://{your-cloudflare-domain} wss://{your-cloudflare-domain} https://*.cloudflareusercontent.com; font-src 'self' data: https://{your-cloudflare-domain} https://*.cloudflareusercontent.com https://cdnjs.cloudflare.com https://fonts.gstatic.com; img-src 'self' data: blob: https://{your-cloudflare-domain} https://*.cloudflareusercontent.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://{your-cloudflare-domain} https://*.cloudflareusercontent.com https://cdnjs.cloudflare.com; style-src 'self' 'unsafe-inline' https://{your-cloudflare-domain} https://*.cloudflareusercontent.com https://cdnjs.cloudflare.com https://fonts.googleapis.com; base-uri 'self'; manifest-src 'self'; frame-src *"
    volumes:
      - uploads:/hedgedoc/public/uploads
    ports:
      - "3000:3000"
    restart: always
    depends_on:
      - database
volumes:
  database:
  uploads:

自分の設定したドメインにします。

{your-cloudflare-domain}

その後

docker compose up -d

で起動します。 以下の画像のようになっていたら成功です。

アクセス

ドメインにアクセスし、

アカウント登録をします。この際、メールアドレスとパスワードを設定しますが、インチキメールアドレスで大丈夫です。

[email protected]

特に@の前のメアドがユーザー名になるので注意です。

新規登録の停止

ymlを書き換えます

version: '3'
services:
  database:
    image: postgres:13.4-alpine
    environment:
      - POSTGRES_USER=hedgedoc
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=hedgedoc
    volumes:
      - database:/var/lib/postgresql/data
    restart: always
  app:
    image: quay.io/hedgedoc/hedgedoc:1.9.9
    environment:
      - CMD_DB_URL=postgres://hedgedoc:password@database:5432/hedgedoc
      - CMD_DOMAIN=md.{your-cloudflare-domain}
      - CMD_PROTOCOL_USESSL=true
      - CMD_URL_ADDPORT=false
      - CMD_TRUST_PROXY=true
      # メール関連設定
      - CMD_EMAIL=true
      - CMD_ALLOW_EMAIL_REGISTER=false
      # 匿名アクセス無効化
      - CMD_ALLOW_ANONYMOUS=false
      - CMD_ALLOW_ANONYMOUS_EDITS=false
      # CSP設定
      - CMD_CSP_ENABLE=true
      - CMD_CSP_REPORT_ONLY=false
      - "CMD_CSP=default-src 'self' https://*.{your-cloudflare-domain} https://*.cloudflareusercontent.com; connect-src 'self' https://*.{your-cloudflare-domain} wss://*.{your-cloudflare-domain} https://*.cloudflareusercontent.com; font-src 'self' data: https://*.{your-cloudflare-domain} https://*.cloudflareusercontent.com https://cdnjs.cloudflare.com https://fonts.gstatic.com; img-src 'self' data: blob: https://*.{your-cloudflare-domain} https://*.cloudflareusercontent.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://*.{your-cloudflare-domain} https://*.cloudflareusercontent.com https://cdnjs.cloudflare.com; style-src 'self' 'unsafe-inline' https://*.{your-cloudflare-domain} https://*.cloudflareusercontent.com https://cdnjs.cloudflare.com https://fonts.googleapis.com; base-uri 'self'; manifest-src 'self'; frame-src *"
    volumes:
      - uploads:/hedgedoc/public/uploads
    ports:
      - "3000:3000"
    restart: always
    depends_on:
      - database
volumes:
  database:
  uploads:

以下で設定できます

      - CMD_ALLOW_EMAIL_REGISTER=false
      - CMD_ALLOW_ANONYMOUS=false
      - CMD_ALLOW_ANONYMOUS_EDITS=false

設定一覧を詳しくは見てください。 書き換えたらDockerを再起動し、サインインしかないことを確認したら終了です。

Githubログイン等を使いたいが...

公式ドキュメント通りにやれば上手く行きますが、組織等で絞ることができず、事実上誰でも登録可能な状態になってしまいます。 そのためauthentikを認証に使用するか、CloudflareAccess等で規制をかけた上プロキシを張ることが必要になります。

終わりに

カレンダー初日の記事でしたが、パソカタの記事になってしまいました。 明日はゃー君の記事です、楽しみですね。

ホーム