Netlify CMSでデジタル日記を作ってみる

May 07, 2021

programming
article cover
Image by Ellen Auer

Netlify CMS

Netlify CMS は、Netlify で使用できるオープンソースのgitベースCMSです。
Netlify CMSの提供するUIを通して複数人で投稿/編集が可能で、コンテンツはNetlify CMSを通してGithubのレポジトリへpushされます。

gitベースCMSという言葉が出てきたので説明しておきましょう。
Headless CMSは大きくわけて、

  • APIベース
  • Gitベース

の2種類があります。

APIベースはそのHeadless CMSが提供するプラットフォームに依存する形になるのに対して、
GitベースはGithub等をDBとして使い、Headless CMSがレポジトリにpushしてくれます。
GitにあるファイルをUIを通して編集するための仲介アプリのようなものですね。

Gitベースの方がシンプルかつ無料で使用でき、全てがコントロール下にあるので、個人的にはGitベースのHeadless CMSを使用しています。
今回もGitベースCMSであるNetlify CMSを使用していきます。

description

作るもの

今回はNetlify CMSを使い、ウェブページから投稿/編集できる日記を作ってみます。
最小限の構成になっているので、理解しやすいかと思います。

Step 1

兎にも角にも、まずはGithubでレポジトリを作り、Netlifyで公開します。
今回はCMS部分が肝なので、公開するページはなんでもいいです。

*
└── public
     └── index.html
<!DOCTYPE html>
<head>
  <meta charset="UTF-8">
  <title>Diary</title>
</head>
<body>
    <h1>Hello World</h1>
</body>
</html>

新しいレポジトリを作って、push。

screnn

git init
git add .
git commit -m 'init'
git remote add origin master <your repository address>
git push -u origin master

Netlifyで公開。
Build commandは無し、
公開するのはpublicフォルダーです。

screnn

screnn

Step 2

いよいよNetlify CMSの設定。 まずはpublicの中にadminというフォルダを作って、その中にindex.htmlを用意します。

*
└── public/
     ├── index.html
     │
     └── admin/
          └── index.html

admin/index.htmlでやることは3つだけです。

  1. ログイン用のウィジェットを読み込む
  2. Netlify CMSのファイルを読み込む
  3. ログイン後のリダイレクトを設定
<!doctype html>
<html>
<head>
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Content Manager</title>

  <!--  1. ログイン用のウィジェットを読み込む-->
  <script src="https://identity.netlify.com/v1/netlify-identity-widget.js"></script>
</head>
<body>
  <!--  2. Netlify CMSのファイルを読み込む-->
  <script src="https://unpkg.com/netlify-cms@^2.0.0/dist/netlify-cms.js"></script>

  <!--  3. ログイン後のリダイレクトを設定-->
  <script>
  if (window.netlifyIdentity) {
    window.netlifyIdentity.on("init", user => {
      if (!user) {
        window.netlifyIdentity.on("login", () => {
          document.location.href = "/admin/";
        });
      }
    });
  }
</script>
</body>
</html>

ログイン用のウィジェットはpublic/index.htmlでも読み込む必要があります。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
    
  <!--  public/index.htmlにも追記  -->
  <script src="https://identity.netlify.com/v1/netlify-identity-widget.js"></script>
</head>
<body>
  <h1>Hello World</h1>
</body>
</html>

Step 3

adminフォルダの中にconfig.ymlという設定ファイルを作成します。
この設定が重要なんですが、最初は少しトリッキーで苦労しました。

*
└── public/
     ├── index.html
     │
     └── admin/
          ├── index.html
          └── config.yml
backend:
  name: git-gateway
  branch: master

media_folder: "./"
public_folder: "./"

collections:
  - name: "diary"
    label: "Diary"
    folder: "diary"
    create: true
    slug: "{{title}}"
    path: "{{year}}/{{month}}/{{slug}}"
    fields:
      - { label: "Title", name: "title", widget: "string" }
      - { label: "Date", name: "date", widget: "datetime" }
      - { label: "Body", name: "body", widget: "markdown" }

