绿联NAS:搭建TREK一个自托管的旅行/旅行规划工具

绿联NAS:搭建TREK一个自托管的旅行/旅行规划工具

一、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-存放路径自动带出;

image

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、点击立即部署-等待跑码

image

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

image

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

image

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

image

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

image

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

image

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

image

11、报错了。。。

image

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

13、感谢使用。。。

image

14、进入界面

image

15、开始旅行。。。

  • 货币小知识:CNY:在岸人民币-CNY全称是Chinese Yuan;CNH:离岸人民币-CHN全称是Chinese Yuan in HONG KONG

image

16、祝大家有个美好的旅程,哈哈。。出发GOGOGO

三、参考文档:

1、项目地址:https://github.com/liketrek/TREK

2、演示地址:https://demo.liketrek.com/

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享