Files
rsh26_pool_example/README.md
T
2026-07-04 19:43:17 +09:00

149 lines
6.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# みんなで投票(Rsh26pool
投票ルームを作成・参加し、アイデアを投稿して気に入ったものに投票できる、リアルタイムな投票 Web アプリケーションです。班分け(グルーピング)モードや投票の自動終了にも対応しています。
Elixir / Phoenix (LiveView) と PostgreSQL で実装されており、UI はすべて日本語、スタイリングは Tailwind CSSdaisyUI)を使用しています。
## 主な機能
### 基本機能
- **ルーム作成**:ルーム名や一人あたりの投票数などを設定して投票ルームを作成します。
- **ルーム参加**:ルーム番号と名前を入力して既存のルームに参加します。
- **投票**:アイデアを投稿し、気に入った選択肢に投票できます。
- 選択肢の表示順は参加者ごとにシャッフルされます。
- 投票中は各選択肢の得票数は表示されません。
- **管理**:ルームのオーナーは投票の終了やルーム名の変更ができ、得票数付きの結果をリアルタイムで確認できます。
- **トークン認証**:ランダムなトークンを発行してデータベースに保存し、Cookie(セッション)に保持することで各参加者を識別します。ログアウトも可能です。
### 追加機能
- **グルーピングモード**:投票アプリが班分けアプリに変化します。各参加者が意見を投稿し、十分な票を集めた人がリーダーになります。残りの参加者は、投票内容(参加したいグループ)をもとに **ハンガリアン法(Hungarian algorithm** で各グループへ均等に割り当てられます。
- **自動終了**:ルーム作成時に「投票終了日時」を設定すると、その日時(日本時間)に投票が自動的に終了します。
## ページ一覧
| パス | 内容 |
| --- | --- |
| `/` | ホーム。ルームの作成/参加を選択します。 |
| `/create` | ルーム作成ページ。作成後、オーナーは `/manage/{ルーム番号}` にリダイレクトされます。 |
| `/enter` | ルーム番号と名前を入力して参加するページ。 |
| `/vote/{ルーム番号}` | 投票ページ(LiveView)。 |
| `/manage/{ルーム番号}` | 管理ページ(LiveView、オーナー専用)。 |
## 技術スタック
- **言語 / フレームワーク**Elixir, Phoenix 1.8, Phoenix LiveView
- **データベース**PostgreSQLEcto
- **フロントエンド**Tailwind CSS v4 + daisyUI, esbuild
## 必要要件
- Elixir 1.15 以上(Erlang/OTP 26 以上)
- PostgreSQL
## セットアップ
### 1. データベース接続の設定
データベース接続は環境変数 `DATABASE_URL` から読み込みます。プロジェクトルートの `.env` に設定してください。
```
DATABASE_URL=postgresql://ユーザー名:パスワード@localhost:5432/rsh26pool_dev
```
> `DATABASE_URL` が未設定の場合は、開発環境ではローカルの `postgres/postgres@localhost` にフォールバックします。
### 2. 依存関係のインストールと DB 初期化
`.env` を読み込んでから `mix setup`(依存関係の取得・DB作成・マイグレーション・アセットのビルド)を実行します。
```bash
set -a; source .env; set +a
mix setup
```
## 起動方法
環境変数を読み込み、Phoenix サーバーを起動します。
```bash
set -a; source .env; set +a
mix phx.server
```
IEx(対話シェル)付きで起動する場合:
```bash
set -a; source .env; set +a
iex -S mix phx.server
```
起動後、ブラウザで [`http://localhost:4000`](http://localhost:4000) にアクセスしてください。
## 使い方
1. ホーム(`/`)で「ルームを作成」を選び、ルーム名や一人あたりの投票数を設定します。必要に応じて「グルーピングモード」や「投票終了日時」を指定します。
2. 作成後に表示される **ルーム番号** を参加者に伝えます。
3. 参加者はホームの「ルームに参加」からルーム番号と名前を入力して参加し、`/vote/{ルーム番号}` でアイデアの投稿と投票を行います。
4. オーナーは `/manage/{ルーム番号}` で結果を確認し、投票を終了できます。グルーピングモードでは、終了時にグループ分けの結果が表示されます。
## テスト
```bash
set -a; source .env; set +a
mix test
```
コミット前の一括チェック(コンパイル・フォーマット・テスト):
```bash
set -a; source .env; set +a
mix precommit
```
> テストは `DATABASE_URL` の接続先サーバー上に、専用の `..._test` データベースを自動的に作成して実行します。
## Docker でのデプロイ
Docker を使って本番用リリースをビルド・起動できます。データベース接続 URL は、コンテナの **起動時** に環境変数 `DATABASE_URL` から読み込まれます(イメージには埋め込まれません)。
### 1. イメージのビルド
```bash
docker build -t rsh26pool:latest .
```
### 2. マイグレーションの実行
```bash
docker run --rm \
-e DATABASE_URL="ecto://ユーザー名:パスワード@DBホスト:5432/rsh26pool_prod" \
-e SECRET_KEY_BASE="$(mix phx.gen.secret)" \
rsh26pool:latest /app/bin/migrate
```
### 3. サーバーの起動
```bash
docker run -p 4000:4000 \
-e DATABASE_URL="ecto://ユーザー名:パスワード@DBホスト:5432/rsh26pool_prod" \
-e SECRET_KEY_BASE="生成したシークレット" \
-e PHX_HOST="example.com" \
rsh26pool:latest
```
起動後、ブラウザで [`http://localhost:4000`](http://localhost:4000) にアクセスしてください。
### 環境変数
| 変数 | 必須 | 説明 |
| --- | --- | --- |
| `DATABASE_URL` | 必須 | データベース接続 URL(例:`ecto://ユーザー名:パスワード@DBホスト:5432/rsh26pool_prod`)。 |
| `SECRET_KEY_BASE` | 必須 | Cookie の署名・暗号化に使用。`mix phx.gen.secret` で生成できます。 |
| `PHX_HOST` | 推奨 | 公開ホスト名。未設定時は `example.com`。 |
| `PORT` | 任意 | 待ち受けポート。既定は `4000`。 |
| `POOL_SIZE` | 任意 | DB コネクションプールのサイズ。既定は `10`。 |
> 本番設定(`config/prod.exs`)では `force_ssl`HSTS)が有効です。`localhost` 以外のホストでは `https` にリダイレクトされるため、TLS を終端して `x-forwarded-proto` ヘッダーを付与するリバースプロキシの背後で運用してください。