Notemod-selfhosted ヘルプ(v1.0.2)

1. Notemod-selfhosted とは

Notemod-selfhosted は、本家 Notemod(静的UI)をベースに、「自分のサーバーに置いて、JSONを単一データソースとして運用する」ことに特化した自己ホスト版です。
外部サービスに依存することなく、Windows PC と iPhone 間のテキストのやり取りを円滑にすることを目的に開発しました。

※ 自分のウェブサーバーを使うことで、外部依存を最小化できます。

主な特徴

  • GitHub / Gist 非依存(サーバー上の data.json に集約)
  • PHPで同期・APIを提供(iPhoneショートカット / 外部ツール連携前提)
  • Windows PC から Notemod に クリップボードを送信する Windows アプリ(ClipboardSender)を提供
  • アクセスログを「ファイル(生ログ)」と「Notemod Logs カテゴリー」へ記録(ON/OFF可能)
  • notemod-data/ / config/ / logs/自動で .htaccess を作って直アクセスを遮断
  • 読み取りAPIは pretty=2本文だけ(プレーンテキスト)取得できる

2. ディレクトリ構成(標準)

public_html/
├─ index.php                  # Notemod UI
├─ logger.php                 # access logging (file / Notemod logs)
├─ notemod_sync.php           # sync endpoint (save/load)
├─ api/
│  ├─ api.php                 # add note
│  ├─ read_api.php            # read API
│  └─ cleanup_api.php         # delete notes in a category (admin)
├─ notemod-data/
│  └─ data.json               # single data source (runtime)
├─ config/
│  ├─ config.php              # secrets + common settings (DO NOT COMMIT)
│  └─ config.api.php          # API tokens + paths (DO NOT COMMIT)
└─ robots.txt                 # block crawlers (recommended)
  • config/api/index.php と同じ階層に置く想定です
  • 構成を変える場合は、PHP側のパスも合わせて修正が必要です

3. 初回セットアップ(最短)

3.1 サーバーへ配置

このリポジトリ一式を、サーバーの公開フォルダーにアップロードします。
例:public_html/

3.2 設定ファイル作成(重要)

  • config/config.sample.php または config/config.sample.ja.phpconfig/config.php にリネームして編集
  • config/config.api.sample.php または config/config.api.sample.phpconfig/config.api.php にリネームして編集

役割:

  • config.php:SECRET / TIMEZONE / ログ設定など(秘密情報)
  • config.api.php:APIトークン / data.json パスなど(秘密情報)

注意: config/config.phpconfig/config.api.php は絶対に GitHub へコミットしないでください。
.gitignore に入れて「ローカル・本番のみ」で管理します。

3.3 初期化(初回のみ)

ブラウザで公開URLにアクセスして Notemod を開きます。
※ ブラウザによっては、初回だけ読み込みエラーが表示されることがありますが、そのまま進んでください。

表示言語を選び、最初のカテゴリを作成してください。
この操作により、以下が揃います:

  • notemod-data/data.json(初期スナップショット)
  • notemod-data/.htaccess(直アクセス防止・自動)
  • config/.htaccess(直アクセス防止・自動)
  • logs/ および logs/.htaccess(logger のファイルログが ON の場合・自動)

4. セキュリティ(超重要)

4.1 Basic認証を強く推奨

トークンだけで公開運用するのは推奨しません。
必ず次のいずれか(できれば両方)を推奨します:

  • サイト全体と /api/ に Basic認証(/api/ はデフォルトではアクセス許可)
  • さらに可能なら IP制限(固定IP運用できる場合)

4.2 .htaccess 自動生成(直アクセス遮断)

Notemod-selfhosted は、必要なフォルダに .htaccess が無い場合、以下内容で自動生成して守る設計です。

<IfModule mod_authz_core.c>
  Require all denied
</IfModule>
<IfModule !mod_authz_core.c>
  Order allow,deny
  Deny from all
</IfModule>

対象(環境・設定による):

  • notemod-data/data.json を守る)
  • config/(秘密情報を守る)
  • logs/(アクセスログを守る)

※ サーバーによっては .htaccess が効かない/許可されていない場合があります。
その場合も Basic認証が最後の砦になります。

4.3 robots.txt(検索エンジン対策)

