15년, 하나의 서버, 8GB RAM과 50만 사용자 – Webminal이 사라지지 않는 이유
source https://community.webminal.org/t/15-years-one-server-8gb-ram-and-500k-users-how-webminal-refuses-to-die/8803/1
멋지네용
서버
webminal.org는 8GB RAM이 달린 CentOS Linux 서버 한 대로 돌아간다. 끝이다. Kubernetes도 없고, microservices도 없고, auto-scaling도 없다. 2011년부터 지금까지 서버는 딱 한 대였다. 그동안 이 서버는 이런 일도 버텼다.
2021년 데이터센터 화재 (사용자 계정 15만 개를 잃었다)
네덜란드에서 여러 차례 일어난 정전
2017년에 스페인 기술 블로그 하나가 하루 만에 사용자 10,000명을 몰고 왔던 일
Slackware만이 유일한 진짜 distro라고 우기는 내 친구 Freston
아이디어
아이디어는 단순했다. 회사에서 Windows 머신 앞에 앉아 Linux를 배우고 싶었다. 브라우저를 열고 실제 Linux 터미널에서 연습할 수 있다면 어떨까? "Run" 버튼도 없고 "Execute" 버튼도 없이, 그냥 진짜 서버에서 해보는 거다. 그렇게 감을 익히고 자신감이 붙으면, 의자를 휙 돌려 실제 Linux 머신 앞에 가서 그대로 써먹는 거다. 두려움도 망설임도 없이, 이미 뭘 하는지 아니까.
새로 바뀐 점
이번에 사이트 전체를 새로 디자인했다. 모든 페이지를 처음부터 다시 만들었다. 바뀐 건 이렇다.
새로운 모던 UI - 깔끔하고 빠르다. Bootstrap이나 jQuery CDN 의존성도 없다. 폰트는 self-hosted고, 모바일 반응형도 지원한다.
Root Lab - 실제 sysadmin 작업을 root 권한으로 연습할 수 있다. User Mode Linux를 써서 실제 block device가 붙은 완전한 kernel 환경을 제공한다. fdisk, LVM, RAID, mkfs, systemctl, crontab, firewalld, SSH keys, awk & sed 같은 것들을 연습할 수 있다. shared terminal에서는 하기 어려운 것들이다.
실시간 명령어 티커 - 홈페이지에서 스크롤되는 그 바? 가짜가 아니다. eBPF (execsnoop)로 명령어를 실시간 추적해서 보여준다. 지금까지 2,800만 건을 넘겼고, 계속 늘고 있다.
여정
Linode → DigitalOcean → AWS → GCP → OVH → IBM Cloud → Linode한 바퀴를 다 돌고 다시 제자리로 왔다. 그 사이 우리가 만든 것들도 꽤 많다. VS Code/Theia 기반 브라우저 IDE, Docker-over-LXC root 환경, Asciinema screencasting, shared file pool, ttyrec-to-GIF publishing, 커스텀 useradd 바이너리(기본 구현은 사용자가 30만 명을 넘기니 너무 느렸다), 그리고 OpenVZ-based VM provisioning system까지. 지금도 살아 있는 것도 있고, 시간이나 돈 문제로 사라진 것도 있다.
한 번도 얼굴을 본 적 없던 공동 창업자
나는 인도 사람이고, Freston은 네덜란드 사람이다. 우리는 2010년에 LinuxForums.org에서 만났다. 2015년까지 우리는 서로 얼굴을 본 적이 한 번도 없었다. Skype에서조차도. 모든 대화는 우리 서버의 screen 세션에 SSH로 접속해서 이뤄졌다.
$ screen -x chat
$ cat > /dev/null
hey, should we add MySQL support?플랫폼 하나가 그렇게 만들어졌다. Slack도 없고, Zoom도 없고, Jira 티켓도 없었다. 터미널에 메시지를 주고받던 남자 둘이 전부였다.
아무도 추천하지 않는 기술 스택
Python: 2.7 (맞다, 진짜다)
Framework: Flask 0.12.5
Terminal: Shellinabox (2017년에 개발이 멈췄지만, 아직도 완벽하게 돌아간다)
Root labs: User Mode Linux (2001년에 나온 기술)
Monitoring: eBPF/execsnoop (여기서 유일하게 현대적인 것)
Database: 화재를 버틴 서버 위의 MySQL
Frontend: React도 없고, Vue도 없고, npm도 없다. 그냥 HTML과 inline CSS.기술 컨퍼런스 발표라면 어디서든 이 스택은 잘못됐다고 말할 것이다. 그런데 이걸로 사용자 50만 명을 서비스했고, 15년 동안 살아남았다.
Shellinabox vs 세상
우리는 Shellinabox를 modern WebSocket 기반 터미널로 바꿔보려고 했다. 하지만 프로덕션에 올린 지 몇 시간도 안 돼서 사용자들이 빈 화면이 뜬다, Firefox와 호환이 안 된다고 제보하기 시작했다.
Shellinabox는 2005년 기술이다. 못생겼고, 느리고, 지구상의 거의 모든 방화벽과 프록시, 기업 네트워크를 뚫고 동작한다. 그래서 다시 돌아갔다. 가끔은 오래된 게 정답일 때가 있다.
아무도 쓰지 않는 기술, User Mode Linux
다들 Docker를 쓴다. 우리는 User Mode Linux를 쓴다. userspace에서 돌아가는 완전한 Linux kernel이고, Jeff Dike가 2001년에 만들었다.
왜냐고? 학생이 fdisk /dev/sdb를 치는 순간에는 진짜 block device가 필요하기 때문이다. Docker는 그걸 줄 수 없다. UML은 된다.
각 사용자는 이런 환경을 받는다.
완전한 Linux kernel 하나 (container가 아니라 실제 kernel이다)
LVM, RAID, fdisk 연습용 virtual block device 4개 (각 64MB)
256MB RAM
Copy-on-write overlay - 모두가 하나의 golden image를 공유한다
학생이 poweroff를 입력하면 UML이 종료되고, 곧바로 원래 shell로 돌아온다. 완전히 격리되고, 호스트에는 위험이 전혀 없다.
이 COW overlay 덕분에 동시 사용자 100명이 붙어도 디스크 사용량은 ~2GB 정도만 늘어난다. golden image는 공유된다.
eBPF - 유일하게 현대적인 것
홈페이지에 보이는 28,469,041 commands executed 카운터? 진짜다. 우리는 bcc-tools의 execsnoop2를 쓴다.
홈페이지에서 흘러가는 실시간 티커에 보이는 것들도 지금 이 순간 실제 사용자들이 입력하는 진짜 명령어다. 익명화했고, 안전한 명령어만 보여준다. 인자도 없고, 경로도 없고, 비밀번호도 없다. 그저 $ ls, $ gcc, $ vim 같은 것들이 심장 박동처럼 흘러갈 뿐이다.
누군가가 첫 ls를 실행하는 순간을 Linux kernel이 직접 알려준다.
사용자들이 남긴 말
"저는 시간이 많지 않은 Windows 시스템 관리자인데, 이 사이트 덕분에 Linux에 훨씬 익숙해질 수 있었습니다. 태블릿으로도 이 사이트를 씁니다. 튜토리얼도 정말 훌륭해요. 늘 감사하게 생각합니다."
"저는 한국에서 Electronic Engineering을 공부하는 학생입니다. 이 사이트로 Linux를 공부하고 있는데 정말 큰 도움이 됐습니다!"
"튜토리얼이 정말 좋아요! 중간중간 웃긴 부분도 있어서 웃었습니다. 사이트가 정말 놀라워요. 더 많이 만들어 주세요! 계속 멋진 작업 부탁드립니다!"
비용
Webminal은 수익이 0이다. 광고도 없고, 추적도 없고, VC 투자도 없다. 서버 비용은 내 저축에서 낸다. 이 프로젝트에 개인이나 가족을 위해 쓴 돈보다 더 많은 돈을 넣었다.
한두 번이 아니라, 여러 번 접을까 생각했다. 15년은 긴 시간이다. 일을 쉬고 있던 몇 달 동안에는 저축이 줄어드는 걸 보면서도 서버 비용 청구서는 계속 날아왔다. 매달 이번이 플러그를 뽑을 달인가 싶었다. 그러다 다시 일을 구하면 그 생각은 사라졌고, Webminal은 또 1년을 버텼다. YC에도 지원했다. 떨어졌다. 수익화도 해봤다. PayPal, Stripe, 유료 플랜까지. 전부 잘 안 됐다. Webminal이 가장 필요한 사람들은 월 4달러조차 부담하기 어려운 학생들이다. 그래서 무료로 남아 있다.
50만 명이 Webminal에서 처음으로 ls를 쳤다. 그중 일부는 이제 sysadmin이 됐다. 일부는 자기 서버를 직접 운영한다. 아마 그중 한 명은 내가 평생 다룰 인프라보다 더 큰 규모를 관리하고 있을지도 모른다.
단 한 명의 학생에게라도 도움이 된다면, Webminal은 계속 돌아갈 것이다.
더 많은 학생이 동시에 root lab을 돌릴 수 있게 8GB에서 128GB로 업그레이드하는 데 힘을 보태고 싶다면, 작은 후원도 큰 도움이 된다: Sponsor @Lakshmipathi on GitHub Sponsors · GitHub
