背景與需求
身為一個記錄控,我過去睜一隻眼閉一隻眼地允許 Google 每天記錄我的 GPS 軌跡,以便我有時間軸歷史記錄供我自己備考。實在是沒辦法,因為就這個需求而言本來沒有太多選擇,只好出賣自己的隱私換取這個服務。
但總算,繼 Immich 好用到足以取代 Google Album 之後,現在 Dawarich 也好用到足以取代 Google Timeline 了——又是開源的勝利!如果你想找一個自架的軌跡時間軸服務,我認為目前 Dawarich 是個可以參考的選項。
記錄方式一樣是用手機作為蒐集 GPS 的設備,但資料直接回傳到自己的 server。也就是說,你可以不用再給 Google 你的位置信息咯。
以我們讀書會去福山植物園考察山羌(超級多山羌!野生的哦,都不怕人)的位置軌跡為例,給大家欣賞一下 Dawarich 的網頁界面,還挺好看的可不是嗎:
手機端的也挺驚艷:

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

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

為什麼活躍時間要在早上呢?請參考《為什麼我九點睡?》
安裝方式
本次服務老樣子用 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:5487 或 100.87.87.87:5487 來進行訪問。
疑難雜症
初次訪問你會發現啊是要怎麼登入,還真是好問題,因為文件也沒有寫清楚這部分。反正後來從 issue 翻到預設的登入帳號密碼為:[email protected]/safepassword,進去後再修改成自己即可。
以上!