順番に説明していきます。

最初の設定はGithubのレポジトリを使いますよという宣言とブランチ名を明示しています。

backend:
  name: git-gateway
  branch: master

次のmedia_folderとpublic_folderは画像ファイルなどをアップロードした際どこに置くか、という設定になります。
例えば以下のように画像を管理したい場合、

*
└── public/
     ├── index.html
     │
     ├── admin/
     │    ├── index.html
     │    └── config.yml
     │
     └── static/   
          └── image/

次のように設定します。

media_folder: "public/static/image"
public_folder: "/image"

今回は画像のアップロードはしないので、特に記載しません。

次の項目に行く前にどういうフォルダ構造で日記を保存していきたいか決めておきましょう。
今回は年毎にフォルダを分け、その中で更に月毎のフォルダを作りその中に入れていくことにします。

*
├── public/
│    ├── index.html
│    │
│    ├── admin/
│    │    ├── index.html
│    │    └── config.yml
│    │
│    └── static/   
│         └── image/
│
└── diary/
     ├── 2020/
     │    ├── 11/
     │    └── 12/
     │
     └── 2021/ 
          └── 01/

*自動生成させるので、日記用のフォルダを事前に作っておく必要はありません!

それではいよいよ最後の設定をみていきましょう。

collections:
  - name: "diary" 
    label: "Diary"
    folder: "diary"
    create: true
    slug: "{{title}}"
    path: "{{year}}/{{month}}/{{slug}}"
    fields:
      - { label: "Title", name: "title", widget: "string" }
      - { label: "Body", name: "body", widget: "markdown" }

それぞれの項目は以下の通りです。

  • name: コレクション名。ユニークである必要がある。
  • label: UI画面で表示されるコレクション名。
  • folder: フォルダの指定。
  • create: 新しいファイルの作成を許可するかどうか。
  • slug: コンテンツを識別するためのタイトル。
  • path: コンテンツを保存する際のパス
  • fields: コンテンツのスキーマ

slugに使用されている{{title}}は”fields”の中の”title”を指しますが、pathに使用されている{{year}}や{{month}}はNetlify CMSのデフォルトのテンプレート機能で、投稿時の時間が自動で適用されます。

ここまで設定したらGithubに再度pushしておきましょう。
GithubにpushすればNetlifyにも自動で反映されます。

git add .
git commit -m 'set netlify cms'
git push

Step 4

設定はほとんど終わりなんですが、あと一つだけNetlify上でログインに関する設定をする必要があります。

Netlifyのページ画面から > Site settings > Identity
[Enable Identity]をクリック。

setting

setting

その後下にスクロールしてGit gatewayも有効にしておきます。

setting

いよいよ管理画面にアクセスします。

https://<your_app_adderss>.netlify.app/admin/

初回はアカウントを設定する必要があるので、Sign-upからメールアドレスとパスワードを入力、その後確認のメールが送られてくるので、メール内のリンクをクリックすると無事ログインできます。

form

これがUIです。 config.ymlで設定した”Diary”が表示されていますね。 “New Diary”をクリックして、投稿してみましょう。

ui

ちゃんとconfig.ymlで設定した”Title”と”Body”が表示されていますね。
それぞれの項目を入力して”publish”をクリック。

publish

githubのレポジトリを見にいくとしっかり追加されてます!

github

github

CMSのUIでも確認できますね。

check_ui

部分的に導入できる

かなり簡単に導入できました。実際やることと言えば、config.ymlを書くだけです。
更にHeadless CMSが便利なのはプロジェクトの一部分にだけ適用することが可能なことです。

スキーマも柔軟で、配列や入れ子にしたオブジェクトなども可能です。公式ドキュメント を見ながら色々イジってみてください。


Profile picture

元カメラマン。今はベルリンで働くWEBエンジニア。
スロバキア人の妻とドイツ猫二匹の多国籍家族。