본문 바로가기

자료

시도: storj DCS + glitch-soc (docker)

결론부터 말하자면 실패

개요

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 받아서 설정

docs.storj.io/getting-started/quickstart-uplink-cli/uploading-your-first-object/create-first-access-grant

다음 두 과정을 거치면 됨

  • 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