내 소셜 계정을 직접 소유한다는 건 멋진 생각입니다. 그 계정이 남의 서버에서, 남의 규칙과 가동 시간에 따라 살고 있다는 걸 깨닫기 전까지는요. 나만의 Mastodon 인스턴스는 이 문제를 풀어 줍니다. 핸들은 @you@your-domain이고, 끌 수 있는 사람은 나뿐입니다. 다만 Mastodon은 작은 앱이 아닙니다. 무엇을 떠맡는지 알고 시작하는 게 좋습니다.
누구에게 맞나
- 나 자신이나 회사 공식 계정을 위한 1인 인스턴스.
- 친구들이나 프로젝트 팀의 작은 커뮤니티. 수천 명이 아니라 수십 명 규모.
그보다 크면 모더레이션 의무, 신고 처리, 제대로 된 인프라를 갖춘 서비스를 운영하는 셈입니다. 그건 또 다른 이야기입니다.
실제로 필요한 것
Mastodon은 여러 프로세스를 동시에 돌립니다. Rails 웹 앱, 백그라운드 Sidekiq 워커, 스트리밍 서버, PostgreSQL, Redis. 연합 구조 때문에 내가 자는 동안에도 서버는 다른 서버에서 글과 미디어를 계속 가져옵니다.
| 인스턴스 | 요금제 |
|---|---|
| 1인, 팔로우 적음 | Small-IP — 2 vCPU, 4 GB, 월 $16 |
| 작은 커뮤니티, 활발한 연합 | Medium-IP — 4 vCPU, 6 GB, 월 $20 |
4 GB로도 돌아가지만 빠듯합니다. 팔로우하는 인기 글에 답글이 수천 개 달리면 Sidekiq 큐가 밀립니다. 6 GB면 숨 쉴 여유가 생깁니다. 또 다른 제약은 디스크로, 아래 미디어 항목을 보세요.
도메인과 전용 IP도 필요합니다. 다른 서버들이 443번 포트로 내 서버에 전달합니다.
Docker로 설치하기
공식 저장소에 docker-compose.yml이 들어 있습니다. Docker가 설치된 새 Ubuntu 24.04 서버에서:
git clone https://github.com/mastodon/mastodon.git
cd mastodon
git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)
touch .env.production
docker compose run --rm -v $(pwd)/.env.production:/opt/mastodon/.env.production \
web bundle exec rake mastodon:setup
docker compose up -d
설정 작업은 도메인, 데이터베이스와 Redis 설정(기본값이 compose 파일과 맞습니다), 메일 설정, 첫 관리자 계정을 묻고, 모든 것을 .env.production에 씁니다. 체크아웃한 태그의 릴리스 노트는 꼭 읽으세요. 메이저 버전 사이에 절차가 바뀌기도 합니다.
Mastodon에는 dist/nginx.conf에 nginx 템플릿이 들어 있습니다. /etc/nginx/sites-available/에 복사하고, 도메인을 바꾸고, certbot으로 인증서를 받으세요. 리버스 프록시와 도메인 가이드가 둘 다 다룹니다.
메일: 릴레이를 쓰세요
Mastodon은 가입 확인과 비밀번호 재설정 메일을 보냅니다. 저희 서버에서는 25번과 465번 포트가 닫혀 있으니, 587번 포트로 외부 트랜잭션 메일 서비스를 가리키세요.
SMTP_SERVER=smtp.your-provider.example
SMTP_PORT=587
SMTP_LOGIN=apikey
SMTP_PASSWORD=your-smtp-password
SMTP_FROM_ADDRESS=notifications@your-domain.example
솔직히 어차피 릴레이를 원하게 될 겁니다. 갓 만든 서버 IP에서 보낸 메일은 스팸함으로 가기 쉽고, 릴레이에는 아직 내게 없는 평판이 있습니다.
미디어: 디스크 먹는 괴물
서버가 보는 계정들의 이미지와 동영상은 전부 로컬에 캐시됩니다. 활발한 인스턴스라면 일주일에 몇 GB씩입니다. 오래된 원격 미디어를 정기적으로 정리하세요.
docker compose exec web tootctl media remove --days 7
docker compose exec web tootctl preview_cards remove --days 30
이걸 매일 도는 cron 작업에 넣으세요. 인스턴스가 커지면 .env.production의 S3_* 설정으로 미디어를 S3 호환 오브젝트 스토리지에 옮기세요. 그러면 VPS 디스크에는 데이터베이스만 남습니다.
운영
- 업데이트: 새 태그를 받고,
docker compose pull, 릴리스 노트대로 마이그레이션을 돌린 뒤 재시작합니다. 메이저 버전은 건너뛰지 마세요. - 백업: PostgreSQL을 덤프하고
.env.production을 안전하게 보관하세요. 그 안의 비밀 값이 없으면 복원이 되지 않습니다. restic 가이드에서 외부 사본을, Managed Backups로 서버 전체의 일일 복원 지점을 추가할 수 있습니다. - 도메인은 영구적입니다. 페디버스 전체에서 모든 계정 주소에 새겨집니다. 첫 계정을 만들기 전에 정하세요.
팀 채팅용으로 더 가벼운 게 필요하다면 Matrix 서버가 더 잘 맞을 수 있습니다.
댓글
아직 댓글이 없습니다. 첫 번째가 되세요.