SiYuan知识管理软件:三步骤Docker部署与私有化配置实战指南
SiYuan是一款采用TypeScript和Go语言构建的隐私优先、自托管、完全开源的个人知识管理系统,支持块级引用和Markdown所见即所得编辑。本文通过技术要点解析、操作步骤演示和验证方法,为技术爱好者和进阶用户提供完整的私有化部署方案。
一、技术架构解析:双栈架构与数据安全机制
SiYuan采用前后端分离的双栈技术架构,前端基于TypeScript和Electron构建跨平台桌面应用,后端使用Go语言实现高性能内核服务。这种架构设计确保了系统的高性能和数据安全性。
1.1 核心架构组件
技术要点分析:
- 前端架构:基于Electron的跨平台桌面应用,支持Windows、macOS、Linux
- 后端服务:Go语言实现的高性能HTTP/WebSocket服务,监听6806端口
- 数据存储:SQLite用于元数据索引,文件系统存储原始笔记数据
- 块级引用:基于AST树实现的细粒度内容引用机制
1.2 数据安全特性
SiYuan的数据安全设计体现在多个层面:
| 安全层级 | 实现机制 | 技术优势 |
|---|---|---|
| 存储加密 | AES-256加密算法 | 本地数据加密存储 |
| 传输安全 | WebSocket+TLS | 端到端加密通信 |
| 访问控制 | Token认证机制 | API访问权限管理 |
| 备份机制 | 增量快照技术 | 数据版本回滚支持 |
二、Docker部署实战:三步骤私有化配置
2.1 环境准备与基础配置
技术验证步骤:
- 验证Docker环境版本
docker --version
docker-compose --version
- 创建工作目录并设置权限
mkdir -p /siyuan/workspace
chown -R 1000:1000 /siyuan/workspace
配置要点:
- 确保工作目录具有正确的读写权限
- 建议使用非root用户运行容器
- 配置持久化存储路径
2.2 Docker Compose部署方案
创建docker-compose.yml配置文件:
version: "3.9"
services:
siyuan:
image: b3log/siyuan:latest
container_name: siyuan-knowledge
command:
- '--workspace=/siyuan/workspace/'
- '--accessAuthCode=${SIYUAN_AUTH_CODE}'
ports:
- "6806:6806"
volumes:
- /siyuan/workspace:/siyuan/workspace
- /etc/localtime:/etc/localtime:ro
restart: unless-stopped
environment:
- TZ=Asia/Shanghai
- PUID=1000
- PGID=1000
- SIYUAN_ACCESS_AUTH_CODE=${SIYUAN_AUTH_CODE}
- SIYUAN_WORKSPACE_PATH=/siyuan/workspace
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:6806/api/system/bootProgress"]
interval: 30s
timeout: 10s
retries: 3
部署执行命令:
# 设置访问授权码
export SIYUAN_AUTH_CODE="your_secure_password_here"
# 启动服务
docker-compose up -d
# 查看服务状态
docker-compose logs -f siyuan
2.3 Nginx反向代理配置
为提供HTTPS支持和域名访问,配置Nginx反向代理:
server {
listen 443 ssl http2;
server_name siyuan.yourdomain.com;
ssl_certificate /etc/ssl/certs/yourdomain.crt;
ssl_certificate_key /etc/ssl/private/yourdomain.key;
location / {
proxy_pass http://localhost:6806;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket支持
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location /ws {
proxy_pass http://localhost:6806/ws;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
}
三、数据迁移与同步配置
3.1 工作区数据结构解析
SiYuan的工作区采用模块化存储结构:
workspace/
├── data/
│ ├── assets/ # 图片、附件资源
│ ├── storage/ # 配置和查询条件
│ ├── widgets/ # 挂件数据
│ ├── plugins/ # 插件文件
│ └── notebooks/ # 笔记本目录
│ └── *.sy # JSON格式的文档文件
├── conf.json # 用户配置
└── .siyuan/ # 系统配置目录
技术验证方法:
# 验证数据目录结构
tree /siyuan/workspace/data -L 3
# 检查.sy文件格式
head -n 5 /siyuan/workspace/data/notebooks/*.sy | head -20
3.2 自动化备份脚本
创建定时备份脚本/usr/local/bin/siyuan-backup.sh:
#!/bin/bash
BACKUP_DIR="/backup/siyuan"
DATE=$(date +%Y%m%d_%H%M%S)
WORKSPACE="/siyuan/workspace"
# 创建备份目录
mkdir -p $BACKUP_DIR/$DATE
# 导出数据备份
docker exec siyuan-knowledge /opt/siyuan/kernel/siyuan \
--workspace=/siyuan/workspace \
--exportData \
--exportPath=/siyuan/workspace/backup.sybackup
# 复制备份文件
cp /siyuan/workspace/backup.sybackup $BACKUP_DIR/$DATE/
# 清理旧备份(保留最近30天)
find $BACKUP_DIR -type d -mtime +30 -exec rm -rf {} \;
# 记录备份日志
echo "$(date): Backup completed to $BACKUP_DIR/$DATE/" >> /var/log/siyuan-backup.log
配置cron定时任务:
# 每天凌晨2点执行备份
0 2 * * * /usr/local/bin/siyuan-backup.sh
图1:SiYuan跨平台界面展示,支持桌面端和移动端同步访问
四、API集成与自动化运维
4.1 RESTful API接口调用
SiYuan提供完整的RESTful API接口,支持自动化集成:
import requests
import json
class SiYuanAPI:
def __init__(self, base_url="http://localhost:6806", token=None):
self.base_url = base_url
self.headers = {
"Authorization": f"Token {token}",
"Content-Type": "application/json"
}
def create_document(self, notebook_id, path, markdown_content):
"""创建文档"""
url = f"{self.base_url}/api/filetree/createDocWithMd"
data = {
"notebook": notebook_id,
"path": path,
"markdown": markdown_content
}
response = requests.post(url, headers=self.headers, json=data)
return response.json()
def query_blocks(self, sql_statement):
"""SQL查询内容块"""
url = f"{self.base_url}/api/query/sql"
data = {"stmt": sql_statement}
response = requests.post(url, headers=self.headers, json=data)
return response.json()
def export_markdown(self, doc_id, save_path):
"""导出Markdown文档"""
url = f"{self.base_url}/api/export/exportMdContent"
data = {"id": doc_id}
response = requests.post(url, headers=self.headers, json=data)
if response.status_code == 200:
with open(save_path, 'w', encoding='utf-8') as f:
f.write(response.json()["data"]["content"])
return True
return False
4.2 监控与健康检查
配置Prometheus监控指标:
# prometheus.yml配置
scrape_configs:
- job_name: 'siyuan'
static_configs:
- targets: ['localhost:6806']
metrics_path: '/metrics'
scrape_interval: 30s
创建健康检查脚本:
#!/bin/bash
# siyuan-healthcheck.sh
API_URL="http://localhost:6806/api/system/bootProgress"
HEALTH_URL="http://localhost:6806/health"
# 检查服务状态
check_service() {
response=$(curl -s -o /dev/null -w "%{http_code}" $API_URL)
if [ "$response" = "200" ]; then
echo "✓ SiYuan服务运行正常"
return 0
else
echo "✗ SiYuan服务异常,HTTP状态码: $response"
return 1
fi
}
# 检查磁盘空间
check_disk() {
workspace_dir="/siyuan/workspace"
used_percent=$(df $workspace_dir | awk 'NR==2 {print $5}' | sed 's/%//')
if [ $used_percent -gt 90 ]; then
echo "⚠️ 磁盘使用率过高: ${used_percent}%"
return 1
else
echo "✓ 磁盘空间正常: ${used_percent}%"
return 0
fi
}
# 执行检查
check_service
check_disk
五、性能优化与故障排查
5.1 数据库优化配置
SiYuan使用SQLite作为元数据存储,以下优化配置可提升性能:
-- 创建索引优化查询性能
CREATE INDEX IF NOT EXISTS idx_blocks_type ON blocks (type);
CREATE INDEX IF NOT EXISTS idx_blocks_content ON blocks (content);
CREATE INDEX IF NOT EXISTS idx_assets_name ON assets (name);
-- 定期执行VACUUM释放空间
PRAGMA auto_vacuum = INCREMENTAL;
PRAGMA incremental_vacuum(1000);
-- 调整SQLite性能参数
PRAGMA journal_mode = WAL;
PRAGMA synchronous = NORMAL;
PRAGMA cache_size = -2000; -- 2GB缓存
PRAGMA mmap_size = 268435456; -- 256MB内存映射
5.2 常见问题排查指南
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 启动缓慢 | 数据库索引损坏 | 执行PRAGMA integrity_check检查数据库 |
| 内存占用高 | 大文件处理或内存泄漏 | 检查日志文件,重启服务 |
| 同步失败 | 网络连接或权限问题 | 验证网络连通性,检查文件权限 |
| 导入失败 | 数据格式不兼容 | 使用官方导出工具重新导出 |
| API调用失败 | Token过期或权限不足 | 重新生成API Token |
调试技巧:
- 启用详细日志
docker logs siyuan-knowledge --tail 100 -f
- 检查网络连接
curl -v http://localhost:6806/api/system/version
- 验证文件权限
ls -la /siyuan/workspace/data/
5.3 安全加固建议
- 访问控制强化
# Nginx访问限制
location / {
allow 192.168.1.0/24;
deny all;
auth_basic "Restricted Access";
auth_basic_user_file /etc/nginx/.htpasswd;
}
- 定期安全更新
# 自动更新脚本
#!/bin/bash
docker pull b3log/siyuan:latest
docker-compose down
docker-compose up -d
- 数据加密备份
# 使用gpg加密备份
gpg --symmetric --cipher-algo AES256 \
--output /backup/siyuan/backup_$(date +%Y%m%d).sybackup.gpg \
/siyuan/workspace/backup.sybackup
图3:SiYuan数据历史与快照功能,支持版本回滚和数据恢复
六、扩展开发与插件集成
6.1 插件开发基础
SiYuan支持JavaScript/CSS插件扩展,以下为插件开发示例:
// 示例插件:自定义快捷键
siyuan.onPluginLoad(() => {
// 注册自定义快捷键
siyuan.registerKeymap({
id: 'custom-quick-note',
name: '快速笔记',
keys: ['Ctrl+Shift+N'],
callback: () => {
siyuan.createDoc({
notebook: '默认笔记本',
path: '/daily/' + new Date().toISOString().split('T')[0] + '.sy',
markdown: '# 每日笔记\n\n' + new Date().toLocaleString()
});
}
});
// 添加自定义菜单项
siyuan.addMenuItem({
id: 'export-as-html',
name: '导出为HTML',
icon: 'icon-html',
click: (element) => {
const docId = element.getAttribute('data-node-id');
siyuan.exportHTML(docId);
}
});
});
6.2 主题定制开发
创建自定义主题CSS文件:
/* custom-theme.css */
:root {
--b3-theme-primary: #2e7d32;
--b3-theme-secondary: #558b2f;
--b3-theme-background: #f5f5f5;
--b3-theme-surface: #ffffff;
}
/* 代码块样式优化 */
.protyle-code {
border-radius: 8px;
border-left: 4px solid var(--b3-theme-primary);
}
/* 引用块样式 */
.protyle-quote {
background: linear-gradient(90deg,
rgba(46, 125, 50, 0.1) 0%,
rgba(46, 125, 50, 0.05) 100%);
border-left-color: var(--b3-theme-primary);
}
七、技术验证与性能测试
7.1 部署验证清单
完成部署后,执行以下验证步骤:
# 1. 服务健康检查
curl -f http://localhost:6806/api/system/bootProgress
# 2. API接口测试
curl -H "Authorization: Token your_token" \
-X POST http://localhost:6806/api/notebook/lsNotebooks
# 3. 数据目录权限验证
ls -la /siyuan/workspace/data/notebooks/
# 4. 日志检查
docker logs siyuan-knowledge --tail 50 | grep -E "(ERROR|WARN)"
# 5. 性能基准测试
ab -n 1000 -c 10 http://localhost:6806/
7.2 性能监控指标
配置Grafana监控面板,监控关键指标:
| 监控指标 | 正常范围 | 告警阈值 |
|---|---|---|
| 内存使用率 | < 70% | > 85% |
| CPU使用率 | < 50% | > 80% |
| 响应时间 | < 500ms | > 1000ms |
| 活跃连接数 | < 100 | > 200 |
| 磁盘IOPS | < 1000 | > 2000 |
通过以上技术部署方案,您可以构建一个安全、高性能的SiYuan知识管理私有化环境。该方案支持弹性扩展,可根据实际需求调整资源配置,满足从个人使用到团队协作的不同场景需求。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




