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/.env
para 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/ui
como um diretório irmão deimmich/
, por exemplo/home/user/immich
e/home/user/ui
- Compile o projeto
@immich/ui
vianpm 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 get
para instalar as dependências. - Execute
make translation
para gerar o arquivo de tradução. - Execute
fvm flutter run
para 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"
}