シンプルなブックマーク管理「Shiori(栞)」

シンプルなブックマーク管理が無いか探していたところ、Shioriが気になったので試してみました。

Docker環境でセルフホスト

ひとまずテスト目的でさくっと入れてみました。

nano shiori.sh
chmod +x shiori.sh
./shiori.sh start
#!/bin/bash
# =============================================================
#  Shiori(栞)セルフホスト セットアップ・管理スクリプト
# =============================================================

set -euo pipefail

COMPOSE_FILE="$(dirname "$0")/docker-compose.yml"
CONTAINER="shiori"

# ─────────────────────────────────────────
# 色付き出力
# ─────────────────────────────────────────
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'
CYAN='\033[0;36m'; RESET='\033[0m'

info()    { echo -e "${CYAN}[INFO]${RESET}  $*"; }
success() { echo -e "${GREEN}[OK]${RESET}    $*"; }
warn()    { echo -e "${YELLOW}[WARN]${RESET}  $*"; }
error()   { echo -e "${RED}[ERROR]${RESET} $*" >&2; }

# ─────────────────────────────────────────
# 前提チェック
# ─────────────────────────────────────────
check_deps() {
    for cmd in docker; do
        if ! command -v "$cmd" &>/dev/null; then
            error "$cmd が見つかりません。Dockerをインストールしてください。"
            exit 1
        fi
    done
    if ! docker compose version &>/dev/null 2>&1; then
        error "Docker Compose (v2) が必要です。"
        exit 1
    fi
}

# ─────────────────────────────────────────
# 起動
# ─────────────────────────────────────────
cmd_start() {
    info "Shiori を起動します..."
    mkdir -p data
    docker compose -f "$COMPOSE_FILE" up -d
    success "起動完了!ブラウザで http://localhost:8080 を開いてください。"
    echo ""
    warn "初期ログイン情報:"
    echo "  ユーザー名: shiori"
    echo "  パスワード: gopher"
    warn "⚠️  ログイン後すぐにパスワードを変更してください!"
}

# ─────────────────────────────────────────
# 停止
# ─────────────────────────────────────────
cmd_stop() {
    info "Shiori を停止します..."
    docker compose -f "$COMPOSE_FILE" down
    success "停止しました。"
}

# ─────────────────────────────────────────
# 再起動
# ─────────────────────────────────────────
cmd_restart() {
    info "Shiori を再起動します..."
    docker compose -f "$COMPOSE_FILE" restart
    success "再起動しました。"
}

# ─────────────────────────────────────────
# ログ表示
# ─────────────────────────────────────────
cmd_logs() {
    docker compose -f "$COMPOSE_FILE" logs -f --tail=50 "$CONTAINER"
}

# ─────────────────────────────────────────
# ステータス確認
# ─────────────────────────────────────────
cmd_status() {
    docker compose -f "$COMPOSE_FILE" ps
}

# ─────────────────────────────────────────
# アップデート(最新イメージを取得して再起動)
# ─────────────────────────────────────────
cmd_update() {
    info "最新イメージを取得します..."
    docker compose -f "$COMPOSE_FILE" pull
    docker compose -f "$COMPOSE_FILE" up -d
    success "アップデート完了!"
}

# ─────────────────────────────────────────
# バックアップ(dataディレクトリを tar.gz に圧縮)
# ─────────────────────────────────────────
cmd_backup() {
    BACKUP_DIR="./backups"
    TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
    BACKUP_FILE="${BACKUP_DIR}/shiori_backup_${TIMESTAMP}.tar.gz"
    mkdir -p "$BACKUP_DIR"
    info "バックアップを作成します: $BACKUP_FILE"
    tar -czf "$BACKUP_FILE" -C "$(dirname "$0")" data
    success "バックアップ完了: $BACKUP_FILE"
}

# ─────────────────────────────────────────
# ブックマーク追加(CLIから)
# ─────────────────────────────────────────
cmd_add() {
    if [[ -z "${1:-}" ]]; then
        error "使い方: $0 add <URL> [--title タイトル] [--tags タグ1,タグ2]"
        exit 1
    fi
    docker exec "$CONTAINER" shiori add "$@"
}

# ─────────────────────────────────────────
# ブックマーク検索
# ─────────────────────────────────────────
cmd_search() {
    if [[ -z "${1:-}" ]]; then
        error "使い方: $0 search <キーワード>"
        exit 1
    fi
    docker exec "$CONTAINER" shiori search "$@"
}

# ─────────────────────────────────────────
# ブックマーク一覧
# ─────────────────────────────────────────
cmd_list() {
    docker exec "$CONTAINER" shiori print "${@:-}"
}

# ─────────────────────────────────────────
# インポート(ブラウザのHTMLブックマーク / Pocket)
# ─────────────────────────────────────────
cmd_import() {
    if [[ -z "${1:-}" ]]; then
        error "使い方: $0 import <bookmarks.html>"
        exit 1
    fi
    local file="$1"
    local filename
    filename=$(basename "$file")

    info "ファイルをコンテナにコピーします..."
    docker cp "$file" "${CONTAINER}:/tmp/${filename}"
    docker exec "$CONTAINER" shiori import "/tmp/${filename}"
    success "インポート完了!"
}

