update hugo config and update posts

This commit is contained in:
2026-01-07 08:30:24 +08:00
parent 76b0970d29
commit f33537641a
12 changed files with 1620 additions and 7 deletions
+570
View File
@@ -0,0 +1,570 @@
---
title: Git 完整教程指南
tags: ["git", "版本控制", "教程"]
date: 2025-10-08
summary: "从零开始学习 Git 版本控制系统,包含基础概念、常用命令、分支管理、协作流程等完整内容。"
---
> 本教程适用于 Git 初学者到进阶用户,涵盖日常开发中 90% 的使用场景。
## 什么是 Git
Git 是一个分布式版本控制系统,用于跟踪文件的修改历史。与集中式版本控制系统(如 SVN)不同,Git 的每个工作副本都是完整的仓库,包含项目的完整历史记录。
### Git 的核心概念
- **仓库(Repository)**: 项目的版本控制中心,包含所有文件的历史记录。
- **工作目录(Working Directory)**: 你在本地进行修改的文件所在目录。
- **暂存区(Staging Area)**: 一个中间区域,用于暂存你要提交的文件变更。
- **本地仓库(Local Repository)**: 你在本地计算机上的仓库,包含完整的历史记录。
- **远程仓库(Remote Repository)**: 托管在服务器上的仓库,用于与团队成员共享代码。
### Git 工作流程
```mermaid
graph TB
subgraph "Git 工作区域"
A[工作目录<br/>Working Directory]
B[暂存区<br/>Staging Area]
C[本地仓库<br/>Local Repository]
D[远程仓库<br/>Remote Repository]
end
A -->|git add| B
B -->|git commit| C
C -->|git push| D
D -->|git pull| C
C -->|git checkout| A
style A fill:#e3f2fd
style B fill:#f3e5f5
style C fill:#e8f5e9
style D fill:#fff3e0
```
## Git 安装与配置
### 安装 Git
**Windows**: 下载并安装 [Git for Windows](https://git-scm.com/download/win)
**macOS**:
```bash
# 使用 Homebrew
brew install git
# 或者下载安装包
# https://git-scm.com/download/mac
```
**Linux (Ubuntu/Debian)**:
```bash
sudo apt update
sudo apt install git
```
**Linux (CentOS/RHEL)**:
```bash
sudo yum install git
```
### 基础配置
```bash
# 配置用户信息(必须)
git config --global user.name "你的名字"
git config --global user.email "your.email@example.com"
# 配置默认分支名(推荐)
git config --global init.defaultBranch main
# 配置文本编辑器(可选)
git config --global core.editor vim
# 查看配置
git config --list
```
## Git 基础操作
### 初始化仓库
```bash
# 在当前目录初始化 Git 仓库
git init
# 克隆远程仓库
git clone https://github.com/username/repository.git
# 克隆并指定目录名
git clone https://github.com/username/repository.git my-project
```
### 文件状态管理
```bash
# 查看文件状态
git status
# 添加文件到暂存区
git add filename.txt
git add . # 添加所有文件
git add -A # 添加所有变更(包括删除)
# 从暂存区移除文件
git reset filename.txt
# 提交变更
git commit -m "提交信息"
git commit -m "标题" -m "详细描述"
# 跳过暂存区直接提交
git commit -am "提交信息"
```
### 查看历史
```bash
# 查看提交历史
git log
# 简洁查看
git log --oneline
# 查看最近5次提交
git log -5
# 查看文件修改历史
git log --follow filename.txt
# 查看每次提交的差异
git log -p
# 查看统计信息
git log --stat
```
### 撤销操作
```bash
# 撤销工作区的修改
git checkout -- filename.txt
# 撤销暂存区的文件
git reset HEAD filename.txt
# 修改最后一次提交
git commit --amend -m "新的提交信息"
# 回退到指定版本
git reset --hard commit-hash
# 软回退(保留修改)
git reset --soft commit-hash
```
## 分支管理
### 分支概念
```mermaid
graph LR
A[main分支] --> B[创建feature分支]
B --> C[开发新功能]
C --> D[合并回main]
A --> E[创建hotfix分支]
E --> F[修复bug]
F --> D
style A fill:#4caf50
style B fill:#2196f3
style C fill:#2196f3
style D fill:#4caf50
style E fill:#ff9800
style F fill:#ff9800
```
### 分支操作
```bash
# 查看分支
git branch # 本地分支
git branch -r # 远程分支
git branch -a # 所有分支
# 创建分支
git branch feature-login
git checkout -b feature-login # 创建并切换
# 切换分支
git checkout main
git switch main # Git 2.23+ 新命令
# 合并分支
git merge feature-login
# 删除分支
git branch -d feature-login # 安全删除
git branch -D feature-login # 强制删除
# 重命名分支
git branch -m old-name new-name
```
### 解决冲突
当合并分支时出现冲突:
```bash
# 1. 查看冲突文件
git status
# 2. 手动编辑冲突文件
# 删除冲突标记,保留需要的代码
# 3. 标记冲突已解决
git add filename.txt
# 4. 完成合并
git commit
```
## 远程仓库操作
### 连接远程仓库
```bash
# 添加远程仓库
git remote add origin https://github.com/username/repository.git
# 查看远程仓库
git remote -v
# 重命名远程仓库
git remote rename origin github
# 删除远程仓库
git remote remove origin
```
### 推送与拉取
```bash
# 推送到远程仓库
git push origin main
# 首次推送(设置上游分支)
git push -u origin main
# 强制推送(谨慎使用)
git push -f origin main
# 拉取更新
git pull origin main
# 获取更新但不合并
git fetch origin
```
### 标签管理
```bash
# 创建标签
git tag v1.0.0
git tag -a v1.0.0 -m "版本说明"
# 查看标签
git tag
# 推送标签
git push origin v1.0.0
git push origin --tags
# 删除标签
git tag -d v1.0.0
git push origin --delete v1.0.0
```
## 高级功能
### Stash(暂存)
```bash
# 保存当前工作进度
git stash
# 查看保存的进度
git stash list
# 恢复最近保存的进度
git stash pop
# 恢复指定的进度
git stash apply stash@{1}
# 删除保存的进度
git stash drop stash@{0}
```
### Cherry-pick
```bash
# 选择性地合并某个提交
git cherry-pick commit-hash
# 合并多个提交
git cherry-pick commit1 commit2
# 继续合并(解决冲突后)
git cherry-pick --continue
```
### Rebase
```bash
# 交互式 rebase
git rebase -i HEAD~3
# 继续 rebase
git rebase --continue
# 中止 rebase
git rebase --abort
# 跳过当前提交
git rebase --skip
```
### 子模块
```bash
# 添加子模块
git submodule add https://github.com/user/repo.git path/to/submodule
# 初始化子模块
git submodule init
# 更新子模块
git submodule update
# 递归更新
git submodule update --recursive --remote
```
## Git 工作流程
### Git Flow 工作流
```mermaid
graph TB
A[main] --> B[develop]
B --> C[feature/feature-1]
B --> D[feature/feature-2]
C --> B
D --> B
B --> E[release/v1.0]
E --> A
E --> F[hotfix/fix-1]
F --> A
F --> B
style A fill:#4caf50
style B fill:#2196f3
style C fill:#9c27b0
style D fill:#9c27b0
style E fill:#ff9800
style F fill:#f44336
```
### GitHub Flow
1. **创建分支**:从 main 分支创建功能分支
2. **提交修改**:在功能分支上进行开发
3. **创建 Pull Request**:提交代码审查
4. **代码审查**:团队成员进行代码审查
5. **合并分支**:审查通过后合并到 main 分支
6. **部署**:自动或手动部署到生产环境
### GitLab Flow
结合 Git Flow 和 GitHub Flow 的优点,支持多环境部署。
## 实用技巧
### 配置别名
```bash
# 配置常用别名
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.unstage 'reset HEAD --'
git config --global alias.last 'log -1 HEAD'
git config --global alias.visual '!gitk'
```
### 忽略文件
创建 `.gitignore` 文件:
```
# 忽略所有 .log 文件
*.log
# 忽略 node_modules 目录
node_modules/
# 忽略 IDE 配置文件
.vscode/
.idea/
# 忽略操作系统文件
.DS_Store
Thumbs.db
# 忽略编译输出
dist/
build/
*.exe
*.dll
```
### 查看文件差异
```bash
# 查看工作区与暂存区的差异
git diff
# 查看暂存区与仓库的差异
git diff --staged
# 查看两个提交的差异
git diff commit1 commit2
# 查看文件的历史修改
git log -p filename.txt
```
### 统计信息
```bash
# 查看提交统计
git shortlog -sn
# 查看代码行数统计
git log --stat
# 查看贡献者
git log --pretty=format:"%an" | sort | uniq -c | sort -nr
```
## 常见问题解决
### 误提交大文件
```bash
# 从仓库中删除大文件
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch path/to/large-file' \
--prune-empty --tag-name-filter cat -- --all
# 清理和垃圾回收
git reflog expire --expire=now --all
git gc --prune=now --aggressive
```
### 修改历史提交信息
```bash
# 修改最近一次提交
git commit --amend
# 修改历史提交(交互式)
git rebase -i HEAD~3
```
### 找回丢失的提交
```bash
# 查看引用日志
git reflog
# 恢复到某个状态
git reset --hard HEAD@{1}
```
### 子模块问题
```bash
# 更新子模块
git submodule update --init --recursive
# 克隆包含子模块的仓库
git clone --recursive https://github.com/user/repo.git
```
## 最佳实践
### 提交信息规范
```
类型(范围): 简短描述
详细描述(可选)
Fixes #123
```
**类型说明**
- `feat`: 新功能
- `fix`: 修复bug
- `docs`: 文档更新
- `style`: 代码格式调整
- `refactor`: 代码重构
- `test`: 测试相关
- `chore`: 构建过程或辅助工具的变动
### 分支命名规范
- `feature/功能名称`:新功能开发
- `bugfix/bug描述`bug修复
- `hotfix/紧急修复`:紧急修复
- `release/版本号`:发布准备
- `test/测试名称`:测试相关
### 工作流程建议
1. **频繁提交**:小而频繁的提交比大而少的提交更好
2. **明确提交信息**:写清楚提交的目的和内容
3. **及时拉取**:开始工作前拉取最新代码
4. **使用分支**:不要在主分支上直接开发
5. **代码审查**:提交前进行自我审查
6. **保持同步**:定期与远程仓库同步
## 学习资源
### 官方资源
- [Git 官方文档](https://git-scm.com/doc)
- [Pro Git 书籍](https://git-scm.com/book/zh/v2)
- [GitHub Guides](https://guides.github.com/)
### 交互式学习
- [Learn Git Branching](https://learngitbranching.js.org/)
- [GitHub Learning Lab](https://lab.github.com/)
- [Git 小游戏](https://onlywei.github.io/explain-git-with-d3/)
### 可视化工具
- [GitKraken](https://www.gitkraken.com/)
- [SourceTree](https://www.sourcetreeapp.com/)
- [GitHub Desktop](https://desktop.github.com/)
## 总结
Git 是现代软件开发中不可或缺的工具。掌握 Git 不仅能够提高开发效率,还能更好地与团队协作。本教程涵盖了 Git 的核心概念和常用操作,建议通过实践来加深理解。
记住 Git 的学习曲线可能有些陡峭,但一旦掌握,它将成为你开发工具箱中最强大的工具之一。持续练习,遇到问题不要害怕,Git 的强大功能值得你投入时间学习。
---
> 💡 **提示**:Git 命令很多,不需要全部记住。常用的命令熟练掌握即可,其他的可以按需查询。建议收藏本教程作为参考手册。
+50
View File
@@ -0,0 +1,50 @@
---
title: Linux 硬链接
tags: ["linux"]
date: 2024-12-04
summary: "在 Linux 系统中,文件的存储与管理是通过链接来实现的。硬链接是其中一种重要的链接类型,本文将详细介绍硬链接的概念、创建方法及其应用场景。"
---
在 Linux 系统中,文件的存储与管理是通过链接来实现的。硬链接是其中一种重要的链接类型,本文将详细介绍硬链接的概念、创建方法及其应用场景。
## 什么是硬链接?
硬链接是指向文件系统中某个文件数据块的直接引用。通过硬链接,多个文件名可以指向同一个数据块,即使一个文件被删除,其他指向相同数据块的硬链接仍然存在并可以访问数据。这意味着硬链接并不创建文件的副本,而是创建了一个新的目录项。
## 硬链接的特点
1. **共享数据**:多个文件名共享同一个数据块,节省存储空间。
2. **不支持跨文件系统**:硬链接只能在同一个文件系统中创建,无法链接到其他文件系统的文件。
3. **目录不能创建硬链接**:为了防止循环引用,通常不允许为目录创建硬链接(只有超级用户可以)。
4. **引用计数**:每个文件在文件系统中都有一个引用计数,表示有多少个硬链接指向该文件。当引用计数减为零时,文件数据才会被实际删除。
## 示例
1. 创建一个名为 `file1.txt` 的文件:
```shell
echo "Hello, Linux!" > file1.txt
```
2. 创建一个硬链接 `file2.txt`
```shell
ln file1.txt file2.txt
```
3. 检查链接:
```shell
ls -l
```
## 实际应用
之前有朋友问我,威联通的外部设备如何做共享,想在外部设备里面存电影,挂载到emby上,但是由于外置在威联通系统里压根就没法共享,导致无法在emby里引用出来。
说到这很多朋友大概能明白了,可以直接在可以引用的目录里创建一个硬链接,让程序访问这个硬链接即可。
说白了,linux下的硬链接有点类似于windows上的快捷方式。
+55
View File
@@ -0,0 +1,55 @@
---
title: Linux文件系统概述
tags: ["linux"]
date: 2024-12-04
---
Linux的文件系统结构是其核心组成部分之一,它以一种层次化的方式组织数据,使得用户和程序能够高效地访问和管理文件。以下是一些关键概念和特点:
## 1\. 层次化结构
Linux的文件系统是从根目录(\`/\`)开始的。所有文件和目录都在这个根目录下,形成树状结构。常见的目录包括:
- ** `/bin` ** :存放基本命令的二进制文件。
- ** `/etc` ** :系统配置文件。
- ** `/home` ** :用户的主目录,每个用户在此有自己的文件夹。
- ** `/var` ** :存放可变数据,如日志文件和邮件。
这种层次化结构有助于保持系统的整洁和高效。
## 2\. 文件权限
Linux对文件和目录的管理非常注重安全性,采用了严格的文件权限机制。每个文件和目录都有三种基本权限:
- **读(r)** :允许查看文件内容或列出目录内容。
- **写(w)** :允许修改文件内容或添加/删除目录内容。
- **执行(x)** :允许执行文件(如果是可执行文件)或访问目录。
此外,文件权限是分为三类的:
- **用户(u)** :文件的所有者。
- **组(g)** :与文件所有者同属一个组的用户。
- **其他(o)** :所有其他用户。
## 3\. 硬链接与软链接
Linux支持两种类型的链接:
- **硬链接**:指向同一文件的多个目录项,实际上是同一数据块,删除一个不会影响其他。
- **软链接(符号链接)** :指向另一个文件的路径,如果目标文件被删除,软链接会失效。
## 4\. 文件系统的挂载
Linux支持多种文件系统(如ext4、XFS等),可以通过挂载(mount)将其他文件系统整合进当前的文件系统结构中。挂载点是一个目录,挂载后,外部文件系统的内容会出现在该目录下。
## 5\. 文件系统的管理
在Linux中,文件系统的管理包括格式化、检查和修复等操作。常用工具包括:
- ** `mkfs` ** :用于创建文件系统。
- ** `fsck` ** :用于检查和修复文件系统错误。
---
---
Linux文件系统的设计强调灵活性、安全性和效率,使得用户可以轻松地管理和组织文件。理解文件系统结构和权限机制对于使用和管理Linux系统至关重要。
+30
View File
@@ -0,0 +1,30 @@
---
title: docker搭建思源笔记
tags: ["linux","docker"]
date: 2024-11-23
summary: "docker搭建思源笔记..."
---
- `PUID`: 自定义用户 ID(可选,如果未提供,默认为 `1000`
- `PGID`: 自定义组 ID(可选,如果未提供,默认为 `1000`
- `workspace_dir_host`:宿主机上的工作空间文件夹路径
- `accessAuthCode`:访问授权码,请**务必修改**,否则任何人都可以读写你的数据(必须配置,否则容器无法启动)
---
# docker-compose
version: "3.9"
services:
main:
image: b3log/siyuan
command: ['--workspace=/siyuan/workspace/', '--accessAuthCode=xxx']
ports:
- 6806:6806
volumes:
- workspace_dir_host:/siyuan/workspace
restart: unless-stopped
environment:
- TZ=Asia/shanghai
- PUID=${YOUR_USER_PUID} # 自定义用户 ID
- PGID=${YOUR_USER_PGID} # 自定义组 ID
@@ -0,0 +1,175 @@
---
title: frp内网穿透使用指南
tags: ["linux"]
date: 2024-12-02
summary: "frpFast Reverse Proxy)是一个高性能的反向代理应用,主要用于内网穿透。..."
---
## 什么是 frp
frpFast Reverse Proxy)是一个高性能的反向代理应用,主要用于内网穿透。它可以将内网服务暴露到公网上,方便外部访问。
有很多小伙伴,家里都有性能很强大的电脑,但是苦于没有公网 IP,导致无法在互联网上部署自己的网站或者服务,而 frp 内网穿透就是用来解决这个问题的。
---
- 首先你得拥有一台具有公网 IP 的服务器,如果你只是用来进行内网穿透的话,性能并不需要很强,1h1g 是肯定够用了。
- 其次,在中国境内的服务器因为种种原因,需要进行网站备案,所以我这里更推荐你去购买香港或者美国的服务器,可以免备案。会省下很多麻烦事。
> PS: 这里推荐一下本站在用的服务器 CloudCone,价格便宜实惠,流量大,用作 frp 服务器绰绰有余。我这边购买的是 2h1g 服务器,一年也就 130 元人民币,并且还支持支付宝直接支付,无需 VISA 卡之类的,本站强烈推荐!!!!
---
## frp 内网穿透
frp 一共分为两个部分:
- **服务器**:一个具有公网 IP 的服务器,运行 frpsfrp server)。
- **客户端**:一台处于内网中的机器,运行 frpc(frp client)。
### frps(服务端)
1. 前往 [frp GitHub Releases 页面](https://github.com/fatedier/frp/releases) 下载适合你服务器操作系统的 frp 包。(一般linux64位系统选择linux\_amd64即可)
2. 解压缩下载的包:
tar -zxvf frp_x.x.x_linux_amd64.tar.gz
3. 进入解压好的目录,找到frps.toml文件
vim frps.toml
4. 编辑frps.toml文件
```sh
[common]
# frps 服务端的基本配置
# frps 监听的端口,frpc 将通过这个端口连接到 frps
bind_port = 7443
# 用于身份验证的 token,frpc 连接时需要提供相同的 token
token = xxxxxxxxx
# 监控面板的端口(可选),通过这个端口可以访问 frps 的状态信息
dashboard_port = 8443
# 监控面板的用户名和密码,保护监控面板的访问
dashboard_user = new_username
dashboard_pwd = NewPassword!2024
# 允许开放的端口范围,设置为只开放 10000-11000 端口(可自定义开放端口)
allow_ports = 10000-11000
# 日志级别,可选值有 trace, debug, info, warn, error
log_level = info
# 日志文件路径,frps 的日志将写入该文件
log_file = ./frps.log
# 指定日志的最大大小(单位:MB),达到该大小后将进行轮转
max_log_size = 10
# 允许的最大连接数,限制同时连接到 frps 的 frpc 客户端数量
max_connections = 100
# 启用加密传输(可选),可以提高数据传输的安全性
enable_encrypt = true
# 启用 TCP KeepAlive(可选),可以防止由于网络问题导致的连接断开
tcp_keep_alive = true
# 允许的最大数据包大小(单位:字节)
max_packet_size = 8192
```
### frp从(客户端)
前面的步骤都是一样的
- 前往 [frp GitHub Releases 页面](https://github.com/fatedier/frp/releases) 下载适合你服务器操作系统的 frp 包。(一般linux64位系统选择linux\_amd64即可)
- 解压缩下载的包:
tar -zxvf frp_x.x.x_linux_amd64.tar.gz
1. 找到frpc.toml
2. 编辑frpc.toml
```sh
[common]
# frpc 连接到 frps 服务器的配置
# frps 服务器的地址
server_addr = "your_frps_server_ip" # 替换为你的 frps 服务器 IP
# frps 服务器的端口
server_port = 7443 # 与 frps 的 bind_port 一致
# 身份验证 token,必须与 frps 中的 token 一致
token = "xxxxxxxxx"
# 以下是需要开放的服务配置
# 例如,HTTP 服务
[http]
type = "tcp"
local_ip = "127.0.0.1"
local_port = 80 # 本地 HTTP 服务端口
remote_port = 10001 # 通过 frp 暴露的端口
# 其他服务可以继续添加
```
---
> ***这时候通过访问公网服务器ip加上remote_port端口,即可访问你对应的内网服务了!如果访问有不了请检查一下服务器的防火墙,和云服务器上的防火墙。***
这时我们还需要把公网服务器上的frps服务设置为开机自启动
---
- 创建 一个Systemd 服务文件
sudo vi /etc/systemd/system/frps.service
在文件里添加
```
[Unit]
Description=frp server
After=network.target
[Service]
ExecStart=/path/to/frps -c /path/to/frps.toml
Restart=on-failure
User=your_username # 替换为运行 frps 的用户名
WorkingDirectory=/path/to/frp # frp 的工作目录
[Install]
WantedBy=multi-user.target
```
- 重新加载 Systemd
sudo systemctl daemon-reload
- 启动服务并设置为开机自启
sudo systemctl start frpssudo systemctl enable frps
- 查看服务状态
sudo systemctl status frps
- 如果出现错误,大概率是你的路径填写的不对,确保 `ExecStart` 路径指向你的 frps 可执行文件和配置文件的正确路径。
@@ -0,0 +1,373 @@
---
title: gitea 自部署使用体验
tags: ["git","docker"]
date: 2025-11-27
summary: "本文基于 Docker Compose 一键启动 Gitea + Gitea Runner 的实战记录。"
---
> 注意:本文基于 Docker Compose 一键启动 Gitea + Gitea Runner 的实战记录。
## 为什么使用 gitea
使用 gitea,主要原因是它的内存占用低,只有100 M 左右,而 gitlab 官方推荐的最小配置是 4 G 内存。github 在大多数区域访问速度较慢,而 gitea 可以在自部署的情况下,提供与 github 相同的功能。
## 架构速览
Gitea 采用微内核 + 插件扩展的轻量架构,核心组件如下:
1. **Web 服务层**
- 基于 Go 的 HTTP 服务(Gin 框架)
- 提供 Web UI、REST & Git 协议入口
2. **业务逻辑层**
- 路由与中间件(鉴权、CSRF、Session
- 仓库管理(Git 命令封装、钩子触发)
- 组织/用户/权限模型(RBAC)
3. **存储层**
- **SQLite**(默认,单文件零配置)
- **MySQL / PostgreSQL**(生产推荐)
- 文件系统:Git 裸仓库、LFS 对象、头像、日志
4. **后台任务**
- 定时器:镜像同步、归档清理、统计更新
- 队列:邮件、WebHook、索引构建
5. **可选扩展**
- **Gitea Runner**:基于 act(兼容 GitHub Actions)的 CI 执行器
- **包管理**npm、maven、nuget、docker registry 统一入口
### 架构图(Mermaid
```mermaid
graph TB
subgraph "客户端层"
A[Web浏览器]
B[Git客户端]
C[API客户端]
end
subgraph "负载均衡/反向代理"
D[Nginx/Apache]
end
subgraph "Gitea核心服务"
E[Web服务<br/>Gin框架]
F[API服务<br/>RESTful]
G[Git服务<br/>SSH/HTTP]
H[认证授权<br/>Session/OAuth]
end
subgraph "业务逻辑层"
I[仓库管理]
J[用户管理]
K[组织管理]
L[权限控制<br/>RBAC]
M[WebHook]
N[邮件服务]
end
subgraph "数据存储层"
O[数据库<br/>SQLite/MySQL/PostgreSQL]
P[Git仓库<br/>文件系统]
Q[LFS对象存储]
R[缓存<br/>Redis/Memcached]
end
subgraph "后台任务"
S[定时任务<br/>Cron]
T[队列处理<br/>WebHook/邮件]
U[索引构建]
V[镜像同步]
end
subgraph "可选扩展"
W[Gitea Runner<br/>CI/CD]
X[包管理<br/>npm/docker/maven]
Y[代码搜索<br/>Bleve]
end
A --> D
B --> D
C --> D
D --> E
D --> F
D --> G
E --> H
F --> H
G --> H
H --> I
H --> J
H --> K
H --> L
I --> O
I --> P
J --> O
K --> O
L --> O
I --> Q
M --> T
N --> T
S --> V
U --> R
T --> N
W --> P
X --> Q
Y --> R
style A fill:#e1f5fe
style B fill:#e1f5fe
style C fill:#e1f5fe
style D fill:#fff3e0
style E fill:#f3e5f5
style F fill:#f3e5f5
style G fill:#f3e5f5
style H fill:#f3e5f5
style I fill:#e8f5e9
style J fill:#e8f5e9
style K fill:#e8f5e9
style L fill:#e8f5e9
style M fill:#e8f5e9
style N fill:#e8f5e9
style O fill:#ffebee
style P fill:#ffebee
style Q fill:#ffebee
style R fill:#ffebee
style S fill:#fce4ec
style T fill:#fce4ec
style U fill:#fce4ec
style V fill:#fce4ec
style W fill:#e0f2f1
style X fill:#e0f2f1
style Y fill:#e0f2f1
```
### 架构说明
**Gitea** 采用分层架构设计,各层职责清晰:
1. **客户端层**:支持 Web 浏览器、Git 客户端和 API 客户端访问
2. **负载均衡层**:可通过 Nginx/Apache 实现反向代理和负载均衡
3. **核心服务层**:提供 Web UI、API 接口和 Git 协议支持
4. **业务逻辑层**:处理仓库、用户、组织管理和权限控制
5. **数据存储层**:支持多种数据库和文件系统存储
6. **后台任务**:负责定时任务、队列处理和同步操作
7. **扩展功能**:提供 CI/CD、包管理和代码搜索等可选功能
这种架构设计使得 Gitea 具有轻量级、高可用和易扩展的特点。
```mermaid
graph TB
subgraph "客户端层"
A[Web浏览器]
B[Git客户端]
C[API客户端]
end
subgraph "负载均衡层"
D[Nginx/反向代理]
end
subgraph "Gitea核心服务"
E[Web服务<br/>Gin框架]
F[REST API]
G[Git协议处理器]
H[认证授权<br/>RBAC]
I[中间件<br/>CSRF/Session]
end
subgraph "业务逻辑层"
J[仓库管理]
K[用户/组织管理]
L[问题跟踪]
M[PR/MR流程]
N[WebHook系统]
O[通知系统]
end
subgraph "数据存储层"
P[Git仓库<br/>文件系统]
Q[SQLite/MySQL<br/>PostgreSQL]
R[LFS对象存储]
S[会话存储]
T[缓存Redis]
end
subgraph "后台服务"
U[定时任务<br/>镜像同步]
V[队列服务<br/>异步任务]
W[邮件服务]
X[索引构建]
end
subgraph "扩展组件"
Y[Gitea Runner<br/>CI/CD]
Z[包管理<br/>npm/maven]
AA[容器注册表]
end
A --> D
B --> D
C --> D
D --> E
D --> F
D --> G
E --> H
F --> H
G --> H
H --> I
I --> J
I --> K
I --> L
I --> M
I --> N
I --> O
J --> P
K --> Q
L --> Q
M --> P
N --> V
O --> W
V --> U
V --> X
V --> W
J --> Y
J --> Z
J --> AA
P --> R
Q --> S
Q --> T
style A fill:#e1f5fe
style B fill:#e1f5fe
style C fill:#e1f5fe
style D fill:#fff3e0
style E fill:#f3e5f5
style F fill:#f3e5f5
style G fill:#f3e5f5
style H fill:#f3e5f5
style I fill:#f3e5f5
style J fill:#e8f5e8
style K fill:#e8f5e8
style L fill:#e8f5e8
style M fill:#e8f5e8
style N fill:#e8f5e8
style O fill:#e8f5e8
style P fill:#fce4ec
style Q fill:#fce4ec
style R fill:#fce4ec
style S fill:#fce4ec
style T fill:#fce4ec
style U fill:#fff9c4
style V fill:#fff9c4
style W fill:#fff9c4
style X fill:#fff9c4
style Y fill:#e0f2f1
style Z fill:#e0f2f1
style AA fill:#e0f2f1
```
### 架构特点说明
**1. 轻量级设计**
- 单二进制文件部署,内存占用仅100M左右
- 内置Web服务器,无需额外HTTP服务
- SQLite零配置支持,适合个人和小团队
**2. 模块化架构**
- 核心服务与业务逻辑分离
- 插件化扩展机制
- 可选组件按需启用
**3. 数据一致性**
- Git裸仓库直接存储,保证数据完整性
- 数据库存储元数据,支持快速查询
- LFS支持大文件存储
**4. 高可用支持**
- 支持数据库主从复制
- 文件系统可对接分布式存储
- 会话和缓存支持外部存储
## docker compose 部署
> docker 和 docker compose 的安装可以参考 [docker 官方文档](https://docs.docker.com/get-docker/)
```yaml
networks:
gitea:
external: false
services:
gitea:
image: gitea/gitea:latest
container_name: gitea
environment:
- USER_UID=1000
- USER_GID=10
- GITEA__database__DB_TYPE=mysql
- GITEA__database__HOST=db:3306
- GITEA__database__NAME=gitea
- GITEA__database__USER=gitea
- GITEA__database__PASSWD=xxxxx
restart: always
networks:
- gitea
volumes:
- ./data:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "23000:3000"
- "22222:22"
depends_on:
- db
db:
image: mysql:8
container_name: mysql-gitea
restart: always
environment:
- MYSQL_ROOT_PASSWORD=gitea
- MYSQL_USER=gitea
- MYSQL_PASSWORD=xxxxxx
- MYSQL_DATABASE=gitea
networks:
- gitea
volumes:
- ./mysql:/var/lib/mysql
runner:
image: gitea/act_runner:latest
container_name: runner
restart: always
depends_on:
- gitea
volumes:
- ./runner/data:/data
- ./runner/cache:/root/.cache
- ./runner/config.yaml:/config.yaml
- /var/run/docker.sock:/var/run/docker.sock
networks:
- gitea
environment:
- GITEA_INSTANCE_URL=http://gitea:3000/
- GITEA_RUNNER_REGISTRATION_TOKEN=xxxxxxx
- CONFIG_FILE=/config.yaml
- GITEA_RUNNER_NAME=docker-runner
- GITEA_RUNNER_LABELS=docker
```
其中,runner 的 token可以先随便填一个,后面在 gitea 中注册时会替换。
+112
View File
@@ -0,0 +1,112 @@
---
title: markdown语法使用指南
tags: ["markdown"]
date: 2025-03-06
summary: "用来学习markdown语法"
---
## 基础语法
---
### 标题
```markdown
# H1
## H2
### H3
#### H4
##### H5
###### H6
```
### 文本样式
```markdown
*斜体* _斜体_
**粗体** __粗体__
***粗斜体*** ___粗斜体___
~~删除线~~
```
### 列表
```markdown
- 无序列表
* 无序列表
+ 无序列表
1. 有序列表
2. 有序列表
3. 有序列表
- [x] 已完成
- [ ] 未完成
```
### 代码
```markdown
行内代码:`code`
代码块:
```python
print("Hello World")
```
```
### 链接与图片
```markdown
[链接文字](URL "标题")
![图片alt](图片URL "标题")
```
### 引用
```markdown
> 引用内容
> 多行引用
```
### 表格
```markdown
| 左对齐 | 居中对齐 | 右对齐 |
|:-------|:-------:|-------:|
| 数据 | 数据 | 数据 |
| 数据 | 数据 | 数据 |
```
## 高级语法
---
### 分隔线
```markdown
---
***
___
```
### 脚注
```markdown
这是一个脚注[^note]
[^note]: 脚注内容
```
### HTML
```markdown
<details>
<summary>点击展开</summary>
隐藏内容
</details>
```
### 转义字符
```markdown
\*转义星号\*
```
+101
View File
@@ -0,0 +1,101 @@
---
title: zerotier使用指南
tags: ["linux"]
date: 2025-09-07
summary: "zerotier使用指南"
---
# 注册
1.进入[https://my.zerotier.com/network](https://my.zerotier.com/network)注册登录
Create A Network 新建网络,查看网络id
# linux端
## 1.安装
curl -s [https://install.zerotier.com](https://install.zerotier.com) | sudo bash
## 2.加入网络
sudo zerotier-cli join #你的网络id
#设置zerotier自启
sudo systemctl enable zerotier-one.service
新设备加入都要去[zerotier后台](https://my.zerotier.com/network)许可
![](https://img.butubb.cn/i/2024/12/09/67564e1d90bb7.png)
![](https://img.butubb.cn/i/2024/12/09/67564e2d8f266.png)
Authorized勾打上,name自己起,点击save保存
# docker安装
docker run -d -restart always -name zerotier -v 你本地的地址:/var/lib/zerotier-one -network host zerotier/zerotier:latest
#要使用host网络模式
docker exec -it zerotier
sudo zerotier-cli join #你的网络id
# ios端
App Store登录美区账号
搜索下载zerotier-one
打开点击右上角➕
输入网页端显示的网络id
点击add network
---
如果只是简单的互通到这里为止,你的iphone和linux已经可以实现互相访问了,直接ping网页端显示的ip地址即可,一般刚连上会延迟比较高,打洞成功后延迟基本在个位数
![](https://img.butubb.cn/i/2024/12/12/675a2c5a84c21.png)
# 进阶设置
## zerotier托管路由
如果你想实现访问linux客户端下的其他局域网设备,比如ps5等无法安装zerotier的设备
在linux已经安装配置好zerotier的基础上
# 通过 ip a可以查看网卡配置,找到对应的zerotier虚拟网卡
ztiv5heone: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 2800 qdisc fq_codel state UNKNOWN group default qlen 1000
link/ether c6:a0:24:d1:76:3b brd ff:ff:ff:ff:ff:ff
inet 10.147.17.11/24 brd 10.147.17.255 scope global ztiv5heone
valid_lft forever preferred_lft forever
inet6 fe80::c4a0:24ff:fed1:763b/64 scope link
valid_lft forever preferred_lft forever
# ztiv5heone 为虚拟网卡名字
#允许防火墙通过
iptables -I FORWARD -i ztiv5heone -j ACCEPT
iptables -I FORWARD -o ztiv5heone -j ACCEPT
iptables -t nat -I POSTROUTING -o ztiv5heone -j MASQUERADE
# 允许转发
cat /proc/sys/net/ipv4/ip_forward
# 如果返回 1,表示开启不需要后续操作;0 表示关闭需要开启
sudo vim /etc/sysctl.conf
#在文件中找到(或添加)以下行:net.ipv4.ip_forward = 1
sudo sysctl -p
#保存后执行生效
进入[https://my.zerotier.com/network](https://my.zerotier.com/network)进入当前的网络id
找到
![](https://img.butubb.cn/i/2024/12/09/67564e4c2e223.png)
destination填写你的局域网网段例如192.168.2.0/24 ,via输入分配给你的虚拟局域网地址例如10.147.17.11
这里的意思就是如果我要访问局域网的其他设备,是要通过via填写的地址转发到目的局域网ip
此时使用在同一zerotier网络下的其他设备,ping你的局域网其他设备,能ping通即成功
@@ -0,0 +1,62 @@
---
title: 一个NAS用户的UPS求生指南:从断电焦虑到真香体验
tags: ["nas"]
date: 2025-10-22
summary: '作为一个在群租房里"苟活"的绿联NAS用户,这两年我深刻体会到了什么叫"用电如履薄冰"...'
---
## 第一章:那些年,我们一起经历的断电惊魂
作为一个在群租房里"苟活"的绿联NAS用户,这两年我深刻体会到了什么叫"用电如履薄冰":
- 每月一次的断电"保留节目",比大姨妈还准时
- 每次断电后重启NAS时的手抖程度,堪比拆炸弹
- 硬盘的"咔咔"声在我耳中自动翻译成"给老子等着"
## 第二章:UPS选购的哲学思考
在研究了市面上的UPS后,我陷入了当代青年的经典选择困境:
### 选项A:磷酸铁锂"坦克型"UPS
- ✅ 安全系数堪比防弹衣
- ❌ 体积和噪音堪比小型发电机
- ❌ 待机功耗够我多喝两杯奶茶
### 选项B:锂电池"精灵型"UPS
- ✅ 体积小巧如充电宝
- ✅ 安静得像个美男子
- ❓ 安全性...应该也许大概没问题?
直到某个月黑风高的夜晚,连续两次断电后,我的NAS用数据丢失的方式向我发出最后通牒。
## 第三章:我与瓦力UPS
最终入手的瓦力UPS给我的惊喜远超预期:
### 三大真香体验
1. **身材管理满分**120 x 106.7 x 40.3mm放在在NAS上毫无存在感
2. **功能强大**
- 实时功率监测
- 用电统计(终于知道NAS偷吃了多少电)
- 智能关机保护
- mac地址网络唤醒
3. **零噪音**:存在感比我的前任还低
*每天看功率成了新的解压方式*
![](https://img.butubb.cn/i/2025/04/07/67f3813bc9bdb.jpeg)
*每日详细电量消耗*
![](https://img.butubb.cn/i/2025/04/07/67f3796faf0e3.png)
## 第四章:给同病相怜者的建议
1. 别等数据火葬场才想起UPS这个"后悔药"
2. 租房党优先考虑体积和噪音(除非你想体验噪音的关爱)
3. 锂电池UPS没想象中可怕,毕竟手机天天放床头不是?
4. 记得定期测试,别让UPS变成"装饰品"
## 终极感悟
从最初的"应该不用买UPS吧",到现在的"怎么没早点买",真香定律再次胜利。现在我的NAS终于可以安心地说:"我要稳稳的幸福~"(而我的钱包说:你开心就好)
@@ -0,0 +1,71 @@
---
title: 把Kindle变成信息屏!越狱+自动更换新闻壁纸全攻略 | 附开源代码
tags: ["学习"]
date: 2025-10-01
summary: "前些日子翻出尘封两年的KPW4,本想重拾阅读初心,却发现亚马逊中国早已物是人非。正当想着要不要给它闲鱼出手时转卖时,B站刷到Kindle全机型都支持越狱了。"
---
前些日子翻出尘封两年的KPW4,本想重拾阅读初心,却发现亚马逊中国早已物是人非。
正当想着要不要给它闲鱼出手时转卖时,B站刷到Kindle全机型都支持越狱了。
- 书伴网的详细图文教程[2025 Kindle 越狱教程:不限 Kindle 型号,不限固件版本](https://bookfere.com/post/1145.html)
瞬间燃起折腾欲,一直没有给kindle越狱过,想着就算要出手也要越狱折腾看看。
## kindle越狱
参考书伴网的教程[2025 Kindle 越狱教程:不限 Kindle 型号,不限固件版本](https://bookfere.com/post/1145.html)
跟着教程一步一步进行即可,这一步我就不再详细说明了。
越狱后的kindle安装了koreader,传书变得方便了,不需要再使用数据线进行拷贝,可以链接webdav服务器进行下载,确实方便多了,也重燃起我的阅读兴趣。
遂想着还有什么可折腾的,想起没越狱之前,一直想着把kindle的壁纸给换掉,现在越狱了应该可以实现了。
## 实践
整理一下我的需求
- 自动化更换kindle壁纸
- 图片内容为新闻排行榜
- 自动化生成壁纸图片
根据需求我大概去网上看了一下有没有相同想法的小伙伴,但是看到的大多是使用git上传管理自己的图片,不是自动化生成一些壁纸
[读书|通过 Git 管理 Kindle 屏保图片,一键自动同步](https://blog.csdn.net/mzlogin/article/details/132960326)
这是链接大家也可以参考一下。
基于没有现成的,我根据需求大概整理了一下实现的思路
1. github仓库python代码爬取新闻网站信息,整理好生成壁纸,需要适配一下kindle屏幕大小和黑白色,使用github action自动化执行仓库内py脚本每隔30分钟爬取生成一张图片,自动覆盖原图片。
2. kindle写一个sh脚本自动下载图片到指定的目录,使用cron定时任务设置定时下载覆盖
### github
![项目生成的图片](https://img.butubb.cn/i/2025/04/16/67ff6ed10314e.png)
我的github项目地址[8butubb/kindlepic](https://github.com/8butubb/kindlepic)
信息来源是[今日热榜](https://tophub.today)
不知道爬哪个网站的同学可以看看这个网站,信息聚合
### kindle
kindle上壁纸目录是可以使用koreader进行指定,指定或者默认目录,
写一个sh脚本用来下载图片
```sh
#!/bin/sh
# 目标壁纸文件名(需固定名称以覆盖旧文件)
WALLPAPER_NAME="custom_wallpaper.png"
# 壁纸下载链接(替换为你的实际图片URL)
IMAGE_URL="https://example.com/your-image.png"
# 目标路径
TARGET_DIR="/mnt/us/koreader/screensaver"
# 使用 curl 下载并覆盖文件
curl -L -o "${TARGET_DIR}/${WALLPAPER_NAME}" "${IMAGE_URL}"
```
chmod +x download_wallpaper.sh 给个脚本执行权限
写完可以执行一次试试,没有问题的话使用cron设置一下定时任务即可
## 进阶
- 可以在添加天气信息和一些其他自定义信息,这里大家就可以发挥想象力了
+9
View File
@@ -0,0 +1,9 @@
---
title: 重新用回macos
tags: ["日常","mac"]
date: 2025-12-01
summary: ""
---
最近几天,我重新用回了去年使用的macbookpro,屏幕有一条黑线,使用的是外接显示器
深感还是mac系统简洁好用,没有windows那么多的莫名其妙的bug
+12 -7
View File
@@ -1,12 +1,12 @@
baseURL = 'https://8butubb.github.io/'
languageCode = 'zh-cn'
title = '我的博客'
title = '日志'
theme = 'PaperMod'
[params]
defaultTheme = "auto"
# 内联表必须写在一行内
homeInfoParams = { Title = "你好我是butubb", Content = "欢迎来到我的博客主页:个人 / 博客 / 教程" }
homeInfoParams = { Title = "你好我是butubb,安徽人,现工作居住在苏州。", Content = "喜欢互联网冲浪🏄‍♂️,折腾机器💻,看电影🎥,编程🧑‍💻,听音乐🎶等" }
[taxonomies]
@@ -15,16 +15,21 @@ theme = 'PaperMod'
category = "categories"
[[menu.main]]
name = "个人"
url = "/posts"
name = "首页"
url = "/"
weight = 1
[[menu.main]]
name = "教程"
url = "/docs"
name = "博文"
url = "/posts"
weight = 2
[[menu.main]]
name = "标签"
url = "/tags"
weight = 3
[[menu.main]]
name = "学习"
url = "/study"
weight = 3
weight = 4