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.php→config/config.phpにリネームして編集config/config.api.sample.phpまたはconfig/config.api.sample.php→config/config.api.phpにリネームして編集
役割:
config.php:SECRET / TIMEZONE / ログ設定など(秘密情報)config.api.php:APIトークン /data.jsonパスなど(秘密情報)
注意: config/config.php と config/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 内で、categories と notes が JSON文字列 になっています。
例:
{
"categories": "[{...},{...}]",
"notes": "[{...},{...}]",
"selectedLanguage": "EN"
}
PHPでは 二重デコード が必要になります:
- まず
data.jsonをjson_decode() - 次に
$data['notes']をjson_decode()
6. 設定ファイル
6.1 config/config.php(共通設定・秘密)
代表例(実際は sample を元に):
SECRET:sync用トークン(16文字以上推奨)SECRET は、ただの飾りに過ぎないので将来的に廃止予定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)
6.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
7. logger.php(アクセスログ統合)
logger は 2系統で記録できます(configでON/OFF):
- ファイル生ログ:
/logs/access-YYYY-MM.log - 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/.htaccessとconfig/.htaccessが無ければ作成(直アクセス遮断)
8.2 必須パラメータ
token:config.phpのSECRETaction:save/load
9. api.php(ノート追加API)
エンドポイント:/api/api.php
パラメータ
| パラメータ | 必須 | 説明 |
|---|---|---|
token | ✓ | EXPECTED_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_categoriesaction=list_notesaction=latest_note(Logsカテゴリは常に除外)action=get_note(category+titleで1件)
10.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
11. cleanup_api.php(危険操作:カテゴリ内ノート全削除)
エンドポイント:/api/cleanup_api.php
仕様
- POST専用
confirm=YESがないと実行しない(ただしdry_run=1はOK)- トークンは
ADMIN_TOKEN(またはEXPECTED_TOKENfallback) CLEANUP_BACKUP_ENABLEDが ON なら、実行前にdata.json.bak-YYYYmmdd-HHMMSSを作成
バックアップ
- config.api.php でバックアップが有効の場合は、削除実行の際にバックアップファイルが作成される
- エクスポートしたテキストファイルの他、バックアップファイルからもインポートできます
バックアップ全削除
- トークンは
ADMIN_TOKEN(またはEXPECTED_TOKENfallback) purge_bak=1(またはpurge_bak=true)dry_run=1を付けると 削除せずに対象一覧だけ返す- dry_run なしで実行する場合は 今まで通り
confirm=YESが必要
ログファイル全削除(logs/ディレクトリの.logファイル)
- トークンは
ADMIN_TOKEN(またはEXPECTED_TOKENfallback) 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 がクリップボード取得
/api/api.phpにtext=...&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(サーバーが書ける範囲で).htaccess:644
注意:
- 書き込みが必要:
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.phpconfig/config.api.phpnotemod-data/data.jsonlogs/や*.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

