You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
3 days ago | |
|---|---|---|
| backend | 3 days ago | |
| frontend | 3 days ago | |
| .drone.yml | 3 days ago | |
| .gitignore | 3 days ago | |
| Caddyfile | 3 days ago | |
| README.md | 3 days ago | |
| short-link.service | 3 days ago | |
README.md
短链接生成器
粘贴长链接,一键变短。极简工具网站。
架构
用户请求 → Caddy
├── /api/* → Go 后端 :8819
├── /[a-zA-Z0-9]{7} → Go 后端 :8819 (短码重定向)
└── 其他 → 静态文件 /opt/short-link/frontend
后端: Go 1.22 + net/http(标准库路由) + JSON 文件持久化
前端: Svelte 4 + Vite 5
网关: Caddy(自动 HTTPS)
部署: Drone CI → systemd
本地开发
后端
cd backend
# 安装依赖
go mod tidy
# 运行 (默认 :8819)
ADDR=:8819 DOMAIN=http://localhost:8819 DB_PATH=./data.db ADMIN_TOKEN=dev go run .
# 运行测试
go test ./...
前端
cd frontend
# 安装依赖
npm install
# 开发模式 (默认 :5173, API 请求会由 Vite 转发配置决定)
npm run dev
# 构建
npm run build
部署
环境要求
- Go 1.22+
- Node.js 20+
- Caddy 2.x
- systemd (Linux)
手动部署
# 1. 构建
cd backend && CGO_ENABLED=0 go build -ldflags="-s -w" -o short-link-server .
cd ../frontend && npm install && npm run build
# 2. 部署文件
mkdir -p /opt/short-link/data /opt/short-link/frontend
cp backend/short-link-server /opt/short-link/
cp -r frontend/dist/* /opt/short-link/frontend/
# 3. 生成管理员 Token
openssl rand -hex 32 # 填入 short-link.service 的 ADMIN_TOKEN
# 4. 注册服务
cp short-link.service /etc/systemd/system/
systemctl daemon-reload
systemctl enable --now short-link
# 5. Caddy
cp Caddyfile /etc/caddy/
systemctl reload caddy
Drone CI 自动部署
推送到 main 分支自动触发。需在 Drone 配置 ssh_key secret(部署机 SSH 私钥)。
.drone.yml 完成了三步流水线:
golang:1.22— 编译 Go 二进制node:20-alpine— 构建前端alpine:3— 上传文件 +systemctl restart short-link+systemctl reload caddy
配置
| 环境变量 | 默认值 | 说明 |
|---|---|---|
ADDR |
:8819 |
监听地址 |
DOMAIN |
http://localhost:8819 |
短链接域名,用于拼接 short_url |
DB_PATH |
./data.db |
JSON 数据文件路径 |
ADMIN_TOKEN |
(空) | 管理员 Bearer Token,空值时所有管理接口返回 401 |
API
POST /api/shorten
请求: { "url": "https://example.com/very/long/path" }
响应: { "code": "abc1234", "short_url": "https://xieyaxin.top:8899/abc1234", "original_url": "https://example.com/very/long/path" }
- 自动补全
https://前缀 - 仅支持 http/https 协议
- 返回 400(URL 不合法)、500(服务端错误)
GET /:code
GET /abc1234 → 302 Found → Location: https://example.com/...
- 存在:302 临时重定向
- 不存在:404
管理接口
以下接口需在请求头中携带 Authorization: Bearer <ADMIN_TOKEN>。
GET /api/admin/links
列出所有短链接,按创建时间倒序。
→ 200 [{ "code": "abc1234", "original_url": "https://...", "visit_count": 42, "created_at": "2026-05-06T14:30:00Z" }]
→ 401 未授权
PUT /api/admin/links/{code}
更新短链接指向的原始 URL。
请求: { "url": "https://new.example.com" }
→ 200 { "code": "abc1234", "original_url": "https://new.example.com", ... }
→ 404 短码不存在
DELETE /api/admin/links/{code}
删除短链接。
→ 200 { "ok": true }
→ 404 短码不存在
GET /api/admin/export
导出全部数据。
GET /api/admin/export → JSON 文件下载 (application/json)
GET /api/admin/export?format=csv → CSV 文件下载 (text/csv)
短码设计
- 7 位 base62 字符集 (a-z, A-Z, 0-9)
crypto/rand密码学安全随机数- 62^7 ≈ 3.5 万亿组合
- 插入前检查唯一约束,碰撞重试最多 3 次
管理后台
访问 /#admin 进入管理界面:
- 输入
ADMIN_TOKEN登录(浏览器 sessionStorage 保存,关闭标签页自动清除) - 表格展示所有短链接:短码、原始链接、访问次数、创建时间
- 行内编辑:修改原始 URL
- 行内删除:确认后删除
- 导出数据:支持 JSON / CSV 格式下载