Dawarich 使用 Docker 自托管部署指南:从 docker-compose 快速安装到生产配置调优
【免费下载链接】dawarichYour favorite self-hostable alternative to Google Timeline (Google Location History)项目地址: https://gitcode.com/GitHub_Trending/da/dawarich
导读
本文是 Dawarich(一款可自托管的 Google Timeline / Google Location History 替代品)的 Docker 部署实战指南,以仓库文档 docs/How_to_install_Dawarich_using_Docker.md 为主体,结合仓库内的 docker/docker-compose.yml、.env.example 以及各容器入口脚本源码展开。读完本文,你将掌握:如何用一条docker compose up命令在自有服务器上拉起 Dawarich 全栈(Web 应用、Sidekiq 后台任务、Redis、PostGIS 数据库),理解每个服务与配置项的作用,并学会调整端口、资源限制、时区、数据库凭据等关键参数完成生产化部署。
前提条件:先安装 Docker
官方文档明确要求:开始之前,你需要先在系统上安装 Docker。推荐使用 Docker Compose v2(docker compose子命令语法),当前仓库的 docker/docker-compose.yml 未声明旧式version字段,可直接被 Compose v2 解析。Docker 的安装方式与你的操作系统相关,此处不再赘述,但请确保docker与docker compose两条命令在你的终端中均可用:
docker --version docker compose version快速部署:复制 docker-compose.yml 并一键启动
官方文档给出的快速安装方式非常简单:
- 在服务器上创建一个专用文件夹;
- 将仓库根目录(本项目内实际路径为 docker/docker-compose.yml)中
docker-compose.yml的完整内容复制到该文件夹; - 在该文件夹内运行:
docker compose upDocker 会拉取镜像、创建网络与数据卷,并按依赖顺序启动全部服务。首次启动需要下载 Redis、PostGIS 以及freikin/dawarich应用镜像,耗时取决于网络状况。当命令执行成功、所有容器进入运行状态后,即可通过 http://127.0.0.1:3000 打开 Dawarich 的 Web 界面。
注意:仓库根目录本身并未放置
docker-compose.yml,官方文档中“项目根目录”指发布包内的根位置;在当前仓库中该文件位于 docker/docker-compose.yml,直接复制该文件即可,无需自行编写。另外 docs/synology/docker-compose.yml 提供了面向 NAS 场景的简化变体,可作为对照参考。
默认登录凭据
第一次访问登录页面时,使用文档给出的默认账号:
- 邮箱:
demo@dawarich.app - 密码:
safepassword
默认种子账号由容器入口脚本执行rails db:seed时写入(详见下文“首次启动发生了什么”),登录后请立即修改密码,并将默认演示数据替换为你自己的位置数据。
深入解析 docker-compose.yml:四个服务组成的全栈架构
docker/docker-compose.yml 定义了 4 个服务、1 个自定义网络dawarich与 5 个命名数据卷。理解每个组件的职责,是后续调优的前提。
1. dawarich_redis:缓存与后台任务队列
dawarich_redis: image: redis:7.4-alpine command: > redis-server --save 900 1 --save 300 10 --appendonly no volumes: - dawarich_shared:/dataRedis 同时承担 Sidekiq 任务队列与 Rails 缓存。它通过--save指令做了持久化兜底(900 秒内至少 1 次写、300 秒内至少 10 次写即触发 RDB 快照),--appendonly no关闭 AOF。dawarich_shared:/data将 Redis 数据落在共享卷上。健康检查用redis-cli incr ping探测实例活性。
2. dawarich_db:PostGIS 数据库(PostgreSQL + 空间扩展)
Dawarich 是典型的地理位置应用,数据库必须支持空间计算,因此镜像直接选用postgis/postgis:17-3.5-alpine(PostgreSQL 17 + PostGIS 3.5):
dawarich_db: image: postgis/postgis:17-3.5-alpine # image: imresamu/postgis:17-3.5-alpine # If you're on ARM architecture, use this image instead shm_size: 1G environment: POSTGRES_USER: ${POSTGRES_USER:-postgres} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-password} POSTGRES_DB: ${POSTGRES_DB:-dawarich_development}要点:
- ARM 架构(如 Apple Silicon、树莓派)请改用被注释的
imresamu/postgis:17-3.5-alpine镜像,这是 compose 文件注释里官方明确给出的建议; shm_size: 1G提高/dev/shm容量,避免 PostgreSQL 并行查询时共享内存不足;- 数据库账号、密码、库名均可用环境变量覆盖,默认值分别为
postgres/password/dawarich_development; - 健康检查使用
pg_isready,应用容器只有在数据库健康后才启动。
3. dawarich_app:Rails Web 应用(Puma)
dawarich_app: image: freikin/dawarich:latest ports: - "${DAWARICH_APP_PORT:-3000}:3000" entrypoint: web-entrypoint.sh command: ['bin/rails', 'server', '-p', '3000', '-b', '::']应用容器以 docker/web-entrypoint.sh 为入口,启动 Puma 服务器监听 3000 端口,并绑定::(同时支持 IPv4/IPv6)。宿主机端口默认也是 3000,可通过DAWARICH_APP_PORT环境变量改绑,例如改到8080:DAWARICH_APP_PORT=8080 docker compose up。
容器还挂载了多个卷:dawarich_public(静态资源)、dawarich_watched(监控导入目录)、dawarich_storage(Active Storage 文件)。健康检查通过请求应用自带的/api/v1/health端点并校验返回 JSON 中的"status": "ok"来判断存活。
4. dawarich_sidekiq:后台任务执行器
dawarich_sidekiq: image: freikin/dawarich:latest entrypoint: sidekiq-entrypoint.sh command: ['sidekiq']Sidekiq 负责处理导入解析、反向地理编码、轨迹/访问点生成、统计计算等耗时任务(仓库app/jobs/下可见大量此类 Job)。它与 Web 容器共享镜像,但入口换成 docker/sidekiq-entrypoint.sh,并通过depends_on确保数据库、Redis、Web 应用全部健康后才启动。健康检查以pgrep -f sidekiq验证进程存在。
服务间依赖与启动顺序
Compose 文件中显式声明了健康检查级别的依赖(condition: service_healthy),确保启动顺序为:dawarich_db、dawarich_redis→dawarich_app→dawarich_sidekiq。这是 Dawarich 首次启动能自动化建库、迁移并注入演示数据的关键保障。
首次启动发生了什么:入口脚本源码解读
官方文档只描述了“运行docker compose up”这一步,但仓库源码揭示了这一命令背后完整的一键初始化链路。docker/web-entrypoint.sh 在启动 Puma 之前会依次执行:
- 解析
DATABASE_URL:若设置了形如postgres://user:pass@host:5432/dbname的连接串,脚本会自动拆解为DATABASE_HOST/PORT/USERNAME/PASSWORD/NAME等离散变量; - 清理残留 PID 文件:删除
tmp/pids/server.pid,避免异常退出后端口被“僵尸 PID”占用导致无法重启; - 同步静态资源:镜像构建时预编译的资产位于
public_dist,启动时整体拷贝到持久卷public/,保证升级镜像后前端资源及时更新; - 建库:调用
createdb尝试创建DATABASE_NAME指定的数据库,并用psql轮询等待数据库就绪; - 执行迁移与种子:
bundle exec rails db:migrate # 结构迁移 bundle exec rake data:migrate # 数据迁移(db/data_schema.rb) bundle exec rails db:seed # 写入默认账号 demo@dawarich.app- 最后才
exec bundle exec "$@"启动 Rails 服务器。
也就是说,你不需要手动执行任何建库、迁移或初始化命令,容器首次启动即自动完成;demo@dawarich.app / safepassword正是由db:seed步骤写入的。
关键环境变量一览:开箱即用与生产化调优
docker/docker-compose.yml 中所有environment均以${VAR:-default}形式支持外部覆盖,完整模板见仓库 .env.example。以下是部署时最值得关注的变量:
| 环境变量 | 默认值 | 说明 |
|---|---|---|
DAWARICH_APP_PORT | 3000 | 宿主机映射端口,映射为${DAWARICH_APP_PORT:-3000}:3000 |
RAILS_ENV | production | 容器内默认以生产模式运行 |
DATABASE_HOST/DATABASE_PORT | dawarich_db/5432 | 数据库连接地址,默认指向 compose 网络内的服务名 |
DATABASE_USERNAME/DATABASE_PASSWORD/DATABASE_NAME | postgres/password/dawarich_development | 数据库凭据,生产环境务必修改 |
REDIS_URL | redis://dawarich_redis:6379 | Redis 连接串 |
SECRET_KEY_BASE | CHANGE_ME | Rails 密钥,生产部署必须改为随机值(可用bundle exec rails secret生成,见 .env.example 注释) |
APPLICATION_HOSTS | localhost,::1,127.0.0.1 | 允许访问的 Host 列表,绑定域名后需加入你的域名 |
TIME_ZONE | Europe/London | 应用默认时区 |
APPLICATION_PROTOCOL | http | 使用 HTTPS 反向代理时应改为https |
WEB_CONCURRENCY | 1 | Puma worker 数,家庭实例 1 个即可显著降低空闲内存(compose 注释明确说明) |
BACKGROUND_PROCESSING_CONCURRENCY | 3 | Sidekiq 并发线程数,大导入时可临时调高 |
SELF_HOSTED | true | 自托管模式标识 |
STORE_GEODATA | true | 是否存储地理原始数据 |
PROMETHEUS_EXPORTER_ENABLED | false | 是否启用 Prometheus 指标导出 |
LOG_MAX_SIZE/LOG_MAX_FILE | 100m/5 | json-file 日志轮转上限 |
APP_CPU_LIMIT/APP_MEMORY_LIMIT | 0.50/4G | deploy.resources.limits对应用容器的 CPU/内存上限 |
OTP_ENCRYPTION_* | 空 | 启用两步验证(2FA)时必需的三把密钥,默认被注释 |
修改方式:在 compose 文件所在目录创建
.env文件写入KEY=value(或在命令前以内联变量方式传入),Compose 会自动读取。.env.example中还有 SMTP 邮件、反向地理编码服务商(Photon/Nominatim/Geoapify/LocationIQ)、路线视频保留策略等可选项,按需启用。
数据持久化:五个命名卷各司其职
docker compose down不会删除数据,但docker compose down -v会。生产环境请妥善保管以下由 compose 底部定义的命名卷:
volumes: dawarich_db_data: # PostgreSQL 数据文件(挂载到 /var/lib/postgresql/data) dawarich_shared: # Redis 数据与跨容器共享文件(/var/shared) dawarich_public: # 预编译静态资源(升级镜像时由入口脚本自动同步) dawarich_watched: # 监控导入目录(tmp/imports/watched,投放文件实现免操作导入) dawarich_storage: # Active Storage 用户上传文件(导出包、视频、海报等)建议定期对dawarich_db_data做备份;dawarich_storage中的导出/媒体文件也应纳入备份策略。若需在不同宿主机间迁移,直接迁移这些卷即可。
常见调整场景
- 修改对外端口:
DAWARICH_APP_PORT=8080 docker compose up; - 绑定自定义域名 + HTTPS:设置
APPLICATION_HOSTS与APPLICATION_PROTOCOL=https,并用 Nginx/Caddy 反向代理,参见 docs/how_to_setup_reverse_proxy.md; - ARM 设备:将数据库镜像换成
imresamu/postgis:17-3.5-alpine;镜像构建层面对 amd64/arm64 均有支持(docker/Dockerfile 中为两类架构分别适配了 jemalloc 与 maplibre 渲染库,armv7 下服务端海报渲染不可用); - 低内存主机:保持
WEB_CONCURRENCY=1,并可通过APP_MEMORY_LIMIT收紧上限;镜像本身已启用 YJIT 与 jemalloc 内存优化; - 启用 2FA:取消注释并填写
OTP_ENCRYPTION_PRIMARY_KEY、OTP_ENCRYPTION_DETERMINISTIC_KEY、OTP_ENCRYPTION_KEY_DERIVATION_SALT三把密钥; - 以非 root 用户运行:按 compose 注释,设置
PUID/PGID环境变量(而非user:指令),入口脚本会自动修正卷属主并以该用户重启进程。
部署完成之后:导入你的位置数据
Web 界面就绪后即可开始使用。Dawarich 支持导入 Google 导出包、OwnTracks、Overland、GPX/KML/TCX 等多种数据来源(仓库app/services/下可看到对应解析实现)。其中“从照片提取地理数据”是常用功能,详细步骤见 docs/How_to_extract_geodata_from_photos.md;数据导入后可继续参考 docs/how_to_setup_reverse_proxy.md 配置域名访问。
其他部署方式与延伸阅读
Docker Compose 是官方推荐的最轻量自托管方式,仓库还提供了另外两条部署路径与中文版本文档,可按环境选用:
- docs/How_to_install_Dawarich_on_Synology.md:群晖 NAS 图形化安装(配套 compose 见 docs/synology/docker-compose.yml);
- docs/How_to_install_Dawarich_in_k8s.md:Kubernetes 集群部署;
- 中文版安装文档:docs/zh-CN/How_to_install_Dawarich_using_Docker.md;
- 项目总体介绍与功能清单见 README.md。
结语
Dawarich 的 Docker 部署链路设计得相当自动化:docker compose up一条命令即可完成“拉镜像 → 建库 → 迁移 → 种子数据 → 启动 Web 与 Sidekiq”的全部流程,首次访问 http://127.0.0.1:3000 使用默认账号demo@dawarich.app / safepassword登录即可。生产化部署时,请务必重点处理三件事:修改数据库密码、替换SECRET_KEY_BASE、设置正确的APPLICATION_HOSTS与APPLICATION_PROTOCOL。在此基础上,再根据你的硬件条件调整WEB_CONCURRENCY、内存上限与日志轮转参数,即可获得一个稳定、私有的 Google Timeline 替代方案。
【免费下载链接】dawarichYour favorite self-hostable alternative to Google Timeline (Google Location History)项目地址: https://gitcode.com/GitHub_Trending/da/dawarich
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考