Obsidian-remoteやKarakeep、AppFlowy導入メモ

必要があれば使うかも…
ナレッジベースのノートアプリとして人気のObsidian(オブシディアン)。Web-UIの開発は行わない?というのを見かけていたので導入を見合わせていたんですけれど、Obsidian-remoteというのを見かけたので一応メモとして。今のところ使う予定はないですが。
あとで読む系のブックマーク関連サービスとしてKarakeepが良いと見かけたのでこちらも。活用できる気がしていないのでこちらも今のところ使う予定はないですが。
さらに、ナレッジベースのノートアプリとしてAppFlowyも。

Obsidian-remote

# ============================================================
# obsidian-remote セットアップスクリプト (Ubuntu)
# フォルダ: /opt/docker/obsidian
# アクセス: http://<サーバーIP>:8080
# ============================================================

set -e

TARGET_DIR="/opt/docker/obsidian"

# ディレクトリ作成
sudo mkdir -p "$TARGET_DIR"/{vaults,config}
cd "$TARGET_DIR"

# docker-compose.yml 生成
sudo tee "$TARGET_DIR/docker-compose.yml" > /dev/null <<'EOF'
services:
  obsidian:
    image: ghcr.io/sytone/obsidian-remote:latest
    container_name: obsidian-remote
    restart: unless-stopped
    ports:
      - "8080:8080"
    volumes:
      - /opt/docker/obsidian/vaults:/vaults
      - /opt/docker/obsidian/config:/config
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Tokyo
    shm_size: "1gb"
EOF

# Docker がなければインストール
if ! command -v docker &>/dev/null; then
  echo ">>> Docker をインストールします..."
  curl -fsSL https://get.docker.com | sudo sh
  sudo usermod -aG docker "$USER"
  echo ">>> Docker インストール完了"
fi

# コンテナ起動
sudo docker compose -f "$TARGET_DIR/docker-compose.yml" pull
sudo docker compose -f "$TARGET_DIR/docker-compose.yml" up -d

echo ""
echo "✅ obsidian-remote が起動しました!"
echo "   ブラウザで → http://$(hostname -I | awk '{print $1}'):8080"
echo ""
echo "📁 Vault の保存先: $TARGET_DIR/vaults"
echo "⚙️  設定の保存先:   $TARGET_DIR/config"
echo ""
echo "停止: sudo docker compose -f $TARGET_DIR/docker-compose.yml down"
echo "ログ: sudo docker compose -f $TARGET_DIR/docker-compose.yml logs -f"

Karakeep

# ============================================================
# Karakeep セットアップスクリプト (Ubuntu)
# フォルダ: /opt/docker/karakeep
# アクセス: http://<サーバーIP>:3000
# ============================================================

bash -c '
set -e

DIR=/opt/docker/karakeep

if ! command -v docker &>/dev/null; then
  echo "[1/4] Docker をインストール中..."
  curl -fsSL https://get.docker.com | sh
  sudo usermod -aG docker $USER
fi

if ! docker compose version &>/dev/null 2>&1; then
  echo "Docker Compose Plugin をインストール中..."
  sudo apt-get update -qq && sudo apt-get install -y docker-compose-plugin
fi

echo "[2/4] ディレクトリを作成: $DIR"
sudo mkdir -p "$DIR"
sudo chown "$USER":"$USER" "$DIR"

echo "[3/4] ランダム文字列を生成中..."
NEXTAUTH_SECRET=$(openssl rand -base64 48 | tr -d "\n/+=" | head -c 64)
MEILI_MASTER_KEY=$(openssl rand -base64 32 | tr -d "\n/+=" | head -c 40)

echo "[4/4] compose.yaml を生成中..."
cat > "$DIR/compose.yaml" <<EOF
services:
  web:
    image: ghcr.io/karakeep-app/karakeep:latest
    restart: unless-stopped
    volumes:
      - ./data:/data
    ports:
      - "3000:3000"
    environment:
      MEILI_ADDR: http://meilisearch:7700
      BROWSER_WEB_URL: http://chrome:9222
      DATA_DIR: /data
      NEXTAUTH_SECRET: ${NEXTAUTH_SECRET}
      NEXTAUTH_URL: http://localhost:3000
      MEILI_MASTER_KEY: ${MEILI_MASTER_KEY}
    depends_on:
      - meilisearch
      - chrome

  chrome:
    image: gcr.io/zenika-hub/alpine-chrome:123
    restart: unless-stopped
    command:
      - --no-sandbox
      - --disable-gpu
      - --remote-debugging-address=0.0.0.0
      - --remote-debugging-port=9222

  meilisearch:
    image: getmeili/meilisearch:v1.6
    restart: unless-stopped
    volumes:
      - ./meili_data:/meili_data
    environment:
      MEILI_MASTER_KEY: ${MEILI_MASTER_KEY}
      MEILI_NO_ANALYTICS: "true"
