利用Docker和PostgreSQL构建高可用Joplin私有云笔记系统

张开发
2026/5/27 15:28:57 15 分钟阅读
利用Docker和PostgreSQL构建高可用Joplin私有云笔记系统
1. 为什么需要私有云笔记系统在这个信息爆炸的时代笔记软件已经成为我们日常工作学习中不可或缺的工具。你可能用过不少笔记应用但有没有遇到过这样的烦恼免费版功能受限、同步速度慢、数据隐私没保障或者突然某天服务商停止运营导致数据丢失这些问题我都遇到过直到发现了Joplin这个开源解决方案。Joplin是一款完全开源的笔记应用支持Markdown格式拥有桌面端、移动端和命令行版本。最吸引我的是它支持自建同步服务器这意味着你可以完全掌控自己的数据。想象一下你的所有笔记都存放在自己的服务器上就像在家里建了个私人图书馆既不用担心服务商跑路又能享受极速同步体验。2. Docker环境准备与配置2.1 Docker安装与基础配置在开始之前我们需要确保服务器上已经安装了Docker。如果你是Ubuntu用户可以这样安装# 更新软件包索引 sudo apt-get update # 安装必要依赖 sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common # 添加Docker官方GPG密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - # 添加稳定版仓库 sudo add-apt-repository deb [archamd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable # 安装Docker引擎 sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io安装完成后建议将当前用户加入docker组避免每次都要sudosudo usermod -aG docker $USER newgrp docker2.2 Docker Compose安装虽然我们可以直接使用docker run命令但为了更好的管理性我强烈推荐使用Docker Compose。安装方法很简单sudo curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose sudo chmod x /usr/local/bin/docker-compose验证安装是否成功docker-compose --version3. PostgreSQL数据库配置3.1 为什么选择PostgreSQLJoplin Server默认使用SQLite这在小型部署中没问题。但如果你像我一样有大量笔记需要同步或者需要高可用性PostgreSQL是更好的选择。它支持更好的并发性能更可靠的数据完整性更强大的查询能力更容易扩展3.2 PostgreSQL容器部署我们先创建一个专用网络让容器间可以互相通信docker network create joplin-network然后启动PostgreSQL容器docker run -d \ --name joplin-db \ --network joplin-network \ -e POSTGRES_PASSWORDyoursecurepassword \ -e POSTGRES_USERjoplin \ -e POSTGRES_DBjoplin \ -v joplin-db-data:/var/lib/postgresql/data \ postgres:13-alpine这里我们使用了PostgreSQL 13的Alpine版本体积更小。数据卷joplin-db-data会自动创建确保数据持久化。3.3 性能优化配置为了获得最佳性能我们可以调整一些PostgreSQL参数。创建一个custom.conf文件# 连接数相关 max_connections 100 shared_buffers 256MB effective_cache_size 768MB # 写入性能 synchronous_commit off wal_buffers 16MB checkpoint_completion_target 0.9 # 查询优化 random_page_cost 1.1 effective_io_concurrency 200 work_mem 4MB然后重新启动容器应用这些配置docker run -d \ --name joplin-db \ --network joplin-network \ -e POSTGRES_PASSWORDyoursecurepassword \ -e POSTGRES_USERjoplin \ -e POSTGRES_DBjoplin \ -v joplin-db-data:/var/lib/postgresql/data \ -v $(pwd)/custom.conf:/etc/postgresql/postgresql.conf \ postgres:13-alpine -c config_file/etc/postgresql/postgresql.conf4. Joplin Server部署与配置4.1 准备环境变量文件创建一个.env文件存放配置APP_BASE_URLhttps://notes.yourdomain.com APP_PORT22300 DB_CLIENTpg POSTGRES_PASSWORDyoursecurepassword POSTGRES_DATABASEjoplin POSTGRES_USERjoplin POSTGRES_PORT5432 POSTGRES_HOSTjoplin-db4.2 编写Docker Compose文件使用docker-compose.yml可以更清晰地管理服务version: 3 services: db: image: postgres:13-alpine container_name: joplin-db restart: unless-stopped volumes: - joplin-db-data:/var/lib/postgresql/data - ./custom.conf:/etc/postgresql/postgresql.conf environment: POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_DB: ${POSTGRES_DATABASE} command: postgres -c config_file/etc/postgresql/postgresql.conf networks: - joplin-network app: image: joplin/server:latest container_name: joplin-server restart: unless-stopped depends_on: - db ports: - 22300:22300 environment: APP_BASE_URL: ${APP_BASE_URL} APP_PORT: ${APP_PORT} DB_CLIENT: ${DB_CLIENT} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DATABASE: ${POSTGRES_DATABASE} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PORT: ${POSTGRES_PORT} POSTGRES_HOST: db networks: - joplin-network networks: joplin-network: driver: bridge volumes: joplin-db-data:启动服务docker-compose up -d4.3 初始化管理员账户第一次启动后需要设置管理员账户docker exec -it joplin-server node packages/server/dist/app.js --help按照提示创建管理员账户。默认情况下你可以访问https://notes.yourdomain.com/login使用adminlocalhost/admin登录但请立即修改密码。5. Nginx反向代理配置5.1 基本反向代理配置为了提高安全性和可用性建议使用Nginx作为反向代理。基本配置如下server { listen 443 ssl; server_name notes.yourdomain.com; ssl_certificate /path/to/your/cert.pem; ssl_certificate_key /path/to/your/key.pem; client_max_body_size 100M; location / { proxy_pass http://joplin-server:22300; 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; } }5.2 性能优化配置添加以下配置可以提升性能# 启用gzip压缩 gzip on; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xmlrss text/javascript; # 静态资源缓存 location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ { expires 1M; access_log off; add_header Cache-Control public; } # 客户端缓存控制 location ~* \.(?:css|js)$ { expires 1y; access_log off; add_header Cache-Control public; }6. 客户端配置与同步6.1 桌面客户端配置在Joplin桌面客户端中进入工具 选项 同步同步目标选择Joplin Server同步URL填写你的服务地址(如https://notes.yourdomain.com)输入你设置的管理员邮箱和密码点击检查同步配置验证连接6.2 移动客户端配置移动端配置类似进入设置 同步选择Joplin Server作为同步目标填写服务器URL和凭据可以设置自动同步间隔6.3 多设备同步策略如果你有多台设备建议先在一台设备上完成初始同步其他设备同步时选择以远程内容为准定期检查同步状态解决可能的冲突7. 系统维护与监控7.1 备份策略数据库备份至关重要可以设置定时任务# 每天凌晨3点备份 0 3 * * * docker exec joplin-db pg_dump -U joplin -d joplin /backups/joplin-$(date \%Y\%m\%d).sql7.2 日志监控查看Joplin Server日志docker logs -f joplin-serverPostgreSQL性能监控docker exec -it joplin-db psql -U joplin -c SELECT * FROM pg_stat_activity;7.3 定期维护建议每月执行一次数据库维护docker exec -it joplin-db psql -U joplin -c VACUUM FULL ANALYZE;8. 高可用性扩展8.1 数据库复制为了提高可用性可以设置PostgreSQL主从复制# 在docker-compose.yml中添加 db-replica: image: postgres:13-alpine depends_on: - db volumes: - joplin-db-replica-data:/var/lib/postgresql/data environment: POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_DB: ${POSTGRES_DATABASE} command: bash -c echo host replication all 0.0.0.0/0 md5 /var/lib/postgresql/data/pg_hba.conf docker-entrypoint.sh postgres 8.2 负载均衡可以使用多个Joplin Server实例配合负载均衡app2: image: joplin/server:latest container_name: joplin-server-2 restart: unless-stopped depends_on: - db environment: APP_BASE_URL: ${APP_BASE_URL} APP_PORT: ${APP_PORT} DB_CLIENT: ${DB_CLIENT} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DATABASE: ${POSTGRES_DATABASE} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PORT: ${POSTGRES_PORT} POSTGRES_HOST: db networks: - joplin-network然后在Nginx中配置负载均衡upstream joplin_servers { server joplin-server:22300; server joplin-server-2:22300; } server { location / { proxy_pass http://joplin_servers; } }9. 安全加固措施9.1 数据库安全定期更换数据库密码限制数据库访问IP启用SSL连接# 在db服务的environment中添加 POSTGRES_HOST_AUTH_METHOD: scram-sha-256 SSL: on9.2 应用安全定期更新Joplin Server镜像使用强密码策略启用HTTPS并配置HSTSadd_header Strict-Transport-Security max-age63072000; includeSubDomains; preload;9.3 防火墙配置只开放必要端口ufw allow 443/tcp ufw allow 80/tcp ufw enable10. 故障排查与常见问题10.1 同步失败排查如果遇到同步问题检查服务是否运行docker ps查看日志docker logs joplin-server测试数据库连接docker exec -it joplin-db psql -U joplin -c \l10.2 性能问题优化如果同步变慢检查数据库性能docker exec -it joplin-db psql -U joplin -c EXPLAIN ANALYZE SELECT * FROM notes;增加Joplin Server内存在docker-compose.yml中添加mem_limit: 512m优化PostgreSQL配置10.3 数据恢复如果数据丢失从备份恢复docker exec -i joplin-db psql -U joplin backup.sql检查volume状态docker volume inspect joplin-db-data如果需要可以临时挂载volume到其他容器检查内容

更多文章