一段废话

上学时期有做大量笔记的需求,作为一个妥妥的“盗版用户”,笔记本自带的OneNote就用了四年。外加我对数据有洁癖,笔记本差不多几个月就要彻底重装一次系统,当年我的“重要数据”都是靠手工备份到移动硬盘,当然,有加密。

直到开始写点东西,爱上Markdown,公司也配了正版Microsoft全家桶,包括1T Onedrive per user。可我这个时候就开始作了:OneNote不支持Markdown、自己做的笔记太乱了看着糟心、Onedrive 同步龟速,考虑过NAS + Typora,没钱,懒。其实我更像在寻找适合我的存储方式和笔记软件。

体验和需求

  • 有道云,附赠免费云同步,出于对数据洁癖和审美问题,一个星期后已弃用;
  • 印象笔记国际版,长期用的话价格扎心,没有体验;
  • Leanote,开源产品,写的东西还可以发布,忘了为什么放弃;
  • GitNote,开源产品,数据同步到Github私有仓库,一个月后弃用(因为Notion);
  • Notion,爽,项目和时间管理的需求一并解决,但是学习成本有点高,免费空间快用完了,个人版价格可接受,不限block的账号私下交易有巨大风险,不建议非官方途径;之前的版本好像必须联网使用,所以国内用户抱怨网络很慢,官方说因为只有亚马逊的美国地区服务器可用。数据安全方面的保障请看Terms and Privacy

无论用Onedrive或是Github作为存储空间,都是不错的设计想法,但是国情不允许。我是在Windows和MacOS的两种环境办公,因此笔记必须支持跨设备同步,而且它在Windows界面下起码不要太难看。。。数据洁癖那部分,是因为我有随时随地开text来记录信息的习惯,包括一些敏感数据,所以希望尊重我的隐私权和加密的需求。

为什么选择 Joplin

选累了,看完官方功能介绍,有一种遇到了真爱的感觉。

那么是Nextcloud还是Seafile?

花了一晚上看资料和大家的心得,发现两个产品的slogan都写的很好。最后还是选择了Nextcloud,一是对GDPR有盲目自信,二是发现有docker部署,省事(结果折腾更久)

Your Data Safety is our First Priority, Seafile.

You should control your data,Nextcloud.

附 Nextcloud 的体验地址:https://demo.nextcloud.com/

附 Seafile 的体验地址:https://demo.seafile.com/demo

Show me your code

文件结构

Nextcloud官方在Github上有几个非常棒的例子,所有文件均可以在官方Github找到,略微调整后即可上线。

1
2
3
4
5
6
7
[root@h0u5er nextcloud_with_ssl]# tree .
.
├── db.env
├── docker-compose.yml
└── proxy
├── Dockerfile
└── uploadsize.conf

定义proxy镜像

我没有把 jwilder/nginx-proxy 拆分成 nginx 和 jwilder/docker-gen 两个容器运行, 拆开的话安全性会好一点,因为减少了nginx对外暴露 docker socket 的风险。

1
2
3
4
5
6
7
8
[root@h0u5er proxy]# cat Dockerfile 
FROM jwilder/nginx-proxy:alpine

COPY uploadsize.conf /etc/nginx/conf.d/uploadsize.conf

[root@h0u5er proxy]# cat uploadsize.conf
client_max_body_size 10G;
proxy_request_buffering off;

本站已经全站docker化,但请忽略v2fly和Hexo的部分,因为本文不涉及:

  • 用 Nginx-proxy 实现自动反向代理 www.example.com,就是纯静态的博客,网站文件来自Hexo生成
  • 用 Nginx-proxy 实现自动反向代理 drive.example.com,就是 Nextcloud

  • Let‘s Encrypt 自动申请证书,自动配置SSL证书。通配符证书只支持用DNS验证域名的方式签发,而下面用到的镜像,只支持http-01验证,所以结果会申请两张子域名的证书,而不是通配符证书。

Docker.jpg

docker-compose.yml

数据库密码,虚拟主机,SSL的信息需要根据实际情况调整。我用的是 nextcloud:apache 镜像,因此docker-compose包含apache。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
version: '3'

services:
db:
image: mariadb
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
restart: always
volumes:
- db:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=Your_SQL_Password
env_file:
- db.env
app:
image: nextcloud:apache
restart: always
volumes:
- nextcloud:/var/www/html
environment:
- VIRTUAL_HOST=drive.example.com
- LETSENCRYPT_HOST=drive.example.com
- LETSENCRYPT_EMAIL=Your_Email@mail.com
- MYSQL_HOST=db
env_file:
- db.env
depends_on:
- db
networks:
- proxy-tier
- default
blog:
image: nginx
container_name: blog
restart: always
volumes:
- /var/www/public:/usr/share/nginx/html
environment:
- VIRTUAL_HOST=www.example.com,example.com
- LETSENCRYPT_HOST=www.example.com,example.com
- LETSENCRYPT_EMAIL=Your_Email@mail.com
networks:
- proxy-tier
proxy:
build: ./proxy
restart: always
ports:
- 80:80
- 443:443
labels:
com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy: "true"
volumes:
- certs:/etc/nginx/certs:ro
- vhost.d:/etc/nginx/vhost.d
- html:/usr/share/nginx/html
- /var/run/docker.sock:/tmp/docker.sock:ro
networks:
- proxy-tier
letsencrypt-companion:
image: jrcs/letsencrypt-nginx-proxy-companion
restart: always
volumes:
- certs:/etc/nginx/certs
- vhost.d:/etc/nginx/vhost.d
- html:/usr/share/nginx/html
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
- proxy-tier
depends_on:
- proxy
volumes:
db:
nextcloud:
certs:
vhost.d:
html:
public:
networks:
proxy-tier:

最后

有几个弊端要提一下,因为nginx.tmpl配置已经预定义了一些设置,和我之前用不同配置文件控制的方式有点不一样,所以后面关于nginx调整404页面转跳,安全设置等等也没有放出来。docker-compose集成了Let’s Encrypt镜像,当重启docker-compose之后,是会触发证书申请或续签的,那么如果90天后证书失效,仅希望平滑重启Let’s Encrypt镜像的时候,需要用到特殊的命令来操作。对个人使用而言,暂时没看出来全站docker化之后的优势。

未来我会考虑修改一下网站的架构,在原有源码安装的nginx中,添加up stream来连接docker安装的nextcloud,其他保留源码安装。