Shumoku Docs

ドキュメントを検索

Server · next

検索を読み込み中…

English

このドキュメントは開発中のServerを対象としています。

server · stable

Serverのインストールと運用

Dockerで安全に導入し、TLS、更新、バックアップを構成します。

本番環境では公開済みコンテナを利用し、正確なバージョンを固定してください。データはSQLiteを含む永続Volumeへ保存し、管理者パスワードはファイルまたはSecretとして渡します。

Dockerで起動する

install -d -m 700 .shumoku
openssl rand -base64 32 > .shumoku/admin-password
chmod 600 .shumoku/admin-password
docker run -d --name shumoku -p 8080:8080 -v shumoku-data:/data \
  -v "$PWD/.shumoku/admin-password:/run/secrets/shumoku_admin_password:ro" \
  -e SHUMOKU_BOOTSTRAP_ADMIN_PASSWORD_FILE=/run/secrets/shumoku_admin_password \
  ghcr.io/konoe-akitoshi/shumoku:X.Y.Z

http://localhost:8080/loginを開き、生成した管理者パスワードでログインします。latestは将来の再起動時に更新され得るため、本番ではX.Y.Zへ固定します。

リポジトリからComposeで起動する場合は、apps/serverへ移動して.env.example.envへコピーし、docker compose up -dを実行します。利用可能な変数と既定値はこのテンプレートを正とします。

HTTPS

Server自身はHTTPを提供します。外部公開時はCaddyやnginxでTLSを終端し、SHUMOKU_SECURE_COOKIES=trueを設定してください。SHUMOKU_TRUST_PROXY=trueは、信頼するproxyがクライアントIP headerを置換する場合だけ有効にします。

WebSocketの/wsにはUpgrade headerが必要です。長時間のSNMP同期をproxyが切断しないよう、read timeoutも十分に確保します。

リバースプロキシによるSSO(OIDC/SAML)連携

Shumoku自体はOIDC/SSOを内蔵していませんが、認証を行うリバースプロキシ (oauth2-proxy、Authelia、Pomerium など) を前段に置き、そのプロキシが付与する信頼済みヘッダーで認証を委譲できます。 SHUMOKU_PROXY_AUTH_ENABLED=true で有効になります(既定は無効)。

有効化する前に、レスポンスの authMethod を enum として検証する API クライアントを proxy に対応させてください。プロキシ認証を無効にした既存環境では従来の値を返します。

プロキシ認証は HTTP API・認証状態 API・WebSocket で共通です。有効な間は ローカル Cookie と開発用 Bearer 認証を無視し、ローカルの初期設定・ログイン・ パスワード変更も無効にします。古い管理者 Cookie が IdP の権限変更を上書きする ことを防ぎます。Shumoku のセッションは発行しません。

ロールヘッダー未設定時は、プロキシが認証した全員に SHUMOKU_PROXY_AUTH_DEFAULT_ROLE(既定 viewer)を付与します。 利用可能なグループを限定する場合は、次のように設定します。

SHUMOKU_PROXY_AUTH_ENABLED=true
SHUMOKU_PROXY_AUTH_ROLE_HEADER=X-Auth-Request-Groups
SHUMOKU_PROXY_AUTH_ROLE_MAP=net-admins:admin,viewers:viewer

ロールヘッダー設定時は、グループが空・未対応なら拒否し、既定ロールには フォールバックしません。マップ未設定時はロール名そのものを受け付けます。 カンマ・空白区切りで複数のグループがある場合、ヘッダーの順序によらず明示的に 許可された最大のロール(admin > user > viewer)を採用します。 不正なマップやヘッダー名は起動時の検証でエラーになります。

ユーザーヘッダー(既定 X-Auth-Request-User、メールへのフォールバックあり)は proxy: を付けた subject となり、ローカルの身元と区別されます。可能なら IdP の 不変な識別子を設定してください。この subject はリクエスト上の身元であり、永続的な 内部ユーザー ID ではありません。将来のユーザー管理では外部の身元との対応付けを 明示的に追加します。

