# atchat/server デプロイ手順

## サーバー構成

- **サーバー**: norizuki.com と同じ Mac mini (macOS 10.11.6 El Capitan)
- **SSH**: `sshpass -p 'niacroute0230' ssh -p 22 -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedKeyTypes=+ssh-rsa -o StrictHostKeyChecking=no -o PreferredAuthentications=keyboard-interactive,password niac@159.28.108.2`
- **SCP (鍵認証)**: `scp -P 22 -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedKeyTypes=+ssh-rsa -o StrictHostKeyChecking=no -i ~/.ssh/norizuki_rsa`
- **デプロイ先**: `/Users/niac/atchat-server/`
- **Node.js**: `/Users/niac/node-v16.20.2-darwin-x64/bin/node`
- **WebSocket ポート**: `25102`
- **自動起動**: LaunchDaemon `/Library/LaunchDaemons/jp.atchat.server.plist`
- **ログ**: `/var/log/atchat-server.log`

## 通常のデプロイ手順（ソースを変更したとき）

### 1. ローカルでビルド

```bash
cd /Users/menou/Library/CloudStorage/Dropbox/www/atchat/server
npx tsc --project tsconfig.build.json
```

`dist/` に JS ファイルが生成される。

### 2. サーバーに転送

```bash
scp -P 22 -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedKeyTypes=+ssh-rsa \
  -o StrictHostKeyChecking=no -i ~/.ssh/norizuki_rsa \
  dist/ifile.js dist/index.js dist/place.js dist/session.js dist/types.js dist/utils.js \
  niac@159.28.108.2:/Users/niac/atchat-server/dist/
```

### 3. サーバー再起動

```bash
sshpass -p 'niacroute0230' ssh -p 22 \
  -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedKeyTypes=+ssh-rsa \
  -o StrictHostKeyChecking=no -o PreferredAuthentications=keyboard-interactive,password \
  niac@159.28.108.2 \
  "echo niacroute0230 | sudo -S launchctl stop jp.atchat.server && sleep 1 && echo niacroute0230 | sudo -S launchctl start jp.atchat.server"
```

### 4. 起動確認（約 10〜20 秒で初期化完了）

```bash
sshpass -p 'niacroute0230' ssh -p 22 \
  -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedKeyTypes=+ssh-rsa \
  -o StrictHostKeyChecking=no -o PreferredAuthentications=keyboard-interactive,password \
  niac@159.28.108.2 "tail -5 /var/log/atchat-server.log"
```

`WebSocket server listening on ws://localhost:25102` が出ていれば OK。

## データファイルのデプロイ（DATA2/Data/ を変更したとき）

```bash
cd /Users/menou/Library/CloudStorage/Dropbox/www/atchat/server
tar -czf /tmp/atchat-data.tar.gz DATA2 Data account.text error.text localDB.rsd NewUserList.TXT NewUserList.text AdminLog.text

scp -P 22 -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedKeyTypes=+ssh-rsa \
  -o StrictHostKeyChecking=no -i ~/.ssh/norizuki_rsa \
  /tmp/atchat-data.tar.gz niac@159.28.108.2:/tmp/

sshpass -p 'niacroute0230' ssh ... niac@159.28.108.2 \
  "tar -xzf /tmp/atchat-data.tar.gz -C /Users/niac/atchat-server/"
```

その後サーバーを再起動（上記 手順 3〜4）。

## LaunchDaemon 管理

```bash
# 停止
echo niacroute0230 | sudo -S launchctl stop jp.atchat.server

# 起動
echo niacroute0230 | sudo -S launchctl start jp.atchat.server

# 状態確認
echo niacroute0230 | sudo -S launchctl list jp.atchat.server

# plist 変更後の再読み込み
echo niacroute0230 | sudo -S launchctl unload /Library/LaunchDaemons/jp.atchat.server.plist
echo niacroute0230 | sudo -S launchctl load /Library/LaunchDaemons/jp.atchat.server.plist
```

## Apache WebSocket プロキシ設定（変更済み・通常は触らない）

- 設定ファイル: `/Library/Server/Web/Config/Proxy/apache_serviceproxy_customsites.conf`
- `wss://atchat.jp/ws` → `ws://127.0.0.1:25102/` にプロキシ
- それ以外は従来の macOS Server Apache (34543/34580) に転送
- 変更後のリロード: `echo niacroute0230 | sudo -S kill -USR1 $(cat /var/run/service_proxy.pid)`

## ディレクトリ構成（サーバー側）

```
/Users/niac/atchat-server/
├── dist/          ← コンパイル済み JS（tsconfig.build.json でビルド）
│   ├── index.js
│   ├── ifile.js
│   ├── place.js
│   ├── session.js
│   ├── types.js
│   └── utils.js
├── DATA2/         ← 場所・ユーザーデータ（Xojo 形式）
├── Data/          ← 設定データ
├── node_modules/  ← ws パッケージのみ（npm install ws で再現可能）
├── package.json   ← type:module, dependencies: ws のみ
├── account.text
├── error.text
├── localDB.rsd
└── ...
```

## 注意事項

- **初期化に 10〜20 秒かかる**（401 場所のデータ読み込み）。KeepAlive で自動再起動する。
- **Node.js**: `/Users/niac/node-v16.20.2-darwin-x64/` に展開済み。El Capitan の Homebrew では node@14 のソースビルドが失敗するため、公式 pre-built バイナリを手動配置した。
- **`tsx` は使えない**（El Capitan では esbuild ネイティブビルドが失敗）。TypeScript は `tsconfig.build.json`（module:Node16, target:ES2020）でコンパイルしてから配置する。
- **デプロイ hook**: `scp`/`rsync` 実行前に `deploy-check.sh` が承認を求める。
