Posts 旧 Wiki などの建て方
Post
Cancel

旧 Wiki などの建て方

この記事は過去の遺物です

この記事は SFC-RG アドベントカレンダー 2019 21 日目の記事です

メモ管理に疲れたので,サーバに CodiMD と wiki.js を建ててみました.せっかくなので建てた wiki で記事を公開しました.間違い等あったら教えてください.

建てる

個人的に以下の要件を満たしたいお気持ちがありました.

  • 安い VPS で建てたい
  • 死んだときにすぐに別鯖などで復帰できるようにしたい
  • 当然 HTTPS で通信したい
  • 生で建てると面倒なのでコンテナで建てたい

そこで,AWS Lightsail 上に docker-compose を用いて建てることにしました.HTTPS 通信/リバースプロキシに関しては negineri 先生に教えてもらい docker-letsencrypt-nginx-proxy-companion を用いることにしました.

VPS 自体の用意

Lightsail はv6接続性がないので,今は全部 vultr に移動しました

AWS にログインし Lightsail に行きます.「インスタンスの作成」から,新しいインスタンスを建てます.今回は東京リージョンに慣れ親しんだ Ubuntu18.04 LTS で,プランは 2 つのサービスを持つのに最低限な $5 のプランで建てました.一番下の「インスタンスの作成」を押して数分まつだけで上がってきてくれます.

Lightsail トップに戻り,作成したインスタンスを選択,「ネットワーキング」から静的 IP アドレスのアタッチをしておきます.次に「スナップショット」に移り,自動スナップショットを有効化しておきます.

スナップショットは,サーバの状態をまるまる保存しておくというもので,自動を ON にしておくと日に一回勝手に保存してくれます.GB単位で料金が発生しますが,そこまで高くないですし,自動スナップショットでとったものは 1 週間保存された後に自動で消えてくれるので,あまり気にしていません. また,スナップショットを取っておくと,サーバが壊れた際やスケールアップしなければならないとき (※Lightsail は一度作ったインスタンスのサイズを変えられない) にスナップショットからインスタンスを作成することで,ボタン 1 つで復帰できます.さらに,静的 IP アドレスをもとのインスタンスからデタッチし,新しいインスタンスにアタッチすることで,同じ IP アドレスをそのまま使えます.

次に,同じく「ネットワーキング」からファイアーウォールを設定しておきます.443 の inbound を開けておきます.80 は運用時は閉じてしまっても差し支えありません. 閉じると Let’s Encrypt の証明書更新ができなくなるのであけておいてください

VPS の設定

このままではデフォルトユーザ (ubuntu) しかユーザがないので,自分のユーザをお好みで作ります.ssh した後

1
2
3
4
5
sudo -i                                       # superuser になる
adduser {user_name}                           # 対話形式でユーザ作成
gpasswd -a {user_name} sudo                   # sudo グループに追加
mkdir /home/{usen_name}/.ssh
vim /home/{user_name}/.ssh/authorized_keys    # ここに公開鍵をペースト

で新規ユーザを作成します.exit して作ったユーザで再度ログイン.

1
2
3
sudo apt update
sudo apt upgrade -y
sudo apt install -y git docker docker-compose    # 本当は docker 社のリポジトリを追加してからやるのが正しいけど,これで構築しちゃったのでとりあえずこう書いておく

docker-letsencrypt-nginx-proxy-companion の設定

今回は HTTPS 通信を行うために Let’s Encrypt から証明書を取得します.また,その設定とリバースプロキシを同時に,docker-compose で行うため,docker-letsencrypt-nginx-proxy-companion を使います. 使い方としては,まず docker で companion 用のネットワークを作成したあとに companion を立ち上げ,ひたすら走らせ続けます.あとは Web サービスを docker-compose で立ち上げるときに必要な設定を数行入れて同じネットワークに参加させるようにして立ち上げれば,自動で証明書の取得からやってくれます.めっちゃ便利.

1
2
3
4
docker network create web_nw      # 今回は web_nw という名前のネットワークに全て入れる
mkdir /opt/proxy
cd /opt/proxy
vim docker-compose.yml            # ここに以下の設定を入れる

docker-compose の作り方は公式の解説を読んでほしいのですが,私のものを以下に貼っておきます.

設定対象: /opt/proxy/docker-compose.yml

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
version: "3"
services:
  proxy:
    image: jwilder/nginx-proxy:latest
    labels:
      com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy: "true"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - certs:/etc/nginx/certs:ro
      - dhparam:/etc/nginx/dhparam
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - conf:/etc/nginx/conf.d
    ports:
      - "80:80"
      - "443:443"
    restart: always
    privileged: true
    container_name: "reverse-proxy_"

  letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - certs:/etc/nginx/certs:rw
      - dhparam:/etc/nginx/dhparam
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - conf:/etc/nginx/conf.d
    restart: always
    privileged: true
    container_name: "reverse-proxy_letsencrypt_"

networks:
  default:
    external:
      name: web_nw

volumes:
  conf:
  vhost:
  html:
  dhparam:
  certs:

書き終わったら立ち上げます.

設定対象: /opt/proxy