EOF

cd "$DIR"
docker compose pull
docker compose up -d

echo ""
echo "✓ Karakeep が起動しました!"
echo "  アクセス: http://$(hostname -I | awk "{print \$1}"):3000"
echo "  設定ファイル: $DIR/compose.yaml"
'

AppFlowy

見た目はかなり良いのですが、まだバグも多い?

nano appflowy-setup.sh
chmod +x appflowy-setup.sh
sudo ./appflowy-setup.sh
#!/bin/bash
set -euo pipefail

# ============================================================
#  AppFlowy Cloud — Ubuntu セルフホスト セットアップスクリプト
#  インストール先: /opt/docker/appflowy
# ============================================================

INSTALL_DIR="/opt/docker/appflowy"
REPO_URL="https://github.com/AppFlowy-IO/AppFlowy-Cloud.git"

RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; CYAN='\033[0;36m'; BOLD='\033[1m'; NC='\033[0m'
info()    { echo -e "${CYAN}[INFO]${NC}  $*"; }
success() { echo -e "${GREEN}[OK]${NC}    $*"; }
warn()    { echo -e "${YELLOW}[WARN]${NC}  $*"; }
error()   { echo -e "${RED}[ERROR]${NC} $*"; exit 1; }

# ============================================================
# 0. 権限チェック
# ============================================================
[[ $EUID -ne 0 ]] && error "このスクリプトは root または sudo で実行してください。"

# ============================================================
# 1. ホスト名の入力
# ============================================================
echo ""
echo -e "${BOLD}============================================${NC}"
echo -e "${BOLD}  AppFlowy Cloud セットアップ${NC}"
echo -e "${BOLD}============================================${NC}"
echo ""
echo -e "ブラウザからアクセスする際のホスト名またはIPアドレスを入力してください。"
echo -e "  例: ${CYAN}192.168.1.100${NC}  /  ${CYAN}hostname${NC}  /  ${CYAN}appflowy.example.com${NC}"
echo ""

while true; do
    read -rp "ホスト名 / IPアドレス: " INPUT_HOST
    INPUT_HOST="${INPUT_HOST// /}"  # 空白除去
    if [[ -z "$INPUT_HOST" ]]; then
        warn "入力が空です。もう一度入力してください。"
    else
        break
    fi
done

# http(s):// や末尾スラッシュが含まれていたら除去
INPUT_HOST="${INPUT_HOST#http://}"
INPUT_HOST="${INPUT_HOST#https://}"
INPUT_HOST="${INPUT_HOST%%/*}"

echo ""
echo -e "  ホスト名: ${CYAN}${INPUT_HOST}${NC}"
echo ""
read -rp "これで正しいですか? [Y/n]: " CONFIRM
CONFIRM="${CONFIRM:-Y}"
[[ "$CONFIRM" =~ ^[Nn] ]] && error "中断しました。再度スクリプトを実行してください。"

# ============================================================
# 2. Docker インストール
# ============================================================
info "Docker を確認中..."
if ! command -v docker &>/dev/null; then
    info "Docker をインストールします..."
    apt-get update -qq
    apt-get install -y -qq \
        apt-transport-https ca-certificates curl \
        software-properties-common gnupg lsb-release git

    install -m 0755 -d /etc/apt/keyrings
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
        | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    chmod a+r /etc/apt/keyrings/docker.gpg

    echo \
        "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
        https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \
        > /etc/apt/sources.list.d/docker.list

    apt-get update -qq
    apt-get install -y -qq docker-ce docker-ce-cli containerd.io docker-compose-plugin
    systemctl enable --now docker
    success "Docker をインストールしました。"
else
    success "Docker は既にインストール済みです。"
fi

if ! docker compose version &>/dev/null; then
    apt-get install -y -qq docker-compose-plugin
fi
success "Docker Compose: $(docker compose version --short)"

REAL_USER="${SUDO_USER:-$(logname 2>/dev/null || echo '')}"
if [[ -n "$REAL_USER" ]] && ! id -nG "$REAL_USER" | grep -qw docker; then
    usermod -aG docker "$REAL_USER"
    warn "ユーザー '$REAL_USER' を docker グループに追加しました。再ログイン後に有効になります。"
fi

# ============================================================
# 3. git インストール
# ============================================================
if ! command -v git &>/dev/null; then
    apt-get install -y -qq git
fi

# ============================================================
# 4. リポジトリのクローン
# ============================================================
info "インストール先: ${INSTALL_DIR}"
mkdir -p "$INSTALL_DIR"

if [[ -f "${INSTALL_DIR}/docker-compose.yml" ]]; then
    warn "既存のリポジトリを検出しました。git pull で最新化します。"
    git -C "$INSTALL_DIR" pull --ff-only
else
    git clone "$REPO_URL" "$INSTALL_DIR"
    success "リポジトリをクローンしました。"
fi

