[Mastodon] Docker로 마스토돈 자체 서버 열기 -삽질편-

4 minute read

이 글은 본격적인 가이드를 작성하기에 앞서 마스토돈 서버를 설치하며 겪은 상황들을 기록하기 위해 작성되었습니다.

뭔가 프로젝트를 하고 싶은데 흥미가 생기는 게 별로 없어서… 고민하다가

마스토돈 자체 서버를 열 일이 생겼다. 친구 부탁으로…

이전부터 마스토돈 봇을 커스텀 해봐야지~ 하고 생각만 하다가 딱히 동기가 없어서 실행하지 못하고 있었는데, 이참에 봇도 같이 만들어야겠다 싶었다.

마스토돈 자체 서버는 이전에도 GCP를 활용해서 열어본 적 있었다.

위 링크에 있는 마스토돈 공식 문서가 상냥한 편이라 도메인 주소랑 이메일 전송 서비스만 있다면 쉽게 열 수 있다.

(직접 smtp 서버를 구현한다면, 외부 서비스를 이용하지 않아도 되지만… 개인이 GCP로 정상적인 메일을 발송하는 서버를 구현하기 매우 어렵다. 이에 관해서는 나중에 따로 글을 작성할 예정이다.)

근데, 이것저것 찾다 보니까… 마스토돈 서버도 docker image가 있다는 걸 알게 됐다.

위 링크에 있는 linuxserver/mastodon 이미지를 사용하였다.

서버를 열고 나서 게시물을 작성하면서 다른 이미지도 여러 종류 있다는 걸 알게 되었는데… 무슨 차이인지는 잘 모르겠다.

docker로 서버를 설치해야겠다고 생각한 건, docker랑 좀 더 친해지고 싶기도 하고… 유지보수에 좋을 것 같기도 하고, 간단할 것 같아서… 였는데.

다른 건 몰라도 간단한 건 아니었다.

첫째로, docker-compose.yml 파일을 직접 설정해야 했다.

위 docker image 공식 문서에 있는 내용만으로는 부족하다.

저 내용이 틀린 건 아닌데, postgres 및 redis에 대한 내용을 추가로 작성해줘야 한다.

직접 여기저기 찾아보면서 기워서 만든 문서를 사용해야 했다…

둘째로, mastodon 컨테이너 하나만으로 실행할 수 없다.

This container requires separate postgres and redis instances to run.

Running separate sidekiq instances

It is currently only supported to run a single queue per container instance or all queues in a single container instance.

All containers must share the same /config mount and be on a common docker network.

위 docker image 문서에 위와 같이 적혀있는데, 말하자면…

mastodon 이미지, postgres 이미지, redis 이미지를 다운받아서 각각의 컨테이너로 실행하고,

그 컨테이너가 같은 /config 디렉터리에 마운트되어야 하고, docker 네트워크로 연결되어 있어야 한다.

처음에 이 부분을 대충 보고 지나쳤다가, 수많은 오류를 맞이했었다…

(물론 이 모든 건 docker를 거의 사용해보지 않은 초보자의 입장이다.)

혹시나 마스토돈 서버를 직접 열어보고 싶은 사람이 이 글을 본다면…

나처럼 괜히 삽질할 필요 없고 마스토돈 서버 자동 설치기를 이용하면 된다고 알려주고 싶다.

https://github.com/Honeytree-Technologies/Mastodon-Auto-Installer

도메인 주소와 메일 전송 서비스만 있다면 한 번에 열 수 있도록 자동 설치기를 구현하신 것 같다.

직접 사용해본 건 아니지만, 이것도 나중에 사용해보고 가이드를 작성해볼까 싶다.

나도 이 자동 설치기를 초반에 발견했지만, 괜한 오기가 생겨서 사용하지 않았다…

GCP VM 인스턴스를 생성하면서 컨테이너 배포를 바로 할 수 있다고?!

(이 내용은 실패한 경험을 바탕으로 작성되었습니다. 성공하지 못했습니다.)

GCP로 가상환경을 설정하기 위해서 평소와 같이 인스턴스를 만들고 있었다…

image.png

다른 때에는 별로 필요가 없어서 눈여겨 보지 않았던 부분인데,

인스턴스를 만들면서 컨테이너도 바로 생성하면 완전 좋은 거 아냐?! 하고 냅다 눌렀다.

image.png

별로 어려울 건 없고, docker 이미지 문서에 있는 docker-compose 파일의 내용을 그대로 넣으면 되는 형식이었다.


