2024/12/01
最初はHedgeDocをオンプレでセルフホストしようという名前だったのですが、
よくよく考えたらこれ頭痛が痛いだとなり、変更
この記事はcoins Advent Calendar 20241日目の記事です。
推奨タグは#coinsアドベントカレンダー2024らしいです。
公式サイト マークダウンで書け、ログイン認証システム、共有システム、共同編集システムを兼ね備えたセルフホスト型のHackMDみたいなものです。
大体セルフホストではVPSを借りるなどしてグローバルIPを降らせる必要がありますが、CloudflareTunnelを使用して貫通させ、ホストします。ドメインの管理をCloudflareの管轄にする必要があります。
まず適当なサーバーを一台用意してください。 前提としてdockerをインストールしておいてください。 自分はProxmox上にUbntu24.04のサーバーを立てました 多分dockerを動かすならば、2コア2GB以上のRAMがあると良いと思います。
これはCloudflareのダッシュボードでTunnelを作成したときに出てくるセットアップのコードをそのままコピペするだけなので詳しくは解説しません。
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
で起動します。 以下の画像のようになっていたら成功です。
ドメインにアクセスし、
アカウント登録をします。この際、メールアドレスとパスワードを設定しますが、インチキメールアドレスで大丈夫です。
特に@の前のメアドがユーザー名になるので注意です。
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を再起動し、サインインしかないことを確認したら終了です。
公式ドキュメント通りにやれば上手く行きますが、組織等で絞ることができず、事実上誰でも登録可能な状態になってしまいます。 そのためauthentikを認証に使用するか、CloudflareAccess等で規制をかけた上プロキシを張ることが必要になります。
カレンダー初日の記事でしたが、パソカタの記事になってしまいました。 明日はゃー君の記事です、楽しみですね。