マウント可能な Rails Engine として実装された、サイバーセキュリティトレーニング用の脱出ゲームです。
Gemfileに以下を追加:
gem 'break_escape', path: 'path/to/break_escape'
次に:
bundle install
rails break_escape:install:migrations
rails db:migrate
rails db:seed # オプション:シナリオからミッションを作成
config/routes.rbに以下を追加:
mount BreakEscape::Engine => "/break_escape"
export BREAK_ESCAPE_STANDALONE=true
rails server
# http://localhost:3000/break_escape/ にアクセス
Hacktivityまたは別のRailsアプリにマウントします。エンジンは、Deviseを介してホストアプリの current_user を使用します。
# config/initializers/break_escape.rb
BreakEscape.configure do |config|
config.standalone_mode = false # 開発の場合はtrue
config.demo_user_handle = 'demo_player'
end
break_escape_missions - シナリオメタデータ(name, display_name, published, difficulty)break_escape_games - プレイヤー状態 + シナリオスナップショット(JSONB)break_escape_demo_users - スタンドアロンモードのみ(オプション)GET /games/:id/scenario - シナリオJSON(ERB生成)GET /games/:id/ink?npc=X - NPCスクリプト(.inkからJITコンパイル)GET /games/:id/bootstrap - 初期ゲームデータPUT /games/:id/sync_state - プレイヤー状態の同期POST /games/:id/unlock - アンロック試行の検証POST /games/:id/inventory - インベントリの更新シナリオは .json.erb テンプレートとして保存され、オンデマンドでランダム値を含めてレンダリングされます:
<%= random_password %> - ゲームごとに一意のパスワードを生成<%= random_pin %> - 一意の4桁PINを生成<%= random_code %> - 一意の16進コードを生成NPCダイアログスクリプトは最初のリクエスト時にコンパイルされます(約300ms):
.json が存在し、.ink よりも新しいかを確認inklecate を実行してコンパイルプレイヤー状態はJSONBカラムに保存:
テストはGitHub Actions上で自動的に実行されます。コミットされた Gemfile.lock は使用するgemの正確なバージョンを固定します。
bundle install
bundle exec rails db:create db:migrate RAILS_ENV=test
bundle exec rails test
エンジンには、同階層にあるHacktivityチェックアウトからバンドルをブートストラップする bin/setup スクリプトが同梱されています(Hacktivityには必要なgemがすべてベンダリングされています):
# BreakEscapeのルートから — Hacktivityは ../Hacktivity にある必要があります
bin/setup
bundle exec rails test
# Hacktivityが別の場所にある場合は、HACKTIVITY_DIRを設定:
HACKTIVITY_DIR=/path/to/Hacktivity bin/setup
bin/setup は解決済みの .gem ファイルを vendor/cache/ にコピーし、bundle install --local を実行します。vendor/cache/ と vendor/bundle/ ディレクトリはgitignoreされています。コミットされるのは Gemfile.lock のみです。
統合ガイドについては HACKTIVITY_INTEGRATION.md を参照してください。
プロジェクトに貢献してくださったすべての方々に感謝します。GitHubの履歴をご参照ください。