Skip to content

個人用wiki作成

   
4611文字(約7分)

動機

  • これまで個人用メモはローカルに投げうつ生活を送っていました
  • ubuntuをアップデートした際に全デバイス(キーボード含む)を認識しなくなり、再インストールをすることになりました
  • サルベージを忘れたメモたちは電子の藻屑になりました

という悲劇をなくすべくクラウド化

構成検討

前提条件

要求事項として次のものを挙げてみました

  • オンプレ/クラウドサービス/ローカルファイルでのバックアップのどれでもよい
    • オンプレはOracleCloud/GCPが無料なのでwikiぐらいならサクサク動くだろうとの目論見
    • クラウドサービスを嫌がる理由はない。ただ継続した運営は期待すべきではない(後段のエクスポート機能に繋がる)
    • 機能として提供されていなくとも最終的に情報を復元できさえすればよい。半自動バックアップでもよい。どうせマークダウンで書くので復元時の見た目の良さは求めない
  • 書く内容に酷いものもあるのでプライベートにしたい
  • エクスポート機能が確実に備わっている物が良い
  • シェアしたくなった時に楽にシェアできるものが良い
  • markdown系だと嬉しい
  • 最近な奴が良い(ただの新しもの好き)

これらの要求を加味するとオンプレ→クラウド(プライベート)→ローカルファイルの順となった

存在する個人用wiki調査

覚えているものの概要だけ

○オンプレ

  • crowi/growi
    • 見た目ナウい、いい感じ
    • CPU1コア, RAM1Gには荷が重く起動しなかった。。。
    • 個人用途だとelastic search無くてもいいから動かさせて…(ただしelastic searchが無いと個人用途という観点では他のwikiとの差分はあまりない)
  • knowledge
    • Qiitaクローン
    • 個人用としては少しソーシャル機能によりすぎているので微妙
  • codimd
    • これにしました
  • pukiwiki
    • 枯れているので安心感はある
    • 飽きた

○クラウド

  • github/gitlab wiki
    • githubはprivateが使えない
    • gitlabは使えるが、コードが紐づかないので若干微妙感
  • kibela
    • ソーシャル機能に若干重きがあるので微妙
  • confluence
    • 公開できない
    • エクスポートもpdfなど加工した状態
  • slite
    • いい。別アカウントで使っているので違うのが良かった
    • 日本語入力が微妙にだめなので避けてみた

○ローカルファイル

  • sphinx+github
    • 共有するのがまあめんどくさい
  • MDwiki+github
    • ありかな、と思いきややはり導入の手間はあるので避けられるなら避けたい
  • GoogleDrive/OneDriveなどで自動同期
    • 手堅い
    • 始めからこの構成にしておくべきだった、という後悔の念が湧くので除外

検討すればするほど今回の用途だと.mdファイルをGoogleDrive/OneDriveなどで自動同期するのが最強にしか思えない。やる気をふり絞り別の構成にしました。

CodiMDについて

CodiMDはOSSとして公開されている。すばらしい。クラウド版としてHackMDもあります。

押しとしては複数人同時編集とかっぽいのですけど、個人用途では正直関係はないので、一押しとはなりませんでした。plantumlに対応しているのは結構うれしいのですが、メモには書かないかなぁ。別の用途としてのほうが押せる気がします、、、が今回は次の理由によりいいかなと思い選定しました。

  • 公開範囲が絞れる
  • それなりに書きやすい
  • 更新履歴が残る(←メモにあると思っていたより便利)
  • 他が微妙すぎる
  • ロースぺで起動する

今回はエクスポートを盤石にする方向で無駄に頑張ったためオンプレ版にしました。
(手動でポチポチするならクラウドでも良い。まあめんどくさいですよね)

こんな感じというスクショ↓

alt

alt

alt

構成

  • OracleCloud: 無料枠のみ
  • OS: ubuntu 20.04

CodiMDはdocker構築