cd "$INSTALL_DIR"

# ============================================================
# 5. ランダムシークレット生成 & .env 作成
# ============================================================
info ".env ファイルを生成します..."

[[ ! -f "deploy.env" ]] && error "deploy.env が見つかりません。クローンが正常に完了しているか確認してください。"

gen_secret() { openssl rand -hex 32; }

JWT_SECRET=$(gen_secret)
POSTGRES_PASSWORD=$(gen_secret)
MINIO_SECRET_KEY=$(gen_secret)
REDIS_PASSWORD=$(gen_secret)

cp deploy.env .env

# ---- ホスト名を設定(FQDNが全URLのベースになる)----
sed -i "s|^FQDN=.*|FQDN=${INPUT_HOST}|" .env

# ---- シークレットを上書き ----
sed -i "s|^GOTRUE_JWT_SECRET=.*|GOTRUE_JWT_SECRET=${JWT_SECRET}|"        .env
sed -i "s|^POSTGRES_PASSWORD=.*|POSTGRES_PASSWORD=${POSTGRES_PASSWORD}|"  .env
sed -i "s|^MINIO_SECRET_KEY=.*|MINIO_SECRET_KEY=${MINIO_SECRET_KEY}|"    .env
sed -i "s|^REDIS_PASSWORD=.*|REDIS_PASSWORD=${REDIS_PASSWORD}|"          .env

# ---- メール確認スキップ(SMTP なしで即使えるようにする)----
sed -i "s|^GOTRUE_MAILER_AUTOCONFIRM=.*|GOTRUE_MAILER_AUTOCONFIRM=true|" .env

# ---- admin@example.com はログイン不可のためデフォルト管理者設定をクリア ----
sed -i "s|^GOTRUE_ADMIN_EMAIL=.*|GOTRUE_ADMIN_EMAIL=|"          .env
sed -i "s|^GOTRUE_ADMIN_PASSWORD=.*|GOTRUE_ADMIN_PASSWORD=|"    .env
sed -i "s|^PGADMIN_DEFAULT_EMAIL=.*|PGADMIN_DEFAULT_EMAIL=|"    .env
sed -i "s|^PGADMIN_DEFAULT_PASSWORD=.*|PGADMIN_DEFAULT_PASSWORD=|" .env

success ".env を生成しました。"

# ============================================================
# 6. シークレット情報を別ファイルに保存
# ============================================================
SECRET_FILE="${INSTALL_DIR}/.secrets"
cat > "$SECRET_FILE" <<EOF
# AppFlowy Cloud — 生成されたシークレット ($(date '+%Y-%m-%d %H:%M:%S'))
# このファイルは安全な場所にバックアップしてください。
FQDN=${INPUT_HOST}
GOTRUE_JWT_SECRET=${JWT_SECRET}
POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
MINIO_SECRET_KEY=${MINIO_SECRET_KEY}
REDIS_PASSWORD=${REDIS_PASSWORD}
EOF
chmod 600 "$SECRET_FILE"
success "シークレットを ${SECRET_FILE} に保存しました。"

# ============================================================
# 7. Docker Compose で起動
# ============================================================
info "AppFlowy Cloud を起動します..."
docker compose pull
docker compose up -d
success "コンテナを起動しました。"

# ============================================================
# 8. 完了メッセージ
# ============================================================
echo ""
echo -e "${GREEN}${BOLD}============================================"
echo -e "  AppFlowy Cloud セットアップ完了!"
echo -e "============================================${NC}"
echo ""
echo -e "  アクセスURL:    ${CYAN}http://${INPUT_HOST}/${NC}"
echo -e "  管理コンソール: ${CYAN}http://${INPUT_HOST}/console${NC}"
echo -e "  pgAdmin:        ${CYAN}http://${INPUT_HOST}/pgadmin${NC}"
echo -e "  MinIO:          ${CYAN}http://${INPUT_HOST}/minio${NC}"
echo ""
echo -e "  シークレット:   ${YELLOW}${SECRET_FILE}${NC}"
echo ""
echo -e "${YELLOW}  ⚠  ログイン方法:${NC}"
echo -e "     ${CYAN}http://${INPUT_HOST}/${NC} にアクセスして"
echo -e "     「Sign up」から新規ユーザーを作成してください。"
echo -e "     ※ GOTRUE_MAILER_AUTOCONFIRM=true のためメール確認は不要です。"
echo ""
echo -e "${YELLOW}  ⚠  本番運用前に:${NC}"
echo -e "     .env の SMTP 設定を入れて GOTRUE_MAILER_AUTOCONFIRM=false に変更してください。"
echo ""
echo "  管理コマンド:"
echo "    cd ${INSTALL_DIR}"
echo "    docker compose ps"
echo "    docker compose logs -f"
echo "    docker compose down"
echo "    docker compose pull && docker compose up -d   # アップグレード"
echo ""code