ecole42

ft_transcendence

ft_transcendence

ft_transcendence는 ecole42의 마지막 공통 코어 프로젝트로, Ruby on Rails와 Backbone.js를 사용하여 실시간 온라인 Pong 게임 웹사이트를 구현한 프로젝트. WebSocket을 통한 실시간 멀티플레이어 게임, 채팅 시스템, 길드 전쟁, 토너먼트, 랭킹 시스템 등 다양한 기능을 제공하며, OAuth 인증과 2FA를 통한 보안 기능을 포함한다. 한 번도 사용해보지 않은 언어와 프레임워크로 새로운 것을 만드는 것이 이 프로젝트의 진짜 목적이다

Ruby on Rails
Backbone.js
PostgreSQL
Docker

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

실행 방법

  1. 저장소 클론
git clone <repository-url>
cd ft_transcendence
  1. 환경 변수 설정
    .env 파일을 생성하고 필요한 환경 변수를 설정한다:
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
OTP_KEY=your_otp_secret_key
CLOUDINARY_URL=your_cloudinary_url
  1. 애플리케이션 실행
docker-compose up --build
  1. 데이터베이스 초기화 (첫 실행 시)
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 로그인

  1. 웹사이트에서 login with 42 버튼 클릭
  2. 42 OAuth 로그인 페이지로 리다이렉트
  3. 42 인트라넷 계정으로 로그인

2. 데이터베이스 계정 로그인

42 인트라넷 ID가 없는 경우 백도어 로그인 페이지 사용:

http://127.0.0.1/users/sign_in

테스트 계정 (비밀번호: asdfas):

관리자 계정:

  • 이메일: 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 컨벤션 준수

기여자

참고 자료