1
docker-compse up -d

lightsail に割り当てた静的 IP アドレスにアクセスし,nginx のページが見えていれば成功です.

CodiMD の設定

次に CodiMD をたてます.同じく docker-compose です.

1
2
3
mkdir /opt/hackmd
cd /opt/hackmd
vim docker-compose.yml

ここも公式の解説を読んでほしいのですが,自分のを以下に貼り付けます.companion との関係で複数設定を変更している点も記述します.

設定対象: /opt/hackmd/docker-compose.yml

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
version: "3"
services:
  database:
    image: postgres:11.6-alpine
    environment:
      - POSTGRES_USER: codimd
      - POSTGRES_PASSWORD: change_password
      - POSTGRES_DB: codimd
    volumes:
      - "database-data:/var/lib/postgresql/data"
    restart: always
    networks:
      md-backend:
  codimd:
    image: nabo.codimd.dev/hackmdio/hackmd:2.0.1
    environment:
      - CMD_DB_URL: postgres://codimd:change_password@database/codimd
      - CMD_USECDN: false
      - CMD_DOMAIN: md.jj1lfc.dev            # ドメイン名
      - CMD_PORT: 3100
      - CMD_ALLOW_ANONYMOUS_EDITS: true      # 一定条件で第三者の編集を許可 (ページごとにパーミッション指定可能に)
      - CMD_DEFAULT_PERMISSION: private      # フェイルセーフでデフォルトは一番硬く
      - CMD_ALLOW_GRAVATAR: true
      - CMD_ALLOW_FREEURL: true              # ログインしてページを作りたい URL にアクセスするだけでその URL でページを作れる
      - CMD_ALLOW_PDF_EXPORT: true
      - CMD_IMAGE_UPLOAD_TYPE: filesystem    # 画像は内部に
      - CMD_EMAIL: true
      - CMD_ALLOW_EMAIL_REGISTER: false      # 勝手に登録されないように
      - CMD_PROTOCOL_USESSL: true            # これを明示しないと mixed-content で CSS が読み込まれない
      - VIRTUAL_HOST: md.jj1lfc.dev          # proxy 用ドメイン名
      - VIRTUAL_PORT: 3100                   # proxy 用ポート
      - LETSENCRYPT_HOST: md.jj1lfc.dev
      - LETSENCRYPT_MAIL: alt@jj1lfc.dev
    depends_on:
      - database
    expose:
      - 3100                              # 公式では ports だけど expose で十分
    volumes:
      - upload-data:/home/hackmd/app/public/uploads
    restart: always

networks:
  web:
    md-backend:

networks:
  md-backend:
  web:
    external:
      name: web_nw

volumes:
  database-data: {}
  upload-data: {}

書き終わったら同じく docker-compose up -d で建てます.なお,最初に建てるときはこのままだとユーザ登録ができないので,CMD_ALLOW_ANONYMOUS: false を一度コメントアウトしてから建てて,ブラウザでユーザ登録をしてから再度コメントアウトを外して docker-compose down docker-compose up -d を行います.

wiki.js の設定

次に wiki.js をたてます.同じく docker-compose です.

1
2
3
mkdir /opt/wiki
cd /opt/wiki
vim docker-compose.yml

ここも公式の解説を読んでください.一応自分のを以下に貼り付けます.companion との関係で複数設定を変更している点も記述します.

設定対象: /opt/wiki/docker-compose.yml

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
version: "3"

services:
  db:
    image: postgres:11-alpine
    environment:
      - POSTGRES_DB: wiki
      - POSTGRES_PASSWORD: hogehoge
      - POSTGRES_USER: wikijs
    logging:
      driver: "none"
    restart: unless-stopped
    networks:
      wiki-backend:
    volumes:
      - db-data:/var/lib/postgresql/data

  wiki:
    image: requarks/wiki:2
    depends_on:
      - db
    environment:
      - DB_TYPE: postgres
      - DB_HOST: db
      - DB_PORT: 5432
      - DB_USER: wikijs
      - DB_PASS: hogehoge
      - DB_NAME: wiki
      - VIRTUAL_HOST: wiki.jj1lfc.dev                          # 自分のドメイン名に設定
      - VIRTUAL_PORT: 3000
      - LETSENCRYPT_HOST: wiki.jj1lfc.dev                      # 自分のドメイン名に設定
      - LETSENCRYPT_MAIL: alt@jj1lfc.dev                       # 自分のメアドに設定
    restart: unless-stopped
    expose:
      - 3000
    networks:
      web:
      wiki-backend:

networks:
  wiki-backend:
  web:
    external:
      name: web_nw

volumes:
  db-data:

書き終わったら同じく docker-compose up -d で建てます.

以上.wiki.js は多分 WebGUI で設定することのほうが多いですが,見りゃわかると思います.DB の内容を Local や S3,Github に dump できる設定もあるため,自分は Lightsail が立っているのと違うリージョンの S3 と Github にバックアップしています.バックアップ間隔が 5 分から設定変更できないのはバグっぽいです.

This post is licensed under CC BY 4.0 by the author.

-

Meraki MR シリーズで 2.4GHz Only の SSID を吹く