冯梦华的日常

新年快乐

新的一年又到啦,马上就毕业了!大学四年飞快地度过。

rustic-page 项目很久没有提交新的代码了,过段时间会提交一些新的功能代码,这个项目我想着尽量不去反复地重构。

Clash 删库

昨天 clash for windows 删库,今天(2023-11-03) clash 也删库了。前者的删库并没有太大的影响,因为它只是后者的 GUI 工具而已,但是后者的删库则有些严重了,这意味着clash 彻底失去了更新维护。clash 的开发者可是是为了暂时规避 cfw 的影响,当然也不排除他已经受到了政府的迫害,目前还没有更多的消息。

另一个比较常用的代理软件就是 V2Ray 了, 目前没有看出受到了影响,这取决于开发者是否处于国内,是否会受到政府监控的压力。

这里出现了一个比较悲伤观点:世界上并没有那么多对网络严格监管的国家,这意味着在自由的国家中,并没有如此多的开发者愿意去创造和提供高隐私和高安全性的网络代理工具,这意味着,这类软件的开发者大概率也是受到了互联网的封锁,意味着他们也大概率在独裁威权国家里生活。

我真的感到非常的伤心。

当神话故事中的人类看到带给他们火种的普罗米修斯被锁在高加索山之上,日日被巨鹰啄食的时候,我想他们也会很伤心吧。

九月与十月

这个月继续完善 rustic-pages ,这个项目是八月的时候发起的,十月我对它进行了一次重构,目前已经基本完成,代码并没有进行什么模块的拆分,因为我还没完全吃透 rust ,随意套用一些模式会出现意想不到的问题。

因为 rust 的特性,引用借用这些很严格,所以在 0.1.4 以前的版本中,我并没有使用生命周期,所以这不可避免得导致了解析和生成的缓慢,但这仍然是可以接受的。在重构之前,我对 rust 的生命周期理解得还不充分,在拆分模块之后,代码几乎无法正确运行,同时依赖的包也无法自动解析这类的引用类型,我想我在学习 rust 的时候必然是缺失了一些知识,我对数据类型的了解还不够充分。

但是这是一个长期的项目,文档编写的工作也十分繁琐,前期的需求文档已经不足以支持我继续开发了,很多新的特性也在我脑子里蹦出来,我需要更多的时间去完成这些工作。但是目前的我最缺少的就是时间,我仍在准备研究生考试,加之我最近打算弄一个软件著作,时间上总是有些不够呢。


不同于之前的观念,维护一个项目是有趣的,将脑海里的新特性实现于代码之中,这确实很有成就感。

当然了,其实我应该多加入一些方便用户使用的脚本或者功能,事实上,目前的版本只能是将 sources 里的 markdown 源文件渲染到 public 里,但是没有实现类似与 Hexo 中的 deploy 指令,这涉及到一些 git 操作,我目前还是不太了解,虽然我在我自己博客中实现了这一脚本,但是我不确定如果这个脚本在其他电脑中会出现些什么。

#!/bin/bash

