ft_transcendence (42 Pong)
<img src="/ft_transcendence.gif" alt="presentation 42Pong"/>개요
ft_transcendence는 ecole42의 마지막 공통 코어 프로젝트로, Ruby on Rails, Backbone.js, PostgreSQL을 사용하여 실시간 온라인 Pong 게임 웹사이트를 구현하는 것이 표면적인 목적이지만... 진짜 목적은 한 번도 사용해보지 않은 언어와 프레임워크로 새로운 것을 만들어보는 것이다.
이 42 Pong은 실시간 게임, 채팅, 그룹 채팅 채널, 친구 온라인/오프라인 상태, 길드, 길드 전쟁, 랭킹 시스템, 토너먼트를 지원한다. 모든 레이아웃은 완전히 반응형이어야 한다.
주요 기능
게임 기능
- 실시간 Pong 게임: WebSocket을 통한 실시간 멀티플레이어 게임
- 매치 시스템: 1:1 대전, 래더 매치, 토너먼트 매치
- 토너먼트: 4인 토너먼트 (준결승 → 결승)
- 랭킹 시스템: 사용자 RP(Rating Points) 기반 랭킹
소셜 기능
- 1:1 채팅: 개인 메시지 기능
- 채널 채팅: 공개/비공개/비밀 채널 지원
- 채널 관리: 관리자, 멤버, 밴, 음소거 기능
- 비밀번호 보호 채널
- 친구 시스템: 친구 추가/삭제, 온라인 상태 확인
- 사용자 프로필: 닉네임, 아바타, 프로필 관리
길드 시스템
- 길드 생성 및 관리: 길드 생성, 가입, 탈퇴
- 길드 전쟁: 길드 간 전쟁 시스템
- 전쟁 요청 및 수락
- 전쟁 매치 스코어 추적
- 베팅 시스템 (wager)
- 길드 멤버 관리: 길드장, 장교, 일반 멤버 역할
보안 기능
- OAuth 인증: 42 Intranet OAuth 로그인
- 2단계 인증 (2FA): QR 코드 기반 OTP 인증
- 관리자 기능: 사용자 밴/언밴, 관리자 페이지
기술 스택
Backend
- Ruby on Rails 6.0.3: 웹 애플리케이션 프레임워크
- PostgreSQL: 데이터베이스
- ActionCable: WebSocket을 통한 실시간 통신
- Devise: 사용자 인증 시스템
- Omniauth: OAuth 인증 (42 Intranet)
- Cloudinary: 이미지 저장 및 관리
- Puma: 웹 서버
Frontend
- Backbone.js: MVC 프레임워크
- jQuery: DOM 조작 및 이벤트 처리
- Bootstrap 4: UI 프레임워크
- Webpacker: JavaScript 번들링
- SCSS: 스타일시트 전처리기
Infrastructure
- Docker: 컨테이너화
- Docker Compose: 멀티 컨테이너 애플리케이션 관리
- PgAdmin: PostgreSQL 관리 도구
설치 및 실행
사전 요구사항
- Docker
- Docker Compose
실행 방법
- 저장소 클론
git clone <repository-url>
cd ft_transcendence
- 환경 변수 설정
.env파일을 생성하고 필요한 환경 변수를 설정한다:
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
OTP_KEY=your_otp_secret_key
CLOUDINARY_URL=your_cloudinary_url
- 애플리케이션 실행
docker-compose up --build
- 데이터베이스 초기화 (첫 실행 시)
docker-compose exec rails rails db:create db:migrate db:seed
접속 정보
- 42 Pong 웹사이트: http://127.0.0.1
- PgAdmin: http://127.0.0.1:8080
- 이메일:
admin@admin.com - 비밀번호:
admin - 데이터베이스 사용자:
postgres - 데이터베이스 비밀번호:
postgres
- 이메일:
로그인 방법
1. 42 Intranet OAuth 로그인
- 웹사이트에서
login with 42버튼 클릭 - 42 OAuth 로그인 페이지로 리다이렉트
- 42 인트라넷 계정으로 로그인
2. 데이터베이스 계정 로그인
42 인트라넷 ID가 없는 경우 백도어 로그인 페이지 사용:
http://127.0.0.1/users/sign_in
테스트 계정 (비밀번호: asdfas):
- doby@asdf.com
- jai@asdf.com
- salty@asdf.com
- noich@asdf.com
- benny@asdf.com
- sophie@asdf.com
- ol@asdf.com
- snow@asdf.com
- jerry@asdf.com
- charly@adf.com
관리자 계정:
- 이메일:
wpark@student.42.fr - 관리자 페이지 접근 가능
프로젝트 구조
ft_transcendence/
├── docker-compose.yaml # Docker Compose 설정
├── dockerfile # Docker 이미지 설정
├── project/ # Rails 애플리케이션
│ ├── app/
│ │ ├── channels/ # ActionCable 채널
│ │ ├── controllers/ # 컨트롤러
│ │ │ └── api/ # API 컨트롤러
│ │ ├── models/ # 데이터 모델
│ │ ├── javascript/ # JavaScript 파일
│ │ │ └── packs/ # Backbone.js 뷰/모델/컬렉션
│ │ └── views/ # 뷰 템플릿
│ ├── config/
│ │ ├── routes.rb # 라우팅 설정
│ │ └── ...
│ ├── db/
│ │ ├── migrate/ # 데이터베이스 마이그레이션
│ │ └── schema.rb # 데이터베이스 스키마
│ └── ...
└── README.md
데이터베이스 모델
주요 모델
- User: 사용자 계정 (Devise)
- UserProfile: 사용자 프로필 정보
- Match: 게임 매치
- Tournament: 토너먼트
- Guild: 길드
- War: 길드 전쟁
- Chat: 1:1 채팅
- Channel: 채널 채팅
- ChatMessage: 채팅 메시지
- ChannelMessage: 채널 메시지
API 엔드포인트
사용자 관련
GET /api/user_info- 사용자 정보 조회GET /api/user_info/:user_id- 특정 사용자 정보PUT /api/user_info/:user_id/ban- 사용자 밴PUT /api/user_info/:user_id/unban- 사용자 언밴GET /api/profile/:user_id- 프로필 조회PUT /api/profile/:user_id- 프로필 업데이트
2단계 인증
GET /api/two_factors/:user_id- 2FA 설정 조회POST /api/two_factors/:user_id- 2FA 설정 생성PUT /api/two_factors/:user_id- 2FA 설정 업데이트
친구
GET /api/my_friends- 친구 목록GET /api/my_friends/:user_id- 친구 정보PUT /api/my_friends/:user_id- 친구 추가DELETE /api/my_friends/:user_id- 친구 삭제
채팅
GET /api/chats- 채팅 목록GET /api/chats/:room/chat_messages- 채팅 메시지 조회POST /api/chats/:room/chat_messages- 채팅 메시지 전송
채널
GET /api/channels- 채널 목록POST /api/channels- 채널 생성GET /api/channels/:id- 채널 정보DELETE /api/channels/:id- 채널 삭제GET /api/channels/:id/channel_messages- 채널 메시지 조회POST /api/channels/:id/channel_messages- 채널 메시지 전송PUT /api/channels/:id/members/:user_id- 채널 멤버 추가DELETE /api/channels/:id/members/:user_id- 채널 멤버 제거PUT /api/channels/:id/admins/:user_id- 채널 관리자 추가PUT /api/channels/:id/bans/:user_id- 채널 밴PUT /api/channels/:id/mutes/:user_id- 채널 음소거
길드
GET /api/guilds/:user_id- 길드 정보 조회POST /api/guilds- 길드 생성PUT /api/guilds/:user_id- 길드 정보 업데이트DELETE /api/guilds/:user_id- 길드 삭제
전쟁
GET /api/war/:user_id- 전쟁 정보 조회PUT /api/war/:user_id- 전쟁 정보 업데이트POST /api/war/notify_enemy_guild_of_attack- 적 길드 공격 알림GET /api/war_request/:war_id- 전쟁 요청 조회POST /api/war_request- 전쟁 요청 생성PUT /api/war_request/:war_id- 전쟁 요청 수락/거절DELETE /api/war_request/:war_id- 전쟁 요청 삭제GET /api/war_history/:guild_id- 전쟁 기록 조회GET /api/war_ongoing/:war_id- 진행 중인 전쟁 조회
토너먼트
GET /api/tournaments- 토너먼트 목록POST /api/tournaments- 토너먼트 생성GET /api/tournaments/:id- 토너먼트 정보PUT /api/tournaments/:id/players- 토너먼트 참가DELETE /api/tournaments/:id/players- 토너먼트 탈퇴
매치
GET /api/matches- 매치 목록POST /api/matches- 매치 생성GET /api/matches/:id- 매치 정보
랭킹
GET /api/rank/:id- 랭킹 조회
WebSocket 채널
채널 목록
game_channel: 게임 실시간 통신chat_channel: 채팅 실시간 통신channel_channel: 채널 채팅 실시간 통신notification_channel: 알림 실시간 통신user_status_channel: 사용자 상태 실시간 업데이트guild_channel: 길드 관련 실시간 통신match_channel: 매치 관련 실시간 통신tournament_channel: 토너먼트 관련 실시간 통신
테스트
# Rails 콘솔 접속
docker-compose exec rails rails console
# 데이터베이스 마이그레이션
docker-compose exec rails rails db:migrate
# 데이터베이스 시드
docker-compose exec rails rails db:seed
개발 가이드
환경 변수
프로젝트 루트에 .env 파일을 생성하고 다음 변수들을 설정한다:
POSTGRES_USER: PostgreSQL 사용자명POSTGRES_PASSWORD: PostgreSQL 비밀번호OTP_KEY: 2FA 암호화 키CLOUDINARY_URL: Cloudinary 설정 URL
코드 스타일
- Ruby: Ruby 스타일 가이드 준수
- JavaScript: Backbone.js 컨벤션 준수
