以前、ブックマーク管理やあとで読む系として「Karakeep」を紹介しましたが、 似たようなものとして「Linkwarden」があり、使いやすそうだったので導入してみました。
シンプルで分かりやすくて良いですね。 さらに、似たようなサービスとして「Readeck」があり、こちらは試していませんが、 Linkwardenはブックマーク管理、Readeckはあとで読むと使い分けている人もいるようですね。
Docker-composeでインストール
ポートは3300に変更しています。
#!/bin/bash
set -e
# ─────────────────────────────────────────
# Linkwarden セルフホスト セットアップスクリプト
# ─────────────────────────────────────────
INSTALL_DIR="/opt/docker/linkwarden"
echo "📁 インストールディレクトリを作成: $INSTALL_DIR"
sudo mkdir -p "$INSTALL_DIR"
cd "$INSTALL_DIR"
# ── シークレットキー自動生成 ──────────────────
NEXTAUTH_SECRET=$(openssl rand -base64 36)
POSTGRES_PASSWORD=$(openssl rand -base64 24 | tr -dc 'a-zA-Z0-9' | head -c 32)
echo "🔑 シークレットキーを自動生成しました"
# ── .env 生成 ────────────────────────────────
sudo tee .env > /dev/null <<EOF
# ── PostgreSQL ──────────────────────────────
POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
# ── Linkwarden ──────────────────────────────
NEXTAUTH_SECRET=${NEXTAUTH_SECRET}
NEXTAUTH_URL=http://localhost:3300
# ── (オプション) メール認証を使う場合は以下を設定 ──
# EMAIL_FROM=no-reply@example.com
# EMAIL_SERVER=smtp://user:pass@smtp.example.com:587
EOF
echo "✅ .env を生成しました"
# ── docker-compose.yml 生成 ──────────────────
sudo tee docker-compose.yml > /dev/null <<'COMPOSE'
services:
postgres:
image: postgres:16-alpine
container_name: linkwarden-db
restart: unless-stopped
env_file: .env
environment:
POSTGRES_DB: linkwarden
POSTGRES_USER: linkwarden
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U linkwarden -d linkwarden"]
interval: 10s
timeout: 5s
retries: 5
linkwarden:
image: ghcr.io/linkwarden/linkwarden:latest
container_name: linkwarden-app
restart: unless-stopped
env_file: .env
environment:
DATABASE_URL: postgresql://linkwarden:${POSTGRES_PASSWORD}@postgres:5432/linkwarden
NEXTAUTH_URL: ${NEXTAUTH_URL}
NEXTAUTH_SECRET: ${NEXTAUTH_SECRET}
ports:
- "3300:3000"
volumes:
- linkwarden_data:/data/data
depends_on:
postgres:
condition: service_healthy
volumes:
postgres_data:
linkwarden_data:
COMPOSE
echo "✅ docker-compose.yml を生成しました"
# ── パーミッション設定 ────────────────────────
sudo chmod 600 .env
# ── 起動 ─────────────────────────────────────
echo ""
echo "🚀 Linkwarden を起動します..."
sudo docker compose pull
sudo docker compose up -d
echo ""
echo "════════════════════════════════════════"
echo " ✅ Linkwarden の起動が完了しました!"
echo "════════════════════════════════════════"
echo ""
echo " 🌐 アクセスURL : http://localhost:3300"
echo " 📂 インストール先: $INSTALL_DIR"
echo ""
echo " 🔑 生成された認証情報 (.env に保存済み)"
echo " POSTGRES_PASSWORD : ${POSTGRES_PASSWORD}"
echo " NEXTAUTH_SECRET : ${NEXTAUTH_SECRET}"
echo ""
echo " 📋 よく使うコマンド"
echo " ログ確認 : sudo docker compose -f $INSTALL_DIR/docker-compose.yml logs -f"
echo " 停止 : sudo docker compose -f $INSTALL_DIR/docker-compose.yml down"
echo " 更新 : sudo docker compose -f $INSTALL_DIR/docker-compose.yml pull && sudo docker compose up -d"
echo ""
スクリプトがやること
| ステップ | 内容 |
|---|---|
| ① ディレクトリ作成 | /opt/docker/linkwarden を作成 |
| ② シークレット自動生成 | openssl で NEXTAUTH_SECRET と POSTGRES_PASSWORD をランダム生成 |
③ .env 生成 | 生成した値を自動で書き込み |
④ docker-compose.yml 生成 | PostgreSQL + Linkwarden の2コンテナ構成 |
| ⑤ 起動 | docker compose up -d で即起動 |
構成のポイント
- PostgreSQL 16 Alpine — 軽量で安定したDBイメージ
- ヘルスチェック付き — DBが準備完了してからアプリが起動
- データ永続化 —
postgres_data/linkwarden_dataの named volume で再起動後もデータ保持 .envはchmod 600でセキュアに保護
起動後は http://localhost:3300 でアクセスでき、初回は新規ユーザー登録画面が表示されます。

アップデート方法
cd /opt/docker/linkwarden
# 最新イメージを取得
sudo docker compose pull
# コンテナを再作成して起動
sudo docker compose up -d

