GitHub(nextgroup2706/ken_nogi)は今後使わず自社Gitea運用に切替え。 NodeSrvは旧リポジトリの履歴を破棄しファイルのみ統合(Dokploy用サービスアカウントは 別途mygit-admin/NodeSrv.gitに履歴あり)。notepmエクスポート(12GB)とPleasanter インストーラzip(208MB)はサイズが大きいため.gitignoreで除外。 Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
55 lines
3.0 KiB
Markdown
55 lines
3.0 KiB
Markdown
# app-template
|
||
|
||
新規WEBアプリを作る際のひな形。新しいアプリを作るときは、このフォルダを `NodeSrv/apps/<新アプリ名>` としてコピーして使う。
|
||
|
||
## ローカル開発
|
||
|
||
```
|
||
npm install
|
||
cp .env.example .env
|
||
npm run dev
|
||
```
|
||
|
||
`http://localhost:3000/` と `http://localhost:3000/health` で動作確認。
|
||
|
||
## 本番同等の動作確認(Docker)
|
||
|
||
Dokployへデプロイする前に、ローカルでも同じDockerfileでビルド・起動できることを確認する。
|
||
|
||
```
|
||
docker compose -f docker-compose.local.yml up --build
|
||
```
|
||
|
||
`docker-compose.local.yml` はローカル検証専用。Dokploy側は `docker-compose.yml` を使う(Compose「Raw」プロバイダ、Traefikラベルを手書きしたもの)。
|
||
|
||
## Dokployへのデプロイ
|
||
|
||
詳細手順は `.claude/skills/dokploy-webapp/SKILL.md` および NodeSrvリポジトリ直下の `README.md` を参照。概要:
|
||
|
||
1. `docker-compose.yml` 内の `your-app-name`(Dockerサービス名・Traefikルーター識別子)と `yourapp.apps.next-hd.net`(公開ドメイン)をそれぞれ実際の値に置換。両者は独立した値でよく、一致させる必要はない
|
||
2. Gitea(`https://git73.next-hd.net/mygit-admin/NodeSrv.git`)へpush
|
||
3. Dokployで新規Compose(`webapps` project、Provider: Gitea、sourceType: gitea、Compose Path: `apps/<アプリ名>/docker-compose.yml`)を作成
|
||
4. 環境変数(`.env.example` の内容)をDokployのEnvironment画面に設定(`.env` 自体はgit管理しない)
|
||
5. Deploy実行 → `https://<公開ドメイン>.apps.next-hd.net/health` が200を返すことを確認
|
||
|
||
認証ゲートウェイ(Keycloak/oauth2-proxy)は既定では付けない。必要な場合のみ、リポジトリ直下 `README.md` の「認証ゲートウェイ」章を参照して個別に追加する。
|
||
|
||
## アプリポータル(apps/app-portal)への登録
|
||
|
||
`webapps` project配下のアプリは、`.env.example`のPORTAL_*変数をDokploy Environment画面で設定することで、`apps/app-portal`のダッシュボードに一覧表示・操作対象として登録できる(任意)。
|
||
|
||
- 常駐WEBサービス(`PORTAL_APP_TYPE=web`): ダッシュボードからStart/Stop/Restart、「開く」で`PORTAL_APP_URL`へ遷移
|
||
- バッチジョブ(`PORTAL_APP_TYPE=batch`): ダッシュボードの「今すぐ実行」から`PORTAL_APP_URL${PORTAL_TRIGGER_PATH}`へPOSTされる。アプリ側は以下のパターンでトリガーエンドポイントを実装する:
|
||
|
||
```js
|
||
app.post(process.env.PORTAL_TRIGGER_PATH, (req, res) => {
|
||
if (req.headers['x-portal-secret'] !== process.env.PORTAL_SECRET) {
|
||
return res.sendStatus(403);
|
||
}
|
||
// 実処理を非同期でキューイングし即座に202を返す
|
||
res.sendStatus(202);
|
||
});
|
||
```
|
||
|
||
`PORTAL_SECRET`はポータルとアプリ間で共有する値。`AUTH_SECRETS.md`同様、機密情報として扱いDokploy Environment画面でのみ設定する。実装例は`apps/portal-sample-batch/src/index.js`参照。
|