Shiori Docker 설치 가이드: 심플 북마크 관리자 자체 호스팅




Shiori는 Go 언어로 작성된 심플하고 가벼운 북마크 관리자입니다. Pocket의 셀프호스팅 대안으로, 단일 바이너리로 실행되어 설치와 관리가 매우 쉽습니다. 웹 UI와 CLI 모두 지원하며, 북마크한 페이지의 오프라인 아카이브를 자동 생성합니다. 원본 페이지가 사라져도 저장된 콘텐츠는 영구 보존됩니다. GitHub Stars 9K+로 활발히 개발 중입니다.

Shiori 주요 특징

Shiori는 미니멀하면서도 필수 기능을 갖춘 북마크 관리자입니다.

핵심 기능

  • 북마크 관리: 추가, 편집, 삭제, 검색
  • 오프라인 아카이브: 페이지 콘텐츠 자동 저장
  • 태그: 태그로 북마크 분류
  • 가져오기/내보내기: Netscape Bookmark 파일 지원
  • Pocket 가져오기: 기존 Pocket 데이터 마이그레이션
  • 리더 뷰: 광고 제거된 깔끔한 읽기 모드

기술적 장점

  • 단일 바이너리 (의존성 없음)
  • Go 언어 기반 (빠르고 가벼움)
  • SQLite, PostgreSQL, MySQL 지원
  • CLI 및 웹 인터페이스
  • 브라우저 확장 (Firefox, Chrome)
  • 매우 낮은 리소스 사용량 (~18MB RAM)

사전 요구 사항

  • Docker 및 Docker Compose 설치
  • 최소 128MB RAM
  • 1GB 이상 저장 공간

Docker Compose로 Shiori 설치

기본 설치 (SQLite)

# docker-compose.yml
services:
  shiori:
    image: ghcr.io/go-shiori/shiori:latest
    container_name: shiori
    restart: unless-stopped
    ports:
      - "8080:8080"
    environment:
      - SHIORI_DIR=/srv/shiori
      - SHIORI_HTTP_SECRET_KEY=${SECRET_KEY}
    volumes:
      - ./data:/srv/shiori

환경 변수 파일

# .env
# 64자 랜덤 시크릿 키 생성: openssl rand -hex 32
SECRET_KEY=your_64_character_random_secret_key_here

설치 및 실행

# 디렉토리 생성
mkdir shiori && cd shiori
mkdir -p data

# 권한 설정 (선택)
# chown -R 1000:1000 data

# docker-compose.yml 및 .env 생성

# 컨테이너 실행
docker compose up -d

# 로그 확인
docker compose logs -f shiori

# 브라우저에서 접속
# http://localhost:8080
# 기본 로그인: shiori / gopher

초기 설정

1. 기본 비밀번호 변경

# CLI로 비밀번호 변경
docker exec -it shiori shiori account update shiori --password new_password

# 또는 웹 UI에서 변경
# Settings → Account → Change Password

2. 새 사용자 생성

# 새 계정 생성
docker exec -it shiori shiori account add username --password your_password

# 관리자 권한으로 생성
docker exec -it shiori shiori account add username --password your_password --owner

3. 데이터베이스 마이그레이션 (최초 실행 시)

Shiori 1.5.3 이상에서는 첫 실행 후 마이그레이션이 필요할 수 있습니다:

docker exec -it shiori shiori server migrate

고급 설정

PostgreSQL 사용

# docker-compose.yml
services:
  shiori:
    image: ghcr.io/go-shiori/shiori:latest
    container_name: shiori
    restart: unless-stopped
    depends_on:
      - db
    ports:
      - "8080:8080"
    environment:
      - SHIORI_DIR=/srv/shiori
      - SHIORI_HTTP_SECRET_KEY=${SECRET_KEY}
      - SHIORI_DATABASE_URL=postgres://shiori:${DB_PASSWORD}@db:5432/shiori?sslmode=disable
    volumes:
      - shiori-data:/srv/shiori

  db:
    image: postgres:16-alpine
    container_name: shiori-db
    restart: unless-stopped
    environment:
      - POSTGRES_DB=shiori
      - POSTGRES_USER=shiori
      - POSTGRES_PASSWORD=${DB_PASSWORD}
    volumes:
      - shiori-db:/var/lib/postgresql/data

volumes:
  shiori-data:
  shiori-db:

Traefik 연동

