打造个人写作系统

打造个人写作系统

记录笔记对我来说一直是个比较头疼的事情,之前用过比较久的有道云笔记,也尝试过各类云笔记,和markdown编辑工具,好像没法兼顾归类整理和简单易用,那是不是可以自己搭建一套呢?

一、问题现状

  • 需要支持使用mackdown编辑
  • 可以在mackdown中添加图片
  • 可以复制到其他平台进行预览
  • 可以在多个设备之间自动同步
  • 穷~

二、需求方案

  • 可以配置上传图片插件的mackdown编辑器
  • 不想花钱,使用开源或免费方案,不被商业产品束缚 🐶
  • 可以在mackdown插入图片并能在其他平台预览,需要一个公网可访问的图片服务,那不就是图床 🤔️
  • 之前用的一个日记软件可以使用WebDAV的方式绑定三方云盘,是不是可以搭建一个支持WebDAV网盘

2.1 需求拆解

2.1.1 markdown编辑器

MacDown、VS Code、Typora、Atom、Android Studio(貌似暴露了什么)等,又在网上搜了下 Obsidian和Typora是可玩儿性比较高的,并且最近Obsidian也支持了即时预览。

2.1.2 图床服务

图床服务我理解分为以下几类

  • git代码托管方案,如github、国内的gitee(码云)等;
  • 云服务商的对象存储方案,如腾讯云COS、阿里云OSS、百度云BOS等;
  • 自建服务,开源的如:Lychee、树洞外链、Lskypro等;

2.1.3 上传工具

PicGo、uPic 都是不错的工具

2.1.4 开源网盘

Nextcloud、Cloudreve、可道云、Seafile等都是不错的方案

2.2 整体方案

  • 所有采用免费方案,服务器采用群晖的Docker,当然家里没用的旧笔记本也可以装Linux系统跑Docker,熄屏下也比较省电;
  • Obsidian作为主战场,用来编写、管理文章;
  • 图床采用Docker部署Lskypro,由于Lskypro需要依赖数据库,再跑个mysql;
  • 上传工具使用PicGo,就不用每次打开图床网页上传图片;
  • Obsidian的Image auto upload插件和PicGo配合,进行贴入markdown的图片自动上传;
  • Obsidian的Remotely Save插件自动同步到Cloudreve云盘;

三、开始搭建

尽管我是一只程序猿,但是关于服务搭建,环境配置其实一窍不通,所以下面可能会有些说的不专业。

3.1 Docker容器创建

由于docker我只是之前做Android编译镜像的时候突击了一个周末,对于docker其实也是刚刚入门,很多基础都是一知半解。

3.1.1 mysql

这里选用的5.7.9版本,可以在创建container的时候创建一个用户名和密码以及对该用户授权的数据库,变量如下

MYSQL_USER=用户名
MYSQL_PASSWORD=用户密码
MYSQL_DATABASE=数据库名

但是不太建议直接在环境变量配置这些,可以只配一个root用户密码的环境变量,后续的再创建用户和数据库。

可以使用图形化和命令两种方式管理Docker,图形化管理可以用portainer/portainer

由于我开始学的时候是在公司的开发机上,所以还是比较倾向于使用命令,当然原则上是一样的,没有高低。

docker run -d \
    --name=mysql \
    --restart unless-stopped \
    -v /volume1/docker/mysql:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=root密码 \
    mysql:5.7.9

3.1.2 phpmyadmin

mysql数据库管理,可以进行图形化的操作数据库,个人感觉还是比较方便的。

命令如下,需要关联上面创建的mysql容器。

docker run -d \
    --name=phpmyadmin \
    --link mysql:db \
    -p 6080:80 \
    phpmyadmin

使用phpmyadmin,创建lsky用户并勾选创建同名数据库。

打造个人写作系统

3.1.3 lskypro

终于到我们的图床主角了,不得不说,这个项目太赞了,大家可以根据自己的情况去官方打赏。

容器创建命令如下

docker run -d \
    --name=lskypro \
    --link mysql:db \
    -p 37158:80 \
    -v /volume1/docker/lsky:/var/www/html \
    --restart unless-stopped
    wbsu2003/lskypro

启动之后,可以根据自己配置的端口映射,在本地访问进行初始化配置。

【第一步】进入本地网址访问,就看到了运行环境监测,使用docker的方式好处就是环境不用我们担心,超省心。

运行环境监测
运行环境监测

【第二步】数据库配置,在配置数据库的地方我浪费了比较多的时间,首先是数据库地址,localhost127.0.0.1都不行,可以理解为lskypro和mysql是一栋楼的邻居,lskypro需要连接数据库,在自己家里(localhost127.0.0.1)找肯定是找不到的。

那么接下来就是找出数据库家的门牌号,到命令行进行查看,先找到mysql的容器ID。

