📘 Notemod-selfhosted マニュアル(v1.1.0)
Notemod-selfhosted v1.1.0 は、本家 Notemod(静的UI)をベースに 「自分のサーバーに置いて、JSONを単一データソースとして運用する」 ことに特化した自己ホスト版です。
外部サービスに依存せず、Windows PC と iPhone 間のテキストのやり取りを円滑にする目的で開発されています。
1. Notemod-selfhosted とは
主な特徴
- GitHub / Gist 非依存(サーバー上の
notemod-data/data.jsonに集約) - PHPで同期・APIを提供(iPhoneショートカット / 外部ツール連携前提)
- Windows PC から Notemod にクリップボードを送信する Windowsアプリ(ClipboardSender) と相性が良い
- アクセスログを ファイル(生ログ) と Notemod Logsカテゴリー の両方に記録(ON/OFF可能)
notemod-data//config//logs/に 自動で .htaccess を作成して直アクセス遮断- 読み取りAPIは
pretty=2で 本文だけ(プレーンテキスト) を取得可能 - Web UI 認証(v1.1.0 追加):Basic認証が使えないサーバーでも、Notemod側のログインで保護
- PWA対応(v1.1.0 追加):ホーム画面に追加して“アプリっぽく”使える
2. 動作要件(v1.1.0)
- PHP 8.1 以上が必須(v1.1.0 から)
- 推奨:HTTPS(PWA運用でも実質必須)
- 必要になりがちなPHP拡張:
json/mbstring(環境によっては標準で有効)
3. ディレクトリ構成(標準)
public_html/
├─ index.php # Notemod UI
├─ logger.php # access logging (file / Notemod logs)
├─ notemod_sync.php # sync endpoint (save/load)
├─ setup_auth.php # Web UI 認証 初期セットアップ/管理(v1.1.0)
├─ login.php # ログイン画面(構成により名称が異なる場合あり)
├─ logout.php # ログアウト
├─ account.php # アカウント画面(パスワード変更等)
├─ auth_common.php # 認証共通(セッション/権限チェック等)
├─ api/
│ ├─ api.php # add note
│ ├─ read_api.php # read API
│ └─ cleanup_api.php # admin cleanup(purge_log / purge_bak 対応 v1.1.0)
├─ 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)
├─ logs/ # file logs (enabled only)
├─ robots.txt # block crawlers (recommended)
└─ (PWA files) # manifest / service worker / icons 等(v1.1.0)
config/とapi/はindex.phpと同じ階層に置く想定です。
構成を変える場合は、PHP側のパスも合わせて修正が必要です。
4. 初回セットアップ(最短)
4.1 サーバーへ配置
リポジトリ一式を、サーバーの公開フォルダーにアップロードします
例:public_html/
4.2 設定ファイル作成(重要)
v1.1.0 で Web UI での 初期設定の際に自動的に生成されます。
タイムゾーンやログのオン/オフ、バックアップファイル自動作成のオン/オフなどは、下記設定ファイルを編集してください。
config/config.sample.php→config/config.phpにリネームして編集- または、
config/config.phpを編集 config/config.api.sample.php→config/config.api.phpにリネームして編集- または、
config/config.api.phpを編集
注意:config/config.php と config/config.api.php は絶対にGitHubへコミットしないでください.gitignore に入れて “ローカル・本番のみ” で管理します。
4.3 初期化(初回のみ)
ブラウザで公開URLにアクセスして Notemod を開きます。
表示言語を選び、最初のカテゴリを作成してください。
この操作で以下が揃います(環境・設定による)
notemod-data/data.json(初期スナップショット)notemod-data/.htaccess(直アクセス防止・自動)config/.htaccess(直アクセス防止・自動)logs/とlogs/.htaccess(loggerファイルログがONの場合・自動)
5. セキュリティ(超重要)
5.1 まず結論(推奨の順)
- (可能なら)Basic認証 + トークン(最強)
- Basic認証が使えないサーバー → Web UI認証 + トークン(v1.1.0で対応)
- 可能なら追加で IP制限(固定IP運用できるなら)
v1.1.0 の「Web UI認証」は、Basic認証が提供されない/使えないサーバー向けの保護手段です。
5.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が効かない/許可されていない場合があります。
その場合は Web UI認証(v1.1.0) や Basic認証 が最後の砦になります。
5.3 robots.txt(検索エンジン対策)
robots.txt を同梱しています。
- 用途:検索エンジンに拾われないようにする(公開運用の安全性UP)
- 注意:robots は「礼儀」なので、悪意あるアクセスは防げません
→ 認証(Basic or Web UI)とトークンが本命です。
6. Web UI 認証(v1.1.0 追加)
6.1 何ができる?
- Basic認証なしでも、Notemod を ログイン制 にできる
- 初回セットアップ時に 初期ユーザー作成
- 運用中は 未ログインだと認証情報(APIトークン等)は伏字、編集不可
- ログイン中は アカウント/認証情報の管理 が可能
6.2 使い方(ざっくり)
setup_auth.phpにアクセス- 初回(認証データが無い場合)
- 画面の案内に従って 初期ユーザー を作成
- 必要な秘密情報の生成・保存(例:
config/auth.phpなど)
- 運用中(認証データがある場合)
- 未ログイン:閲覧はできても管理操作は不可(トークン伏字等)
- ログイン済み:管理操作が可能
実際の保存先ファイル名は実装に依存します(例:
config/auth.php)。
いずれにせよ GitHubにコミット禁止 です。
6.3 Notemod UI の設定アイコン(v1.1.0 追加)
NotemodのUIに 設定アイコン(歯車) を追加しています。
押すとメニューが表示され、以下に遷移します(構成例):
- ログアウト →
./logout.php - アカウント →
./account.php - 認証情報 →
./setup_auth.php
7. data.json の構造(重要)
Notemodは data.json 内で、categories と notes が JSON文字列 になっています。
例:
{
"categories": "[{...},{...}]",
"notes": "[{...},{...}]",
"selectedLanguage": "EN"
}
PHPでは「二重デコード」が必要です。
- まず
data.jsonをjson_decode() - 次に
$data['notes']/$data['categories']をjson_decode()
8. 設定ファイル
8.1 config/config.php(共通設定・秘密)
代表例(実際は sample を元に)
SECRET:sync用トークン(16文字以上推奨)TIMEZONE:例Asia/TokyoDEBUG:trueで_sync_debug.log等へログINITIAL_SNAPSHOT:初回データ- logger設定
LOGGER_FILE_ENABLED(ファイルログ ON/OFF)LOGGER_NOTEMOD_ENABLED(Logsカテゴリー記録 ON/OFF)LOGGER_LOGS_DIRNAME(例:logs/logs1)
8.2 config/config.api.php(API設定・秘密)
代表例
EXPECTED_TOKEN:通常APIトークンADMIN_TOKEN:cleanup用(強い値推奨)DATA_JSON:notemod-data/data.jsonへのパスDEFAULT_COLOR:作成カテゴリ/ノートの色CLEANUP_BACKUP_ENABLED:cleanup時バックアップ ON/OFF
9. logger.php(アクセスログ統合)
logger は 2系統で記録できます(configでON/OFF)
- ファイル生ログ:
/logs/access-YYYY-MM.log - Notemod Logsカテゴリー:
Logsカテゴリー内のaccess-YYYY-MMノート
Logsカテゴリの仕様
- カテゴリ名:
Logs - 月別ノート:
access-YYYY-MM - 追記方式:先頭に追記(最新が上)
read_api.php?action=latest_noteでは Logsカテゴリは常に除外
(通常メモの最新だけ取りたい用途のため)
10. notemod_sync.php(サーバー同期用 save/load)
10.1 役割
action=save:クライアントから受け取った JSON文字列 を保存action=load:サーバーの JSON文字列 を返す- 初回:
data.jsonが無ければINITIAL_SNAPSHOTで作成 notemod-data/.htaccessとconfig/.htaccessが無ければ作成(直アクセス遮断)
10.2 必須パラメータ
token:config.phpのSECRETaction:save/load
11. api.php(ノート追加API)
エンドポイント:/api/api.php
| パラメータ | 必須 | 説明 |
|---|---|---|
| token | ✓ | EXPECTED_TOKEN |
| text | ✓ | ノート本文(改行可) |
| title | 任意 | 無ければ日時 |
| category | 任意 | 無ければ INBOX |
仕様
categoryが無ければINBOXを自動作成textは HTML保存(改行→<br>、XSS対策でhtmlspecialchars)- JSONレスポンス
例(GET)
https://YOUR_SITE/api/api.php?token=EXPECTED_TOKEN&category=メモ&text=AAA
12. read_api.php(読み取りAPI)
エンドポイント:/api/read_api.php
12.1 action 一覧
action=list_categoriesaction=list_notesaction=latest_note(Logsカテゴリは常に除外)action=get_note(category+titleで1件)
12.2 pretty
pretty=1:JSONを整形pretty=2:latest_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
13. cleanup_api.php(危険操作:削除系)
エンドポイント:/api/cleanup_api.php
13.1 共通仕様
- POST専用
confirm=YESがないと実行しない(ただしdry_run=1はOK)- トークンは
ADMIN_TOKEN(またはEXPECTED_TOKENfallback) CLEANUP_BACKUP_ENABLEDがONなら、実行前にバックアップを作成data.json.bak-YYYYmmdd-HHMMSS
13.2 カテゴリ内ノート全削除(従来機能)
category=...等(実装のパラメータに合わせて使用)- 実行は
confirm=YESが必要
13.3 バックアップファイル全削除(v1.1.0 対応)
purge_bak=1(またはpurge_bak=true)dry_run=1:削除せずに対象一覧だけ返すdry_runなしで実行する場合:confirm=YESが必要
13.4 ログファイル全削除(v1.1.0 対応)
purge_log=1(またはpurge_log=true)- 対象:
logs/配下の.logファイル(実装により拡張子条件は異なる場合あり) dry_run=1:削除せずに対象一覧だけ返すdry_runなしで実行する場合:confirm=YESが必要
14. Basic認証とAPIの叩き方(補足)
14.1 ブラウザでのアクセス
Basic認証に遭遇すると、通常はID/パス入力ダイアログが出ます。
そこで入力すればOKです。
https://user:pass@host/...形式は古い方法で、ブラウザによっては拒否されます。
14.2 iPhoneショートカットで叩く(推奨)
ショートカットの「URLの内容を取得」で
- ヘッダ:
Authorization: Basic base64(user:pass) - 本文/クエリ:
token/actionなど
が確実です。
15. ClipboardSender(Windowsアプリ)連携
目的:Windowsのクリップボード内容を Notemodへ即送信して “Windows → iPhone” のテキスト移動を軽くする
典型パターン
- ClipboardSender がクリップボード取得
/api/api.phpにtext=...&category=INBOXなどで送信- iPhone側は
read_api.php?action=latest_note&pretty=2で最新を読む
おすすめ運用
- Windows送信用カテゴリ:
INBOX - iPhone側ショートカットで “PC → iPhone” を作る
- 認証(Basic or Web UI)+トークンの二重ガード
16. PWA対応(v1.1.0 追加)
16.1 できること
- iPhone / Android で「ホーム画面に追加」して、アプリのように起動
- 表示がフルスクリーン寄りになり、URLバーの存在感が減る
16.2 条件・注意
- 原則 HTTPS が必要です(PWAの仕組み上、HTTPだと制限されます)
- 会社/共有サーバーの制限で Service Worker が動かない場合があります
16.3 iPhoneでの追加(例)
- Safari で Notemod を開く
- 共有ボタン → 「ホーム画面に追加」
- アイコンから起動
17. パーミッション(目安)
共用サーバーの典型値
- フォルダ:
755 - PHPファイル:
644 data.json/ ログ:600〜644(サーバーが書ける範囲で).htaccess:644
注意
- 書き込みが必要:
notemod-data/、(loggerファイルログONなら)logs/ - “書けない” 場合は logger や sync が失敗します
18. GitHub公開時の注意(必読)
公開してよいもの
- PHP/HTML/JS(
index.php/api//logger.php/notemod_sync.php/ 認証UI関連) config/*.sample.phpREADME/LICENSE/.gitignore/robots.txt- PWAの公開用ファイル(manifest / icons / service worker 等)
公開してはいけないもの(絶対)
config/config.phpconfig/config.api.php- (認証導入後)認証情報ファイル(例:
config/auth.php等) notemod-data/data.jsonlogs/や*.log*.bak-*(backup)
19. 参考 API 例(v1.1.0)
19.1 ノートを追加
GET/POST /api/api.php?token=EXPECTED_TOKEN&category=メモ&text=AAA
19.2 最新ノートを取得(本文のみ)
GET /api/read_api.php?token=EXPECTED_TOKEN&action=latest_note&pretty=2
19.3 ノート一覧を取得
GET /api/read_api.php?token=EXPECTED_TOKEN&action=list_notes&pretty=1
19.4 category + title で本文のみ
GET /api/read_api.php?token=EXPECTED_TOKEN&action=get_note&category=aaa&title=i&pretty=2
19.5 Basic認証つき(古いURL埋め込み方式)
https://USER:PASS@YOUR_SITE/api/api.php?token=EXPECTED_TOKEN&category=メモ&text=AAA
19.6 ログファイル一括削除(POST)【v1.1.0 追加】
curl -X POST "https://USER:PASS@YOUR_SITE/api/cleanup_api.php" -H "Content-Type: application/x-www-form-urlencoded" --data-urlencode "token=ADMIN_TOKEN" --data-urlencode "purge_log=1" --data-urlencode "confirm=YES"
19.7 バックアップファイル一括削除(POST)【v1.1.0 追加】
curl -X POST "https://USER:PASS@YOUR_SITE/api/cleanup_api.php" -H "Content-Type: application/x-www-form-urlencoded" --data-urlencode "token=ADMIN_TOKEN" --data-urlencode "purge_bak=1" --data-urlencode "confirm=YES"
20. v1.0.2 → v1.1.0 アップデート手順(おすすめ)
- 既存環境をバックアップ
notemod-data/data.jsonconfig/config.php/config/config.api.php/(認証導入済みなら認証情報ファイル)
- リポジトリのファイルを上書きアップロード
- configやdataは上書きしない
- サーバーのPHPバージョンを 8.1以上 に設定
- ブラウザで Notemod を開いて動作確認
- (Basic認証が使えない環境の場合)
setup_auth.phpで Web UI認証を初期化・有効化 - PWAで使う場合は HTTPS と配信パス(manifest / service worker)が正しいか確認
