Google KeepやSimplenoteのような軽量なメモサイトを自前で用意します。メリットは軽量で高速、データを自身で管理出来る点です。
DockerでMemosをセットアップ
まずはディレクトリを作成します。
mkdir -p ~/memos
cd ~/memos
nano ~/memos/docker-compose.yml
docker-compose.ymlの内容
version: "3.8"
services:
memos:
image: ghcr.io/usememos/memos:latest
container_name: memos
ports:
- "5230:5230"
volumes:
- ./data:/var/opt/memos
restart: unless-stopped
起動
docker compose up -d
あとは「http://サーバーIP:5230」でアクセスすれば表示されます。日本語環境でも使えます。
軽量で使いやすいですね。

設定で「ストレージ」は「Local」にしたほうが、写真がデータベースとは分離されてパフォーマンスが良くなると思われます。また「ダブルクリックで編集を有効化」「折りたたみを有効化」などは便利でしょう。
またiPhoneやAndroidで、Memosと連携出来るアプリ「Moe Memos」もあります。
LXDコンテナ内で1コピペでインストール
LXDコンテナ内なので、手軽に使えるように80番ポートで公開しています。Tailscale serveによるhttps化はあえて行っていません。Tailnetに参加しているPCからのみ(それとホストPCから)、分かりやすいマジックドメイン名でアクセスできます。ホスト側でLXDコンテナへの転送設定を行っていなければ、Tailnetに参加していないLAN内の別PCからはアクセスできません。
一応、大事な内容を記述するのではなく、ちょっとしたメモ用途に使えるかなと。
#!/bin/bash
# =============================================================================
# Memos インストールスクリプト (LXDコンテナ + Tailscale環境)
# ポート80で公開 → http://TailscaleマジックDNS/でアクセス可能
# =============================================================================
set -euo pipefail
INSTALL_DIR="/opt/docker/memos"
echo "=== [1/4] Docker / Docker Compose の確認・インストール ==="
if ! command -v docker &>/dev/null; then
apt-get update -qq
apt-get install -y -qq ca-certificates curl gnupg
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 $(. /etc/os-release && echo "$VERSION_CODENAME") 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
echo "✓ Docker インストール完了"
else
echo "✓ Docker は既にインストール済み"
fi
echo ""
echo "=== [2/4] ディレクトリ & docker-compose.yml の作成 ==="
mkdir -p "${INSTALL_DIR}/data"
cat > "${INSTALL_DIR}/docker-compose.yml" <<'EOF'
version: "3.8"
services:
memos:
image: ghcr.io/usememos/memos:latest
container_name: memos
ports:
- "80:5230"
volumes:
- ./data:/var/opt/memos
restart: unless-stopped
EOF
echo "✓ ${INSTALL_DIR}/docker-compose.yml 作成完了"
echo ""
echo "=== [3/4] Memos コンテナの起動 ==="
cd "${INSTALL_DIR}"
docker compose pull
docker compose up -d
echo "✓ Memos 起動完了"
echo ""
echo "=== [4/4] アクセス情報 ==="
# Tailscaleマジックドメイン名を取得
TAILSCALE_HOSTNAME=""
if command -v tailscale &>/dev/null; then
TAILSCALE_HOSTNAME=$(tailscale status --json 2>/dev/null \
| grep -oP '"DNSName":\s*"\K[^"]+' | head -1 | sed 's/\.$//' || true)
fi
# コンテナのIPアドレスを取得
CONTAINER_IP=$(hostname -I | awk '{print $1}')
echo ""
echo "┌─────────────────────────────────────────────────────────┐"
echo "│ Memos インストール完了! │"
echo "├─────────────────────────────────────────────────────────┤"
if [ -n "${TAILSCALE_HOSTNAME}" ]; then
echo "│ Tailnet からアクセス: http://${TAILSCALE_HOSTNAME}"
fi
echo "│ LAN からアクセス : http://${CONTAINER_IP}"
echo "│ データ保存先 : ${INSTALL_DIR}/data"
echo "├─────────────────────────────────────────────────────────┤"
echo "│ 初回アクセス時にアカウント作成画面が表示されます │"
echo "└─────────────────────────────────────────────────────────┘"
echo ""
echo "管理コマンド:"
echo " ログ確認 : docker compose -f ${INSTALL_DIR}/docker-compose.yml logs -f"
echo " 停止 : docker compose -f ${INSTALL_DIR}/docker-compose.yml down"
echo " 更新 : docker compose -f ${INSTALL_DIR}/docker-compose.yml pull && docker compose -f ${INSTALL_DIR}/docker-compose.yml up -d"
アンインストール方法
#!/bin/bash
# =============================================================================
# Memos アンインストールスクリプト
# =============================================================================
set -euo pipefail
INSTALL_DIR="/opt/docker/memos"
echo "=== [1/3] Memos コンテナの停止・削除 ==="
if [ -f "${INSTALL_DIR}/docker-compose.yml" ]; then
cd "${INSTALL_DIR}"
docker compose down --rmi all --volumes 2>/dev/null || true
echo "✓ コンテナ・イメージ・ボリューム削除完了"
else
# compose ファイルがなくてもコンテナが残っている場合に対応
docker rm -f memos 2>/dev/null && echo "✓ コンテナ削除完了" || echo " コンテナは存在しませんでした"
docker rmi ghcr.io/usememos/memos:latest 2>/dev/null && echo "✓ イメージ削除完了" || echo " イメージは存在しませんでした"
fi
echo ""
echo "=== [2/3] インストールディレクトリの削除 ==="
echo "⚠ データも含めて削除します: ${INSTALL_DIR}"
read -rp "本当に削除しますか? (yes/N): " CONFIRM
if [[ "${CONFIRM}" == "yes" ]]; then
rm -rf "${INSTALL_DIR}"
echo "✓ ${INSTALL_DIR} 削除完了"
else
echo " スキップ(データは ${INSTALL_DIR} に残ります)"
fi
echo ""
echo "=== [3/3] Docker 本体の削除(任意) ==="
read -rp "Docker 自体も削除しますか?他サービスで使用中の場合はNを選択 (yes/N): " CONFIRM_DOCKER
if [[ "${CONFIRM_DOCKER}" == "yes" ]]; then
systemctl stop docker containerd 2>/dev/null || true
apt-get purge -y docker-ce docker-ce-cli containerd.io docker-compose-plugin 2>/dev/null || true
apt-get autoremove -y
rm -rf /etc/apt/sources.list.d/docker.list \
/etc/apt/keyrings/docker.gpg \
/var/lib/docker \
/var/lib/containerd
echo "✓ Docker 削除完了"
else
echo " Docker はそのまま保持します"
fi
echo ""
echo "✓ Memos アンインストール完了"
ポイント
| ステップ | 内容 |
|---|---|
docker compose down --rmi all --volumes | コンテナ・イメージ・無名ボリュームをまとめて削除 |
| データ削除の確認 | /opt/docker/memos/data 以下のメモデータも消えるため対話確認 |
| Docker本体は任意 | 他のコンテナサービスを動かしている場合は残す選択が可能 |
データをバックアップしてからアンインストールする場合は、削除前に以下を実行してください。
cp -r /opt/docker/memos/data ~/memos-backup-$(date +%Y%m%d)


