シンプルなブックマーク管理が無いか探していたところ、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

