跳到主要内容

安裝設定

注释

如果您打算開發某個功能,請先在 Discord 上通知我們,這樣我們可以:

  1. 讓您知道該功能是否適合被加入 Immich
  2. 提供一些實現相關功能的建議
  3. 確保沒有人已經在開發相同的功能以避免重複勞動

感謝您對貢獻感興趣 😊

環境

服務

此環境包含下列服務。每個服務的詳細細節可在其 README 中查看。

  • 伺服器 - /server
  • 網頁應用程式 - /web
  • 機器學習 - /machine-learning
  • Redis
  • 暴露埠 5432 的 PostgreSQL 開發資料庫,您可以使用任何資料庫客戶端訪問

所有服務均使用單一 Docker Compose 指令打包運行。

伺服器與網頁應用程式

  1. Clone 此專案倉庫。
  2. 執行 cp docker/example.env docker/.env
  3. 編輯 docker/.env 以填寫所需的變數 UPLOAD_LOCATION
  4. 在根目錄中執行命令:
啟動開發伺服器
make dev # 系統需安裝 Makefile。
  1. 在瀏覽器中打開 http://localhost:3000 訪問開發實例,或者通過行動應用程式進行連接。

所有服務將啟用了即時熱重載,確保快速的反饋循環。

您可通過 http://your-machine-ip:3000http://localhost:3000 訪問網頁,並通過 mobile app 使用 http://your-machine-ip:3000/api 訪問伺服器。

注意事項:

  • "web" 開發容器以 uid 1000 運行。如果該 uid 在掛載的卷上沒有讀寫權限,您可能會遇到錯誤。
  • 在使用無 root 權限的 docker 設定時,您需要在容器內使用 root 帳戶,否則可能會遇到讀寫權限錯誤,詳情請參閱 docker/docker-compose.dev.yml 文件中的註解。

連接網頁到遠端後端

如果您只需要開發網頁,並連接到已存在的遠端後端,請按以下步驟操作:

  1. 建立 Immich SDK - cd open-api/typescript-sdk && npm i && npm run build && cd -
  2. 進入 web 資料夾 - cd web/
  3. 安裝 web 依賴 - npm i
  4. 啟動 web 開發伺服器
IMMICH_SERVER_URL=https://demo.immich.app/ npm run dev

如果您使用 Windows 的 PowerShell,可能需要單獨設置環境變數,例如:

$env:IMMICH_SERVER_URL = "https://demo.immich.app/"
npm run dev

@immich/ui

若需要在 Immich 中檢視本地的 @immich/ui 變更,請執行以下步驟:

  1. @immich/ui 安裝為與 immich/ 並列的位置,如 /home/user/immich/home/user/ui
  2. 通過 npm run build 建置 @immich/ui 專案
  3. docker/docker-compose.dev.yaml 文件的 web service 段落中取消註釋對應的自訂掛載 (../../ui:/usr/ui)
  4. web/vite.config.js 文件中取消註釋對應的別名 ('@immich/ui': path.resolve(__dirname, '../../ui'))
  5. web/src/app.css 文件中取消註釋該行:@import '/usr/ui/dist/theme/default.css'; 並註釋掉 @import '@immich/ui/theme/default.css';
  6. 通過 make dev 啟動堆棧
  7. 每次修改 @immich/ui 後,重新構建它(npm run build

行動應用程式

安裝設定

  1. 使用 FVM 建立 Flutter 工具鏈。
  2. 執行 flutter pub get 安裝依賴。
  3. 執行 make translation 生成翻譯文件。
  4. 執行 fvm flutter run 啟動應用。

翻譯

若需要新增翻譯文字,請在 immich 專案根目錄的 i18n/en.json 文件中新增鍵值對。然後在 mobile/ 資料夾中執行:

make translation

行動應用將向您詢問需連接的後端。若您不需修改伺服器代碼或上傳照片,可以利用演示後端(https://demo.immich.app/)。或者,您可以依照以上步驟自行運行伺服器。

IDE 設定

Lint / 格式化擴充功能

在 IDE 中設置這些功能可提供更佳的開發者體驗,自動在儲存時格式化代碼,並即時提供 lint 問題的反饋。

Dart Code Metrics

行動應用使用 DCM(Dart Code Metrics)進行 lint 和指標計算。有關 DCM 設置的更多資訊,請參考入門指南

注意:不需要啟用授權。

VSCode

安裝 FlutterDCMPrettierESLintSvelte 擴展。這些擴展在 .vscode/extensions.json 文件中列為擴展推薦。

以下是我們使用的設置,應作為工作區設置在 settings.json 中啟用:

settings.json
{
"[css]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"editor.tabSize": 2
},
"[dart]": {
"editor.defaultFormatter": "Dart-Code.dart-code",
"editor.formatOnSave": true,
"editor.selectionHighlight": false,
"editor.suggest.snippetsPreventQuickSuggestions": false,
"editor.suggestSelection": "first",
"editor.tabCompletion": "onlySnippets",
"editor.wordBasedSuggestions": "off"
},
"[javascript]": {
"editor.codeActionsOnSave": {
"source.organizeImports": "explicit",
"source.removeUnusedImports": "explicit"
},
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"editor.tabSize": 2
},
"[json]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"editor.tabSize": 2
},
"[jsonc]": {
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"editor.tabSize": 2
},
"[svelte]": {
"editor.codeActionsOnSave": {
"source.organizeImports": "explicit",
"source.removeUnusedImports": "explicit"
},
"editor.defaultFormatter": "svelte.svelte-vscode",
"editor.formatOnSave": true,
"editor.tabSize": 2
},
"[typescript]": {
"editor.codeActionsOnSave": {
"source.organizeImports": "explicit",
"source.removeUnusedImports": "explicit"
},
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true,
"editor.tabSize": 2
},
"cSpell.words": ["immich"],
"editor.formatOnSave": true,
"eslint.validate": ["javascript", "svelte"],
"explorer.fileNesting.enabled": true,
"explorer.fileNesting.patterns": {
"*.dart": "${capture}.g.dart,${capture}.gr.dart,${capture}.drift.dart",
"*.ts": "${capture}.spec.ts,${capture}.mock.ts"
},
"svelte.enable-ts-plugin": true,
"typescript.preferences.importModuleSpecifier": "non-relative"
}