WebSocket の認可は接続時に行います。接続済みの principal は切断まで保持され、 IdP のログアウトやロール変更だけでは即時失効しません。プロキシで接続寿命を設定し、 即時失効が必要な運用では既存接続も切断してください。

サイドバーはローカルの Logout の代わりに SSO を表示します。セッションの終了は 組織の認証基盤で行ってください。Shumoku の Cookie 削除では終了できません。

セキュリティ上の前提: この方式は、Shumokuが必ずプロキシ経由でのみ到達可能で、 かつプロキシが**毎リクエストでこれらのヘッダーを上書き(外部入力を除去)**する場合に だけ安全です。クライアントがShumokuへ直接到達できたり、プロキシが外部由来のヘッダーを そのまま転送すると、任意の身元を詐称できます。有効化は認証をプロキシへ完全に委譲する ことを意味します。

oauth2-proxy の auth-request 連携では --set-xauthrequest=true がレスポンスに ヘッダーを出力します。前段プロキシでそれを Shumoku 向けリクエストへコピーし、 WebSocket にも適用してください。このフラグだけでは転送されません。 メールのフォールバックも含め、クライアント由来の身元・ロールヘッダーを除去してください。

初回起動には管理者 Secret(SHUMOKU_BOOTSTRAP_ADMIN_PASSWORD*)が引き続き必須です。 非常用のローカルアクセスでは、接続元を制限してから SHUMOKU_PROXY_AUTH_ENABLED=false に変更して再起動し、管理者パスワードを使います。 プロキシを迂回するだけではローカルログインできません。復旧後はプロキシ経由だけに 接続を制限し、プロキシ認証を再度有効にしてください。

変数説明既定値
SHUMOKU_PROXY_AUTH_ENABLEDリバースプロキシのヘッダー認証を有効化(下記参照)false
SHUMOKU_PROXY_AUTH_USER_HEADERユーザー識別子を運ぶヘッダー名X-Auth-Request-User
SHUMOKU_PROXY_AUTH_EMAIL_HEADERユーザーヘッダーが無い場合に使うメールヘッダー名X-Auth-Request-Email
SHUMOKU_PROXY_AUTH_ROLE_HEADERロール/グループを運ぶヘッダー名(任意)
SHUMOKU_PROXY_AUTH_DEFAULT_ROLEロールヘッダー未設定時のrole(viewer/user/adminviewer
SHUMOKU_PROXY_AUTH_ROLE_MAPgroup:role,group:role 形式のグループ→role対応

コンテナへの設定の渡し方

変数はDockerの-e、Composeのenvironment override、またはHelm Chartのenvリストで Serverプロセスへ渡します。現在のComposeは列挙した変数だけを転送するため、.envに プロキシ認証の変数を書くだけでは反映されません。上記Docker例を使う場合も、Serverの 公開ポートへクライアントが直接到達できないよう、認証プロキシ経由だけに制限してください。

接続できない場合

  • 起動できない:初回管理者Secretとロールマップ・ヘッダー名の検証エラーを確認します。
  • APIが401:身元ヘッダーと、ロールヘッダー設定時は対応するグループの転送を確認します。ローカルCookieでは迂回できません。
  • APIが403:認証済みですが必要な権限がありません。グループとロールの対応を確認します。
  • WebSocketだけ失敗:Upgrade時にも身元・グループを転送し、ブラウザのOriginと一致する外部Hostを維持します。

更新

更新前にバックアップを取得し、固定したimage versionを変更して再作成します。

docker compose pull
docker compose up -d

Serverのリリースはserver-v* tagから作成されます。利用できるimage tagとリリース手順はrepositoryのdocs/releasing.mdを参照してください。

バックアップ

SQLiteはWAL modeを使用するため、動作中のshumoku.dbだけをコピーしないでください。短時間停止して/data Volume全体を保存するか、LitestreamなどSQLite対応の継続バックアップを利用します。

docker compose stop
docker run --rm -v shumoku-data:/data -v "$PWD":/backup alpine \
  tar czf /backup/shumoku-backup.tgz -C /data .
docker compose start

復元手順は本番前に別環境で確認してください。schema変更を含む更新前には必ず復元可能なバックアップを取得します。