robots.txt を同梱しています。

  • 用途:検索エンジンに拾われないようにする(公開運用の安全性UP)
  • 注意:robots は「礼儀」なので、悪意あるアクセスは防げません
    → Basic認証やIP制限が本命です

5. data.json の構造(重要)

Notemod は data.json 内で、categoriesnotesJSON文字列 になっています。

例:

{
  "categories": "[{...},{...}]",
  "notes": "[{...},{...}]",
  "selectedLanguage": "EN"
}

PHPでは 二重デコード が必要になります:

  • まず data.jsonjson_decode()
  • 次に $data['notes']json_decode()

6. 設定ファイル

6.1 config/config.php(共通設定・秘密)

代表例(実際は sample を元に):

  • SECRET:sync用トークン(16文字以上推奨)SECRET は、ただの飾りに過ぎないので将来的に廃止予定
  • TIMEZONE:例 Asia/Tokyo
  • DEBUGtrue_sync_debug.log 等へログ
  • INITIAL_SNAPSHOT:初回データ
  • logger設定
  • LOGGER_FILE_ENABLED(ファイルログ ON/OFF)
  • LOGGER_NOTEMOD_ENABLED(Logsカテゴリー記録 ON/OFF)
  • LOGGER_LOGS_DIRNAME(例:logs / logs1

6.2 config/config.api.php(API設定・秘密)

代表例:

  • EXPECTED_TOKEN:通常APIトークン
  • ADMIN_TOKEN:cleanup用(強い値推奨)
  • DATA_JSONnotemod-data/data.json へのパス
  • DEFAULT_COLOR:作成カテゴリ/ノートの色
  • CLEANUP_BACKUP_ENABLED:cleanup時バックアップ ON/OFF

7. logger.php(アクセスログ統合)

logger は 2系統で記録できます(configでON/OFF):

  1. ファイル生ログ:/logs/access-YYYY-MM.log
  2. Notemod Logsカテゴリー:Logs カテゴリー内の access-YYYY-MM ノート

7.1 Logsカテゴリの仕様

  • カテゴリ名:Logs
  • 月別ノート:access-YYYY-MM
  • 追記方式:先頭に追記(最新が上)
  • read_api.php?action=latest_note では Logsカテゴリは常に除外
    (通常メモの最新だけ取りたい用途のため)

8. notemod_sync.php(サーバー同期用 save/load)

8.1 役割

  • action=save:クライアントから受け取った JSON文字列 を保存
  • action=load:サーバーの JSON文字列 を返す
  • 初回:data.json が無ければ INITIAL_SNAPSHOT で作成
  • notemod-data/.htaccessconfig/.htaccess が無ければ作成(直アクセス遮断)

8.2 必須パラメータ

  • tokenconfig.phpSECRET
  • actionsave / load

9. api.php(ノート追加API)

エンドポイント:/api/api.php

パラメータ

パラメータ必須説明
tokenEXPECTED_TOKEN
textノート本文(改行可)
title任意無ければ日時
category任意無ければ INBOX

仕様

  • category が無ければ INBOX を自動作成
  • text は HTML保存(改行→<br>、XSS対策で htmlspecialchars
  • JSONレスポンス

https://YOUR_SITE/api/api.php?token=EXPECTED_TOKEN&category=メモ&text=AAA

10. read_api.php(読み取りAPI)

エンドポイント:/api/read_api.php

10.1 action 一覧

  • action=list_categories
  • action=list_notes
  • action=latest_note(Logsカテゴリは常に除外)
  • action=get_notecategory + title で1件)

10.2 pretty

  • pretty=1:JSONを整形
  • pretty=2latest_note / get_note のとき 本文だけ(プレーンテキスト)で返す
  • <br> → 改行
  • HTMLタグ除去
  • HTMLエンティティ復号
  • 改行コード統一

例:

https://YOUR_SITE/api/read_api.php?token=EXPECTED_TOKEN&action=get_note&category=マニュアル&title=v1.0.0&pretty=2

11. cleanup_api.php(危険操作:カテゴリ内ノート全削除)

エンドポイント:/api/cleanup_api.php

仕様

  • POST専用
  • confirm=YES がないと実行しない(ただし dry_run=1 はOK)
  • トークンは ADMIN_TOKEN(または EXPECTED_TOKEN fallback)
  • CLEANUP_BACKUP_ENABLED が ON なら、実行前に data.json.bak-YYYYmmdd-HHMMSS を作成

バックアップ

  • config.api.php でバックアップが有効の場合は、削除実行の際にバックアップファイルが作成される
  • エクスポートしたテキストファイルの他、バックアップファイルからもインポートできます

バックアップ全削除

  • トークンは ADMIN_TOKEN(または EXPECTED_TOKEN fallback)
  • purge_bak=1(または purge_bak=true
  • dry_run=1 を付けると 削除せずに対象一覧だけ返す
  • dry_run なしで実行する場合は 今まで通り confirm=YES が必要

ログファイル全削除(logs/ディレクトリの.logファイル)

  • トークンは ADMIN_TOKEN(または EXPECTED_TOKEN fallback)
  • purge_log=1(または purge_log=true
  • dry_run=1 を付けると 削除せずに対象一覧だけ返す
  • dry_run なしで実行する場合は 今まで通り confirm=YES が必要

12. Basic認証とAPIの叩き方

12.1 ブラウザでのアクセス

ブラウザは Basic認証に遭遇すると、通常はID/パス入力ダイアログが出ます。
そこで入力すればOKです。

https://user:pass@host/... 形式は古い方法で、ブラウザによっては拒否されます。

12.2 iPhoneショートカットで叩く(推奨)

ショートカットの「URLの内容を取得」で、

  • ヘッダ:Authorization: Basic base64(user:pass)
  • 本文/クエリ:token / action など

が確実です。

反応が無い場合の確認ポイント:

  • Authorization の値が Basic xxxx になっているか
  • base64が余計な改行を含んでいないか
  • 「URLの内容を取得」が POST/GET どちらになっているか

13. ClipboardSender(Windowsアプリ)連携

目的:Windowsのクリップボード内容を Notemodへ即送信して “Windows → iPhone” のテキスト移動を軽くする。

ClipboardSender を GitHub からダウンロード

ClipboardSender のヘルプ

典型パターン

  • ClipboardSender がクリップボード取得
    • /api/api.phptext=...&category=INBOX などで送信
  • iPhone側は read_api.php?action=latest_note&pretty=2 で最新を読む

おすすめ運用

  • Windows送信用カテゴリ:INBOX
  • iPhone側ショートカットで “PC → iPhone” を作る
  • Basic認証+トークンの二重ガード

14. パーミッション(目安)

共用サーバーの典型値:

  • フォルダ:755
  • PHPファイル:644
  • data.json / ログ:600〜644(サーバーが書ける範囲で)
  • .htaccess644

注意:

  • 書き込みが必要:notemod-data/、(logger のファイルログ ON なら)logs/
  • “書けない” 場合は logger や sync が失敗します

15. GitHub公開時の注意(必読)

公開してよいもの

  • PHP/HTML/JS(index.php / api/ / logger.php / notemod_sync.php
  • config/*.sample.php
  • README / LICENSE / .gitignore / robots.txt

公開してはいけないもの(絶対)

  • config/config.php
  • config/config.api.php
  • notemod-data/data.json
  • logs/*.log
  • *.bak-*(backup)

16. 参考 API 例

ノートを追加

  • GET/POST /api/api.php?token=EXPECTED_TOKEN&category=メモ&text=AAA

最新ノートを取得(本文のみ)

  • GET /api/read_api.php?token=EXPECTED_TOKEN&action=latest_note&pretty=2

ノート一覧を取得

  • GET /api/read_api.php?token=EXPECTED_TOKEN&action=list_notes&pretty=1

category + title で本文のみ

  • GET /api/read_api.php?token=EXPECTED_TOKEN&action=get_note&category=aaa&title=i&pretty=2

(旧式)BASIC認証つき URL 例

https://USER:PASS@YOUR_SITE/... は古い方法で、ブラウザによっては拒否されます。

  • GET/POST https://USER:PASS@YOUR_SITE/api/api.php?token=EXPECTED_TOKEN&category=メモ&text=AAA
  • GET https://USER:PASS@YOUR_SITE/api/read_api.php?token=EXPECTED_TOKEN&action=latest_note&pretty=2
  • GET https://USER:PASS@YOUR_SITE/api/read_api.php?token=EXPECTED_TOKEN&action=list_notes&pretty=1
  • GET https://USER:PASS@YOUR_SITE/api/read_api.php?token=EXPECTED_TOKEN&action=get_note&category=aaa&title=i&pretty=2
Language
PAGE TOP