通信設備の障害情報と計画メンテナンス情報を公開・管理する Node.js + Express 製アプリケーションです。
公開画面(利用者向け)と管理画面(運用者向け)、および外部連携用 API を提供します。
- 障害情報の登録・編集・削除・公開/非公開切替
- メンテナンス情報の登録・編集・削除・公開/非公開切替
- カテゴリ・ステータス・タグのマスタ管理
- 公開ページでの検索・複数条件フィルタ・タブ切替(障害/メンテ)
- Markdown 本文の表示(公開画面側でサニタイズ)
- 管理画面/API からの Discord Webhook 通知(任意)
- JWT / APIキー認証付き REST API
- Swagger UI による API ドキュメント表示
- Node.js 24 / Express
- EJS (テンプレート)
- SQLite (
better-sqlite3) - Swagger (
swagger-jsdoc,swagger-ui-express)
server.js: エントリポイントmodels/db.js: SQLite テーブル初期化routes/public.js: 公開画面routes/admin.js: 管理画面(障害/メンテ)routes/settings.js: マスタ管理画面routes/api.js: REST APImiddleware/auth.js: APIキー/JWT 認証middleware/rateLimit.js: レートリミットviews/*.ejs: 画面テンプレートswagger.js: Swagger 設定
npm install.env.example をコピーして .env を作成し、最低限以下を設定してください。
ADMIN_USER=admin
ADMIN_PASS=strong-password
JWT_SECRET=your-jwt-secret
API_KEY=your-api-key
PUBLIC_BASE_URL=https://outage.example.com
PUBLIC_INCIDENTS_PATH=/
PUBLIC_MAINTENANCE_PATH=/#maintenance
DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/...
PORT=3000PUBLIC_BASE_URLは Discord 通知リンクのベースURLです。PUBLIC_INCIDENTS_PATH/PUBLIC_MAINTENANCE_PATHは通知先パス(または絶対URL)です。DISCORD_WEBHOOK_URLは未設定でも動作します(通知のみ無効)。PORTは未設定時3000です。
npm start起動後、http://localhost:3000 にアクセスしてください。
docker build ./ -t soi01docker run -d \
--name soi01 \
--restart unless-stopped \
-p 3002:3000 \
-v $(pwd)/db:/app/db/ \
--env-file .env \
soi01docker stop soi01 && docker rm soi01 && docker build ./ -t soi01 --no-cache
docker run -d \
--name soi01 \
--restart unless-stopped \
-p 3002:3000 \
-v $(pwd)/db:/app/db/ \
--env-file .env \
soi01docker run --rm -it \
-v $(pwd):/app \
-w /app \
node:24 \
bash -lc "npm ci --omit=dev && npm audit --omit=dev"- 公開トップ:
PUBLIC_RATE_LIMIT_* - ログイン (
POST /login):LOGIN_RATE_LIMIT_* - API (
/api/*):API_RATE_LIMIT_*
閾値はすべて .env で変更できます。
- 公開ページ:
GET / - ログイン:
GET /login - 管理画面(障害):
GET /admin/incidents - 管理画面(メンテ):
GET /admin/maintenance - 設定管理:
GET /admin/settings - APIドキュメント:
GET /api-docs
POST /loginでADMIN_USER/ADMIN_PASSを検証- 成功時に JWT を
tokenCookie(httpOnly)へ保存 - 有効期限: 1時間
以下のいずれかで認証できます。
x-api-key: <API_KEY>ヘッダーAuthorization: Bearer <JWT>
GET /api/incidentsPOST /api/incidentsPUT /api/incidents/:idDELETE /api/incidents/:id
GET /api/maintenancePOST /api/maintenancePUT /api/maintenance/:idDELETE /api/maintenance/:id
- SQLite DB は
./db/database.dbに作成されます。 categories/statuses/tagsは管理画面の「設定管理」から登録してください。- ステータス色は
statuses.colorに保存した Bootstrap カラーキー(primaryなど)を参照します。
LICENSE を参照してください。