架設自己的 HackMD 吧! – CodiMD

前言廢話

大家多少都有聽過 HackMD 吧!其方便於只需使用 Markdown 語法即可撰寫出一篇篇好看的文章。但你可曾想過自己架設一個嗎?

CodiMD 就是開源版的 HackMD,由 HackMD 自行維護,你可以在 這裡 找到他的原始碼。而類似的還有另一款名為 HedgeDoc,一樣是開源版本,我一樣將連結放在 這裡

不過 HedgeDoc 不是本篇重點,因此我就不細講了,有興趣的可以自己去看看哦!

安裝 CodiMD

首先,先更新一下系統

sudo apt-get -y update && sudo apt-get -y upgrade

安裝 docker-compose

sudo apt-get install -y docker-compose

接著,可以建立一個資料夾,我們在資料夾裡面,建立一個名為 docker-compose.yml 的檔案

sudo mkdir codimd && cd codimd
sudo vim docker-compose.yml

在內文貼上以下文字,並修改你的資料庫帳號及密碼(注意,以下是截稿前的配置,若想找最新的配置,可以在 這裡 找到)

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
  codimd:
    image: hackmdio/hackmd:2.4.2
    environment:
      - CMD_DB_URL=postgres://codimd:change_password@database/codimd
      - CMD_USECDN=false
    depends_on:
      - database
    ports:
      - "3000:3000"
    volumes:
      - upload-data:/home/hackmd/app/public/uploads
    restart: always
volumes:
  database-data: {}
  upload-data: {}

存檔離開後,我們執行他。

sudo docker-compose up -d

這時候,你的機器應該會下載檔案直到完成,你應該就可以在瀏覽器打開 <IP位址>:3000 看到網站囉!

遇到的問題及解答

關閉帳號註冊

若你希望服務不開放註冊,只讓自己用的話,你可以在初次註冊帳號結束後,編輯 docker-compose.yml

我們可以在 codimd 區塊的 environment 底下新增

  - CMD_ALLOW_ANONYMOUS=false
  - CMD_ALLOW_EMAIL_REGISTER=false

存檔後,使用 docker-compose down 將服務下線,並使用 docker-compose up -d 啟動服務。現在,你應該就不會看到註冊按鈕囉!

Docker 無法用防火牆管理

在筆記的當下,我正為這台機器使用 ufw 當作防火牆,根據上面我們的設定,我們將 CodiMD 設定在 Port 3000,但 ufw 卻無法控制他,即便已在 ufw 禁止這個 Port 的連入,我還是能從外面訪問他。

經過一番的爬文,我找到了一個解決方案:我們編輯 docker-compose.yml,並修改 codimd 區塊裡的 ports

  # 刪除
  - "3000:3000"
  # 新增
  - "127.0.0.1:3000:3000"

接著使用 docker-compose down 將服務下線,並使用 docker-compose up -d 啟動服務。現在,你應該就只能在 localhost 訪問到他囉。那你說,這樣外網就訪問不到啦,我將在下一個小節提到。

使用 Nginx 代理

通常,雖然我們可以直接在服務上開 Port 訪問他,但大部分人應該更偏好使用正規的網頁伺服器來進行管理。因此,本節將使用 Nginx 為例,來代理 CodiMD。

首先,先安裝 Nginx

sudo apt-get install -y nginx

進入 /etc/nginx/sites-enabled/ 並新增一個檔案叫 codimd

cd /etc/nginx/sites-enabled/ && sudo vim codimd

貼上以下內容,並適當的更新內容,例如:網域名稱、代理的 Port (若你有更改)

server {
        listen 80;
        root /var/www/html;
        server_name test.example.com;
        location / {
                proxy_pass http://localhost:3000/;
        }
}

接著重啟 Nginx

sudo systemctl restart nginx

若你已經在 DNS 綁上網域了,那你現在應該可以使用這個網域訪問到 CodiMD 囉!

結語

這篇文章是給想要自行架設此平台的人看啦。但要是你對這樣的需求不高,其實 HackMD 就真的很好用了啦!