Aki's Site源码
本网站的源码,已开源可下载,附带说明文档
Rust
Axum
SQLite
HTML
CSS
JavaScript
Aki's Site — 个人网站
一个基于 Rust + Axum 的个人网站系统,包含博客、作品集、软件仓库和管理后台。
技术栈
| 层级 | 技术 |
|---|---|
| 后端 | Rust, Axum 0.9, Tokio |
| 数据库 | SQLite (通过 SQLx) |
| 模板 | Tera (Jinja2 风格) |
| 前端 | HTML + CSS + JS + HTMX |
| 认证 | JWT + Argon2id |
| 部署 | Nginx + systemd + Let's Encrypt |
功能
- 博客 — 发布文章,支持 Markdown 编辑
- 作品集 — 展示个人项目,可关联文件
- 软件仓库 — 包管理 + 版本文件上传/下载
- 管理后台 — 所有内容的 CRUD 管理
- 登录保护 — 1 小时内 3 次错误自动锁定
快速开始
# 1. 确保安装了 Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
# 2. 克隆并运行
git clone <repo-url> && cd site
SITE_JWT_SECRET="your-random-secret" cargo run
# 3. 打开浏览器访问 http://127.0.0.1:3000
# 后台地址 http://127.0.0.1:3000/admin/login
# 默认管理员: admin / admin123(首次启动自动创建)
详细部署指南见 DEPLOY.md 自定义配置见 CUSTOMIZE.md
项目结构
src/
├── main.rs # 入口
├── config.rs # 配置(环境变量)
├── db.rs # 数据库初始化
├── auth.rs # JWT + 密码 + 登录锁定
├── markdown.rs # Markdown 渲染
├── models/ # 数据模型(post, project, package...)
└── routes/ # 路由处理函数
└── admin/ # 管理后台
templates/ # Tera 模板
static/ # CSS/JS
环境变量
| 变量 | 默认值 | 说明 |
|---|---|---|
SITE_HOST |
127.0.0.1 |
监听地址 |
SITE_PORT |
3000 |
监听端口 |
SITE_DATABASE_URL |
site.db |
SQLite 文件路径 |
SITE_JWT_SECRET |
必填 | JWT 签名密钥 |
SITE_SITE_NAME |
Aki's Site |
网站名称 |
License
MIT
部署指南
环境要求
- 服务器:1C2G 及以上(推荐 2C2G)
- 系统:Ubuntu 20.04+ / Debian 11+ / Arch Linux
- 软件:Rust 1.78+、Nginx、SQLite3(可选,用于管理)
编译与上传
# 本地编译
cd ~/Projects/rust/site
cargo build --release
# 打包
tar czf site-deploy.tar.gz \
target/release/site \
templates/ \
static/
# 上传到服务器
scp site-deploy.tar.gz user@your-server:/tmp/
服务器配置
1. 解压文件
ssh user@your-server
sudo mkdir -p /opt/site
sudo tar xzf /tmp/site-deploy.tar.gz -C /opt/site/
sudo cp /opt/site/target/release/site /opt/site/site
sudo rm -rf /opt/site/target
sudo chmod +x /opt/site/site
sudo chown -R user:user /opt/site
mkdir -p /opt/site/uploads/images
2. 配置 systemd 服务
sudo tee /etc/systemd/system/site.service << 'EOF'
[Unit]
Description=Personal Site
After=network.target
[Service]
Type=simple
User=user
WorkingDirectory=/opt/site
ExecStart=/opt/site/site
Restart=always
RestartSec=5
Environment=SITE_HOST=127.0.0.1
Environment=SITE_PORT=3000
Environment=SITE_DATABASE_URL=/opt/site/site.db
Environment=SITE_JWT_SECRET=<替换为随机生成的密钥>
Environment=SITE_SITE_NAME="My Site"
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable site
sudo systemctl start site
生成随机 JWT 密钥:
openssl rand -hex 32
3. 配置 Nginx 反向代理
server {
server_name your-domain.com;
client_max_body_size 0; # 无上传限制
proxy_read_timeout 1800s;
proxy_send_timeout 1800s;
proxy_request_buffering off; # 大文件上传必需
location / {
proxy_pass http://127.0.0.1:3000;
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;
}
location /static/ {
alias /opt/site/static/;
expires 7d;
}
location /uploads/ {
alias /opt/site/uploads/;
expires 7d;
}
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
}
server {
if ($host = your-domain.com) { return 301 https://$host$request_uri; }
listen 80;
server_name your-domain.com;
return 404;
}
4. 配置 HTTPS(Let's Encrypt)
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d your-domain.com
证书会自动续签,无需额外操作。
首次启动
启动后服务会自动:
- 创建 SQLite 数据库文件
- 创建所有数据表
- 创建默认管理员账号:admin / admin123
部署后第一时间登录后台修改密码!
更新流程
# 本地
cd ~/Projects/rust/site
git pull
cargo build --release
tar czf update.tar.gz target/release/site templates/ static/
# 服务器
scp update.tar.gz user@server:/tmp/
ssh user@server
sudo systemctl stop site
sudo tar xzf /tmp/update.tar.gz -C /opt/site/
sudo cp /opt/site/target/release/site /opt/site/site
sudo rm -rf /opt/site/target
sudo chmod +x /opt/site/site
sudo chown -R user:user /opt/site
sudo systemctl start site
运维命令
# 查看状态
sudo systemctl status site
# 查看日志
sudo journalctl -u site -f
# 重启
sudo systemctl restart site
# 解锁管理员(3次错误后锁定)
sudo /opt/site/unlock.sh
自定义指南
本文档介绍如何定制自己的个人网站。
快速修改
修改网站名称
设置环境变量即可,无需改代码:
export SITE_SITE_NAME="My Awesome Site"
修改首页内容
首页模板:templates/pages/index.html
可以修改的内容:
- 欢迎语 — 第 26-27 行的
<h1>和<p>标签 - 头像 — 后台仪表盘上传(或直接在
site_settings表中设置avatar_url) - 关于我一句话 — 后台仪表盘设置
- 四卡片的标题和链接 — 第 32-80 行的卡片区域
修改页脚
文件:templates/base.html 第 45 行
<p>© 2026 {{ site_name }}. 由 Rust + Axum 驱动.</p>
修改导航栏
文件:templates/base.html 第 26-30 行
<nav class="site-nav">
<a href="/">首页</a>
<a href="/blog">博客</a>
<!-- 添加你自己的导航项 -->
</nav>
修改 CSS 样式
- 公开页面样式:
static/css/style.css - 管理后台样式:
static/css/admin.css
CSS 变量定义在 style.css 开头:
:root {
--color-primary: #2563eb; /* 主色 */
--color-text: #1a1a2e; /* 正文颜色 */
--color-bg: #ffffff; /* 背景色 */
--max-width: 900px; /* 页面最大宽度 */
}
进阶修改
添加新的页面
- 创建路由处理函数:在
src/routes/下新建文件 - 创建模板:在
templates/pages/下新建.html文件 - 注册路由:在
src/routes/mod.rs中添加.route() - 如果需要在导航栏显示,修改
templates/base.html
修改数据库表结构
- 在
src/db.rs的migrate()函数中添加CREATE TABLE语句 - 在
src/models/下创建对应的 Rust 结构体 - 结构体需要
#[derive(sqlx::FromRow)]来自动映射
添加新的管理后台页面
- 在
src/routes/admin/下新建处理函数文件 - 实现 list、new、edit、delete 等标准操作
- 在
src/routes/admin/mod.rs中注册路由 - 在
templates/admin/下创建对应的模板文件 - 在
templates/admin/partials/sidebar.html中添加导航链接
功能配置
Markdown 编辑器支持
文章编辑器支持 Markdown,使用 comrak 库渲染,支持:
- 标题(
#~######) - 表格、任务列表、删除线
- 代码块(带语法高亮)
- 图片(通过管理后台上传)
文件上传
- 所有上传默认存储在
uploads/目录 - 上传不限制文件大小和类型(仅管理员可用)
- 上传的文件保留原始文件名,重名自动加后缀
- 超大文件(1GB+)建议确保服务器有足够磁盘空间
图片插入
在文章编辑器中,点击「上传并插入」选择本地图片:
- 图片上传到服务器
- 自动在光标位置插入
 - 支持 JPG、PNG、GIF、SVG 格式
常见问题
修改默认管理员用户名和密码
# 直接在数据库中修改
sqlite3 /opt/site/site.db "UPDATE users SET username='newadmin' WHERE username='admin';"
# 修改密码需要通过后台登录后修改,或重新生成哈希
cargo run --bin gen-hash -- "新密码"
# 然后用输出的哈希值更新数据库
更换数据库
当前使用 SQLite,如需更换为 PostgreSQL:
- 修改
Cargo.toml添加postgresfeature - 修改
db.rs中的连接字符串 - 修改
AppConfig中的默认数据库 URL
添加 OAuth 登录
当前仅支持管理员账号密码登录。如需添加 OAuth:
- 添加 oauth2 crate
- 在
auth.rs中添加 OAuth 验证逻辑 - 在登录页面增加第三方登录按钮
安全建议
- 必须设置
SITE_JWT_SECRET环境变量为随机字符串 - 部署后立即修改默认管理员密码
- 防火墙开放 80/443 端口即可,后端 3000 端口只需本机访问
- 定期更新依赖:
cargo update - 上传功能仅管理员可用,前台无上传入口