Featured image of post 誰でも簡単!hedgedocセルフホスト!

誰でも簡単!hedgedocセルフホスト!

hackMDがセルフホストできる!

どうもこんにちは、whatacotton です。

最近hedgedocのサーバーをセルフホストしたので、簡単にその説明をおいておきます〜

# はじめに

皆さんはhedgedocという議事録やメモを残しておくアプリケーションをご存知でしょうか?HackMDでも構いません。

HackMDのほうが圧倒的に使ったことのある方が多いと思いますが、HackMDはセルフホストと言って、自分で作ったサーバー上にそのシステムを載せて使うということができません。

そこで使うのがhedgedocです!

この記事はlinuxサーバーを構築し、その上でhedgedocのサーバーを立てるという流れを解説しています。一応自己責任でお願いします。

# hedgedocのサーバーを構築する方法は主に2つ

公式ではhedgedocサーバーを立てる方法は2つあると言っていて、次の2つです。

# Nodeのサーバーを自分で立てる

この方法はその見出し通り1からサーバーを構築する方法です。最初この方法でやろうと思いましたが、必要となるアプリケーションが多いのと、それぞれのセットアップが必要なので諦めました。

# dockerを使う(今回の方式)

今回の記事ではこの方法を採用しています。dockerはその他のセットアップがほとんど必要ないので手軽に立てることができます。

# curl,dockerのインストール

まずはcurlとdockerの環境をインストールしましょう。入っている人は飛ばしてください。

1
2
3
4
5
6
# curlのインストール
$ sudo apt install curl
# dockerのインストール
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
$ rm get-docker.sh

dockerのインストールは下記を参考にしました。

# docker-compose.ymlの構築

次にdocker-compose.ymlを書いていきます。公式ドキュメント通りでも動かすことができますが、

1
- CMD_DOMAIN=localhost

の部分を書き換えないと、そのホストのパソコンでしか使用できなくなります。

なぜならリクエストを飛ばすURLをその環境変数を元にしているからで、localhostのままだと、外からアクセスしようとしてもそのパソコン自体の内側にアクセスしようとしてしまうからです。 (そのパソコンのlocalhostにアクセスしようとしてしまう。)

 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
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:
    # Make sure to use the latest release from https://hedgedoc.org/latest-release
    image: quay.io/hedgedoc/hedgedoc:1.9.9
    environment:
      - CMD_DB_URL=postgres://hedgedoc:password@database:5432/hedgedoc
      # ここでIPアドレスかドメインを入力
      # ドメインを使用する場合は
      #- CMD_PROTOCOL_USESSL=true
      # を追加することでSSLを有効化できます。
      - CMD_DOMAIN=<IP-Address-to-deploy>
      # ここをfalseにしないとCSPエラーが出てcssやjsが読み込めない
      - CMD_URL_ADDPORT=false
    volumes:
      - uploads:/hedgedoc/public/uploads
    ports:
      - "3000:3000"
    restart: always
    depends_on:
      - database
volumes:
  database:
  uploads:

参考: hedgedocのdocker-compose.ymlの設定について

そのサーバーを外部公開する気がないのであれば、そのサーバーのIPアドレスを指定してあげることで同じネットワークからアクセスすることができます。 自分のサーバーのIPアドレスを知りたい場合は

1
$ ip a

とコマンドを打って確認します。次の写真だと、黄色のハイライトをかけた10.240.255.145が自分のアドレスとなります。

参考: ローカルIPについて

# サーバーの起動

docker-compose.ymlが作成できたら、dockerを起動します。

1
$ sudo docker compose up 

これで特に問題がなければhedgedocのサーバーの起動が完了できます。
<IP-address-to-deploy>:3000にブラウザからアクセスしてみてください。
(例: 192.168.10.1:3000など)

CMD_DOMAINlocalhostにしていない場合はlocalhost:3000だとページを見ることはできますが、いろいろなエラーが出て表示が崩れます。)

# サーバーの停止

起動中のサーバーはctrl+cで停止することができ、次のコマンドでサーバーを完全に停止することができます。

1
$ sudo docker compose down

# screenコマンドの使用

そのパソコンからログアウトしたあとでもそのサーバーを動かしたままでおきたい場合はscreenコマンドを使います。

インストール

1
$ sudo apt install screen

次のコマンドで別のスクリーンに入ることができます。

1
$ screen

別のスクリーンに入ってからサーバーを起動させましょう。

スクリーンを抜ける場合はctrl+aを打ったあとにdを打つと抜けることができます。また、再度そのスクリーンに入るときは、

1
$ screen -ls

で現在開いているスクリーンを表示して確認したあと、

1
$ screen -r <screen-id>

で入ることができます。

参考: screenコマンドの使い方

# リバースプロキシの設定

そのパソコンからアクセスできただけでは、スマホなどの外部デバイスから接続ができません。ここから、ローカルネットワークに公開するにはリバースプロキシというものを構築していく必要があります。

# nginxのインストール

リバースプロキシのアプリケーションであるnginxをインストールします。

1
$ sudo apt install nginx

# nginxの設定ファイルの書き換え

nginxの設定ファイルを書いていきます。

1
$ sudo nano /etc/nginx/nginx.conf

/etc/nginx/nginx.confに以下の設定を追加します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
http{
+ server{
+	 listen 80;
+	server_name <IP-address-to-deploy>;
+
+    	location / {
+        proxy_pass http://localhost:3000;
+        proxy_set_header Host $host;
+        proxy_set_header X-Real-IP $remote_addr;
+        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+     }
+    }
}

httpのネストの中に入れてあげないと動かないので注意してください。

設定ファイルが掛けたら次のコマンドを打ちます。

1
2
3
4
# nginxの有効化
$ systemctl enable nginx
# nginxの起動
$ systemctl start nginx

これで公開ができるはずです!

設定が完了したら、IPアドレスを同じネットワークの別のデバイスで叩いて、確認しましょう!

このような画面が見えたら成功です!!!

# 終わりに

どうだったでしょうか。

すこし大変だったかもしれませんが、自分でサーバーを立てるという経験はとてもいい経験となると思います!

ではまた別の記事で〜

comments powered by Disqus
Hugo で構築されています。
テーマ StackJimmy によって設計されています。