-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathupdate_data.sh
More file actions
236 lines (203 loc) · 7.84 KB
/
update_data.sh
File metadata and controls
236 lines (203 loc) · 7.84 KB
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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
#!/bin/bash
# 這個腳本用於下載和安裝最新的 geodata 和 i18n-iso-countries 資料夾
# 下載的檔案會被解壓縮到指定的目錄 (DOWNLOAD_DIR)
# 如果指定了 --install 參數,則會將檔案安裝到系統目錄 (僅限於 Docker 環境)
set -e
# --- 版本工具函數 ---
# 自動檢測 package.json 位置並取得版本字串,例如 1.140.1
get_pkg_version() {
# 優先檢查舊版本路徑
if [ -f "/usr/src/app/package.json" ]; then
node -p "require('/usr/src/app/package.json').version" 2>/dev/null
# 備援檢查新版本路徑
elif [ -f "/usr/src/app/server/package.json" ]; then
node -p "require('/usr/src/app/server/package.json').version" 2>/dev/null
else
echo "錯誤:無法找到 Immich package.json 檔案" >&2
echo "檢查的位置:" >&2
echo " - /usr/src/app/package.json" >&2
echo " - /usr/src/app/server/package.json" >&2
echo "請確認此腳本在正確的 Immich 容器環境中執行。" >&2
exit 1
fi
}
# 比較語義化版本:若 $1 < $2 則傳回 0 (true),否則傳回 1 (false)
semver_lt() {
local a="$1" b="$2"
# 優先使用 npx semver(最標準的語意版本比較)
if command -v npx >/dev/null 2>&1; then
npx --yes semver "$a" -r "<$b" >/dev/null 2>&1
return $?
fi
# 備援:使用 GNU sort -V 進行版本排序
if command -v sort >/dev/null 2>&1 && sort --version-sort /dev/null >/dev/null 2>&1; then
local sorted=$(printf "%s\n%s\n" "$a" "$b" | sort -V)
local first_line=$(echo "$sorted" | head -n1)
[ "$first_line" = "$a" ] && [ "$a" != "$b" ]
return $?
fi
# 最後備援:安全的語意版本比較實現
node -e "
const [a, b] = process.argv.slice(1);
const normalize = v => {
const parts = v.split('.').map(Number);
return [parts[0] || 0, parts[1] || 0, parts[2] || 0];
};
const [a0, a1, a2] = normalize(a);
const [b0, b1, b2] = normalize(b);
const lt = (a0 < b0) || (a0 === b0 && (a1 < b1 || (a1 === b1 && a2 < b2)));
process.exit(lt ? 0 : 1);
" "$a" "$b"
}
# --- 版本工具函數結束 ---
# 用戶可修改的配置
DOWNLOAD_DIR="./temp" # 普通模式下的下載目錄
# 預設值
RELEASE_TAG="latest"
INSTALL_MODE=false
# 解析參數
while [[ "$#" -gt 0 ]]; do
case $1 in
--tag) RELEASE_TAG="$2"; shift; shift ;; # 讀取 --tag 後面的值
--install) INSTALL_MODE=true; shift ;; # 識別 --install 參數
*) echo "未知的參數: $1"; exit 1 ;;
esac
done
# 構建下載連結和驗證 Tag (如果不是 latest)
if [ "$RELEASE_TAG" == "latest" ]; then
DOWNLOAD_URL="https://github.com/RxChi1d/immich-geodata-zh-tw/releases/latest/download/release.tar.gz"
else
# 驗證 Tag 是否存在
echo "正在驗證 Tag: $RELEASE_TAG ..."
TAG_CHECK_URL="https://api.github.com/repos/RxChi1d/immich-geodata-zh-tw/releases/tags/${RELEASE_TAG}"
HTTP_STATUS=$(curl -o /dev/null -s -w "%{http_code}" "$TAG_CHECK_URL")
if [ "$HTTP_STATUS" -eq 404 ]; then
echo "錯誤:找不到指定的 Release Tag '$RELEASE_TAG'。"
echo "請確認 Tag 名稱是否正確,或使用 'latest' 來下載最新版本。"
exit 1
elif [ "$HTTP_STATUS" -ne 200 ]; then
# 處理其他可能的錯誤,例如網路問題或 API rate limit
echo "錯誤:驗證 Tag '$RELEASE_TAG' 時發生問題 (HTTP Status: $HTTP_STATUS)。"
exit 1
fi
echo "Tag '$RELEASE_TAG' 驗證成功。"
DOWNLOAD_URL="https://github.com/RxChi1d/immich-geodata-zh-tw/releases/download/${RELEASE_TAG}/release.tar.gz"
fi
# 根據安裝模式決定下載目錄
if [ "$INSTALL_MODE" = true ]; then
# 安裝模式:使用臨時目錄
DOWNLOAD_DIR=$(mktemp -d -t immich_geodata_XXXXXX)
echo "使用臨時目錄: $DOWNLOAD_DIR"
# 註冊清理函數,在腳本結束時自動刪除臨時目錄
cleanup() {
if [ -d "$DOWNLOAD_DIR" ]; then
echo "清理臨時目錄: $DOWNLOAD_DIR"
rm -rf "$DOWNLOAD_DIR"
fi
}
trap cleanup EXIT
else
# 普通下載模式:使用指定目錄
echo "使用指定目錄: $DOWNLOAD_DIR"
# 確保下載目錄存在
if [ ! -d "$DOWNLOAD_DIR" ]; then
echo "創建下載目錄: $DOWNLOAD_DIR"
mkdir -p "$DOWNLOAD_DIR"
else
GEODATA_DIR="$DOWNLOAD_DIR/geodata"
I18N_ISO_COUNTRIES_DIR="$DOWNLOAD_DIR/i18n-iso-countries"
if [ -d "$GEODATA_DIR" ]; then
echo "清理舊版本 geodata..."
rm -rf "$GEODATA_DIR"
fi
if [ -d "$I18N_ISO_COUNTRIES_DIR" ]; then
echo "清理舊版本 i18n-iso-countries..."
rm -rf "$I18N_ISO_COUNTRIES_DIR"
fi
fi
fi
# 下載檔案
echo "開始下載 release.tar.gz 從 $DOWNLOAD_URL ..."
curl -L -o "$DOWNLOAD_DIR/release.tar.gz" "$DOWNLOAD_URL"
if [ $? -ne 0 ]; then
echo "下載檔案失敗"
exit 1
fi
# 解壓縮檔案
echo "開始解壓縮 release.tar.gz..."
tar --no-same-permissions -xvf "$DOWNLOAD_DIR/release.tar.gz" -C "$DOWNLOAD_DIR"
if [ $? -ne 0 ]; then
echo "解壓縮檔案失敗"
exit 1
fi
# 在安裝模式下,不需要特別刪除壓縮檔,因為整個臨時目錄會被清理
# 在普通模式下,保留壓縮檔,讓用戶自行決定是否刪除
# 如果指定了 --install,執行安裝步驟
if [ "$INSTALL_MODE" = true ]; then
echo "執行安裝步驟 (--install)..."
# 定義系統目標路徑
SYSTEM_GEODATA_PATH="/build/geodata"
# 依版本決定 i18n 目標路徑
CURRENT_VERSION="$(get_pkg_version)"
if [ -z "$CURRENT_VERSION" ]; then
echo "警告:無法讀取 /usr/src/app/server/package.json 版本,將使用相容路徑 /usr/src/app/node_modules"
CURRENT_VERSION="0.0.0"
fi
if semver_lt "$CURRENT_VERSION" "1.136.0"; then
SYSTEM_I18N_PATH="/usr/src/app/node_modules/i18n-iso-countries"
else
SYSTEM_I18N_PATH="/usr/src/app/server/node_modules/i18n-iso-countries"
fi
echo "偵測版本: $CURRENT_VERSION -> i18n 目標: $SYSTEM_I18N_PATH"
# 確保目標父目錄存在
echo "確保目標系統目錄存在..."
mkdir -p /build
mkdir -p "$(dirname "$SYSTEM_I18N_PATH")"
# --- 先備份系統路徑 ---
echo "備份現有系統檔案..."
if [ -d "$SYSTEM_GEODATA_PATH" ]; then
echo "備份 $SYSTEM_GEODATA_PATH 到 $SYSTEM_GEODATA_PATH.bak..."
rm -rf "$SYSTEM_GEODATA_PATH.bak" # 先移除舊備份
cp -a "$SYSTEM_GEODATA_PATH" "$SYSTEM_GEODATA_PATH.bak"
fi
if [ -d "$SYSTEM_I18N_PATH" ]; then
echo "備份 $SYSTEM_I18N_PATH 到 $SYSTEM_I18N_PATH.bak..."
rm -rf "$SYSTEM_I18N_PATH.bak" # 先移除舊備份
cp -a "$SYSTEM_I18N_PATH" "$SYSTEM_I18N_PATH.bak"
fi
echo "備份完成。"
# --- 備份結束 ---
# --- 更新系統檔案 ---
echo "更新系統檔案..."
# 檢查來源是否存在
if [ -d "$DOWNLOAD_DIR/geodata" ]; then
echo "更新 geodata..."
rm -rf "$SYSTEM_GEODATA_PATH"
cp -a "$DOWNLOAD_DIR/geodata" "$SYSTEM_GEODATA_PATH"
# 確保複製後的檔案擁有者為 root
echo "設定 geodata 擁有者為 root..."
chown -R root:root "$SYSTEM_GEODATA_PATH"
else
echo "錯誤:geodata 資料夾不存在,無法完成更新。"
fi
if [ -d "$DOWNLOAD_DIR/i18n-iso-countries" ]; then
echo "更新 i18n-iso-countries..."
# 確保目標模組目錄存在 (它應該由基礎映像檔安裝好)
mkdir -p "$SYSTEM_I18N_PATH"
# 複製下載目錄的 *內容* 到目標目錄,覆蓋現有檔案
# 注意來源路徑結尾的 /. 表示複製內容而非目錄本身
cp -a "$DOWNLOAD_DIR/i18n-iso-countries/." "$SYSTEM_I18N_PATH/"
# 確保複製後的檔案擁有者為 root
echo "設定 i18n-iso-countries 擁有者為 root..."
chown -R root:root "$SYSTEM_I18N_PATH"
else
echo "錯誤:i18n-iso-countries 資料夾不存在,無法完成更新。"
fi
echo "系統檔案更新完成。"
# --- 更新結束 ---
echo "安裝步驟完成。"
echo "更新完成 (Tag: $RELEASE_TAG)"
# 臨時目錄會由 trap 自動清理
else
echo "下載完成 (Tag: $RELEASE_TAG)"
fi