Настройка
Если вы планируете работать над какой-либо функцией, дайте нам знать об этом в Discord, чтобы мы могли:
- Сообщить вам, будет ли эта функция принята в Immich
- Предоставить рекомендации по ее оптимальной реализации
- Убедиться, что никто уже не работает над этим вопросом/функцией, чтобы не дублировать усилия
Спасибо за интерес к участию в разработке 😊
Окружение
Сервисы
Это окружение включает в себя следующие сервисы. Подробная информация доступна в README каждого сервиса.
- Сервер -
/server
- Веб-приложение -
/web
- Машинное обучение -
/machine-learning
- Redis
- Разработческая база данных PostgreSQL с открытым портом
5432
, чтобы вы могли использовать любой клиент базы данных для доступа к ней
Все сервисы упакованы для запуска одной командой Docker Compose.
Сервер и веб-приложения
- Клонируйте репозиторий проекта.
- Запустите
cp docker/example.env docker/.env
. - Измените
docker/.env
, чтобы указать значения для обязательной переменнойUPLOAD_LOCATION
. - В корневом каталоге выполните:
make dev # требуется установленный в системе Makefile.
- Откройте экземпляр разработки в браузере по адресу http://localhost:3000 или подключитесь через мобильное приложение.
Все сервисы будут запущены с включенной горячей перезагрузкой для быстрого цикла обратной связи.
Вы можете получить доступ к веб-версии через http://your-machine-ip:3000
или http://localhost:3000
, а также получить доступ к серверу через мобильное приложение по адресу http://your-machine-ip:3000/api
Примечания:
- Контейнер разработки "web" работает с uid 1000. Если у этого uid нет прав на чтение/запись к монтированным объемам, вы можете столкнуться с ошибками
- В случае настройки rootless Docker необходимо использовать root внутри контейнера, иначе будут возникать ошибки с правами на чтение/запись. См. комментарии в файле
docker/docker-compose.dev.yml
.
Подключение веб-приложения к удаленному серверу
Если вы хотите заниматься только разработкой веб-сайта, подключенного к существующему удаленному серверу, выполните следующие шаги:
- Соберите SDK Immich -
cd open-api/typescript-sdk && npm i && npm run build && cd -
- Перейдите в каталог веб-приложения -
cd web/
- Установите зависимости веб-приложения -
npm i
- Запустите сервер разработки веб-приложения
IMMICH_SERVER_URL=https://demo.immich.app/ npm run dev
Если вы используете PowerShell в Windows, возможно, понадобится задать переменную окружения отдельно, например:
$env:IMMICH_SERVER_URL = "https://demo.immich.app/"
npm run dev
@immich/ui
Чтобы увидеть локальные изменения в @immich/ui
в Immich, выполните следующее:
- Установите
@immich/ui
рядом с каталогомimmich/
, например/home/user/immich
и/home/user/ui
- Соберите проект
@immich/ui
с помощью командыnpm run build
- Раскомментируйте соответствующий том в веб-сервисе файла
docker/docker-compose.dev.yaml
(../../ui:/usr/ui
) - Раскомментируйте соответствующий alias в файле
web/vite.config.js
('@immich/ui': path.resolve(__dirname, '../../ui')
) - Раскомментируйте строку импорта в файле
web/src/app.css
(@import '/usr/ui/dist/theme/default.css';
) и закомментируйте строку@import '@immich/ui/theme/default.css';
- Запустите стек с помощью команды
make dev
- После внесения изменений в
@immich/ui
перезагрузите его (npm run build
)
Мобильное приложение
Настройка
- Настройте инструментальную цепочку Flutter с использованием FVM.
- Запустите
flutter pub get
для установки зависимостей. - Выполните
make translation
для создания файла перевода. - Запустите
fvm flutter run
для запуска приложения.
Перевод
Чтобы добавить новый текст перевода, укажите пару "ключ-значение" в файле i18n/en.json
в корне проекта Immich. Затем, из каталога mobile/
, выполните
make translation
Мобильное приложение спрашивает, к какому серверу подключиться. Вы можете использовать демонстрационный сервер (https://demo.immich.app/), если вам не нужно изменять коды сервера или загружать фотографии. Кроме того, вы можете запустить сервер самостоятельно, следуя вышеуказанным инструкциям.
Настройка IDE
Расширения для линтинга / форматирования
Настройка этих расширений в IDE улучшает разработку, автоматически форматируя код при сохранении и пре доставляя мгновенную обратную связь по вопросам линтинга.
Dart Code Metrics
Мобильное приложение использует DCM (Dart Code Metrics) для линтинга и вычисления метрик. Пожалуйста, ознакомьтесь с страницей "Начало работы" для получения дополнительной информации о настройке DCM.
Примечание: Активация лицензии не требуется.
VSCode
Установите расширения Flutter
, DCM
, Prettier
, ESLint
и Svelte
. Эти расширения перечислены в файле extensions.json
под .vscode/
и должны отображаться как рекомендации для рабочего пространства.
Вот настройки, которые мы используем. Они должны быть активны как настройки рабочего пространства (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"
}