バックアップにマークダウンを自動でzipにしてGoogleDriveにアップするスクリプト作成(←ここが作業時間の7割を占めてしまった……)

バックアップコード

シェル力が低いのでpythonで実現しました。コンソールから動かせるようにしてくれるhackmd-cliまで用意されているとは、至れり尽くせり。すばらしい。

docker-compose

ほぼ公式のまま。公式がそのまま使えることにありがたみを感じます。

version: "3"
services:
  database:
    image: postgres:11.6-alpine
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=password
      - POSTGRES_DB=codimd
    volumes:
      - "database-data:/var/lib/postgresql/data"
    restart: always
  codimd:
    image: nabo.codimd.dev/hackmdio/hackmd:2.2.0
    environment:
      - CMD_DB_URL=postgres://user:password@database/codimd
      - CMD_USECDN=false
      - CMD_DEFAULT_PERMISSION=private #limited
      - CMD_IMAGE_UPLOAD_TYPE=filesystem
      - CMD_ALLOW_EMAIL_REGISTER=false
    depends_on:
      - database
    ports:
      - "3000:3000"
    volumes:
      - upload-data:/home/hackmd/app/public/uploads
    restart: always
volumes:
  database-data: {}
  upload-data: {}

ポイント

妥協点

個人用途なので色々とあっさり諦めています

  • GoogleDriveのフォルダは事前指定

    IDの取得がどうにもうまくいかない/手動での共有が必須なのでハードコーディングしてもそれ程影響はない

  • バックアップ履歴の削除ロジックが微妙

    それなりには弾いているのですが命名規則に沿わないフォルダをうっかり置いたりしたらコードが落ちるはず。その時は諦める

  • GoogleDriveの認証手順が闇に包まれた

    調査中にメモり忘れたため、もうわかりません。折角dockerで楽をしたのに、再度セットアップしようとした場合今回と同じ苦しみが必要となってしまった。懇切丁寧な解説記事を待ってます

docker部分

自動バックアップの関係で一般ユーザにdockerを起動させるようにする必要がある。
Ubuntuにdockerをインストールする
とか参照

GoogleDriveへのアップロード

ここではサービスアカウントによる連携でしのぎました。
2020/8/11に調べた感じの上位に来るサンプルコードの大半は更新についていけていないのか、アプリが前提でサーバからのアクセスを考慮していないのかわかりませんが、認証が通りませんでした。

そして公式ドキュメントが鉄板と思いきや、英語斜め読みマンには何も理解できなかった。インポートすべきパッケージの説明すらない気がしています。GoogleDriveのAPIが難しい、難しすぎる。

ということでこの辺りの参考文献が無かったら無理でした。

なお私にサービスアカウントの場合、GoogleDriveのフォルダは共有しないとアップロードしても見ることができないという控えめに言って神な知見を与えてくださったサイトがありました。アドレスをメモし忘れるというひどい状態のためリンクを張ることができません、申し訳ない神よ。

次のような事をします

alt

alt

没知見

OAuthの認証をすべく認証URLが発行されるが、Webに転がっているサンプルコードではどう頑張ってもリダイレクトURLを設定できなかった。その結果手動書き換えをすることでリダイレクトNGを回避

1
2
3
4
5
6
7
https://accounts.google.com/o/oauth2/auth?client_id=
xxx.apps.googleusercontent.com
&redirect_uri=
https://www.google.com/←ここを書き換え
&scope=https://www.googleapis.com/auth/drive.file+https://www.googleapis.com/auth/drive.install&access_type=offline&response_type=code&approval_prompt=force

※改行してあります

したのもつかの間、コンソールで認証しているのでリダイレクトを認識できず認証突破できない?。つまりこの方式が間違っている、のはわかりましたが正しい方法がわかりません。

感想

余は満足じゃ

関連記事

  1. Unityで2Dシーン編集競合対策
  2. Unityのスプライトの色をコード上から変える方法まとめ
  3. Gitホスティングサービスについて
  4. 課題管理サービスについて
comments powered by Disqus