current_datetime=$(date +"%Y-%m-%d %H:%M:%S")
TEMP_DIR=$(mktemp -d)
cp -r public/* "$TEMP_DIR"
cd "$TEMP_DIR"
git init

git add .
git commit -m "Update: $current_datetime"
git remote add origin "git@github.com:fengyarnom/fengyarnom.github.io.git"
git push -f origin "master:gh-pages"
# 清理临时目录
cd ..
rm -rf "$TEMP_DIR"

Rustic-pages 需求与开发文档

1. 引言

要求使用 Rust 编写一个高效且易于使用的静态博客生成器,它将能正确处理 Markdown 和 SCSS 文件的文件。

它将支持以下命令行指令:

  • init: 初始化程序,创建相应文件夹及内容

  • generate : 渲染和生成所有的静态网站内容

  • clean : 清除缓存

  • server : 本地部署服务,该指令应该默认调用 cleangenerate

  • deploy : 自动部署静态文件到指定仓库

所有的内容应该均以变量的形式预先准备,然后再根据规则渲染文件。

2. 功能需求

2.1 博文编辑

  • 用户可以创建、编辑和删除博文。
  • 博文内容支持 Markdown 格式,允许用户使用 Markdown 语法编写博文。
  • 用户可以设置博文的标题、发布日期、标签和归档。
  • 用户可以上传图片和附件,并在博文中引用它们。
  • 用户可以保存博文为草稿,随时继续编辑。

2.2 博文生成

  • 用户可以使用命令行工具生成静态网站。
  • 博客生成器将从用户指定的目录中读取博文和资源文件,并生成静态 HTML 文件。
  • 用户可以指定生成的网站目标路径。
  • 生成的网站应包括主页、博文详细页、归档页、分类页面和标签页面。

2.3 主题和样式

  • 用户可以选择不同的博客主题和样式。
  • 博客生成器应支持多个默认主题,用户也可以自定义主题。
  • 用户可以自定义网站的样式表(CSS)。

3. 功能模块

3.1 数据结构

3.1.1 Post

  • title: String

  • date: String

  • date_simple : String

  • published: bool

  • tags: Vec

  • categories: Vec

  • raw_content: String

  • content: String

  • slug: String

  • link: String

3.1.2 Page

  • title: String,

  • date: String,

  • template: String,

  • raw_content: String,

  • content: String,

  • limited_cows:usize,

  • total: usize,

  • current: usize,

  • prev:usize,

  • prev_link: String,

  • next:usize,

  • next_link: String

3.1.3 Archive

  • posts - Vec
  • pages: Vec
  • tags: HashMap<String,Vec<& Post>>
  • categories: HashMap<String,Vec<& Post>>

3.1.4 Config

pass

3.2 构建逻辑(Generate)

  1. 程序首先构造一个 Archive 实例,用于保存接下来所有的变量数据。

  2. Post 处理过程

    1. 从 /source/content/posts 中获取所有的 markdown 文件,并进行解析,封装为一个可操作的 Post 数据实例。
    2. 所有的Post 插入到 Archive.posts
  3. Tag 处理过程

    1. 遍历 Archive.posts 将每个Post 内的 Tag 解析
    2. 所有的 Tag 插入到 Archive.tags
  4. Category 处理过程

    1. 遍历 Archive.posts 将每个Post 内的 Category 解析
    2. 所有的 Category 插入到 Archive.categories
  5. 页面构造逻辑

    1. 从 /source/content/pages 中获取所有的 markdown 文件,进行解析,封装为一个可操作的 Page 数据实例
    2. 所有的 Page 插入到 Archive.pages
    3. 若是front-matter 带有 pagination: tags,则对 Archive.tags 触发分页
    4. 若是front-matter 带有 template: xxx ,则渲染模板,否则默认输出 content

3.3 路径渲染逻辑

  • Index - Page
    • /public/index.html
    • /public/page/N/index.html
  • Archive
    • /public/archive/posts/2023/12/10/hello/index.html
    • /public/archive/tags/技术/index.html
    • /public/archive/categories/算法/index.html
  • Tags - Page
    • /public/tags/index.html
    • /public/tags/page/N/index.html
  • Categories - Page
    • /public/categories/index.html
    • /public/categories/page/N/index.html
  • Custom Page
    • /public/custom/index.html
    • /public/custom/page/N/index.html

README 文档

A lightweight static blog generator developed using Rust

Usage

You can compile the source code of this project using the cargo build command.

cargo build

When you run cargo build, it searches for the Cargo.toml file in the current directory and builds the project based on the configuration information specified in that file. Cargo.toml is the configuration file for Rust projects and contains the project’s dependencies and other build configurations.

我的静态博客生成器

近些日子无心向学,于是又手痒折腾起了代码。

起因是接触到了 Rust 这门语言,并了解到了它的很多特性。我认为这真的是一个很棒的语言并且惊叹于它的性能。正因如此,我决定以此为契机,开始了一个新的项目,一个使用 Rust 编写的静态博客生成器。

项目情况

目前它只是一个堪堪能用的状态,我甚至还没想好它的名字,现在只是使用 static-blog-rust-make 作为项目名字,我并没有想出一个正式的名字。我目前开源在Github 上,由于时间实在是不够用,我在有限的时间内已经做到了极限,优化代码和新功能的添加只能在日后完成了,但是,我仍然十分满意于这个项目!

虽然如此,这个生成器确实已经可以正常使用。我用它来重新生成了一个这个网站,并将之前为 Hexo 写的主题应用其中。目前的版本是 v0.03 。项目仅仅是一个粗劣地模仿 Hexo 的产物,并没有融入很多我的思考,很多核心功能也只是调用别人写好的包,但是这次的代码仍然给我很多地启示,我发觉我开始接触到了很多软件工程的内容,同时对一个项目的整体规划有了一些了解。总之,这一次的项目开发还是很有意思的,之后的一段时间会着手于新的开发文档,并希望能在书写开发文档的过程中,思考更多新的功能。

最后,这是一个非常不完美的项目,里面的代码混乱不堪,复杂的逻辑结构几乎把我压倒。在多次重构和清理冗杂代码后,确实完成了我一开始定下的所有功能需求,但是这样的代码总归让人看了倒胃口,但也只能在之后的日子里慢慢修改完善啦,至少它没有夭折在漫长的开发期中。我确实是以最快的速度开发的,为的就是减少枯燥,目前看来确实如此,我在耐心消耗殆尽前完成了这个项目。

你好,OrangePi Zero3!

本篇文章将详细地写下我配置这块单板计算机的全过程,之后若是有新的自托管服务也会在本文记录下来。

购买

自从接触 Linux 之后渴望得到一个树莓派了,奈何因为疫情导致了全球的芯片供应紧张,树莓派的价格水涨船高,价格已经远远超过了它的价值,更重要的是超过了我的预算,即使是二手的价格也非常不值当。总之,出于囊中羞涩的考虑,我最终选择了这块国产的派 —— OrangePi Zero3.

2023-08-17_12-27.png

我购买的是内存为 1.5G 的版本价格为一百出头,刚拿到快递的时候我就疑惑了, 为何如此之小!开箱后更是震惊,它甚至没有我的巴掌大呢!虽然但是,这还是很精致的,而且对于这样的设备而言,小其实是更好的,更方便搭载在其他的设备上。

photo_6264513425795298480_y.jpg

除开这块板子,我还另外买了:

  • 亚克力的外壳
  • 风扇+散热片
  • USB to TTL 用于串口调试
  • 64G 闪迪 tf 卡

关于系统镜像方面,我还是选择了熟悉的 debian 发行版,毕竟我的 vps 用的也是这个,这块单板计算机我是拿来内网穿透的 官方镜像

2023-08-17_12-42.png

系统配置

在向 tf 卡刷完系统后,就可以通过串口进行连接了。

自动连接热点 WiFi

使用串口多少是不方便的,所以先来配置一下网络,让其他机器可以通过 ssh 访问这块板子。

  1. 使用nmcli dev wifi查看当前扫描到的 wifi 列表。

  2. 使用 nmcli 连接到热点并输入密码:

sudo nmcli dev wifi connect YourHotspotName password YourPassword
  1. 将连接的配置设置为自动连接:
sudo nmcli connection modify "YourHotspotName" connection.autoconnect yes

YourHotspotName 替换为你的热点名称,YourPassword 替换为密码。

完成后通过 ip addr 即可看到 ip 地址,然后就可以通过 ssh 正常访问板子了

添加一个新用户

useradd -m -G additional_groups -s login_shell username
passwd username

然后去修改 /etc/sudoers 文件

FRP 内网穿透

在这个 releases 页面中,找到对应架构的压缩包,可以使用 uname -a 查看到。

通过 wget 下载

wget https://github.com/fatedier/frp/releases/download/v0.51.3/frp_0.51.3_linux_arm64.tar.gz

通过 tar 解压

tar xvf frp_0.51.3_linux_arm64.tar.gz
  • frpc: 这是 FRP 客户端的可执行文件。FRP 客户端用于连接到 FRP 服务器并将内部网络服务暴露给外部访问。
  • frps: 这是 FRP 服务器的可执行文件。FRP 服务器用于接收来自客户端的连接,并将这些连接转发到内部的网络服务。
  • frpc.ini: 这是 FRP 客户端的配置文件,用于指定客户端的连接设置、代理规则等。
  • frps.ini: 这是 FRP 服务器的配置文件,用于指定服务器的监听端口、代理规则等。
  • frpc_full.ini: 这是 FRP 客户端的完整配置文件,可能包含更多详细的设置。
  • frps_full.ini: 这是 FRP 服务器的完整配置文件,可能包含更多详细的设置。

服务器配置

下载完对应架构的文件后,即可开始配置,只需要关心 frpsfrps.ini 文件即可,前者是FRP 服务器的可执行文件,后者是这是 FRP 服务器的配置文件。

打开 frps.ini进行配置,配置文件的内容如下:

[common]
bind_port = 7000
token = 1234567890

客户端和服务器的配置文件中都需要设置相同的 Token 才能正确进行连接和通信。

为了保障安全性,你应该选择一个强密码的 Token,并确保不会轻易泄露给他人。如果你怀疑 Token 可能已经暴露,应当立即生成一个新的 Token 并更新配置文件。

完成后,运行 ./frpc -c ./frpc.ini

若无问题,则说明配置成功。

接下来,配置一下 systemd 服务,让上面这条运行命令能开机自动启动,这非常实用:

但是在此之前,我们需要先将 frpsfrps.ini 文件放到合适的地方:

sudo cp frps /usr/local/bin/
sudo mkdir /usr/local/etc/frp
sudo cp frps.ini /usr/local/etc/frp/

首先,创建一个名为frps.service的文件,该文件将存储有关你的自启动服务的信息。通常,这些文件存放在/etc/systemd/system/目录下。

sudo vim /etc/systemd/system/frps.service
[Unit]
Description=frps
After=network.target
[Service]
TimeoutStartSec=30
WorkingDirectory=/usr/local/bin/
ExecStart=/usr/local/bin/frps -c /usr/local/etc/frp/frps.ini
Restart=on-failure
[Install]
WantedBy=multi-user.target

保存后,执行:

sudo systemctl enable frps
sudo systemctl start frps
sudo systemctl status frps

若无问题,则可进入客户端的配置。

下面是一些常用的命令:

  • 启动服务:sudo systemctl start frps
  • 停止服务:sudo systemctl stop frps
  • 重启服务:sudo systemctl restart frps
  • 查看服务状态:sudo systemctl status frps
  • 关闭自启动:sudo systemctl disable frps

客户端配置

下载完对应架构的文件后,即可开始配置,只需要关心 frpcfrpc.ini 文件即可,前者是FRP 客户端的可执行文件,后者是这是 FRP 客户端的配置文件。

假设:

服务器的ip地址是 1.1.1.1, 服务端frp正在监听的端口是7000, token是1234567890

客户端目前正在运行一个项目叫 bitwarden ,它正在本地 0.0.0.0 地址上监听 1111 端口

打开 frpc.ini进行配置,配置文件的内容如下:

[common]
server_addr = 1.1.1.1
server_port = 7000
token = 1234567890

[bitwarden]
type = tcp
local_ip = 0.0.0.0
local_port = 1111
remote_port = 8111

值得注意的是,配置文件中的 [bitwarden] 可以替换成任何想要的名字

为了方便,我们同样设置 systemd 服务

但是在此之前,我们需要先将 frpcfrpc.ini 文件放到合适的地方:

sudo cp frpc /usr/local/bin/
sudo mkdir /usr/local/etc/frp
sudo cp frpc.ini /usr/local/etc/frp/

首先,创建一个名为frpc.service的文件,该文件将存储有关你的自启动服务的信息。通常,这些文件存放在/etc/systemd/system/目录下。

sudo vim /etc/systemd/system/frpc.service
[Unit]
Description=frpc
After=network.target
[Service]
TimeoutStartSec=30
WorkingDirectory=/usr/local/bin/
ExecStart=/usr/local/bin/frpc -c /usr/local/etc/frp/frpc.ini
Restart=on-failure
[Install]
WantedBy=multi-user.target

保存后,执行:

sudo systemctl enable frpc
sudo systemctl start frpc
sudo systemctl status frpc

若无问题的话,则说明没有问题!

原理

Frp(Fast Reverse Proxy)是一个用于内网穿透的工具,它允许你在公网上访问位于内网的计算机服务。它的原理是通过在公网服务器上部署 frps(Frp 服务器端)和在内网机器上部署 frpc(Frp 客户端),通过公网服务器作为中转,将外部请求转发到内网机器上。

  • 在公网服务器上部署 frps:公网服务器上运行的 frps 监听一个指定的端口,等待来自 frpc 的连接。
  • 在内网机器上部署 frpc:内网机器上的 frpc 将建立到 frps 的连接,并注册自己的服务信息。frpc 和 frps 之间建立的连接可以被用于穿透数据。
  • 数据传输:当公网客户端请求连接到公网服务器的指定端口时,frps 会将这个请求转发给已经连接的 frpc 客户端,然后 frpc 客户端再将请求转发到内网机器的指定服务上。

在我上面的配置中,其转换的意思就是:

frps 监听在公网服务器的 7000 端口,frpc 连接到公网服务器的 7000 端口,并注册自己的服务信息。frpc 客户端配置了一个类型为 TCP 的服务,将本地的 bitwarden 服务映射到公网服务器的 8111 端口上。

若是请求 https://1.1.1.1:8111 那么这个请求就转发给客户端的 http://0.0.0.0:1111

Nginx 配置

我在服务器中是使用 Nginx 来进行反向代理的,若你的服务器不是,则可以跳过此内容。若你完全不了解 nginx 建议先去学习了之后再回来进行配置,因为此处我写得很简略,可能会对你产生误导。

我的 Nginx 代理了80端口,所有的请求都是从此处进入上文提到,需要从 8111 端口进入才能访问内网,所以我需要对 nginx 添加一些配置:

2023-08-17_15-48.png

这样,当请求 bitwarden 路径时,将会反向代理到 8111 端口

当然,通过 nginx 也可以配置子域名来访问,首先将三级域名 bitwarden.yarnom.top 通过 CNAME 指向当前的服务器地址

然后,nginx 设置一个新的 server ,server_name 就是这个三级域名:

2023-08-17_15-26.png

搭建 Vaultwarden

由于官方的 Bitwarden 服务对于我的小机子来说过于庞大了,所以选择了社区用 Rust 编写 Vaultwarden 项目

它可以用 docker 搭建,那就是几条命令就能安装完毕:

Pull the docker image and mount a volume from the host for persistent storage:

docker pull vaultwarden/server:latest
docker run -d --name vaultwarden -v /vw-data/:/data/ --restart unless-stopped -p 80:80 vaultwarden/server:latest

完成!

搭建 Memos

docker 搭建

docker run -d --name memos -p 5230:5230 -v ~/.memos/:/var/opt/memos ghcr.io/usememos/memos:latest

自行修改参数即可。

完成!