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

证书会自动续签,无需额外操作。

首次启动

启动后服务会自动:

  1. 创建 SQLite 数据库文件
  2. 创建所有数据表
  3. 创建默认管理员账号: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>&copy; 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;             /* 页面最大宽度 */
}

进阶修改

添加新的页面

  1. 创建路由处理函数:在 src/routes/ 下新建文件
  2. 创建模板:在 templates/pages/ 下新建 .html 文件
  3. 注册路由:在 src/routes/mod.rs 中添加 .route()
  4. 如果需要在导航栏显示,修改 templates/base.html

修改数据库表结构

  1. src/db.rsmigrate() 函数中添加 CREATE TABLE 语句
  2. src/models/ 下创建对应的 Rust 结构体
  3. 结构体需要 #[derive(sqlx::FromRow)] 来自动映射

添加新的管理后台页面

  1. src/routes/admin/ 下新建处理函数文件
  2. 实现 list、new、edit、delete 等标准操作
  3. src/routes/admin/mod.rs 中注册路由
  4. templates/admin/ 下创建对应的模板文件
  5. templates/admin/partials/sidebar.html 中添加导航链接

功能配置

Markdown 编辑器支持

文章编辑器支持 Markdown,使用 comrak 库渲染,支持:

  • 标题(# ~ ######
  • 表格、任务列表、删除线
  • 代码块(带语法高亮)
  • 图片(通过管理后台上传)

文件上传

  • 所有上传默认存储在 uploads/ 目录
  • 上传不限制文件大小和类型(仅管理员可用)
  • 上传的文件保留原始文件名,重名自动加后缀
  • 超大文件(1GB+)建议确保服务器有足够磁盘空间

图片插入

在文章编辑器中,点击「上传并插入」选择本地图片:

  1. 图片上传到服务器
  2. 自动在光标位置插入 ![图片](/uploads/images/xxx.png)
  3. 支持 JPG、PNG、GIF、SVG 格式

常见问题

修改默认管理员用户名和密码

# 直接在数据库中修改
sqlite3 /opt/site/site.db "UPDATE users SET username='newadmin' WHERE username='admin';"

# 修改密码需要通过后台登录后修改,或重新生成哈希
cargo run --bin gen-hash -- "新密码"
# 然后用输出的哈希值更新数据库

更换数据库

当前使用 SQLite,如需更换为 PostgreSQL:

  1. 修改 Cargo.toml 添加 postgres feature
  2. 修改 db.rs 中的连接字符串
  3. 修改 AppConfig 中的默认数据库 URL

添加 OAuth 登录

当前仅支持管理员账号密码登录。如需添加 OAuth:

  1. 添加 oauth2 crate
  2. auth.rs 中添加 OAuth 验证逻辑
  3. 在登录页面增加第三方登录按钮

安全建议

  1. 必须设置 SITE_JWT_SECRET 环境变量为随机字符串
  2. 部署后立即修改默认管理员密码
  3. 防火墙开放 80/443 端口即可,后端 3000 端口只需本机访问
  4. 定期更新依赖cargo update
  5. 上传功能仅管理员可用,前台无上传入口

← 返回作品集