# ─────────────────────────────────────────
# エクスポート
# ─────────────────────────────────────────
cmd_export() {
    local out_file="./shiori_export_$(date +%Y%m%d).html"
    docker exec "$CONTAINER" shiori export /tmp/shiori_export.html
    docker cp "${CONTAINER}:/tmp/shiori_export.html" "$out_file"
    success "エクスポート完了: $out_file"
}

# ─────────────────────────────────────────
# DBマイグレーション(バージョンアップ後に必要な場合あり)
# ─────────────────────────────────────────
cmd_migrate() {
    info "DBマイグレーションを実行します..."
    docker exec "$CONTAINER" shiori migrate
    success "マイグレーション完了!"
}

# ─────────────────────────────────────────
# ヘルプ
# ─────────────────────────────────────────
cmd_help() {
    echo ""
    echo -e "${CYAN}Shiori 管理スクリプト${RESET}"
    echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
    echo "  起動・管理:"
    echo "    start        コンテナを起動"
    echo "    stop         コンテナを停止"
    echo "    restart      コンテナを再起動"
    echo "    status       稼働状況を確認"
    echo "    logs         ログをリアルタイム表示"
    echo "    update       最新イメージに更新"
    echo ""
    echo "  データ管理:"
    echo "    backup       データをバックアップ"
    echo "    import <file>  ブックマーク(HTML/Pocket)をインポート"
    echo "    export         ブックマークをエクスポート"
    echo "    migrate      DBマイグレーション(アップデート後)"
    echo ""
    echo "  ブックマーク操作(CLI):"
    echo "    add <URL> [--title タイトル] [--tags タグ]"
    echo "    search <キーワード>"
    echo "    list"
    echo ""
    echo "  ブラウザアクセス: http://localhost:8080"
    echo "  初期ログイン: shiori / gopher"
    echo ""
}

# ─────────────────────────────────────────
# エントリポイント
# ─────────────────────────────────────────
check_deps

case "${1:-help}" in
    start)   cmd_start ;;
    stop)    cmd_stop ;;
    restart) cmd_restart ;;
    status)  cmd_status ;;
    logs)    cmd_logs ;;
    update)  cmd_update ;;
    backup)  cmd_backup ;;
    add)     shift; cmd_add "$@" ;;
    search)  shift; cmd_search "$@" ;;
    list)    shift; cmd_list "$@" ;;
    import)  shift; cmd_import "$@" ;;
    export)  cmd_export ;;
    migrate) cmd_migrate ;;
    help|--help|-h) cmd_help ;;
    *)
        error "不明なコマンド: ${1}"
        cmd_help
        exit 1
        ;;
esac

ブラウザで http://localhost:8080 を開き、初期ログイン情報でサインインします。ログイン後にパスワードを変更しましょう。

  • ユーザー名: shiori
  • パスワード: gopher

Linkwardenのかなり軽量版といった形ですね。

拡張機能を入れると、連携して使えるようです。

管理コマンド一覧

コマンド説明
./shiori.sh start起動
./shiori.sh stop停止
./shiori.sh update最新版に更新
./shiori.sh backupデータをバックアップ
./shiori.sh add <URL>CLIでブックマーク追加
./shiori.sh import bookmarks.htmlブラウザのブックマークをインポート
./shiori.sh logsログ確認

PostgreSQL を使いたい場合

docker-compose.yml 内のコメントアウトされた shiori_db セクションと関連環境変数を有効にしてください。SQLite のままなら追加設定は不要です。

services:
  shiori:
    image: ghcr.io/go-shiori/shiori:latest
    container_name: shiori
    restart: unless-stopped
    ports:
      - "8080:8080"
    volumes:
      - ./data:/srv/shiori
    environment:
      - SHIORI_DIR=/srv/shiori
      # PostgreSQLを使う場合はコメントを外して設定してください
      # - SHIORI_DBMS=postgresql
      # - SHIORI_PG_USER=shiori
      # - SHIORI_PG_PASS=change_this_password
      # - SHIORI_PG_NAME=shiori
      # - SHIORI_PG_HOST=shiori_db
      # - SHIORI_PG_PORT=5432
    # PostgreSQL使用時はこちらのコメントを外してください
    # depends_on:
    #   shiori_db:
    #     condition: service_healthy

  # --- PostgreSQL (オプション) ---
  # SQLiteで十分な場合は不要です
  # shiori_db:
  #   image: postgres:16-alpine
  #   container_name: shiori_db
  #   restart: unless-stopped
  #   environment:
  #     - POSTGRES_DB=shiori
  #     - POSTGRES_USER=shiori
  #     - POSTGRES_PASSWORD=change_this_password
  #   volumes:
  #     - ./db_data:/var/lib/postgresql/data
  #   healthcheck:
  #     test: ["CMD-SHELL", "pg_isready -U shiori"]
  #     interval: 10s
  #     timeout: 5s
  #     retries: 5
Release v1.8.0.1 ?? go-shiori/shiori-web-ext
What's Changedbuild(deps): bump actions/download-artifact from 4 to 5 by @dependabot in #84build(deps): bump actions/che…
タイトルとURLをコピーしました