背景與需求

身為一個記錄控,我過去睜一隻眼閉一隻眼地允許 Google 每天記錄我的 GPS 軌跡,以便我有時間軸歷史記錄供我自己備考。實在是沒辦法,因為就這個需求而言本來沒有太多選擇,只好出賣自己的隱私換取這個服務。

但總算,繼 Immich 好用到足以取代 Google Album 之後,現在 Dawarich 也好用到足以取代 Google Timeline 了——又是開源的勝利!如果你想找一個自架的軌跡時間軸服務,我認為目前 Dawarich 是個可以參考的選項。

記錄方式一樣是用手機作為蒐集 GPS 的設備,但資料直接回傳到自己的 server。也就是說,你可以不用再給 Google 你的位置信息咯。

以我們讀書會去福山植物園考察山羌(超級多山羌!野生的哦,都不怕人)的位置軌跡為例,給大家欣賞一下 Dawarich 的網頁界面,還挺好看的可不是嗎:

dawarich2手機端的也挺驚艷:

mobile

除了瀏覽界面的 UI 設計很不錯之外,它的 Poster Studio 能自訂參數,輸出美麗的軌跡海報:

dawarich

當然,作為記錄控並不是真的純粹愛記錄,而是蒐集來的 data 可以拿來分析,給自己一些洞見。我自己的看法是,「純記錄不分析」很大程度上就淪於所謂「形式大於內容」,不可不慎。但移動軌跡、日記、相簿這些「記錄本身就包含內容」的資料就還好啦,所以我只是隨口 murmur 一下(?),以後再來談談我過去的一堆「形式大於內容」的折騰。不過 Dawarich 倒是真的有針對資料提供一些 insight,還真就把我的活躍時間給準確地揪了出來:

dawarich4

為什麼活躍時間要在早上呢?請參考《為什麼我九點睡?》

安裝方式

本次服務老樣子用 docker 運行在我的 linux server 中,但有別以往用 Nginx Proxy Manager 反向代理從外網訪問進來,這次我採用 Tailscale 的方案,不過核心概念都是一樣的,不多贅述。至於我對 Tailscale 的評價…… 簡直就是魔法,太方便了,歎為觀止。

調整 docker compose

此處我們採用官方的 docker-compose.yml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
networks:
dawarich:

services:
dawarich_redis:
image: redis:7.4-alpine
container_name: dawarich_redis
command: >
redis-server
--save 900 1
--save 300 10
--appendonly no
networks:
- dawarich
volumes:
- dawarich_shared:/data
restart: always
healthcheck:
test: [ "CMD", "redis-cli", "--raw", "incr", "ping" ]
interval: 10s
retries: 5
start_period: 30s
timeout: 10s

dawarich_db:
image: postgis/postgis:17-3.5-alpine
shm_size: 1G
container_name: dawarich_db
volumes:
- dawarich_db_data:/var/lib/postgresql/data
- dawarich_shared:/var/shared
networks:
- dawarich
environment:
POSTGRES_USER: ${POSTGRES_USER:-postgres}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-password}
POSTGRES_DB: ${POSTGRES_DB:-dawarich_development}
restart: always
healthcheck:
test: [ "CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-dawarich_development}" ]
interval: 10s
retries: 5
start_period: 30s
timeout: 10s