zwenkai@KevinNAS:~$ docker container ls
Password:
CONTAINER ID   IMAGE                        COMMAND                  CREATED         STATUS          PORTS                     NAMES
eb05cb4c1bf6   wbsu2003/lskypro:latest      "docker-php-entrypoi…"   9 minutes ago   Up 8 minutes    0.0.0.0:6068->80/tcp      lskypro
c53ad5d2b85c   phpmyadmin:latest            "/docker-entrypoint.…"   15 minutes ago  Up 15 minutes   0.0.0.0:5657->80/tcp      phpmyadmin
132ce00dfe9f   mysql:5.7.9                  "/entrypoint.sh mysq…"   19 minutes ago  Up 19 minutes   0.0.0.0:3306->3306/tcp    mysql

再根据容器ID看下它的门牌号,根据我猜测,应该是可以在创建mysql容器的时候声明一个容器IP的。

zwenkai@KevinNAS:~$ docker inspect --format='{{.NetworkSettings.IPAddress}}' 132ce00dfe9f
172.17.0.2

填入数据库地址,也就是我们找到的门牌号172.17.0.2,剩下的就是填入用户信息和数据库名称的常规操作了,也比较简单,和上面创建的对应上就没问题。

打造个人写作系统

【第三步】配置管理员邮箱,完事儿之后就可以登录进来啦。

打造个人写作系统

非常干净清爽,该有的功能也都有。

3.1.4 Cloudreve

网盘服务,另一位主角。这里主要是要它的WebDAV来用来进行数据同步。当然这只是他的一项功能,也可以使用它做一些收费网盘能干的事情。

依旧是安装命令

docker run -d \
    --name cloudreve \
    --restart=unless-stopped \
    -p 5822:5212 \
    -e PUID=1000 \
    -e PGID=1000 \
    -e TZ="Asia/Shanghai" \
    -v /volume1/docker/cloudreve/uploads:/cloudreve/uploads \
    -v /volume1/docker/cloudreve/config:/cloudreve/config \
    -v /volume1/docker/cloudreve/db:/cloudreve/db \
    -v /volume1/docker/cloudreve/avatar:/cloudreve/avatar \
    xavierniu/cloudreve

运行后,执行下面的日志查看默认的用户名和密码。

docker logs -f cloudreve

可以使用初始化的管理员账号到管理后台重新设置用户名和密码。

打造个人写作系统

至此,图床和网盘的基础建设已经完成了。

3.2 内网穿透

经过上面的环境搭建之后,可以在局域网内玩儿了。但这明显还不够,我们想要的是可以在公网上被访问,但是我现在使用的是移动宽带,想要IPV4的公网IP,想都不要想了,那只能老老实实的搞内网穿透。

如果有公网IP的可以直接跳过,有动态公网IP的可以通过DDNS技术搞定,这样也可以跑满你家里的带宽。跑满带宽,想想就开心,额,也只能想想吧。

3.2.1 云服务器frp

理论上搞个最低配的云服务器,部署上frp就可以做内网穿透,但是只选1M带宽,一个月也要50多。如果选择5M带宽直接干到143快6了,IPV4的公网IP就要20快一个月。这一个月最少也要大几十,明显和需求的穷~不沾边。😭

打造个人写作系统

3.2.2 DDNSTO

ddnsto我之前在软路由上玩儿过,免费4M带宽,缺点是不能绑定自己的域名,这个还好,毕竟不是所有人都有国内备案过的域名。最为致命的是,出于安全考虑,一定要进行本人微信扫码验证。

打造个人写作系统

打造个人写作系统 那怎么办?

好吧,向现实低头,默默地掏出手机,淘宝搜下内外穿透,还真有不少产品。一般能把价格做低的,独享带宽是不可能的,基本都是共享带宽,我的需求是什么呢?

  • 内网穿透,这不废话么,这一趴就是要搞定这个事情的
  • 最好不要有流量限制,要不然月末就被掐住脖子没法过了
  • 带宽越大越好,毕竟谁会和体验过不去,而且我的上行带宽有50M呢
  • 价格一定要低,最好一个月10块钱以下,省下的钱上点硬件配置不香嘛
  • 要能绑定自己的域名,我手头有一个多年前在阿里云申请的域名,也做了备案

果然淘了一个符合要求的,具体细节就不过多讲了,你懂的,共享带宽。有需要的朋友私聊我吧。

内网穿透隧道配置,每家都会提供不尽相同的配置,按照他们的教程配就行了。

打造个人写作系统

域名解析设置,这里目前我还不太清楚具体原理,我的理解是域名解析时候,指向指定域名的服务器,这个穿透服务器再转发到我的内网服务器上。

打造个人写作系统

经过内网穿透,就打通了内网和公网,所有公开访问的一定要符合中国法律的要求,把自己送进去就得不偿失啦。

3.3 HTTP or HTTPS

