一、TREK 项目介绍
TREK 是一个自托管的旅行规划工具,支持多人实时协作。简单来说,你可以把它理解为一个团队版的”旅行计划本”,所有参与者可以同时看到最新的行程变动。
核心功能
🗺️ 行程规划
-
拖拽式日程安排,支持跨天移动
-
交互式地图(Leaflet 或 Mapbox GL),支持 3D 建筑、地形、路线可视化
-
地点搜索(Google Places 或免费 OpenStreetMap)
-
支持导入 Google Maps 分享列表、GPX/KML/KMZ/GeoJSON 地图文件
-
16 天天气预报(Open-Meteo,无需 API Key)
🧳 旅行管理
-
预订管理:机票、住宿、餐厅,支持导入确认邮件和 PDF
-
费用追踪:Splitwise 风格的分账、多币种支持
-
打包清单:分类、模板、成员分配、进度追踪
-
文档管理:附件、票据、PDF 导出
🤝 协作功能
-
WebSocket 实时同步,所有改动即时可见
-
多用户行程,基于角色的访问控制
-
邀请链接(一次性或可重复使用,带有效期)
-
SSO 单点登录(OIDC,支持 Google、Apple、Authentik、Keycloak 等)
-
双因素认证(TOTP + 备用码)、Passkeys 无密码登录
📱 移动端 & PWA
-
可安装为 PWA,iOS 和 Android 直接通过浏览器安装,无需应用商店
-
离线支持,Service Worker 缓存
-
触摸优化,移动端专属布局
其他亮点:20 种语言支持(含简体/繁体中文)、AI 辅助(可让 AI 创建行程、生成打包清单等)、管理员面板、自动备份。
技术栈:NestJS 11 + Zustand + WebSocket 实时同步 + JWT/OAuth 2.1/OIDC/WebAuthn 认证
二、部署项目
1、在docker文件夹中创建trek文件夹;
2、打开docker-选择项目-创建-项目名称输入trek-存放路径自动带出;