services:
mastodon:
image: [lscr.io/linuxserver/mastodon:latest](http://lscr.io/linuxserver/mastodon:latest)
container_name: mastodon
environment:
- PUID=1000
- PGID=1000
- TZ=Etc/UTC
- LOCAL_DOMAIN=[example.com](http://example.com/)
- REDIS_HOST=redis
- REDIS_PORT=6379
- DB_HOST=db
- DB_USER=mastodon
- DB_NAME=mastodon
- DB_PASS=mastodon
- DB_PORT=5432
- ES_ENABLED=false
- ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY=
- ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY=
- ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT=
- SECRET_KEY_BASE=
- OTP_SECRET=
- VAPID_PRIVATE_KEY=
- VAPID_PUBLIC_KEY=
- SMTP_SERVER=[mail.example.com](http://mail.example.com/)
- SMTP_PORT=25
- SMTP_LOGIN=
- SMTP_PASSWORD=
- [SMTP_FROM_ADDRESS=notifications@example.com](mailto:SMTP_FROM_ADDRESS=notifications@example.com)
- S3_ENABLED=false
- WEB_DOMAIN=[mastodon.example.com](http://mastodon.example.com/) #optional
- ES_HOST=es #optional
- ES_PORT=9200 #optional
- ES_USER=elastic #optional
- ES_PASS=elastic #optional
- S3_BUCKET= #optional
- AWS_ACCESS_KEY_ID= #optional
- AWS_SECRET_ACCESS_KEY= #optional
- S3_ALIAS_HOST= #optional
- SIDEKIQ_ONLY=false #optional
- SIDEKIQ_QUEUE= #optional
- SIDEKIQ_DEFAULT=false #optional
- SIDEKIQ_THREADS=5 #optional
- DB_POOL=5 #optional
- NO_CHOWN= #optional
volumes:
- /path/to/mastodon/config:/config
ports:
- 80:80
- 443:443
restart: unless-stopped

image 뒤의 항목을 컨테이너 이미지에 넣고,

environment 뒤의 항목을 환경 변수에 넣어주면 된다.

환경 변수의 이름만 써져 있고, 값이 없는 변수들이 몇 개 보이는데… 이건 비워두면 안 된다.

We provide aliases for the common commands that execute in the correct context so that environment variables from secrets are available to them:

To generate keys for SECRET_KEY_BASE & OTP_SECRET run docker run --rm -it --entrypoint /bin/bash lscr.io/linuxserver/mastodon:latest generate-secret once for each.

To generate keys for VAPID_PRIVATE_KEY & VAPID_PUBLIC_KEY run docker run --rm -it --entrypoint /bin/bash lscr.io/linuxserver/mastodon:latest generate-vapid

To generate keys for ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEYACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT, & ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY run docker run --rm -it --entrypoint /bin/bash lscr.io/linuxserver/mastodon:latest generate-active-record

docker image 문서에 위와 같이 작성되어 있다.

말하자면 환경 변수에 넣을 키를 직접 생성해서 입력해줘야 한다는 것이다.

SECRET_KEY_BASE, OTP_SECRET 환경 변수에는

docker run --rm -it --entrypoint /bin/bash lscr.io/linuxserver/mastodon:latest generate-secret

명령을 두 번 실행해서 각각 값에 넣어주면 되고,

VAPID_PRIVATE_KEY, VAPID_PUBLIC_KEY 환경 변수에는

docker run --rm -it --entrypoint /bin/bash lscr.io/linuxserver/mastodon:latest generate-vapid

명령을 한 번 실행해서 각각 값에 넣어준다. (실행하면 구분되어서 나온다.)

ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY, ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT, ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY 환경 변수에는

docker run --rm -it --entrypoint /bin/bash lscr.io/linuxserver/mastodon:latest generate-active-record

명령을 한 번 실행해서 위와 같이 넣어주면 된다. 이것도 각 변수명으로 구분되어서 값이 출력된다.

근데? 나는 이제 막 docker를 설치할 인스턴스를 만드는 중이었고…

이 명령을 실행할 환경 자체가 없었다…

그래서 아무런 값도 넣지 않았다…

그러니까 애초에, docker를 사용할 인스턴스를 생성하면서 컨테이너를 같이 생성한다는 게 안되는 거였다.

게다가 문제는 이것만이 아니었다.

image.png

이때까지만 해도 잘은 몰랐지만… 마운트를 해야 한다길래 일단 해보려고 했다.

볼륨 마운트 추가를 클릭하면 아래와 같은 항목들이 나온다.

image.png

image.png

이미지로 설명하자면 이런 느낌으로 같은 컨테이너와 시스템이 같은 파일을 공유하도록 설정해주는 건데…

마운트는 문제가 없었지만, 볼륨 유형을 디렉터리로 한 게 문제였던 것 같다…

인스턴스를 생성하고 나서, SSH 접속을 하니 아래와 같은 메세지가 뜬 것이다.

*제가 왜 guest OS에 있나요? …*

제가 왜 guest OS에 있나요? …

docker 컨테이너는 실행하는 데 문제가 없었다. (여러가지가 부족해서 오류가 나긴 했지만)

근데, 컨테이너 외부에서 다른 패키지를 전혀 설치할 수 없어서 찾아보니까…

내 인스턴스가 COS(Container-Optimized OS)로 만들어진 것 같았다.

다른 운영체제에서 제공하는 기능을 제공하지 않고, docker 컨테이너만 실행하는 용도로 만들어진 것이다.

COS에 대해서 좀 더 자세히 알고 싶다면 위에 공식 문서를 읽어봐도 좋을 것 같다.

난 이런 게 있다는 걸 이때 처음 알았는데, 지식을 얻어서 기뻐해야 하나…

아무튼 인스턴스 생성부터 잘못해서 첫번째 시도가 실패했다.

사실 이게 제일 충격받은 부분이라 작성하고 나니까 다른 시행착오도 굳이 적어야 하나? 하는 생각이 든다…

다음 게시물은 새로운 마음으로 설치 가이드나 작성해볼까 싶다.

Comments