dawarich_app:
image: freikin/dawarich:latest
container_name: dawarich_app
volumes:
- dawarich_public:/var/app/public
- dawarich_watched:/var/app/tmp/imports/watched
- dawarich_storage:/var/app/storage
- dawarich_db_data:/dawarich_db_data
networks:
- dawarich
ports:
- "${DAWARICH_APP_PORT:-3000}:3000"
stdin_open: true
tty: true
entrypoint: web-entrypoint.sh
command: ['bin/rails', 'server', '-p', '3000', '-b', '::']
restart: unless-stopped
environment:
RAILS_ENV: ${RAILS_ENV:-production}
REDIS_URL: ${REDIS_URL:-redis://dawarich_redis:6379}
DATABASE_HOST: ${DATABASE_HOST:-dawarich_db}
DATABASE_PORT: ${DATABASE_PORT:-5432}
DATABASE_USERNAME: ${DATABASE_USERNAME:-postgres}
DATABASE_PASSWORD: ${DATABASE_PASSWORD:-password}
DATABASE_NAME: ${DATABASE_NAME:-dawarich_development}
APPLICATION_HOSTS: ${APPLICATION_HOSTS:-localhost,::1,127.0.0.1}
TIME_ZONE: ${TIME_ZONE:-Europe/London}
APPLICATION_PROTOCOL: ${APPLICATION_PROTOCOL:-http}
PROMETHEUS_EXPORTER_ENABLED: ${PROMETHEUS_EXPORTER_ENABLED:-false}
SECRET_KEY_BASE: ${SECRET_KEY_BASE:-"CHANGE_ME"}
RAILS_LOG_TO_STDOUT: ${RAILS_LOG_TO_STDOUT:-true}
SELF_HOSTED: ${SELF_HOSTED:-true}
STORE_GEODATA: ${STORE_GEODATA:-true}
WEB_CONCURRENCY: ${WEB_CONCURRENCY:-1}
logging:
driver: "json-file"
options:
max-size: ${LOG_MAX_SIZE:-100m}
max-file: ${LOG_MAX_FILE:-5}
healthcheck:
test: [ "CMD-SHELL", "wget -qO - <http://127.0.0.1:3000/api/v1/health> | grep -q '\"status\"\\s*:\\s*\"ok\"'" ]
interval: 10s
retries: 30
start_period: 30s
timeout: 10s
depends_on:
dawarich_db:
condition: service_healthy
restart: true
dawarich_redis:
condition: service_healthy
restart: true
deploy:
resources:
limits:
cpus: ${APP_CPU_LIMIT:-0.50}
memory: ${APP_MEMORY_LIMIT:-4G}

dawarich_sidekiq:
image: freikin/dawarich:latest
container_name: dawarich_sidekiq
volumes:
- dawarich_public:/var/app/public
- dawarich_watched:/var/app/tmp/imports/watched
- dawarich_storage:/var/app/storage
networks:
- dawarich
stdin_open: true
tty: true
entrypoint: sidekiq-entrypoint.sh
command: ['sidekiq']
restart: unless-stopped
environment:
RAILS_ENV: ${RAILS_ENV:-production}
REDIS_URL: ${REDIS_URL:-redis://dawarich_redis:6379}
DATABASE_HOST: ${DATABASE_HOST:-dawarich_db}
DATABASE_PORT: ${DATABASE_PORT:-5432}
DATABASE_USERNAME: ${DATABASE_USERNAME:-postgres}
DATABASE_PASSWORD: ${DATABASE_PASSWORD:-password}
DATABASE_NAME: ${DATABASE_NAME:-dawarich_development}
APPLICATION_HOSTS: ${APPLICATION_HOSTS:-localhost,::1,127.0.0.1}
BACKGROUND_PROCESSING_CONCURRENCY: ${BACKGROUND_PROCESSING_CONCURRENCY:-3}
APPLICATION_PROTOCOL: ${APPLICATION_PROTOCOL:-http}
PROMETHEUS_EXPORTER_ENABLED: ${PROMETHEUS_EXPORTER_ENABLED:-false}
SECRET_KEY_BASE: ${SECRET_KEY_BASE:-"CHANGE_ME"}
RAILS_LOG_TO_STDOUT: ${RAILS_LOG_TO_STDOUT:-true}
SELF_HOSTED: ${SELF_HOSTED:-true}
STORE_GEODATA: ${STORE_GEODATA:-true}
logging:
driver: "json-file"
options:
max-size: ${LOG_MAX_SIZE:-100m}
max-file: ${LOG_MAX_FILE:-5}
healthcheck:
test: [ "CMD-SHELL", "pgrep -f sidekiq" ]
interval: 10s
retries: 30
start_period: 30s
timeout: 10s
depends_on:
dawarich_db:
condition: service_healthy
restart: true
dawarich_redis:
condition: service_healthy
restart: true
dawarich_app:
condition: service_healthy
restart: true

volumes:
dawarich_db_data:
dawarich_shared:
dawarich_public:
dawarich_watched:
dawarich_storage:

一共會 run 起四個服務。其中我們對 dawarich_app 進行一些修改,建議用 .env 設定環境變數:

  • DAWARICH_APP_PORT=5487 設定服務的 port,此處照慣例設為 5487。
  • APPLICATION_HOST=tailscale-name,100.87.87.87 設定可接受的訪問url。以此處為例,因為 Tailscale 有 Magic DNS,可以填入 server 在 Tailscale 中的裝置名稱 tailscale-name。當然也可以填入 Tailscale 發的 IP 位置,都會是 100 開頭,此處假設 100.87.87.87。如果你不是用 Tailscale,那就是填入反向代理設定的 url。
  • TIME_ZONE=Asia/Taipei 設定你的時區,此處設台北。

運行服務

docker compose up -d 走起,服務啟動。

訪問服務

至此,可以用 tailscale-name:5487100.87.87.87:5487 來進行訪問。

疑難雜症

初次訪問你會發現啊是要怎麼登入,還真是好問題,因為文件也沒有寫清楚這部分。反正後來從 issue 翻到預設的登入帳號密碼為:[email protected]/safepassword,進去後再修改成自己即可。

以上!