Skip to main content

Ruleas 1.0.0

rulea の評価エンジンに FastAPI / Uvicorn、PostgreSQL、認証付き管理画面を追加したサーバーです。rulea 本体のコードは変更していません。既存の ruleas check / ruleas test も利用できます。

起動

Python 3.9 以降。PostgreSQL を用意し、次の手順で初期化してください。

pip install .
export POSTGRES_PASSWORD='replace-with-a-long-random-password'
docker compose up -d db
export RULEAS_DATABASE_URL="postgresql+psycopg://ruleas:${POSTGRES_PASSWORD}@localhost:5432/ruleas"
export RULEAS_SECRET_KEY="$(python -c 'import secrets; print(secrets.token_urlsafe(48))')"
ruleas init-db
ruleas create-user admin --role admin
# ローカル HTTP 開発時のみ。HTTPS 運用では true(既定値)を使用。
export RULEAS_COOKIE_SECURE=false
ruleas serve --host 127.0.0.1 --port 8000

http://127.0.0.1:8000/ が管理画面、/docs が OpenAPI です。ユーザーのパスワードは対話入力(12文字以上)。本番は HTTPS リバースプロキシ配下で起動し、SECRET_KEY は永続的な秘密値として保持してください。init-db と migrate は Alembic の最新 revision まで適用します。

保存と権限

1件の「ルール」は .rulea 文書単位です。文書内に複数の rule / ruleset を記述できます。namespace はソースから取得し、ソース内の policy version と DB の連番 version は独立しています。タグ・有効無効・更新日時・ソース・履歴を保存します。削除は論理削除で、履歴と監査は保持し、rollback で復元できます。rollback 自体も新しいバージョンになります。import を使用する外部モジュールのアップロードには未対応です。

管理者は編集、削除、復元、ユーザー作成、API キー管理、監査ログ閲覧が可能です。閲覧者はルール・履歴閲覧とテスト実行が可能です。API キーは作成した管理者の権限を継承し、一度だけ表示、DB には SHA-256 ハッシュのみを保存します。パスワードは salt 付き scrypt、管理画面は署名付き HttpOnly セッションと CSRF トークンを使用します。

API

ログイン: POST /v1/login に username / password。管理画面の変更系リクエストには返された csrf_token を X-CSRF-Token ヘッダーで指定します。API クライアントは Authorization: Bearer rs_... を使用します。

メソッド パス 内容
GET /health DB 接続を含むヘルスチェック
POST /v1/decide Decision をそのまま返す
POST /v1/check allowed / reason / decision
GET, POST /v1/rules 一覧・作成
GET, PUT, DELETE /v1/rules/{id} 取得・更新・削除
GET /v1/rules/{id}/source .rulea ダウンロード
GET /v1/rules/{id}/versions 履歴
POST /v1/rules/{id}/rollback/{version} 復元
POST /v1/users ユーザー作成(role: admin / viewer)
GET, POST /v1/api-keys キー一覧・発行
DELETE /v1/api-keys/{id} キー失効
GET /v1/audit-logs?limit=100 最新監査ログ(最大1000件)
GET, POST /v1/me, /v1/logout セッション情報・ログアウト

ルール作成例:

{"name":"access","source":"namespace access\nrule adult:\n    when: age >= 18\n    reason: \"Adults only\"\n","enabled":true,"tags":["auth"]}

更新時には上記に expected_version(現在の DB version)を追加します。競合は HTTP 409。実行例:

curl http://127.0.0.1:8000/v1/decide \
  -H "Authorization: Bearer $RULEAS_API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"policy_id":1,"rule":"access.adult","context":{"age":20}}'

ALLOW / DENY / NOT_APPLICABLE / ERROR、reason、trace、子 Decision、policy hash、engine version を返します。無効文書は NOT_APPLICABLE。未知の rule の挙動も rulea に従います。実行結果は actor・文書 ID・rule 名・日時・結果・hash・engine version とともに DB へ保存され、監査保存に失敗した場合はリクエストも失敗します。context やパスワード、キーの平文は監査に保存しません。

検証

pip install '.[test]'
pytest -q
python -m build