# docker-compose.yml
services:
  shiori:
    image: ghcr.io/go-shiori/shiori:latest
    container_name: shiori
    restart: unless-stopped
    expose:
      - "8080"
    environment:
      - SHIORI_DIR=/srv/shiori
      - SHIORI_HTTP_SECRET_KEY=${SECRET_KEY}
    volumes:
      - ./data:/srv/shiori
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.shiori.rule=Host(`bookmarks.yourdomain.com`)"
      - "traefik.http.routers.shiori.entrypoints=websecure"
      - "traefik.http.routers.shiori.tls.certresolver=letsencrypt"
      - "traefik.http.services.shiori.loadbalancer.server.port=8080"
    networks:
      - traefik-public

networks:
  traefik-public:
    external: true

Nginx 리버스 프록시

server {
    listen 443 ssl http2;
    server_name bookmarks.yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/bookmarks.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/bookmarks.yourdomain.com/privkey.pem;

    location / {
        proxy_pass http://localhost:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

CLI 사용법

Shiori의 강점 중 하나는 강력한 CLI입니다.

# 북마크 추가
docker exec shiori shiori bookmark add https://example.com --title "Example Site" --tags tech,reference

# 북마크 검색
docker exec shiori shiori bookmark search "docker tutorial"

# 북마크 목록
docker exec shiori shiori bookmark list

# 북마크 업데이트
docker exec shiori shiori bookmark update 1 --title "New Title"

# 북마크 삭제
docker exec shiori shiori bookmark delete 1

# 북마크 내보내기
docker exec shiori shiori bookmark export > bookmarks.html

# 북마크 가져오기
docker exec -i shiori shiori bookmark import < bookmarks.html

# Pocket에서 가져오기
docker exec shiori shiori pocket import

브라우저 확장 설정

Firefox / Chrome 확장

  1. 브라우저 확장 스토어에서 “Shiori” 검색 또는:
    • Firefox: https://addons.mozilla.org/firefox/addon/shiori-ext/
    • Chrome: 수동 설치 필요
  2. 확장 설정:
    • Server: http://your-server:8080
    • Username: 사용자명
    • Password: 비밀번호
  3. 저장 후 웹 페이지에서 확장 아이콘 클릭하여 북마크 추가

환경 변수

변수설명기본값
SHIORI_DIR데이터 저장 경로/srv/shiori
SHIORI_HTTP_SECRET_KEY세션 암호화 키 (64자)
SHIORI_HTTP_PORT웹 서버 포트8080
SHIORI_DATABASE_URLDB 연결 문자열SQLite
SHIORI_HTTP_ROOT_PATH서브 경로 설정/

관리 명령어

# 로그 확인
docker compose logs -f shiori

# 데이터베이스 백업 (SQLite)
cp ./data/shiori.db ./backup/shiori_$(date +%Y%m%d).db

# PostgreSQL 백업
docker compose exec db pg_dump -U shiori shiori > backup_$(date +%Y%m%d).sql

# 컨테이너 재시작
docker compose restart shiori

# 업데이트
docker compose pull
docker compose up -d

# 계정 목록 확인
docker exec shiori shiori account list

데이터 구조

data/
├── shiori.db       # SQLite 데이터베이스
├── archive/        # 오프라인 아카이브 (HTML)
└── thumb/          # 썸네일 이미지

Pocket에서 마이그레이션

# 1. Pocket Access Token 발급
# https://getpocket.com/developer/apps/ 에서 앱 생성

# 2. Shiori로 가져오기
docker exec -it shiori shiori pocket import

# Consumer Key와 Access Token 입력 프롬프트 따라 진행

문제 해결

“no such table: account” 오류

최초 실행 후 마이그레이션 필요:

docker exec shiori shiori server migrate

권한 오류

# 데이터 폴더 권한 확인
sudo chown -R 1000:1000 ./data

아카이브가 생성되지 않는 경우

일부 웹사이트는 JavaScript 렌더링이 필요하여 아카이브가 제한될 수 있습니다.

마무리

Shiori는 가볍고 빠른 북마크 관리자로, 복잡한 설정 없이 바로 사용할 수 있습니다. Go 기반 단일 바이너리로 리소스 사용량이 극히 적어 Raspberry Pi에서도 원활하게 실행됩니다. 오프라인 아카이브 기능으로 링크 로트(link rot)에서 중요한 콘텐츠를 보호하고, CLI를 통해 자동화도 쉽게 구현할 수 있습니다.


참고 링크

  • GitHub: https://github.com/go-shiori/shiori
  • Docker Hub: https://hub.docker.com/r/ghcr.io/go-shiori/shiori
  • 위키: https://github.com/go-shiori/shiori/wiki
  • 브라우저 확장: https://github.com/nicholasgasior/shiori-firefox-extension



댓글 남기기