自前のメモ環境Memosを使う

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)
タイトルとURLをコピーしました