결론부터 말하자면 실패
개요
Q. 무엇을 시도했나요?
- Mastodon 올리기, glitch-soc 에디션, docker-compose 사용
- 프리빌트된 이미지가 없어서 직접 빌드해야 함
- 목표: github .git 주소로 바로 빌드하기, 재현성을 위해 커밋 해시 사용
- AWS S3 대신에 이미지 저장소로 (오브젝트 스토리지) 암호화폐를 이용한 분산 저장소 서비스 storj DCS 사용
Q. 무엇에 성공했나요?
- Mastodon 올리기 (위 목표 모두 포함)
- storj DCS (구 tardigrade) 에 S3 호환 API 연동해서 미디어 올리기, 퍼블릭에 노출
Q. 무엇에 실패했나요?
- glitch-soc 의 docker-compose 에 있는 elasticsearch 활성화
- storj DCS 에서 퍼블릭으로 노출한 오브젝트에 https 걸기
=> 성공했는데 업로드에 2~3회 실패해서 사실상 사용 불가능한 수준
어차피 storj DCS 의 업로드 속도는 체감상 2~5배 정도 느린 거 같으니 실제로 이걸로 서비스를 생각한다면 캐시서버를 구성하는 게 좋을듯
한 짓거리들
storj DCS 설정
많은 부분 생략하고 이미 웹에서 버킷까지 만들었다고 가정함
S3 호환 액세스
이건 웹에서 해도 됨
버킷을 만든 뒤 Access Grant 란에서 계속 진행하다보면 끝에 S3 API 만들기 있으니 그거 그대로 따라하시면 됩니다
Uplink CLI
웹에서 퍼블릭 엑세스 추가는 불가능하므로 uplink CLI 받아서 설정
다음 두 과정을 거치면 됨
- Create an Access Grant (전 이미 웹에서 키를 만들었던지라 accessgrant.txt 로 저장해서 CLI에서 로드함)
- Set Up Uplink CLI with Access Grant
퍼블릭 노출 - 커스텀 URL 설정
github.com/storj/linksharing#custom-url-configuration-and-static-site-hosting-with-uplink
저는 uplink 바이너리를 /usr/bin 으로 옮기지 않았어서 로컬 경로입니다.
좀 해보고 --base-url 등의 옵션을 더 추가했는데 출력 결과물 보면 결국 미국 게이트웨이를 쓰는 모양...
./uplink share --dns 도메인_빼고_앞부분_가령_www라던가_mastodon이라던가 sj://버킷이름_버킷_전체다_공개할거니까 --base-url https://link.ap1.storjshare.io --disallow-lists
CNAME 레코드 추가
시키는대로 추가합시다. 저는 cloudflare 에서 적당히 했습니다.
문제는 SSL 적용이 안 된다는 거고 마스토돈은 이미지 링크를 https://로 뿜어낸다는 겁니다. 여기서 막힘.
수정: cloudflare 로 프록싱 설정을 해놓으면 어째서인지 서브도메인에 "." 이 들어가면 안 됩니다. 예전에 다른 서버 굴릴때도 같은 증상으로 쓸데없이 고생했었는데;
glitch-soc 버전 마스토돈 올리기
공식에서 docker-compose 가져와서 수정
(확인해봤는데 현 시점에선 오피셜이랑 글리치랑 아마도 같음)
이미지가 없으니 빌드해야 되어서 build 부분을 교체. 첫 번째거만 로컬 경로에서 git URL 로 바꿨고 나머지는 stackoverflow 에서 재빌드 안 하려면 지우고 이미지 이름 맞추면 된다고 해서 그렇게 함
github.com/glitch-soc/mastodon/blob/main/docker-compose.yml
version: '3'
services:
db:
restart: always
image: postgres:12-alpine # 이것도 바꿈
shm_size: 256mb
networks:
- internal_network
healthcheck:
test: ["CMD", "pg_isready", "-U", "postgres"]
volumes:
- ./postgres:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=암호넣으십쇼
- POSTGRES_USER=postgres # 원래 커스텀으로 바꿨는데 자꾸 오류 로그가 출력돼서 그냥 postgres 로 돌림
redis:
restart: always
image: redis:6.2-alpine
networks:
- internal_network
healthcheck:
test: ["CMD", "redis-cli", "ping"]
volumes:
- ./redis:/data
# es:
# restart: always
# image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.8.10
# environment:
# - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
# - "cluster.name=es-mastodon"
# - "discovery.type=single-node"
# - "bootstrap.memory_lock=true"
# networks:
# - internal_network
# healthcheck:
# test: ["CMD-SHELL", "curl --silent --fail localhost:9200/_cluster/health || exit 1"]
# volumes:
# - ./elasticsearch:/usr/share/elasticsearch/data
# ulimits:
# memlock:
# soft: -1
# hard: -1
web:
# 커밋 해시 보이죠?
build: https://github.com/glitch-soc/mastodon.git#a346912030012dc1451249373ff7ef1a61016517
image: glitch-soc/mastodon
restart: always
env_file: .env.production
command: bash -c "rm -f /mastodon/tmp/pids/server.pid; bundle exec rails s -p 3000"
networks:
- external_network
- internal_network
healthcheck:
test: ["CMD-SHELL", "wget -q --spider --proxy=off localhost:3000/health || exit 1"]
ports:
- "127.0.0.1:8901:3000" # 첫 번째 포트 바꾸십쇼 (물론 필요하다면)
depends_on:
- db
- redis
# - es
volumes:
- ./public/system:/mastodon/public/system
streaming:
image: glitch-soc/mastodon
restart: always
env_file: .env.production
command: node ./streaming
networks:
- external_network
- internal_network
healthcheck:
test: ["CMD-SHELL", "wget -q --spider --proxy=off localhost:4000/api/v1/streaming/health || exit 1"]
ports:
- "127.0.0.1:8902:4000" # 두 번째 포트 바꾸십쇼
depends_on:
- db
- redis
sidekiq:
image: glitch-soc/mastodon
restart: always
env_file: .env.production
command: bundle exec sidekiq
depends_on:
- db
- redis
networks:
- external_network
- internal_network
volumes:
- ./public/system:/mastodon/public/system
# 양파망 안 쓸거임
## Uncomment to enable federation with tor instances along with adding the following ENV variables
## http_proxy=http://privoxy:8118
## ALLOW_ACCESS_TO_HIDDEN_SERVICE=true
# tor:
# image: sirboops/tor
# networks:
# - external_network
# - internal_network
#
# privoxy:
# image: sirboops/privoxy
# volumes:
# - ./priv-config:/opt/config
# networks:
# - external_network
# - internal_network
networks:
external_network:
internal_network:
internal: true
설정 실행
gist.github.com/TrillCyborg/84939cd4013ace9960031b803a0590c4
docker-compose run --rm web bundle exec rake mastodon:setup
CLI 설정을 거칠텐데 이 때 (클라우드에 미디어를 저장한다면 = 이 글의 목적) minio 를 선택합니다
(minio 는 AWS "호환" 일텐데 AWS 랑 minio 옵션이 둘 다 있어서 minio 고름)
docker 로 실행하는 경우 설정은 출력만 되므로 같은 경로의 .env.production 파일에 저장해야 함
실행 & 확인
# 잘 돌아가는지 체크하려면
docker-compose up
# 실제 서비스
docker-compose up -d