サーバーテストは隔離された SQLite を使用します。本番向け PostgreSQL テストは CI の PostgreSQL サービスで実施します。管理画面はルール編集、有効無効、履歴復元、JSON context テスト、Decision / trace 表示、キーとユーザーの作成、監査閲覧を提供します。テスト実行は保存済みソースを対象にします。

DB migration

スキーマは Alembic で管理します。0001 が公開時の5テーブル、0002 がログイン制限カウンターです。

# 新規 DB / Alembic 管理済み DB
ruleas migrate
# 旧 create_all() 版 DB: 必ずバックアップ後に実行
ruleas stamp-initial

stamp-initial は旧スキーマと revision 0001 の一致を検証し、既存データを保持して 0001 を stamp し、0002 以降を適用します。不一致や管理済み DB への stamp は拒否します。既存 DB を無条件で stamp しません。migration は起動前に1プロセスで実行してください。

負荷と入力上限

  • 判定・GET は通常の SELECT、更新・削除・rollback のみ SELECT FOR UPDATE を使用します。
  • HTTP body は実受信量で 1 MiB まで。Content-Length がなくても適用し、超過時は 413。
  • context は UTF-8 JSON 表現で 64 KiB、深さ32、4096ノードまで。超過は 422。
  • source は UTF-8 で256 KiB、タグは32個まで、各64 UTF-8バイトまで。
  • エンジンはプロセス内 LRU に最大32件、(policy ID, DB version) 単位で保持します。更新と rollback は新しい version のエンジンを使用します。評価中にキャッシュロックは保持しません。複数ワーカーは独立したキャッシュを持ちます。
  • ログインは DB 共有の固定60秒窓で、接続元 IP ごと30回・ユーザー名ごと10回まで。成功・失敗を両方計上し、超過時はパスワード検証前に 429 と Retry-After を返します。境界では連続する2窓分の試行が可能です。DB 障害時には制限を迂回せず失敗します。
  • 接続元は ASGI の client IP を使います。プロキシ運用では Uvicorn の信頼する転送元を明示してください。未検証の X-Forwarded-For をアプリで直接信用しません。

main の保護

CI の required-tests は全 Python バージョン、配布物、PostgreSQL テストのすべての成功を要求します。ワークフローを追加するだけでは GitHub のブランチ保護は有効になりません。管理権限を持つ GitHub CLI セッションで次を実行すると、最新 main への追従と required-tests 成功を必須にし、管理者にも適用、force push と削除を禁止します。

sh scripts/protect-main.sh

設定 payload は .github/branch-protection.json です。既存の保護を置き換える操作なので内容を確認してください。

License

Ruleas is licensed under the Apache License 2.0. See LICENSE for the full license text. Rulea is also licensed under Apache-2.0.

Metadata

Release files for ruleas 1.0.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ruleas 1.0.0
File Size Uploaded Provenance
ruleas-1.0.0.tar.gz 40.3 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for ruleas 1.0.0
File Interpreter ABI Platform
ruleas-1.0.0-py3-none-any.whl Python 3 none any Details

Total release size: 73.2 kB

Release files / ruleas-1.0.0.tar.gz

Download URL ruleas-1.0.0.tar.gz
Size 40.3 kB
Tags Source
SHA-256 checksum
How to use checksums
0a95dcee02ee875cb44178ee42d2414d0d247f6a3b2b212b8bf8f863f3c9d9d6
BLAKE2b-256 checksum
How to use checksums
6f53ced46c3ccfaa76cadddd8255a1f9b14543e808a751f9958b6c2edb512d22
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.

Transparency log

Release files / ruleas-1.0.0-py3-none-any.whl

Download URL ruleas-1.0.0-py3-none-any.whl
Size 32.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
cb727ff58b5e9a04e5493e0bb99041970fd5d6ce289bc912f8c498f0def11b37
BLAKE2b-256 checksum
How to use checksums
2b27018165dd1514b0c9a50c136e1cf7032ab7fce9af3b5aa874984d5b7625fc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.

Transparency log

Security for ruleas 1.0.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for ruleas-1.0.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 21, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page