3、粘贴docker compose;
# =============================================================================
# Docker Compose 配置文件 - TREK 旅行规划应用
# 项目主页: https://github.com/liketrek/TREK
# 镜像: mauriceboe/trek:latest (官方 Docker Hub)
# =============================================================================
services:
# -------------------------------------------------------------------------
# 主应用服务
# -------------------------------------------------------------------------
trek:
# 使用官方镜像,建议固定版本号(如 mauriceboe/trek:3.4.1)避免意外升级
image: mauriceboe/trek:latest
# 容器名称,便于管理(docker logs trek, docker stop trek 等)
container_name: trek
# ======== 安全加固 ========
# 根文件系统只读,防止应用意外修改容器内的系统文件
read_only: true
# 禁止容器进程获取新权限(如 setuid/setgid 提权)
security_opt:
- no-new-privileges:true
# 删除所有 Linux Capabilities,仅添加必需的最小权限集
cap_drop:
- ALL
cap_add:
- CHOWN # 允许更改文件所有者(上传文件时需修改权限)
- SETUID # 允许设置进程用户 ID(安全上下文切换)
- SETGID # 允许设置进程组 ID
# 临时文件存储:使用内存 tmpfs,限制大小并禁用执行
tmpfs:
- /tmp:noexec,nosuid,size=64m # noexec 防止执行恶意脚本,size 限制内存占用
# ======== 端口映射 ========
# 宿主机端口(你通过浏览器访问的端口): 容器内端口(应用实际监听的端口)
# 重要:官方镜像默认监听 3000,且环境变量 PORT 可能被忽略,
# 因此宿主机端口设为 10000,容器端口保持 3000,以保持兼容。
# 访问地址:http://你的NAS_IP:10000
ports:
- "10000:3000"
# ======== 环境变量 ========
# 所有变量均支持从外部 .env 文件注入(${VAR:-default} 语法)
environment:
# ---- 基础必填 ----
# 运行环境:生产环境务必设为 production,否则性能下降且泄露堆栈信息
- NODE_ENV=production
# 容器内部监听端口(建议保持 3000,与端口映射的容器端一致)
# 如果镜像忽略此变量,则默认仍是 3000,不影响映射
- PORT=3000
# 加密密钥:用于加密会话、JWT 及数据库敏感字段(API 密钥、MFA 备用码等)
# 必须设置!请用命令生成:openssl rand -hex 32
# 将生成的 64 位十六进制字符串填入 .env 文件中的 ENCRYPTION_KEY=xxx
# 警告:密钥一旦设置,切勿丢失或随意更改,否则已加密数据将永久无法解密!
- ENCRYPTION_KEY=${ENCRYPTION_KEY:-}
# 时区:建议设为 Asia/Shanghai,使日志和日程时间符合中国习惯
- TZ=${TZ:-Asia/Shanghai}
# 日志级别:可选 debug/info/warn/error,生产环境推荐 info
- LOG_LEVEL=${LOG_LEVEL:-info}
# 跨域来源(CORS):多个域名用逗号分隔,生产环境应明确指定
# 若留空,可能允许所有来源(不安全),建议填入你的访问域名/IP
- ALLOWED_ORIGINS=${ALLOWED_ORIGINS:-}
# 应用外部访问 URL:用于生成邮件链接、OIDC 回调地址等。
# 必须填写,否则功能异常。示例:http://192.168.1.100:10000
- APP_URL=${APP_URL:-}
# ---- 可选配置(根据需求取消注释) ----
# 如果使用 HTTP 协议访问(非 HTTPS),必须设为 false,否则浏览器会拒绝 Cookie
- COOKIE_SECURE=false
# 如果应用部署在 HTTPS 反向代理(如 Nginx)后面,且代理已终结 TLS,
# 则取消注释以下两行,并注释掉上面的 COOKIE_SECURE=false
# - FORCE_HTTPS=true
# - TRUST_PROXY=1
# ---------- OIDC 单点登录(SSO)配置 ----------
# 如需启用 OIDC 登录,请取消注释并填写实际值
# - OIDC_ISSUER=https://auth.example.com
# - OIDC_CLIENT_ID=trek
# - OIDC_CLIENT_SECRET=supersecret
# - OIDC_DISPLAY_NAME=SSO
# - OIDC_ADMIN_CLAIM=groups
# - OIDC_ADMIN_VALUE=app-trek-admins
# ======== 数据持久化 ========
# 将宿主机的目录挂载到容器内,保证数据在容器重启/更新后不丢失
volumes:
# 应用数据(SQLite 数据库、配置文件、日志等)
- ./data:/app/data
# 用户上传的文件(图片、附件等)
- ./uploads:/app/uploads
# 重启策略:除非手动停止,否则容器退出后自动重启(适合生产环境)
restart: unless-stopped
# ======== 健康检查 ========
# Docker 定期检查应用是否存活,便于监控和自动恢复
healthcheck:
# 用 wget 访问健康检查端点(容器内部访问 localhost:3000,因为映射不影响内部)
test: ["CMD", "wget", "-qO-", "http://localhost:3000/api/health"]
interval: 30s # 每 30 秒检查一次
timeout: 10s # 单次检查超时时间
retries: 3 # 连续失败 3 次标记为不健康
start_period: 15s # 容器启动后等待 15 秒再开始检查,避免启动期间误判
4、点击立即部署-等待跑码

5、还在跑码,有点慢呢。。。

6、这个时候你要在本地电脑创建一个.env文件,上传到trek文件夹中
env文件内容:
ENCRYPTION_KEY=你生成的32字节十六进制密钥
TZ=Asia/Shanghai
LOG_LEVEL=info
APP_URL=http://你的NAS_IP:10000
ALLOWED_ORIGINS=http://你的NAS_IP:10000

7、这个时候docker就完成了;

8、查看容器的日志,日志中会有email和password,复制保存一下;

9、容器启动后,在浏览器访问:http://你的NAS_IP:10000;如:http://192.168.100.100:10000;

10、输入保存的email和password,会要求设置新密码,输入自己的密码;

11、报错了。。。

12、记住密码要有大写小字母、数字和特殊字符,一共要8位;通用密码:Aa123456.
13、感谢使用。。。

14、进入界面

15、开始旅行。。。
- 货币小知识:CNY:在岸人民币-CNY全称是Chinese Yuan;CNH:离岸人民币-CHN全称是Chinese Yuan in HONG KONG

16、祝大家有个美好的旅程,哈哈。。出发GOGOGO
三、参考文档:
1、项目地址:https://github.com/liketrek/TREK
2、演示地址:https://demo.liketrek.com/









