自托管导航页 · iOS 桌面风格 · Docker 一键部署
OneNav 是一个极简风格的自托管导航页应用,模拟 iOS 桌面风格,适合作为浏览器主页或书签管理工具。
| 层级 | 技术 |
|---|---|
| 后端框架 | Python 3.11 + Flask |
| 数据库 | SQLite(自动生成) |
| 前端 | 原生 HTML/CSS/JS + SortableJS |
| 容器化 | Docker + docker compose |
docker compose 命令可用)5099(可自定义)mkdir -p /你的路径/docker/nav
cd /你的路径/docker/nav
在项目目录下创建以下文件:
/你的路径/docker/nav/
├── docker-compose.yml
├── Dockerfile
├── app.py
├── manifest.json
├── templates/
│ └── index.html
└── static/
├── icon.png # PWA 图标(192×192 或 512×512)
└── manifest.json
data/ 目录和 nav.db 数据库文件会自动生成,无需手动创建。icon.png 需要自行准备一张方形图片,推荐 512×512 像素。
services:
nav:
build: .
container_name: onenav
restart: unless-stopped
ports:
- "5099:5099"
volumes:
- ./static:/app/static
- ./data:/app/data
FROM python:3.11-alpine
WORKDIR /app
RUN pip install flask -i https://pypi.tuna.tsinghua.edu.cn/simple
COPY . .
EXPOSE 5099
CMD ["python", "app.py"]
app.py 和 templates/index.html 是项目核心文件,请从项目源获取完整内容,确保包含最新的固定/取消固定功能和页面布局参数。
cd /你的路径/docker/nav
sudo docker compose up -d --build
mkdir /home/xxx: permission denied),请使用:
mkdir -p /tmp/docker-tmp
HOME=/tmp/docker-tmp sudo docker compose up -d --build
sudo docker ps | grep onenav
看到 Up 状态表示运行成功。浏览器访问 http://你的服务器IP:5099 即可使用。
# 查看最近日志
sudo docker logs onenav --tail 50
# 实时查看日志
sudo docker logs onenav -f
sudo docker restart onenav
cd /你的路径/docker/nav
sudo docker compose down
sudo docker compose up -d --build
# 数据库文件位于项目目录的 data/ 文件夹
cp -r /你的路径/docker/nav/data /你的备份路径/nav-backup-$(date +%Y%m%d)
# 将备份的 data/ 目录复制回项目目录
cp -r /你的备份路径/nav-backup-xxxx /你的路径/docker/nav/data
sudo docker restart onenav
docker-compose.yml 中 ports 左侧的端口号sudo docker compose up -d --build浏览器可能缓存了旧文件。尝试:
Ctrl+Shift+R(Windows)或 Cmd+Shift+R(Mac)http://IP:5099?v=123确保容器运行的是最新代码:
sudo docker exec onenav grep "pinToDock" /app/templates/index.html
如果没有输出,说明代码未更新,需要重新构建容器。
# 进入容器
sudo docker exec -it onenav sh
# 使用 sqlite3 操作
sqlite3 /app/data/nav.db
.tables
SELECT * FROM links;
.quit
exit
cd /你的路径/docker/nav
sudo docker compose down
cd ..
rm -rf nav
| 路由 | 方法 | 说明 |
|---|---|---|
| /api/links | GET | 获取所有链接(分 links 和 pinned) |
| /api/links/add | POST | 添加链接(name, icon, href) |
| /api/links/delete/<id> | POST | 删除链接 |
| /api/links/update/<id> | POST | 更新链接 |
| /api/links/sort | POST | 批量排序(ids 数组) |
| /api/links/pin | POST | 固定到底部(id, dock_index) |
| /api/links/unpin | POST | 取消固定(id) |
curl -s -X POST http://localhost:5099/api/links/pin \
-H 'Content-Type: application/json' \
-d '{"id": 1, "dock_index": 0}'