{"id":26530221,"url":"https://github.com/nutfes/nutfes-bingo","last_synced_at":"2026-04-19T19:03:08.763Z","repository":{"id":175201129,"uuid":"653491983","full_name":"NUTFes/nutfes-Bingo","owner":"NUTFes","description":null,"archived":false,"fork":false,"pushed_at":"2026-04-16T02:33:47.000Z","size":32389,"stargazers_count":1,"open_issues_count":27,"forks_count":0,"subscribers_count":2,"default_branch":"develop","last_synced_at":"2026-04-16T04:29:33.282Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/NUTFes.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2023-06-14T06:53:53.000Z","updated_at":"2026-04-16T02:33:53.000Z","dependencies_parsed_at":"2025-07-25T11:09:35.609Z","dependency_job_id":"51508320-07f5-45a6-9211-79e9a321e778","html_url":"https://github.com/NUTFes/nutfes-Bingo","commit_stats":null,"previous_names":["nutfes/nutfes-bingo"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/NUTFes/nutfes-Bingo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NUTFes%2Fnutfes-Bingo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NUTFes%2Fnutfes-Bingo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NUTFes%2Fnutfes-Bingo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NUTFes%2Fnutfes-Bingo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/NUTFes","download_url":"https://codeload.github.com/NUTFes/nutfes-Bingo/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NUTFes%2Fnutfes-Bingo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32018765,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T20:23:30.271Z","status":"online","status_checked_at":"2026-04-19T02:00:07.110Z","response_time":55,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-03-21T17:40:23.144Z","updated_at":"2026-04-19T19:03:08.757Z","avatar_url":"https://github.com/NUTFes.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# nutfes-Bingo\n\n技大祭当日に使うビンゴアプリです。\n\n## 制作背景\n\n### 課題\n\n従来の学園祭ビンゴ大会では、抽選機で排出された番号をホワイトボードに手書きで掲示していました。この運用には以下の課題がありました。\n\n- **視認性の問題**：後方の参加者には文字が見えづらい\n- **人員コスト**：板書担当として人員を別途確保する必要がある\n\n### 目的\n\n抽選番号や景品の当選状況を Web 上でリアルタイムに確認できるアプリを作成し、参加者体験の向上と運営の効率化を両立させることを目的としました。\n\n参加者（600〜1000人規模）が自身のスマートフォンから番号を確認できるようにするとともに、会場の大型ディスプレイへの表示、管理者向けの運営機能も提供しています。\n\n---\n\n## 技術選定\n\n### 技術スタック\n\n| レイヤー | 技術 |\n|------|------|\n| フロントエンド | Next.js / TypeScript |\n| バックエンド | Hasura Engine (GraphQL) |\n| データベース | PostgreSQL |\n| ストレージ | MinIO |\n| インフラ | オンプレサーバ（Proxmox VM） + Cloudflare Tunnel |\n| 開発環境 | Docker / Docker Compose |\n\n### 選定理由\n\n**Hasura (GraphQL)**\n\nこのアプリの主要要件は「複数ユーザーへのリアルタイム配信」でした。Hasura の GraphQL Subscription を使うことで WebSocket 通信を容易に実装できること、また GUI 上でスキーマ作成からCRUD API・Subscription クエリの生成まで行えるため、バックエンドの実装コストを大幅に削減できると判断し採用しました。\n\n開発期間が3か月、チームのほとんどが Web 開発未経験という状況で、当日リリースを最優先にするためバックエンドに時間を割かずフロントの UI に注力できる構成を選びました。\n\n**Next.js / TypeScript**\n\nnutmeg（所属サークル）内の複数プロジェクトで採用されており、技術的な質問・知見の共有がしやすい環境にあったため採用しました。\n\n**インフラ（オンプレ + Cloudflare Tunnel）**\n\nProxmox 上の VM にサービスを構築し、Cloudflare Tunnel 経由で外部公開しています。\n\n## Branch 命名規則\n\n新機能の Branch 名：feature/issue○○/title[isuue の簡単な説明]\n\n修正の Branch 名：fix/issue○○/title[issue の簡単な説明]\n\n## PR 命名規則\n\n新機能：[add] title\n\n編集・修正：[fix] title\n\n削除：[del] title\n\n## セットアップ\n\n### 基本的なセットアップ\n\n```bash\nmake setup\n```\n\n### MinIO 認証情報を新規生成してセットアップ\n\n```bash\nmake setup-with-new-keys\n```\n\n### MinIO 認証情報のみ生成\n\n```bash\nmake generate-minio-keys\n```\n\n## 実装メモ\n\n- `next: permission denied`が出る時の対処法\n  - `docker compose run --rm [コンテナ名] bash` でそのコンテナに入る\n  - `chown +x -R .`　で実行権限を与える\n  - `exit`でそのコンテナから出る\n\n### MinIO 認証情報について\n\n- MinIO のアクセスキーとシークレットキーは `api/seeds/generate_minio_credentials.sh` で自動生成可能\n- GUI 操作不要で、mc コマンドを使用して認証情報を生成・更新\n- 環境変数ファイル (`settings/bingo.env`, `settings/admin.env`) は自動的にバックアップ・更新される\n- **バケット作成も認証情報生成時に自動実行される**\n\n### スクリプトの役割分担\n- `generate_minio_credentials.sh`: MinIO 環境セットアップ（認証情報生成 + バケット作成）\n- `seed_with_existing_images.sh`: データ投入のみ（画像アップロード + DB 登録）\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnutfes%2Fnutfes-bingo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnutfes%2Fnutfes-bingo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnutfes%2Fnutfes-bingo/lists"}