Configuração
Se há uma funcionalidade que você está planejando trabalhar, apenas nos informe no Discord para que possamos:
- Informar se é algo que aceitaríamos no Immich
- Fornecer orientações sobre como algo assim poderia ser idealmente implementado
- Garantir que ninguém já esteja trabalhando nessa questão/funcionalidade para evitar esforços duplicados
Obrigado por seu interesse em contribuir 😊
Ambiente
Serviços
Este ambiente inclui os serviços abaixo. Detalhes adicionais estão disponíveis no README de cada serviço.
- Servidor -
/server - Aplicativo web -
/web - Aprendizado de máquina -
/machine-learning - Redis
- Banco de dados de desenvolvimento PostgreSQL com porta exposta
5432, permitindo o uso de qualquer cliente de banco de dados para acessá-lo
Todos os serviços estão empacotados para rodar com um único comando Docker Compose.
Aplicativos servidor e web
- Clone o repositório do projeto.
- Execute
cp docker/example.env docker/.env. - Edite
docker/.envpara fornecer valores para a variável necessáriaUPLOAD_LOCATION. - No diretório raiz, execute:
make dev # Makefile requerido instalado no sistema.
- Acesse a instância de desenvolvimento no seu navegador em http://localhost:3000, ou conecte-se via aplicativo móvel.
Todos os serviços serão iniciados com hot-reloading ativado para um ciclo rápido de feedback.
Você pode acessar o aplicativo web em http://your-machine-ip:3000 ou http://localhost:3000 e acessar o servidor pelo aplicativo móvel em http://your-machine-ip:3000/api
Notas:
- O contêiner de desenvolvimento "web" opera com uid 1000. Se esse uid não tiver permissões de leitura/escrita nos volumes montados, você pode encontrar erros
- Em caso de configuração Docker sem root, será necessário usar root dentro do contêiner. Caso contrário, você encontrará erros relacionados a permissões de leitura/escrita. Veja os comentários em
docker/docker-compose.dev.yml.
Conectar web a um backend remoto
Se você deseja apenas desenvolver o front-end conectado a um backend remoto existente, siga estes passos:
- Compile o SDK Immich -
cd open-api/typescript-sdk && npm i && npm run build && cd - - Entre no diretório web -
cd web/ - Instale as dependências web -
npm i - Inicie o servidor de desenvolvimento web
IMMICH_SERVER_URL=https://demo.immich.app/ npm run dev
Se você estiver usando PowerShell no Windows, pode ser necessário definir a variável de ambiente separadamente, assim:
$env:IMMICH_SERVER_URL = "https://demo.immich.app/"
npm run dev
@immich/ui
Para ver alterações locais em @immich/ui no Immich, faça o seguinte:
- Instale
@immich/uicomo um diretório irmão deimmich/, por exemplo/home/user/immiche/home/user/ui - Compile o projeto
@immich/uivianpm run build - Descomente o volume correspondente no serviço web do arquivo
docker/docker-compose.dev.yaml(../../ui:/usr/ui) - Descomente o alias correspondente no arquivo
web/vite.config.js('@immich/ui': path.resolve(__dirname, '../../ui')) - Descomente a declaração de importação no arquivo
web/src/app.css@import '/usr/ui/dist/theme/default.css';e comente@import '@immich/ui/theme/default.css'; - Inicie o stack via
make dev - Após fazer alterações em
@immich/ui, reconstrua-o (npm run build)
Aplicativo móvel
Configuração
- Configure o conjunto de ferramentas Flutter usando o FVM.
- Execute
flutter pub getpara instalar as dependências. - Execute
make translationpara gerar o arquivo de tradução. - Execute
fvm flutter runpara iniciar o aplicativo.
Tradução
Para adicionar um novo texto de tradução, insira o par chave-valor no arquivo i18n/en.json na raiz do projeto Immich. Em seguida, no diretório mobile/, execute
make translation
O aplicativo móvel solicita qual backend deseja conectar. Você pode utilizar o backend demo (https://demo.immich.app/) se não precisar alterar o código do servidor ou carregar fotos. Alternativamente, você pode executar o servidor conforme as instruções acima.
Configuração de IDE
Extensões para lint / formatação
Definir essas extensões na IDE proporciona uma melhor experiência de desenvolvimento, com formatação automática de código ao salvar e feedback instantâneo sobre problemas de lint.
Dart Code Metrics
O aplicativo móvel utiliza DCM (Dart Code Metrics) para linting e cálculo de métricas. Por favor, consulte a página Getting Started para mais informações sobre como configurar o DCM.
Nota: Ativar a licença não é necessário.
VSCode
Instale as extensões Flutter, DCM, Prettier, ESLint e Svelte. Estas extensões estão listadas no arquivo extensions.json dentro da pasta .vscode/ e devem aparecer como recomendações do workspace.
Aqui estão as configurações que usamos. Elas devem estar ativas como configurações do workspace (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"
}