# Debian 12 上一次完成 Memos 私有笔记部署
(含 Docker 安装、Compose 管理、七牛云自动备份、无痛更新方案)
---
## 0. 前提
- 一台 Debian 12(Ubuntu 同理)能上网的 Linux 主机
- 拥有 sudo 权限的普通用户(示例用户 chenyinfu)
- 80/443 端口未被占用(若后来做反代)
- 七牛云账号已开通 Kodo 对象存储,并拿到:
- `AccessKey` / `SecretKey`
- 存储空间名(bucket)及对应外链域名
---
## 1. Docker & Docker Compose 安装(国内镜像加速)
### 1.1 卸载旧版本(可选)
```bash
sudo apt remove -y docker docker-engine docker.io containerd runc
```
### 1.2 使用清华源安装 Docker CE
```bash
# 安装依赖
sudo apt update && sudo apt install -y ca-certificates curl gnupg lsb-release
# 导入清华 GPG key
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian/gpg |
sudo gpg --dearmor -o /etc/apt/keyrings/docker.asc
# 写入清华软件源
echo
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc]
https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/debian
$(lsb_release -cs) stable" |
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装
sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
```
### 1.3 配置镜像加速器(拉取速度↑)
```bash
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<'EOF'
{
"registry-mirrors": [
"https://docker.mirrors.tuna.tsinghua.edu.cn",
"https://hub-mirror.c.163.com"
],
"dns": ["223.5.5.5", "8.8.8.8"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
# 验证
docker info | grep -A3 "Registry Mirrors"
```
### 1.4 把当前用户加入 docker 组(免 sudo)
```bash
sudo usermod -aG docker $USER
newgrp docker
```
---
## 2. Memos 安装(官方镜像 + Compose)
### 2.1 创建项目目录
```bash
mkdir -p ~/memos && cd ~/memos
```
### 2.2 编写 docker-compose.yml(无版次警告)
```yaml
# ~/memos/docker-compose.yml
services:
memos:
image: neosmemo/memos:stable
container_name: memos
restart: unless-stopped
ports:
- "5230:5230"
volumes:
- ./data:/var/opt/memos
```
### 2.3 首次启动
```bash
docker compose up -d
```
浏览器访问 `http://<服务器IP>:5230` → 注册第一个管理员账号即可使用。
**数据文件实体位置**:`~/memos/data`
---
## 3. 七牛云自动备份方案
思路:
- 每天 02:30 打包 `~/memos/data` → `memos-$(date +%F).tar.gz`
- 使用 qshell 上传至七牛云 bucket,保留最近 30 份
- 通过 systemd timer(或 cron)定时执行
### 3.1 本地安装 qshell(七牛官方 CLI)
```bash
wget https://devtools.qiniu.com/qshell-v2.14.0-linux-amd64.tar.gz
tar xf qshell-v2.14.0-linux-amd64.tar.gz -C /usr/local/bin qshell
chmod +x /usr/local/bin/qshell
```
### 3.2 配置 qshell 账户
```bash
qshell account <AccessKey> <SecretKey> memos
```
### 3.3 编写备份脚本
```bash
sudo tee /usr/local/bin/memos-backup.sh <<'EOF'
#!/bin/bash
# 变量
DATA_DIR=$HOME/memos/data
BACKUP_DIR=$HOME/memos/backup
BUCKET=your-bucket
DOMAIN=your-domain.com # 七牛外链域名
KEEP_LOCAL=7 # 本地保留天数
KEEP_REMOTE=30
mkdir -p "$BACKUP_DIR"
DATE=$(date +%F)
ARCHIVE="$BACKUP_DIR/memos-${DATE}.tar.gz"
# 打包
tar -zcf "$ARCHIVE" -C "$(dirname "$DATA_DIR")" "$(basename "$DATA_DIR")"
# 上传
qshell rput "$BUCKET" "memos/${DATE}.tar.gz" "$ARCHIVE"
# 清理本地旧备份
find "$BACKUP_DIR" -name 'memos-*.tar.gz' -mtime +${KEEP_LOCAL} -delete
# 清理远程旧备份(通过列举 + 删除)
qshell listbucket2 "$BUCKET" --prefix memos/ | awk '{print $1}' | sort -r | tail -n +$((KEEP_REMOTE+1)) | xargs -I{} qshell delete "$BUCKET" {}
EOF
chmod +x /usr/local/bin/memos-backup.sh
```
### 3.4 建立 systemd 定时任务
```bash
# /etc/systemd/system/memos-backup.service
sudo tee /etc/systemd/system/memos-backup.service <<EOF
[Unit]
Description=Memos data backup to Qiniu
After=network-online.target
[Service]
Type=oneshot
User=chenyinfu
ExecStart=/usr/local/bin/memos-backup.sh
EOF
# /etc/systemd/system/memos-backup.timer
sudo tee /etc/systemd/system/memos-backup.timer <<EOF
[Unit]
Description=Run memos backup daily
[Timer]
OnCalendar=02:30
Persistent=true
[Install]
WantedBy=timers.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now memos-backup.timer
```
查看状态:
```bash
systemctl list-timers memos-backup.timer
```
首次可手动验证:
```bash
systemctl start memos-backup.service
```
上传成功后会返回 `Hash/Key`,通过 `https://<DOMAIN>/memos/2025-08-19.tar.gz` 即可下载。
---
## 4. Memos 平滑更新方案(零停机)
### 4.1 更新前自动备份(可选)
```bash
systemctl start memos-backup.service
```
### 4.2 拉取最新镜像并重启
```bash
cd ~/memos
docker compose pull # 获取最新 stable
docker compose up -d # 自动重新创建容器,数据卷保留
```
### 4.3 回滚(万一有问题)
```bash
# 查看刚才的镜像 ID
docker images neosmemo/memos
# 立即回滚到旧镜像
docker compose stop
docker compose rm -f
docker tag <旧镜像ID> neosmemo/memos:stable
docker compose up -d
```
---
## 5. 常用命令速查
| 场景 | 命令 |
|---|---|
| 启动 memos | `docker compose up -d` |
| 查看日志 | `docker compose logs -f` |
| 重启应用 | `docker compose restart` |
| 更新镜像 | `docker compose pull && docker compose up -d` |
| 手动备份 | `systemctl start memos-backup.service` |
| 进入容器调试 | `docker exec -it memos /bin/sh` |
---
## 6. 小结
1. 用清华源秒装 Docker,再配镜像加速器,拉镜像飞快。
2. 一份 Compose 文件即可管理 Memos;数据落盘到 `~/memos/data`,删容器也不丢。
3. 七牛云 + qshell 每晚自动打包上传,保留 30 份历史,本地再留 7 天,兼顾安全与空间。
4. 更新只需两行 `pull && up -d`,出问题秒级回滚;更新前脚本自动再备一份,万无一失。
把这份流程保存成 `README.md` 放在 `~/memos` 目录,后来换机器也能 10 分钟重建。祝使用愉快!