必要があれば使うかも…
ナレッジベースのノートアプリとして人気の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

