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 확장
- 브라우저 확장 스토어에서 “Shiori” 검색 또는:
- Firefox: https://addons.mozilla.org/firefox/addon/shiori-ext/
- Chrome: 수동 설치 필요
- 확장 설정:
- Server:
http://your-server:8080 - Username: 사용자명
- Password: 비밀번호
- Server:
- 저장 후 웹 페이지에서 확장 아이콘 클릭하여 북마크 추가
환경 변수
| 변수 | 설명 | 기본값 |
|---|---|---|
| SHIORI_DIR | 데이터 저장 경로 | /srv/shiori |
| SHIORI_HTTP_SECRET_KEY | 세션 암호화 키 (64자) | – |
| SHIORI_HTTP_PORT | 웹 서버 포트 | 8080 |
| SHIORI_DATABASE_URL | DB 연결 문자열 | 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