3.3.1 不安全

http在公网上传播不安全,https为什么安全?哈哈,想到了校招生面试的时候大家都在问这个问题。😏

浏览器在http的时候会提示不安全、微信小程序不允许使用http服务,而且https的证书也可以很轻松的免费获取到,http的服务已经快要绝迹了。

3.3.2 反向代理

对于没有提供https访问的服务,怎么对外提供https服务呢?聪明的同学已经想到了nginx反向代理,对外暴露https的服务,nginx再转向内部的http服务。

3.3.3 SSL证书

由于采用https的方式,未配置证书的情况下,会有如下提示。

打造个人写作系统

不同的云服务商或域名服务商都会附带对应的SSL证书的申请配置功能,阿里云上是可以免费申请20个。

打造个人写作系统

3.3.4 配置证书

域名解析配置,可以手动配置,在阿里云上申请的SSL证书,已经贴心的自动配置到了域名解析中,其他的按照对应平台的域名配置方式配置即可。

服务端配置证书,下载对应服务器类型的证书,我下载的是nginx类型的,然后配置到自己的服务域名上。

由于我的是在群晖上可以图形化配置,找出来位置 /etc/nginx/sites-enabled,供大家参考。

server {
    listen 8785 ssl;
    listen [::]:8785 ssl;
    
    server_name img.zwenkai.com;
    
    if ( $host !~ "(^img.zwenkai.com$)" ) { return 404; }
    include /usr/syno/etc/www/certificate/ReverseProxy_802f84e7-5083-4b5c-ad52-e43310661616/cert.conf*;
    include /usr/syno/etc/security-profile/tls-profile/config/ReverseProxy_802f84e7-5083-4b5c-ad52-e43310661616.conf*;
    
    add_header Strict-Transport-Security "max-age=15768000; includeSubdomains; preload" always;

    proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

    location / {
        proxy_connect_timeout 60;
        proxy_read_timeout 60;
        proxy_send_timeout 60;
        proxy_intercept_errors off;
        proxy_http_version 1.1;
        proxy_set_header        Host                 $http_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;
        proxy_pass http://localhost:37158;
    }

    error_page 403 404 500 502 503 504 /dsm_error_page;

    location /dsm_error_page {
        internal;
        root /usr/syno/share/nginx;
        rewrite (.*) /error.html break;
        allow all;
    }
}

nginx相关的配置我也不熟悉,多年前救急帮朋友搭个服务,突击了两天。😊

再次访问,没问题了,而且这里已经变为了一把小锁,nice~

打造个人写作系统

同样的方式,把网盘二级域名的SSL证书也配置下。

3.3.5 配置PicGo

PicGo下载发布版,建议下载稳定版本。插件搜索lskypro,进行安装。

打造个人写作系统

然后配置上Url和Token(大家配置自己的即可,我这是魔法处理过的,不用尝试)🐶 网站设置中找到Token,然后配置到PicGo。

打造个人写作系统
打造个人写作系统

值得注意的是,PicGo设置中有个设置Server配置,可以搂一眼,默认配置不用更改。

打造个人写作系统

3.3.6 配置Obsidian

搜索三方Image auto upload Pligin插件,安装上这个神奇的插件。

打造个人写作系统

对插件进行配置,选择默认的上传工具 PicGo,PicGo server是不是有点熟悉,就是上面我们看的在PicGo设置中看到的设置server

打造个人写作系统

经过上面的关联配置之后就可以实现自动上传图片并转为mackdown的图片标签了。

下图是在编写这篇文章的时候,截图之后粘贴后自动上传并显示出来的动图,哈哈,套娃了。

打造个人写作系统

用ps把视频搞成gif,删除内容重复的帧,500帧只保留了不到200帧,花了近20分钟,确实是个体力活。

3.3.7 配置自动同步

Cloudreve创建WebDAV账号,这个账号我后来删除了,大家也不用尝试 😜

打造个人写作系统

Obsidian安装Remotely Save插件,这里顺带提一嘴,Obsidian可以配置为中文,可以根据自己的习惯配置。

打造个人写作系统

配置插件,主要是选择WebDAV并配置账号密码,一些同步策略可以根据自己的情况配置。

打造个人写作系统

稍等片刻,在网盘就可以看到自动同步上去的内容啦 ~

打造个人写作系统

Obsidian也有手机客户端,国内的市场好像没有,可以在Google Play商店下载,有需要的朋友也可以联系我分享给你。

四、总结

经过上面搭建配置,基本满足了我的写作的需求。其实也没什么技术含量,也都是基于成熟的解决方案。欢迎有兴趣的小伙伴共同探讨,相互学习。

原创文章,作者:Kevin,如若转载,请注明出处:https://zwenkai.com/create-personal-writing-system/

(4)
KevinKevin
上一篇 2024年1月14日
下一篇 2022年4月22日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注