시작: 서버 하나에서 커뮤니티까지

Counter-Strike 2 커뮤니티 서버를 운영하게 된 계기는 단순합니다. 한국 서버가 너무 적었거든요. 매칭 대기 시간이 길어서 "직접 서버를 열면 되지 않을까?"라는 생각으로 시작했습니다. 처음에는 단순히 게임 서버 하나를 띄우는 것이었지만, 운영을 하다 보니 기술적 과제가 끊임없이 생겼습니다.

서버에 사람이 모이기 시작하면서 Discord 커뮤니티가 자연스럽게 형성되었고, 현재 500명 이상의 멤버가 활동하고 있습니다. 단순한 게임 서버가 아니라, 기술로 더 나은 게임 경험을 만들어가는 커뮤니티가 되었습니다.

GrenadeBoost: 커스텀 물리 엔진 구현

CS2에서 수류탄은 게임의 전략적 핵심입니다. 기본 게임에서는 수류탄의 물리가 정해져 있지만, 우리 서버에서는 수류탄으로 플레이어를 밀어내는 "부스트" 기능을 추가하고 싶었습니다. 기존에 이 기능을 제공하는 플러그인이 없어서 직접 만들기로 했습니다.

CounterStrikeSharp 프레임워크를 사용해 C#으로 개발했습니다. 가장 어려웠던 부분은 물리 연산입니다. 수류탄 폭발 시 플레이어에게 가해지는 힘의 방향과 크기를 계산해야 하는데, 단순히 폭발 지점에서 밀어내면 부자연스럽습니다.

최종적으로 구현한 물리 모델은 다음 요소를 고려합니다:

이 플러그인은 GitHub에 오픈소스로 공개했고, 다른 서버 운영자들도 사용하고 있습니다.

Docker + Pterodactyl 인프라 자동화

게임 서버 하나만 운영할 때는 수동 관리가 가능했지만, 여러 서버와 서비스를 운영하면서 자동화가 필수가 되었습니다. Pterodactyl 패널을 도입해 게임 서버를 웹 UI로 관리하고, 모든 서비스를 Docker 컨테이너로 격리했습니다.

자동화한 것들:

BangyaDan: Discord 커뮤니티 관리 봇

500명 이상의 커뮤니티를 관리하려면 자동화된 도구가 필요합니다. BangyaDan은 Discord.js 기반의 커뮤니티 관리 봇으로, 게임 서버와 Discord를 연결하는 다리 역할을 합니다.

주요 기능으로는 Discord OAuth 기반 웹 관리 패널, PM2로 무중단 운영, 헬스체크를 통한 자동 복구가 있습니다. 웹 패널에서는 서버 설정, 사용자 관리, 로그 확인 등을 브라우저에서 바로 할 수 있습니다.

가장 유용한 기능은 게임 서버 상태 연동입니다. 서버가 다운되면 Discord에 자동으로 알림이 가고, 복구되면 다시 알림을 보냅니다. 서버 점검 시에도 플레이어들에게 실시간으로 상태를 공유할 수 있어서 커뮤니티 소통에 큰 도움이 됩니다.

기술로 커뮤니티를 만든다는 것

좋은 커뮤니티는 좋은 경험에서 시작된다. 기술은 그 경험을 만드는 도구다.

게임 서버를 운영하면서 느낀 것은, 기술이 사람을 모으는 힘이 있다는 것입니다. 수류탄 부스트 같은 재미있는 기능이 플레이어를 끌어들이고, 안정적인 인프라가 플레이어를 머물게 합니다. Discord 봇이 소통을 원활하게 하고, 자동화가 운영자의 부담을 줄여 더 나은 서비스에 집중할 수 있게 합니다.

단순히 "게임 서버를 열었다"가 아니라, 기획-개발-운영-커뮤니티 관리의 전체 사이클을 경험했습니다. 사용자의 피드백을 받아 플러그인을 개선하고, 서버 장애를 분석해 인프라를 강화하고, 커뮤니티의 요구에 맞춰 새로운 기능을 추가하는 — 이 과정은 어떤 소프트웨어 프로젝트에서든 통용되는 경험입니다.