Compare commits
239 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 32240777c3 | |||
| 6065ff8caa | |||
| 8db073941d | |||
| 5e281b44e9 | |||
| 142ede350e | |||
| a2e1d4caa2 | |||
| 5f00d8b9c6 | |||
| 2e85e18020 | |||
| 40a8115101 | |||
| d02b97e1c1 | |||
| 485b152beb | |||
| c918f5b001 | |||
| cca2f7d178 | |||
| baf533de35 | |||
| dfc0d6eee7 | |||
| 7948cb8110 | |||
| 568436f188 | |||
| 04b59318f9 | |||
| 1a3d05ffc3 | |||
| 2f2db74d73 | |||
| ef097d15dd | |||
| caaa474c23 | |||
| 63bebd92e0 | |||
| ad36b8b10f | |||
| 18c22d2a6c | |||
| 73024edba9 | |||
| a360c0a3d7 | |||
| 34657f820f | |||
| 8840911f22 | |||
| 4aa66f4156 | |||
| 799a1c99f2 | |||
| c4247bfea3 | |||
| 1e3464fe47 | |||
| b7603fd150 | |||
| 517a3363d6 | |||
| 3511b69fc8 | |||
| e6efc61b3b | |||
| 360c1d9a15 | |||
| e3449f9c8f | |||
| a8e723d722 | |||
| d116234523 | |||
| dce2bc7508 | |||
| 2bf764f560 | |||
| 587b77e70b | |||
| 53cd9fd8bf | |||
| a8220172f8 | |||
| 397f8c70b4 | |||
| 68ff5377b0 | |||
| b359dc3cb6 | |||
| 5b036067ed | |||
| b9f38162d5 | |||
| ab6909bfbd | |||
| 53c3c916a6 | |||
| 6924aa5eb1 | |||
| a3b45d62b6 | |||
| b34de624ce | |||
| 7886c42742 | |||
| d476b15312 | |||
| bdf38e7668 | |||
| e33566a04a | |||
| c28251b8b4 | |||
| 337db1c508 | |||
| ad2a1ba901 | |||
| fa6f6f8e9f | |||
| a44043a4e5 | |||
| 87b15c60c0 | |||
| 2c83e52c15 | |||
| 55c5027539 | |||
| ce06af0c9b | |||
| baaf7ad153 | |||
| 4a25e7dc22 | |||
| f90563d18c | |||
| 8352ecd3b9 | |||
| 69b34a4364 | |||
| 6023c3c624 | |||
| 171e7ffa77 | |||
| d9f918005a | |||
| e8ade4866b | |||
| bbfa789a4e | |||
| a779c3803c | |||
| 79dea504b0 | |||
| 4900fecd10 | |||
| adfaab7eb2 | |||
| c5adbea6e1 | |||
| bb89fa4aab | |||
| 43d639104d | |||
| a1792a7d94 | |||
| 373b6918f8 | |||
| f1396761b0 | |||
| 335bb0707c | |||
| 7a51e0dd4d | |||
| 5b42899dde | |||
| 229357df2b | |||
| 8d5626620b | |||
| 2c4243b3d0 | |||
| 38e0178c81 | |||
| c5c7a134dd | |||
| da9eb61532 | |||
| c1ccf026f0 | |||
| 4309104925 | |||
| a3b84b3ca7 | |||
| f6630163b1 | |||
| aebeb37fb0 | |||
| b74ad69288 | |||
| b6579cd38e | |||
| 46a2032b9a | |||
| 0eb548f115 | |||
| c7dff229db | |||
| 8e80825b4f | |||
| a1481c1113 | |||
| 3bdcdef198 | |||
| b69f6e0df7 | |||
| be2794a372 | |||
| 2ff25b49f4 | |||
| 135d72d4cd | |||
| 90ef64efa3 | |||
| 60df387459 | |||
| fc1acf6f01 | |||
| cfc5229964 | |||
| f9ddeac265 | |||
| 8d7c576037 | |||
| fccdbdd66a | |||
| 23ba651705 | |||
| ac0ad98b55 | |||
| 9cbd5d1b0c | |||
| 80fd664cc8 | |||
| 041c711cb9 | |||
| dd9c5244fd | |||
| fe693db84f | |||
| 5c9d3cd08b | |||
| 725ab5622f | |||
| e9acd21733 | |||
| ce1ab1ed50 | |||
| 3e918ffd18 | |||
| 678ce23c16 | |||
| 31c18ff34c | |||
| e407a4fa13 | |||
| be72df70fe | |||
| dbd79f4797 | |||
| f790315d3f | |||
| f1ab700334 | |||
| afc29a67d2 | |||
| ba816babee | |||
| 6e0ac79eae | |||
| 94514cfeea | |||
| 8c7080eaef | |||
| 348d395b21 | |||
| 2e7e97ea13 | |||
| d71e7ebff1 | |||
| 9755936950 | |||
| 347052f82f | |||
| e196ff1e2f | |||
| 46e344bb92 | |||
| 7f038cae90 | |||
| 489a34b10c | |||
| 46b2b6b558 | |||
| bb7566426c | |||
| 7df552e767 | |||
| 274fba1bd2 | |||
| db366aac08 | |||
| 1359418745 | |||
| 8da3f231e0 | |||
| b3cfe6d9e9 | |||
| 424845d924 | |||
| 4630ca5321 | |||
| e13d4a6b9c | |||
| c624580596 | |||
| e085a10cf3 | |||
| 21d1920d68 | |||
| 94cc1d7dbd | |||
| 026f3c24e9 | |||
| 251c92ff1e | |||
| 135e1a7a7b | |||
| 9008093cce | |||
| 5990a28870 | |||
| bd34be92e6 | |||
| e608c61ba5 | |||
| d2edc0bffe | |||
| bfde308492 | |||
| f181dba964 | |||
| c894e36855 | |||
| 01e906e99c | |||
| 352800223e | |||
| 619735fea0 | |||
| 75b1ed08b4 | |||
| c234c95880 | |||
| 7cc7fc0a0c | |||
| 897d49f734 | |||
| 051c958c8b | |||
| 56627caf5b | |||
| 4f47c8c06b | |||
| de1dbcea9c | |||
| d1498506a8 | |||
| 9bcbdd31ce | |||
| 38c968d47e | |||
| f578ca6d47 | |||
| b04e69fd66 | |||
| 0a1e28a08f | |||
| 9fdaa82d77 | |||
| 88123b1cd2 | |||
| 42c4c9dba1 | |||
| e63dc49475 | |||
| 690f30f3dd | |||
| 561b030e80 | |||
| 4756c075b6 | |||
| 328f382f86 | |||
| 6ad77e9434 | |||
| 919928ab70 | |||
| 2a4d4ea999 | |||
| 547ce49500 | |||
| f4970ed053 | |||
| 9cf083decf | |||
| d078367c04 | |||
| a8edc85183 | |||
| 5d48de7fa9 | |||
| 82beb040bc | |||
| 03864e52ff | |||
| c24fb403c5 | |||
| 1d3ee2008c | |||
| c917875943 | |||
| e2904a02a5 | |||
| 292eb645b0 | |||
| 07fdf51069 | |||
| 97dc7660b4 | |||
| b6a7d40863 | |||
| 55cba8aa5f | |||
| 6141888d3e | |||
| 09964e4b16 | |||
| 20cab5a949 | |||
| da4fd201ad | |||
| 13525d2330 | |||
| 0d8fddf537 | |||
| 56c92cd83b | |||
| bafc32f30a | |||
| 76a300481f | |||
| 613b4449a7 | |||
| 85b83f9666 | |||
| 568cc243f0 | |||
| af2efbdbbd |
@@ -0,0 +1,4 @@
|
|||||||
|
# These are supported funding model platforms
|
||||||
|
|
||||||
|
github: alextran1502
|
||||||
|
custom: https://www.buymeacoffee.com/altran1502?new=1
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Create a report to help us improve
|
||||||
|
title: '[BUG] <title>'
|
||||||
|
labels: bug, need triage
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Note: Please search to see if an issue already exists for the bug you encountered.
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
**Describe the bug**
|
||||||
|
A clear and concise description of what the bug is.
|
||||||
|
|
||||||
|
**Task List**
|
||||||
|
- [ ] I have read thoroughly the README setup and installation instructions.
|
||||||
|
- [ ] If my setup is different, I have included my docker-compose file.
|
||||||
|
- [ ] I have included my redacted `.env` file.
|
||||||
|
- [ ] I have included information on my machine, and environment.
|
||||||
|
|
||||||
|
**To Reproduce**
|
||||||
|
Steps to reproduce the behavior:
|
||||||
|
1. Go to '...'
|
||||||
|
2. Click on '....'
|
||||||
|
3. Scroll down to '....'
|
||||||
|
4. See error
|
||||||
|
|
||||||
|
**Expected behavior**
|
||||||
|
A clear and concise description of what you expected to happen.
|
||||||
|
|
||||||
|
**Screenshots**
|
||||||
|
If applicable, add screenshots to help explain your problem.
|
||||||
|
|
||||||
|
**Desktop (please complete the following information):**
|
||||||
|
- OS: [e.g. iOS]
|
||||||
|
|
||||||
|
**Smartphone (please complete the following information):**
|
||||||
|
- Device: [e.g. iPhone6]
|
||||||
|
- OS: [e.g. iOS8.1]
|
||||||
|
- Version [e.g. 22]
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context about the problem here.
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
blank_issues_enabled: false
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
name: Feature Request
|
||||||
|
description: Request a feature that you would like for the app
|
||||||
|
title: "[Feature]: "
|
||||||
|
labels: ["feature", "need triage"]
|
||||||
|
assignees:
|
||||||
|
- ""
|
||||||
|
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
Thanks for taking the time to fill out this feature request!
|
||||||
|
|
||||||
|
- type: textarea
|
||||||
|
id: feature-detail
|
||||||
|
attributes:
|
||||||
|
label: Feature detail
|
||||||
|
placeholder: Describe the feature you would like to see for the app
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
|
||||||
|
- type: dropdown
|
||||||
|
id: platform
|
||||||
|
attributes:
|
||||||
|
label: Platform
|
||||||
|
description: Choose the platform for the feature
|
||||||
|
options:
|
||||||
|
- Web
|
||||||
|
- Mobile App
|
||||||
|
- Server
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
version: 2
|
||||||
|
updates:
|
||||||
|
# Maintain dependencies for GitHub Actions
|
||||||
|
- package-ecosystem: "github-actions"
|
||||||
|
directory: "/"
|
||||||
|
schedule:
|
||||||
|
interval: "daily"
|
||||||
@@ -0,0 +1,120 @@
|
|||||||
|
name: Build and Push Docker Image - Latest
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches: [main]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
# This image include both the server and microservices - the two containers can be slitted into separated
|
||||||
|
# service with its coressponding entry file.
|
||||||
|
build_and_push_server_monorepo_latest:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v2.0.0
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
id: buildx
|
||||||
|
uses: docker/setup-buildx-action@v2.0.0
|
||||||
|
- name: Login to Docker Hub
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
- name: Build and push Immich Mono Repo
|
||||||
|
uses: docker/build-push-action@v3.0.0
|
||||||
|
with:
|
||||||
|
context: ./server
|
||||||
|
file: ./server/Dockerfile
|
||||||
|
platforms: linux/arm/v7,linux/amd64,linux/arm64
|
||||||
|
push: true
|
||||||
|
tags: |
|
||||||
|
altran1502/immich-server:latest
|
||||||
|
|
||||||
|
build_and_push_machine_learning_latest:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v2.0.0
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
id: buildx
|
||||||
|
uses: docker/setup-buildx-action@v2.0.0
|
||||||
|
- name: Login to Docker Hub
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
- name: Build and Push Machine Learning
|
||||||
|
uses: docker/build-push-action@v3.0.0
|
||||||
|
with:
|
||||||
|
context: ./machine-learning
|
||||||
|
file: ./machine-learning/Dockerfile
|
||||||
|
platforms: linux/arm/v7,linux/amd64
|
||||||
|
push: true
|
||||||
|
tags: |
|
||||||
|
altran1502/immich-machine-learning:latest
|
||||||
|
|
||||||
|
build_and_push_web_latest:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v2.0.0
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
id: buildx
|
||||||
|
uses: docker/setup-buildx-action@v2.0.0
|
||||||
|
- name: Login to Docker Hub
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
- name: Build and Push Web
|
||||||
|
uses: docker/build-push-action@v3.0.0
|
||||||
|
with:
|
||||||
|
context: ./web
|
||||||
|
file: ./web/Dockerfile
|
||||||
|
platforms: linux/arm/v7,linux/amd64,linux/arm64
|
||||||
|
target: prod
|
||||||
|
push: true
|
||||||
|
tags: |
|
||||||
|
altran1502/immich-web:latest
|
||||||
|
|
||||||
|
build_and_push_nginx_latest:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v2.0.0
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
id: buildx
|
||||||
|
uses: docker/setup-buildx-action@v2.0.0
|
||||||
|
- name: Login to Docker Hub
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
- name: Build and Push Proxy
|
||||||
|
uses: docker/build-push-action@v3.0.0
|
||||||
|
with:
|
||||||
|
context: ./nginx
|
||||||
|
file: ./nginx/Dockerfile
|
||||||
|
platforms: linux/arm/v7,linux/amd64,linux/arm64
|
||||||
|
push: true
|
||||||
|
tags: |
|
||||||
|
altran1502/immich-proxy:latest
|
||||||
@@ -0,0 +1,122 @@
|
|||||||
|
name: Build and Push Docker Image - Staging
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
branches: [main]
|
||||||
|
pull_request:
|
||||||
|
branches: [main]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
# This image include both the server and microservices - the two containers can be slitted into separated
|
||||||
|
# service with its coressponding entry file.
|
||||||
|
build_and_push_server_monorepo_staging:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v2.0.0
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
id: buildx
|
||||||
|
uses: docker/setup-buildx-action@v2.0.0
|
||||||
|
- name: Login to Docker Hub
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
- name: Build and push Immich Mono Repo
|
||||||
|
uses: docker/build-push-action@v3.0.0
|
||||||
|
with:
|
||||||
|
context: ./server
|
||||||
|
file: ./server/Dockerfile
|
||||||
|
platforms: linux/arm/v7,linux/amd64,linux/arm64
|
||||||
|
push: ${{ github.event_name == 'pull_request' }}
|
||||||
|
tags: |
|
||||||
|
altran1502/immich-server:staging
|
||||||
|
|
||||||
|
build_and_push_machine_learning_staging:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v2.0.0
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
id: buildx
|
||||||
|
uses: docker/setup-buildx-action@v2.0.0
|
||||||
|
- name: Login to Docker Hub
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
- name: Build and Push Machine Learning
|
||||||
|
uses: docker/build-push-action@v3.0.0
|
||||||
|
with:
|
||||||
|
context: ./machine-learning
|
||||||
|
file: ./machine-learning/Dockerfile
|
||||||
|
platforms: linux/arm/v7,linux/amd64
|
||||||
|
push: ${{ github.event_name == 'pull_request' }}
|
||||||
|
tags: |
|
||||||
|
altran1502/immich-machine-learning:staging
|
||||||
|
|
||||||
|
build_and_push_web_staging:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v2.0.0
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
id: buildx
|
||||||
|
uses: docker/setup-buildx-action@v2.0.0
|
||||||
|
- name: Login to Docker Hub
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
- name: Build and Push Web
|
||||||
|
uses: docker/build-push-action@v3.0.0
|
||||||
|
with:
|
||||||
|
context: ./web
|
||||||
|
file: ./web/Dockerfile
|
||||||
|
platforms: linux/arm/v7,linux/amd64,linux/arm64
|
||||||
|
target: prod
|
||||||
|
push: ${{ github.event_name == 'pull_request' }}
|
||||||
|
tags: |
|
||||||
|
altran1502/immich-web:staging
|
||||||
|
|
||||||
|
build_and_push_nginx_staging:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v2.0.0
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
id: buildx
|
||||||
|
uses: docker/setup-buildx-action@v2.0.0
|
||||||
|
- name: Login to Docker Hub
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
- name: Build and Push Proxy
|
||||||
|
uses: docker/build-push-action@v3.0.0
|
||||||
|
with:
|
||||||
|
context: ./nginx
|
||||||
|
file: ./nginx/Dockerfile
|
||||||
|
platforms: linux/arm/v7,linux/amd64,linux/arm64
|
||||||
|
push: ${{ github.event_name == 'pull_request' }}
|
||||||
|
tags: |
|
||||||
|
altran1502/immich-proxy:staging
|
||||||
@@ -0,0 +1,158 @@
|
|||||||
|
name: Build and push Docker image - Release
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
release:
|
||||||
|
types: [published]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build_and_push_server_monorepo_release:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
ref: "main"
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: "Get Previous tag"
|
||||||
|
id: previoustag
|
||||||
|
uses: "WyriHaximus/github-action-get-previous-tag@v1"
|
||||||
|
with:
|
||||||
|
fallback: latest
|
||||||
|
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v2.0.0
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
id: buildx
|
||||||
|
uses: docker/setup-buildx-action@v2.0.0
|
||||||
|
|
||||||
|
- name: Login to Docker Hub
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Build and push immich-server release
|
||||||
|
uses: docker/build-push-action@v3.0.0
|
||||||
|
with:
|
||||||
|
context: ./server
|
||||||
|
file: ./server/Dockerfile
|
||||||
|
platforms: linux/arm/v7,linux/amd64,linux/arm64
|
||||||
|
push: ${{ github.event_name != 'pull_request' }}
|
||||||
|
tags: |
|
||||||
|
altran1502/immich-server:${{ steps.previoustag.outputs.tag }}
|
||||||
|
altran1502/immich-server:release
|
||||||
|
|
||||||
|
build_and_push_machine_learning_release:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
- name: "Get Previous tag"
|
||||||
|
id: previoustag
|
||||||
|
uses: "WyriHaximus/github-action-get-previous-tag@v1"
|
||||||
|
with:
|
||||||
|
fallback: latest
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v2.0.0
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
id: buildx
|
||||||
|
uses: docker/setup-buildx-action@v2.0.0
|
||||||
|
- name: Login to Docker Hub
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
- name: Build and Push Machine Learning
|
||||||
|
uses: docker/build-push-action@v3.0.0
|
||||||
|
with:
|
||||||
|
context: ./machine-learning
|
||||||
|
file: ./machine-learning/Dockerfile
|
||||||
|
platforms: linux/arm/v7,linux/amd64
|
||||||
|
push: true
|
||||||
|
tags: |
|
||||||
|
altran1502/immich-machine-learning:${{ steps.previoustag.outputs.tag }}
|
||||||
|
altran1502/immich-machine-learning:release
|
||||||
|
|
||||||
|
build_and_push_web_release:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
ref: "main"
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: "Get Previous tag"
|
||||||
|
id: previoustag
|
||||||
|
uses: "WyriHaximus/github-action-get-previous-tag@v1"
|
||||||
|
with:
|
||||||
|
fallback: latest
|
||||||
|
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v2.0.0
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
id: buildx
|
||||||
|
uses: docker/setup-buildx-action@v2.0.0
|
||||||
|
|
||||||
|
- name: Login to Docker Hub
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Build and push immich-web release
|
||||||
|
uses: docker/build-push-action@v3.0.0
|
||||||
|
with:
|
||||||
|
context: ./web
|
||||||
|
file: ./web/Dockerfile
|
||||||
|
platforms: linux/arm/v7,linux/amd64,linux/arm64
|
||||||
|
push: ${{ github.event_name != 'pull_request' }}
|
||||||
|
target: prod
|
||||||
|
tags: |
|
||||||
|
altran1502/immich-web:${{ steps.previoustag.outputs.tag }}
|
||||||
|
altran1502/immich-web:release
|
||||||
|
|
||||||
|
build_and_push_nginx_release:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
ref: "main"
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: "Get Previous tag"
|
||||||
|
id: previoustag
|
||||||
|
uses: "WyriHaximus/github-action-get-previous-tag@v1"
|
||||||
|
with:
|
||||||
|
fallback: latest
|
||||||
|
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v2.0.0
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
id: buildx
|
||||||
|
uses: docker/setup-buildx-action@v2.0.0
|
||||||
|
|
||||||
|
- name: Login to Docker Hub
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Build and push immich-proxy release
|
||||||
|
uses: docker/build-push-action@v3.0.0
|
||||||
|
with:
|
||||||
|
context: ./nginx
|
||||||
|
file: ./nginx/Dockerfile
|
||||||
|
platforms: linux/arm/v7,linux/amd64,linux/arm64
|
||||||
|
push: ${{ github.event_name != 'pull_request' }}
|
||||||
|
tags: |
|
||||||
|
altran1502/immich-proxy:release
|
||||||
|
altran1502/immich-proxy:${{ steps.previoustag.outputs.tag }}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
name: Test
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
push: { branches: master }
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test-server-e2e:
|
||||||
|
name: Run test suite
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: Run Immich Server 2E2 Test
|
||||||
|
run: docker-compose -f ./docker/docker-compose.test.yml --env-file ./docker/.env.test up --abort-on-container-exit --exit-code-from immich_server_test
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
.DS_Store
|
||||||
|
.vscode
|
||||||
|
.idea
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2022 Hau Tran
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
dev:
|
||||||
|
docker-compose -f ./docker/docker-compose.dev.yml up --remove-orphans
|
||||||
|
|
||||||
|
dev-update:
|
||||||
|
docker-compose -f ./docker/docker-compose.dev.yml up --build -V --remove-orphans
|
||||||
|
|
||||||
|
dev-scale:
|
||||||
|
docker-compose -f ./docker/docker-compose.dev.yml up --build -V --scale immich-server=3 --remove-orphans
|
||||||
|
|
||||||
|
stage:
|
||||||
|
docker-compose -f ./docker/docker-compose.staging.yml up --build -V --remove-orphans
|
||||||
|
|
||||||
|
test-e2e:
|
||||||
|
docker-compose -f ./docker/docker-compose.test.yml --env-file ./docker/.env.test up --renew-anon-volumes --abort-on-container-exit --exit-code-from immich_server_test --remove-orphans
|
||||||
|
|
||||||
|
prod:
|
||||||
|
docker-compose -f ./docker/docker-compose.yml up --build -V --remove-orphans
|
||||||
|
|
||||||
|
prod-scale:
|
||||||
|
docker-compose -f ./docker/docker-compose.yml up --build -V --scale immich-server=5 --scale immich-microservices=3 --remove-orphans
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
# TODO
|
||||||
|
|
||||||
|
Server scenario with web
|
||||||
|
|
||||||
|
[ ] 1 user exist without admin right -> make admin on first check
|
||||||
|
|
||||||
|
[ ] 2 users exist without admin right -> ask user to choose which account will be the admin
|
||||||
|
|
||||||
|
[ X ] No users exist -> prompt signup form for Admin
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
# Deployment checklist for iOS/Android/Server
|
||||||
|
|
||||||
|
[ ] Up version in [mobile/pubspec.yml](/mobile/pubspec.yaml)
|
||||||
|
|
||||||
|
[ ] Up version in [docker/docker-compose.yml](/docker/docker-compose.yml) for `immich_server` service
|
||||||
|
|
||||||
|
[ ] Up version in [docker/docker-compose.gpu.yml](/docker/docker-compose.gpu.yml) for `immich_server` service
|
||||||
|
|
||||||
|
[ ] Up version in [docker/docker-compose.dev.yml](/docker/docker-compose.dev.yml) for `immich_server` service
|
||||||
|
|
||||||
|
[ ] Up version in [server/src/constants/server_version.constant.ts](/server/src/constants/server_version.constant.ts)
|
||||||
|
|
||||||
|
[ ] Up version in iOS Fastlane [/mobile/ios/fastlane/Fastfile](/mobile/ios/fastlane/Fastfile)
|
||||||
|
|
||||||
|
[ ] Add changelog to [Android Fastlane F-droid folder](/mobile/android/fastlane/metadata/android/en-US/changelogs)
|
||||||
|
|
||||||
|
All of the version should be the same.
|
||||||
@@ -0,0 +1,264 @@
|
|||||||
|
<p align="center">
|
||||||
|
<a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/license-MIT-green.svg?color=3F51B5&style=for-the-badge&label=License&logoColor=000000&labelColor=ececec" alt="License: MIT"></a>
|
||||||
|
<a href="https://github.com/alextran1502/immich"><img src="https://img.shields.io/github/stars/alextran1502/immich.svg?style=for-the-badge&logo=github&color=3F51B5&label=Stars&logoColor=000000&labelColor=ececec" alt="Star on Github"></a>
|
||||||
|
<a href="https://immichci.little-home.net/viewType.html?buildTypeId=Immich_BuildAndroidAndGetArtifact&guest=1">
|
||||||
|
<img src="https://img.shields.io/teamcity/http/immichci.little-home.net/s/Immich_BuildAndroidAndGetArtifact.svg?style=for-the-badge&label=Android&logo=teamcity&logoColor=000000&labelColor=ececec" alt="Android Build"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://immichci.little-home.net/viewType.html?buildTypeId=Immich_BuildAndPublishIOSToTestFlight&guest=1">
|
||||||
|
<img src="https://img.shields.io/teamcity/http/immichci.little-home.net/s/Immich_BuildAndPublishIOSToTestFlight.svg?style=for-the-badge&label=iOS&logo=teamcity&logoColor=000000&labelColor=ececec" alt="iOS Build"/>
|
||||||
|
</a>
|
||||||
|
<a href="https://actions-badge.atrox.dev/alextran1502/immich/goto?ref=main">
|
||||||
|
<img alt="Build Status" src="https://img.shields.io/endpoint.svg?url=https%3A%2F%2Factions-badge.atrox.dev%2Falextran1502%2Fimmich%2Fbadge%3Fref%3Dmain&style=for-the-badge&label=Github Action&logo=github&labelColor=ececec&logoColor=000000" />
|
||||||
|
</a>
|
||||||
|
<a href="https://discord.gg/D8JsnBEuKb">
|
||||||
|
<img src="https://img.shields.io/discord/979116623879368755.svg?label=Immich%20Discord&logo=Discord&style=for-the-badge&logoColor=000000&labelColor=ececec" atl="Immich Discord"/>
|
||||||
|
</a>
|
||||||
|
<br/>
|
||||||
|
<br/>
|
||||||
|
<br/>
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img src="design/feature-panel.png" title="Immich Logo">
|
||||||
|
</p>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
# Immich
|
||||||
|
|
||||||
|
**High performance self-hosted photo and video backup solution.**
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Loading ~4000 images/videos
|
||||||
|
|
||||||
|
## Screenshots
|
||||||
|
|
||||||
|
### Mobile
|
||||||
|
<p align="left">
|
||||||
|
<img src="design/login-screen.png" width="150" title="Login With Custom URL">
|
||||||
|
<img src="design/backup-screen.png" width="150" title="Backup Setting Info">
|
||||||
|
<img src="design/selective-backup-screen.png" width="150" title="Backup Setting Info">
|
||||||
|
<img src="design/home-screen.jpeg" width="150" title="Home Screen">
|
||||||
|
<img src="design/search-screen.jpeg" width="150" title="Curated Search Info">
|
||||||
|
<img src="design/shared-albums.png" width="150" title="Shared Albums">
|
||||||
|
<img src="design/nsc6.png" width="150" title="EXIF Info">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
### Web
|
||||||
|
<p align="left">
|
||||||
|
<img src="design/web-home.jpeg" width="49%" title="Home Dashboard">
|
||||||
|
<img src="design/web-detail.jpeg" width="49%" title="Detail">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
# Note
|
||||||
|
|
||||||
|
**!! NOT READY FOR PRODUCTION! DO NOT USE TO STORE YOUR ASSETS !!**
|
||||||
|
|
||||||
|
This project is under heavy development, there will be continuous functions, features and api changes.
|
||||||
|
|
||||||
|
# Features
|
||||||
|
|
||||||
|
| | Mobile | Web |
|
||||||
|
| - | - | - |
|
||||||
|
| Upload and view videos and photos | Yes | Yes
|
||||||
|
| Auto backup when app is opened | Yes | N/A
|
||||||
|
| Selective album(s) for backup | Yes | N/A
|
||||||
|
| Download photos and videos to local device | Yes | Yes
|
||||||
|
| Multi-user support | Yes | Yes
|
||||||
|
| Shared Albums | Yes | No
|
||||||
|
| Quick navigation with draggable scrollbar | Yes | Yes
|
||||||
|
| Support RAW (HEIC, HEIF, DNG, Apple ProRaw) | Yes | Yes
|
||||||
|
| Metadata view (EXIF, map) | Yes | Yes
|
||||||
|
| Search by metadata, objects and image tags | Yes | No
|
||||||
|
| Administrative functions (user management) | No | Yes
|
||||||
|
|
||||||
|
|
||||||
|
# System Requirement
|
||||||
|
|
||||||
|
**OS**: Preferred unix-based operating system (Ubuntu, Debian, MacOS...etc).
|
||||||
|
|
||||||
|
I haven't tested with `Docker for Windows` as well as `WSL` on Windows
|
||||||
|
|
||||||
|
*Raspberry Pi can be used but `microservices` container has to be comment out in `docker-compose` since TensorFlow has not been supported in Docker image on arm64v7 yet.*
|
||||||
|
|
||||||
|
**RAM**: At least 2GB, preffered 4GB.
|
||||||
|
|
||||||
|
**Core**: At least 2 cores, preffered 4 cores.
|
||||||
|
|
||||||
|
# Getting Started
|
||||||
|
|
||||||
|
You can use docker compose for development and testing out the application, there are several services that compose Immich:
|
||||||
|
|
||||||
|
1. **NestJs** - Backend of the application
|
||||||
|
2. **SvelteKit** - Web frontend of the application
|
||||||
|
3. **PostgreSQL** - Main database of the application
|
||||||
|
4. **Redis** - For sharing websocket instance between docker instances and background tasks message queue.
|
||||||
|
5. **Nginx** - Load balancing and optimized file uploading.
|
||||||
|
6. **TensorFlow** - Object Detection (COCO SSD) and Image Classification (ImageNet).
|
||||||
|
|
||||||
|
## Step 1: Populate .env file
|
||||||
|
|
||||||
|
Navigate to `docker` directory and run
|
||||||
|
|
||||||
|
```
|
||||||
|
cp .env.example .env
|
||||||
|
```
|
||||||
|
|
||||||
|
Then populate the value in there.
|
||||||
|
|
||||||
|
Notice that if set `ENABLE_MAPBOX` to `true`, you will have to provide `MAPBOX_KEY` for the server to run.
|
||||||
|
|
||||||
|
Pay attention to the key `UPLOAD_LOCATION`, this directory must exist and is owned by the user that run the `docker-compose` command below.
|
||||||
|
|
||||||
|
**Example**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
###################################################################################
|
||||||
|
# Database
|
||||||
|
###################################################################################
|
||||||
|
DB_USERNAME=postgres
|
||||||
|
DB_PASSWORD=postgres
|
||||||
|
DB_DATABASE_NAME=immich
|
||||||
|
|
||||||
|
###################################################################################
|
||||||
|
# Upload File Config
|
||||||
|
###################################################################################
|
||||||
|
UPLOAD_LOCATION=<put-the-path-of-the-upload-folder-here>
|
||||||
|
|
||||||
|
###################################################################################
|
||||||
|
# JWT SECRET
|
||||||
|
###################################################################################
|
||||||
|
JWT_SECRET=randomstringthatissolongandpowerfulthatnoonecanguess
|
||||||
|
|
||||||
|
###################################################################################
|
||||||
|
# MAPBOX
|
||||||
|
####################################################################################
|
||||||
|
# ENABLE_MAPBOX is either true of false -> if true, you have to provide MAPBOX_KEY
|
||||||
|
ENABLE_MAPBOX=false
|
||||||
|
MAPBOX_KEY=
|
||||||
|
|
||||||
|
###################################################################################
|
||||||
|
# WEB
|
||||||
|
###################################################################################
|
||||||
|
# This is the URL of your vm/server where you host Immich, so that the web frontend
|
||||||
|
# know where can it make the request to.
|
||||||
|
# For example: If your server IP address is 10.1.11.50, the environment variable will
|
||||||
|
# be VITE_SERVER_ENDPOINT=http://10.1.11.50:2283/api
|
||||||
|
VITE_SERVER_ENDPOINT=http://192.168.1.216:2283/api
|
||||||
|
```
|
||||||
|
|
||||||
|
## Step 2: Start the server
|
||||||
|
|
||||||
|
To **start**, run
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose -f ./docker/docker-compose.yml up
|
||||||
|
```
|
||||||
|
|
||||||
|
If you have a few thousand photos/videos, I suggest running docker-compose with *scaling* option for the `immich_server` container to handle high I/O load when using fast scrolling.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose -f ./docker/docker-compose.yml up --scale immich-server=5
|
||||||
|
```
|
||||||
|
|
||||||
|
To *update* docker-compose with newest image (if you have started the docker-compose previously)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose -f ./docker/docker-compose.yml pull && docker-compose -f ./docker/docker-compose.yml up
|
||||||
|
```
|
||||||
|
|
||||||
|
The server will be running at `http://your-ip:2283/api` through `Nginx`
|
||||||
|
|
||||||
|
## Step 3: Register User
|
||||||
|
|
||||||
|
Access the web interface at `http://your-ip:2283` to register an admin account.
|
||||||
|
|
||||||
|
<p align="left">
|
||||||
|
<img src="design/admin-registration-form.png" width="300" title="Admin Registration">
|
||||||
|
<p/>
|
||||||
|
|
||||||
|
Additional accounts on the server can be created by the admin account.
|
||||||
|
|
||||||
|
<p align="left">
|
||||||
|
<img src="design/admin-interface.png" width="500" title="Admin User Management">
|
||||||
|
<p/>
|
||||||
|
|
||||||
|
## Step 4: Run mobile app
|
||||||
|
|
||||||
|
Login the mobile app with your server address
|
||||||
|
|
||||||
|
<p align="left">
|
||||||
|
<img src="design/login-screen.jpeg" width="250" title="Example login screen">
|
||||||
|
<p/>
|
||||||
|
|
||||||
|
## F-Droid
|
||||||
|
You can get the app on F-droid by clicking the image below.
|
||||||
|
|
||||||
|
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png"
|
||||||
|
alt="Get it on F-Droid"
|
||||||
|
height="80">](https://f-droid.org/packages/app.alextran.immich)
|
||||||
|
|
||||||
|
|
||||||
|
## Android
|
||||||
|
|
||||||
|
#### Get the app on Google Play Store [here](https://play.google.com/store/apps/details?id=app.alextran.immich)
|
||||||
|
|
||||||
|
*The App version might be lagging behind the latest release due to the review process.*
|
||||||
|
|
||||||
|
<p align="left">
|
||||||
|
<img src="design/google-play-qr-code.png" width="200" title="Google Play Store">
|
||||||
|
<p/>
|
||||||
|
|
||||||
|
## iOS
|
||||||
|
|
||||||
|
#### Get the app on Apple AppStore [here](https://apps.apple.com/us/app/immich/id1613945652):
|
||||||
|
|
||||||
|
*The App version might be lagging behind the latest release due to the review process.*
|
||||||
|
|
||||||
|
|
||||||
|
<p align="left">
|
||||||
|
<img src="design/ios-qr-code.png" width="200" title="Apple App Store">
|
||||||
|
<p/>
|
||||||
|
|
||||||
|
|
||||||
|
# Development
|
||||||
|
|
||||||
|
The development environment can be started from the root of the project after populating the `.env` file with the command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
make dev # required Makefile installed on the system.
|
||||||
|
```
|
||||||
|
|
||||||
|
All servers and web container are hot reload for quick feedback loop.
|
||||||
|
|
||||||
|
# Support
|
||||||
|
|
||||||
|
If you like the app, find it helpful, and want to support me to offset the cost of publishing to AppStores, you can sponsor the project with [**Github Sponsor**](https://github.com/sponsors/alextran1502), or a one time donation with the Buy Me a coffee link below.
|
||||||
|
|
||||||
|
[](https://www.buymeacoffee.com/altran1502)
|
||||||
|
|
||||||
|
This is also a meaningful way to give me motivation and encouragement to continue working on the app.
|
||||||
|
|
||||||
|
Cheers! 🎉
|
||||||
|
|
||||||
|
# Known Issue
|
||||||
|
|
||||||
|
## TensorFlow Build Issue
|
||||||
|
|
||||||
|
*This is a known issue on RaspberryPi 4 arm64-v7 and incorrect Promox setup*
|
||||||
|
|
||||||
|
TensorFlow doesn't run with older CPU architecture, it requires a CPU with AVX and AVX2 instruction set. If you encounter the error `illegal instruction core dump` when running the docker-compose command above, check for your CPU flags with the command and make sure you see `AVX` and `AVX2`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
more /proc/cpuinfo | grep flags
|
||||||
|
```
|
||||||
|
|
||||||
|
If you are running virtualization in Promox, the VM doesn't have the flag enabled.
|
||||||
|
|
||||||
|
You need to change the CPU type from `kvm64` to `host` under VMs hardware tab.
|
||||||
|
|
||||||
|
`Hardware > Processors > Edit > Advanced > Type (dropdown menu) > host`
|
||||||
|
|
||||||
|
Otherwise you can:
|
||||||
|
- edit `docker-compose.yml` file and comment the whole `immich-machine-learning` service **which will disable machine learning features like object detection and image classification**
|
||||||
|
- switch to a different VM/desktop with different architecture.
|
||||||
|
Before Width: | Height: | Size: 8.3 KiB |
|
Before Width: | Height: | Size: 8.3 KiB |
|
Before Width: | Height: | Size: 8.3 KiB |
|
Before Width: | Height: | Size: 8.3 KiB |
|
Before Width: | Height: | Size: 8.3 KiB |
|
Before Width: | Height: | Size: 8.3 KiB |
|
Before Width: | Height: | Size: 8.3 KiB |
|
Before Width: | Height: | Size: 8.3 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 8.3 KiB |
|
Before Width: | Height: | Size: 8.3 KiB |
|
Before Width: | Height: | Size: 8.3 KiB |
|
After Width: | Height: | Size: 58 KiB |
|
After Width: | Height: | Size: 105 KiB |
|
After Width: | Height: | Size: 115 KiB |
|
After Width: | Height: | Size: 308 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 89 KiB |
|
After Width: | Height: | Size: 126 KiB |
|
After Width: | Height: | Size: 144 KiB |
@@ -0,0 +1,98 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 26.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||||
|
<svg version="1.1" id="svg2781" xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 564.2 553.5"
|
||||||
|
style="enable-background:new 0 0 564.2 553.5;" xml:space="preserve">
|
||||||
|
<style type="text/css">
|
||||||
|
.st0{fill:#4081EF;stroke:#512D8C;stroke-miterlimit:10;}
|
||||||
|
.st1{fill:#31A452;stroke:#512D8C;stroke-miterlimit:10;}
|
||||||
|
.st2{fill:#DE7FB3;stroke:#512D8C;stroke-miterlimit:10;}
|
||||||
|
.st3{fill:#FFB800;stroke:#512D8C;stroke-miterlimit:10;}
|
||||||
|
.st4{fill:#E64132;stroke:#512D8C;stroke-miterlimit:10;}
|
||||||
|
.st5{fill:#F2F5FB;stroke:#512D8C;stroke-miterlimit:10;}
|
||||||
|
</style>
|
||||||
|
<path class="st0" d="M210.5,549.6c-2.2-0.2-5.5-1-9.7-2.2c-52.4-15.7-99-46.5-133.8-88.5c-8.8-10.7-17.2-22.4-19.4-27.5
|
||||||
|
c-8.1-18.1-6.3-38.7,4.8-55.4c5-7.5,13.2-15,20.5-18.7c1.2-0.6,54.1-20,55.8-20.4c0.5-0.1,0.5,0.2-0.3,2.1c-0.7,1.7-1,3.1-1.1,5.5
|
||||||
|
l-0.1,3.2l2.8,5.8c8.7,17.9,19.2,32.7,33.2,46.4c6.3,6.2,7.8,7.6,13.8,12.3c22.7,18.1,52,30.7,79.9,34.3c2.5,0.3,5,0.8,5.7,1
|
||||||
|
c2.8,0.9,7.7-0.8,11-3.7l1.8-1.6l-0.2,4.8c-0.1,2.7-0.6,15.4-1,28.3c-0.6,20.3-0.8,24-1.5,27.5c-3.9,20.7-18.6,37.5-38.4,44.1
|
||||||
|
c-4.6,1.5-8,2.2-13.1,2.7C216.6,550.1,215.3,550,210.5,549.6z"/>
|
||||||
|
<path class="st1" d="M339.8,549.4c-4-0.4-9.4-1.6-13.2-2.9c-3.4-1.2-10-4.4-12.5-6.1c-10.9-7.4-19-17.9-23.1-30
|
||||||
|
c-2.2-6.7-2.3-7.5-3.3-36.9c-0.5-14.9-0.9-27.9-0.9-28.9l0-1.9l2.3,1.8c2.6,2,6.6,3.4,8.5,3.1c0.6-0.1,3-0.5,5.3-0.8
|
||||||
|
c37.7-5.3,71.2-22.2,97.4-49.1c12.2-12.5,21.4-25.5,29.9-42.4l3.5-7l0-3.6c0-3.1-0.1-3.8-1-5.7c-0.5-1.2-0.9-2.1-0.9-2.2
|
||||||
|
c0.2-0.2,55.3,20.1,56.9,20.9c2.6,1.3,6.6,4.1,9.9,7c9.2,7.7,16.1,19.4,18.8,31.8c0.7,3.1,0.8,4.8,0.8,11.3c0,8.6-0.5,11.7-2.9,18.7
|
||||||
|
c-1.7,5-2.9,7.2-7.1,13.1c-7.6,11-15.3,20.5-25.2,31.2c-32.8,35.4-76.5,62.5-123.4,76.3C351.6,549.6,347.2,550.1,339.8,549.4z"/>
|
||||||
|
<path class="st2" d="M255.6,438c-25.9-4.2-50.7-14.9-71.7-31c-5.2-4-8.7-7.1-14.1-12.4c-12.7-12.5-21.9-24.9-30.5-41.4
|
||||||
|
c-2.3-4.4-2.4-4.7-2.4-7.1c0-8.8,8.5-15.2,16.9-12.7c5.6,1.7,9.6,6.8,9.7,12.2c0,2.6-0.8,4.6-2.6,6.2c-1.2,1.1-3.2,1.9-4.6,1.9
|
||||||
|
c-1.2,0-3.3-0.8-4.3-1.6c-2.1-1.8-2-1,0.4,3.2c19.3,33.8,52.3,59.1,90,69.1c5.7,1.5,11.5,2.7,11.8,2.4c0.1-0.1-0.4-0.8-1.3-1.6
|
||||||
|
c-5.1-4.5-2.3-11.7,5-12.8c5.4-0.8,11.4,2.7,13.9,8c0.8,1.7,1,2.5,1,5.3s-0.1,3.5-1,5.3c-2,4.3-6.8,7.9-10.3,7.8
|
||||||
|
C260.6,438.7,257.9,438.3,255.6,438z"/>
|
||||||
|
<path class="st0" d="M297.6,438.2c-3.4-1.3-6.4-4.3-7.8-8.1c-1.1-2.9-0.9-7.3,0.5-10.2c2.6-5.3,8.7-8.5,14.4-7.5
|
||||||
|
c2.9,0.5,4.7,1.9,6,4.3c0.8,1.6,1,2.2,0.8,3.6c-0.3,2.2-0.9,3.3-2.7,4.8c-0.8,0.7-1.4,1.4-1.3,1.5c0.5,0.5,13.4-2.7,21.3-5.4
|
||||||
|
c33.6-11.3,62.5-35.1,80.4-66.1c2.5-4.4,2.6-5,0.5-3.2c-2.8,2.4-7,1.9-9.6-1c-4-4.6-0.7-13.8,6.1-16.9c2-0.9,2.7-1,5.5-1
|
||||||
|
c2.9,0,3.5,0.1,5.6,1.1c4.4,2.1,7.4,6.4,7.8,11c0.2,2.2,0.1,2.3-2.2,6.9c-23,45.9-67,78.1-117.2,85.9
|
||||||
|
C300.2,438.8,299.4,438.9,297.6,438.2z"/>
|
||||||
|
<path class="st1" d="M211.1,398.5c-4.7-0.9-8.7-2.7-12.9-5.9c-10.8-8.1-13.5-22.3-6.6-33.7c0.7-1.2,1.1-2.2,1-2.4
|
||||||
|
c-0.2-0.2-1.2-0.6-2.3-1.1c-7.6-3-13-10.6-13.5-19.1c-0.5-7.4,3.1-15,9-19.4c1-0.7,2.2-1.5,2.6-1.8c0.8-0.4,68.9-22.7,69.4-22.7
|
||||||
|
c0.2,0,0.7,0.7,1.2,1.5c0.5,0.8,1.6,2.3,2.4,3.3c1.2,1.4,1.5,1.9,1.2,2.3c-0.2,0.3-6.9,9.5-14.8,20.5
|
||||||
|
c-15.9,21.9-15.5,21.3-13.4,23.4c1.3,1.3,2.9,1.4,4.4,0.3c0.6-0.4,7.5-9.7,15.5-20.7c11.2-15.4,14.6-19.9,15-19.7
|
||||||
|
c0.9,0.4,5.5,1.9,6.6,2.1l1,0.2l0,35.3c0,39.7,0,38.8-2.5,44c-2.6,5.3-7.2,9.3-12.7,11.2c-3.7,1.3-6.8,1.6-10.2,1
|
||||||
|
c-5.5-0.9-9.8-3.2-13.7-7.4l-2.2-2.4l-0.6,0.9c-3,4.3-8.6,8.1-14,9.5C218.2,398.6,213.2,398.9,211.1,398.5z"/>
|
||||||
|
<path class="st3" d="M342.9,398.5c-5.5-0.9-9.9-3.2-14.3-7.6l-3.2-3.2l-0.7,1c-2.3,3.3-6.8,6.5-11.1,7.9c-3.7,1.2-9.2,1.4-12.6,0.3
|
||||||
|
c-7.1-2.1-12.7-7.4-15.2-14.3l-0.9-2.6v-37.1v-37.1l1.8-0.4c1-0.2,2.7-0.8,3.9-1.2c1.1-0.5,2.1-0.8,2.2-0.7c0.1,0.1,6.5,9,14.4,19.9
|
||||||
|
c7.8,10.9,14.7,20.1,15.2,20.5c2.2,1.9,5.4,0.4,5.4-2.6c0-1.4-1-2.9-13.8-20.5c-7.6-10.5-14.2-19.6-14.7-20.4l-0.9-1.3l1.4-1.7
|
||||||
|
c0.8-0.9,1.9-2.5,2.5-3.4l1-1.6l34.4,11.2c18.9,6.2,35.1,11.6,35.9,12.1c6.8,4,11.1,11.3,11.1,19.1c0,4.1-0.5,6.4-2.4,10.2
|
||||||
|
c-2,4.1-5.5,7.6-9.6,9.7c-1.6,0.8-3.2,1.5-3.4,1.5c-1,0-0.9,0.7,0.3,2.6c2.8,4.3,4,8.5,3.9,13.7c0,8.1-3.7,15.2-10.6,20.3
|
||||||
|
C356.4,397.6,349.5,399.5,342.9,398.5z"/>
|
||||||
|
<path class="st2" d="M53.9,341.9c-0.5-0.1-2.3-0.4-3.9-0.7c-15.6-2.6-30.4-12.6-38.8-26.2c-3.5-5.7-6.4-13.2-7.8-19.9
|
||||||
|
c-1.2-6.1-0.8-28.1,0.8-43.1c4.5-43,19-84.3,42.2-120.7c6.5-10.2,14.9-21.5,18.2-24.6c17.8-16.6,43.1-20.5,64.8-10
|
||||||
|
c4.3,2.1,8.8,5.1,12.7,8.6c2.8,2.4,5.8,6.1,20.9,25.5c9.7,12.5,17.8,22.8,17.9,23c0.2,0.2-0.9,0.4-3.2,0.4c-2.5,0-4.1,0.2-5.7,0.7
|
||||||
|
c-2.1,0.7-2.6,1.1-7.9,6.3c-8.2,8.1-14.4,15.3-20.3,23.9c-15.5,22.2-25.4,47.7-28.8,74.8c-2.2,16.9-1.6,37.5,1.6,52.3
|
||||||
|
c0.3,1.4,0.5,2.8,0.4,3c-0.1,0.2,0.2,1.3,0.8,2.4c1.1,2.4,4.3,5.7,6.5,6.8l1.5,0.8l-1.2,0.4c-0.7,0.2-13.1,3.8-27.6,8
|
||||||
|
c-16.4,4.7-27.7,7.8-29.8,8.1C64.1,342.1,56.1,342.3,53.9,341.9z"/>
|
||||||
|
<path class="st3" d="M494.7,341.7c-2.1-0.3-33.8-9.1-56.5-15.8l-2.5-0.7l1.6-0.8c3.4-1.7,7.2-6.6,7.3-9.6c0-0.7,0.4-3.3,0.8-5.8
|
||||||
|
c3.9-22.7,3.1-46.1-2.5-68.4c-6.4-25.5-18.6-49.2-35.8-69.1c-4.6-5.3-14.8-15.4-16.4-16.1c-2.4-1.1-5.1-1.6-8-1.4l-2.7,0.2l1.2-1.5
|
||||||
|
c0.7-0.8,8.5-10.8,17.5-22.3c8.9-11.5,17.2-21.8,18.5-23.1c2.6-2.7,7-6.2,10.3-8.2c19.3-11.6,43-11.1,61.6,1.2
|
||||||
|
c5.4,3.6,8.2,6.2,12.3,11.7c26.4,34.5,44,73.7,52.3,116.2c3.4,17.6,4.9,33.3,5,52.4c0,13-0.2,14.8-2.5,21.8
|
||||||
|
C547.8,328.6,521.7,345.2,494.7,341.7z"/>
|
||||||
|
<path class="st4" d="M133.9,318.5c-2-0.5-4.6-1.9-6-3.3c-2.5-2.4-3.1-3.5-3.7-7.3c-4.4-27.3-2.2-54,6.7-79.3
|
||||||
|
c5.3-15.1,13.5-30.5,23-43.1c5.8-7.8,16.6-19.5,19-20.7c4.7-2.4,11.3-1.2,15.2,2.7c5.4,5.4,5.2,13.9-0.3,19.1
|
||||||
|
c-4.3,4-9.4,4.4-12.6,0.9c-1.7-1.9-2.2-3.9-1.7-6.4c0.2-1.1,0.3-2,0.2-2.2c-0.3-0.3-3.6,3.3-8.3,9.1c-17.6,21.8-28.5,48-31.9,76.5
|
||||||
|
c-1.1,9.3-1,26.4,0.1,34.6c0.3,1.8,0.8,1.9,1.4,0.1c0.9-2.6,4-4.7,6.8-4.7c3,0,5.9,2.2,7.5,5.7c0.6,1.3,0.8,2.3,0.8,5.2
|
||||||
|
c0,3.3-0.1,3.8-1.1,5.7c-1.4,2.7-4.6,5.7-7.1,6.6C139.4,318.6,135.8,318.9,133.9,318.5z"/>
|
||||||
|
<path class="st1" d="M422.6,318.5c-3.7-0.6-7.7-3.6-9.4-7.1c-3.8-7.5,0.1-16.9,6.9-16.9c3.1,0,5.8,2,6.9,5.2
|
||||||
|
c0.4,1.2,0.5,1.3,0.7,0.7c1.3-3.7,1.7-26.4,0.6-35.7c-3.6-29.6-14.5-55.3-33-77.9c-5.5-6.7-8.4-9.4-7.1-6.6c0.7,1.4,0.5,4.3-0.3,5.9
|
||||||
|
c-0.9,1.7-3.2,3.5-5,3.8c-3.2,0.6-7.9-1.6-10.2-4.8c-6.5-8.8-0.5-21.2,10.4-21.4c4.6-0.1,5.2,0.3,11.2,6.4
|
||||||
|
c12.1,12.3,21.1,24.9,28.8,40.3c13.2,26.3,18.6,54.9,16.1,84.5c-0.5,5.6-2,15.7-2.6,17.1c-1.3,2.8-4.8,5.5-8.4,6.5
|
||||||
|
C425.9,318.9,425.1,318.9,422.6,318.5z"/>
|
||||||
|
<path class="st0" d="M178.2,307.2c-6-1.3-12.2-6.2-14.9-11.7c-3.4-7-3.1-15.1,0.9-21.6c0.7-1.2,1.2-2.3,1.1-2.4
|
||||||
|
c-0.1-0.1-1.1-0.6-2.1-1c-3.9-1.5-8.1-4.8-10.7-8.3c-4.6-6.2-6.1-14.6-3.9-22.1c2.9-10.3,9.4-16.8,19.1-19.3c2.8-0.7,9-0.8,11.7,0
|
||||||
|
c1.1,0.3,2.2,0.5,2.4,0.5c0.2,0,0.3-0.7,0.3-1.5c0-2.9,0.8-5.8,2.4-9.2c5.2-10.8,18.1-15.5,29-10.5c2.7,1.2,6.2,3.8,7.8,5.8
|
||||||
|
c0.7,0.8,10.3,14,21.5,29.4l20.3,27.9l-1.5,1.8c-0.8,1-1.9,2.6-2.5,3.5c-0.6,1-1.2,1.7-1.5,1.6c-4.5-1.7-46.7-15-47.7-15
|
||||||
|
c-1.9,0-3.1,1.3-3.1,3.2c0,1,0.2,1.7,0.8,2.3c0.6,0.6,7.8,3.1,24.5,8.5l23.7,7.7l-0.1,4.3l-0.1,4.3L223,295.9
|
||||||
|
c-18,5.9-33.9,10.9-35.2,11.2C184.7,307.8,181.2,307.8,178.2,307.2z"/>
|
||||||
|
<path class="st4" d="M372.5,306.8c-1.8-0.5-17.5-5.6-35-11.3l-31.8-10.4l1-4.3v-4.3l22.6-7.7c15-4.9,24-8,24.6-8.5
|
||||||
|
c0.7-0.6,0.9-1.1,0.9-2.2c0-2-1.2-3.3-3.1-3.3c-0.9,0-10.5,2.9-24.7,7.5c-12.8,4.1-23.4,7.5-23.6,7.5c-0.1,0-0.7-0.8-1.3-1.9
|
||||||
|
c-0.6-1-1.6-2.5-2.2-3.2c-0.7-0.7-1.2-1.5-1.2-1.6c0-0.2,9.6-13.5,21.4-29.6c18.9-26,21.6-29.6,23.6-31.1c5.7-4.4,13.1-5.8,19.7-3.9
|
||||||
|
c9,2.7,16.1,11.6,16.1,20.3c0,2.3-0.1,2.3,3.1,1.5c4.7-1.1,11.5-0.5,16,1.5c4.6,2,9,6,11.5,10.2c2.1,3.6,3.9,9.4,4.2,13.2
|
||||||
|
c0.3,5.2-1.1,10.7-4,15.3c-2.6,4.1-7.8,8.3-12.1,9.8c-0.9,0.3-1.7,0.8-1.7,1c0,0.2,0.4,1,0.9,1.7c2.4,3.6,3.6,7.7,3.5,12.7
|
||||||
|
c0,5.8-2.1,10.7-6.4,15.1c-4,4.1-8.9,6.3-14.9,6.5C376.3,307.7,375.3,307.6,372.5,306.8z"/>
|
||||||
|
<path class="st5" d="M276.2,298.9c-6.1-1.6-11.4-6.8-13.2-12.9c-0.7-2.4-0.7-7.5,0-9.9c1.7-5.8,6.6-10.8,12.3-12.5
|
||||||
|
c2.7-0.8,7.2-0.9,10-0.2c6.2,1.6,11.6,7.1,13.2,13.3c1.6,6-0.3,12.6-5,17.3C288.9,298.6,282.2,300.5,276.2,298.9z"/>
|
||||||
|
<path class="st2" d="M248.3,229.8c-13.3-18.3-21.2-29.6-22-31.1c-1.4-3-1.9-5.5-1.9-9.4c0-14.1,13.1-24.4,27.1-21.4
|
||||||
|
c1.4,0.3,2.6,0.5,2.7,0.5s0.3-1.3,0.4-2.8c0.8-10.7,8.4-19.6,18.9-22.4c3.9-1,10.6-1,14.5,0c8.9,2.3,15.9,9.3,18.2,18.2
|
||||||
|
c0.4,1.5,0.7,3.7,0.7,4.9c0,1.2,0.1,2.1,0.3,2.1s1.5-0.3,3-0.6c7.4-1.6,15.2,0.7,20.5,6c4.3,4.3,6.6,9.6,6.6,15.6
|
||||||
|
c0,4-0.6,6.5-2.4,10c-0.6,1.2-10.4,15-21.7,30.7c-17.8,24.5-20.8,28.5-21.4,28.3c-0.4-0.1-1.9-0.6-3.4-1.1c-1.5-0.5-2.9-0.9-3.3-0.9
|
||||||
|
c-0.7,0-0.7-0.8-0.3-25.5v-25.5l-1.4-0.9c-1-1.1-2.5-1.5-3.8-0.9c-2,0.8-2-0.5-1.8,27.2v25.8h-1.2c-0.5-0.2-2.4,0.3-4,0.9
|
||||||
|
s-3.1,1.1-3.2,1.1C269.2,258.5,259.8,245.6,248.3,229.8z"/>
|
||||||
|
<path class="st3" d="M210.9,164.8c-4.1-0.9-7.7-3.6-9.6-7.4c-1.4-2.8-1.7-7.3-0.5-10.3c1.7-4.5,3.9-6.1,15.6-11.2
|
||||||
|
c15.8-7,31.4-11.1,49.2-12.9c7.3-0.8,23.2-0.8,30.6,0c17.4,1.8,33.3,6,49.1,13c7.3,3.2,12.5,6.1,13.6,7.5c4.3,5.6,3.8,12.7-1.1,17.6
|
||||||
|
c-5.1,5.1-12.9,5.4-18.1,0.7c-2-1.8-3-3.5-3.4-5.6c-0.7-4,2.9-8.1,7.3-8.2c1.4,0,1.5-0.1,1.1-0.5c-0.3-0.3-2.2-1.2-4.3-2.1
|
||||||
|
c-33.2-14.5-70.5-16.4-105-5.4c-7.5,2.4-19,7.2-18.6,7.7c0.1,0.2,0.8,0.3,1.6,0.3c5.6,0,9.1,6.2,6.1,10.8
|
||||||
|
C221.6,163.3,215.9,165.9,210.9,164.8z"/>
|
||||||
|
<path class="st4" d="M174.7,123.4c-8.9-13.1-16.8-25.1-17.5-26.6c-1.6-3.3-3.6-9.2-4.4-13c-2.6-12.5-0.9-25.8,5-37.5
|
||||||
|
c4.2-8.3,11.2-16.3,18.6-21.3c5-3.4,6.1-3.9,12.8-6.3c23.1-8.2,47.2-13.1,73.4-15c7.5-0.6,28.5-0.6,36.3,0
|
||||||
|
c25.5,1.8,50.6,6.9,73,14.8c6.4,2.2,8.2,3.1,13.1,6.5c9.8,6.6,18.1,17.5,22,29.2c2.2,6.5,2.7,10,2.7,17.9c0,7.9-0.5,11.3-2.7,17.9
|
||||||
|
c-2.3,6.8-3.7,9.1-20.3,33.6l-16.1,23.8l-0.4-2.2c-0.2-1.2-0.9-3-1.4-4c-1-1.8-4.4-5.6-4.7-5.2c-0.1,0.1-1.2-0.4-2.4-1.1
|
||||||
|
c-9.1-5.2-21.9-10.5-33.2-13.9c-37-11-77.2-8.8-113,6.1c-4.9,2.1-17.7,8.4-19.2,9.5c-2.2,1.6-5.1,6.8-5.1,9c0,0.4-0.1,1-0.3,1.2
|
||||||
|
C191,147,184.7,138,174.7,123.4z"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 9.7 KiB |
|
After Width: | Height: | Size: 56 KiB |
|
After Width: | Height: | Size: 59 KiB |
|
After Width: | Height: | Size: 278 KiB |
|
After Width: | Height: | Size: 2.7 MiB |
|
After Width: | Height: | Size: 406 KiB |
|
After Width: | Height: | Size: 540 KiB |
|
After Width: | Height: | Size: 376 KiB |
|
After Width: | Height: | Size: 570 KiB |
|
After Width: | Height: | Size: 244 KiB |
|
After Width: | Height: | Size: 46 KiB |
|
After Width: | Height: | Size: 145 KiB |
|
After Width: | Height: | Size: 206 KiB |
|
Before Width: | Height: | Size: 42 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 30 KiB |
@@ -1,100 +0,0 @@
|
|||||||
## Visual Review
|
|
||||||
|
|
||||||
Found **12** page(s) with visual changes.
|
|
||||||
|
|
||||||
### admin-system-settings
|
|
||||||
|
|
||||||
Change: **9.0%** (186,690 pixels)
|
|
||||||
|
|
||||||
| Base | PR | Diff |
|
|
||||||
|------|-------|------|
|
|
||||||
|  |  |  |
|
|
||||||
|
|
||||||
### admin-users
|
|
||||||
|
|
||||||
Change: **3.8%** (79,810 pixels)
|
|
||||||
|
|
||||||
| Base | PR | Diff |
|
|
||||||
|------|-------|------|
|
|
||||||
|  |  |  |
|
|
||||||
|
|
||||||
### albums-list
|
|
||||||
|
|
||||||
Change: **6.1%** (126,081 pixels)
|
|
||||||
|
|
||||||
| Base | PR | Diff |
|
|
||||||
|------|-------|------|
|
|
||||||
|  |  |  |
|
|
||||||
|
|
||||||
### archive
|
|
||||||
|
|
||||||
Change: **4.9%** (101,086 pixels)
|
|
||||||
|
|
||||||
| Base | PR | Diff |
|
|
||||||
|------|-------|------|
|
|
||||||
|  |  |  |
|
|
||||||
|
|
||||||
### explore
|
|
||||||
|
|
||||||
Change: **4.8%** (100,268 pixels)
|
|
||||||
|
|
||||||
| Base | PR | Diff |
|
|
||||||
|------|-------|------|
|
|
||||||
|  |  |  |
|
|
||||||
|
|
||||||
### favorites
|
|
||||||
|
|
||||||
Change: **31.7%** (657,589 pixels)
|
|
||||||
|
|
||||||
| Base | PR | Diff |
|
|
||||||
|------|-------|------|
|
|
||||||
|  |  |  |
|
|
||||||
|
|
||||||
### map
|
|
||||||
|
|
||||||
Change: **62.4%** (1,293,490 pixels)
|
|
||||||
|
|
||||||
| Base | PR | Diff |
|
|
||||||
|------|-------|------|
|
|
||||||
|  |  |  |
|
|
||||||
|
|
||||||
### people
|
|
||||||
|
|
||||||
Change: **0.4%** (7,907 pixels)
|
|
||||||
|
|
||||||
| Base | PR | Diff |
|
|
||||||
|------|-------|------|
|
|
||||||
|  |  |  |
|
|
||||||
|
|
||||||
### photos-timeline
|
|
||||||
|
|
||||||
Change: **55.4%** (1,149,491 pixels)
|
|
||||||
|
|
||||||
| Base | PR | Diff |
|
|
||||||
|------|-------|------|
|
|
||||||
|  |  |  |
|
|
||||||
|
|
||||||
### sharing
|
|
||||||
|
|
||||||
Change: **5.3%** (109,526 pixels)
|
|
||||||
|
|
||||||
| Base | PR | Diff |
|
|
||||||
|------|-------|------|
|
|
||||||
|  |  |  |
|
|
||||||
|
|
||||||
### trash
|
|
||||||
|
|
||||||
Change: **5.4%** (112,470 pixels)
|
|
||||||
|
|
||||||
| Base | PR | Diff |
|
|
||||||
|------|-------|------|
|
|
||||||
|  |  |  |
|
|
||||||
|
|
||||||
### user-settings
|
|
||||||
|
|
||||||
Change: **6.1%** (126,625 pixels)
|
|
||||||
|
|
||||||
| Base | PR | Diff |
|
|
||||||
|------|-------|------|
|
|
||||||
|  |  |  |
|
|
||||||
|
|
||||||
@@ -1,134 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
"name": "admin-system-settings",
|
|
||||||
"baseExists": true,
|
|
||||||
"prExists": true,
|
|
||||||
"diffPixels": 186690,
|
|
||||||
"totalPixels": 2073600,
|
|
||||||
"changePercent": 9.00318287037037,
|
|
||||||
"diffImagePath": "/home/runner/work/immich/immich/screenshots/diff/admin-system-settings-diff.png",
|
|
||||||
"baseImagePath": "/home/runner/work/immich/immich/screenshots/base/admin-system-settings.png",
|
|
||||||
"prImagePath": "/home/runner/work/immich/immich/screenshots/pr/admin-system-settings.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "admin-users",
|
|
||||||
"baseExists": true,
|
|
||||||
"prExists": true,
|
|
||||||
"diffPixels": 79810,
|
|
||||||
"totalPixels": 2073600,
|
|
||||||
"changePercent": 3.8488618827160495,
|
|
||||||
"diffImagePath": "/home/runner/work/immich/immich/screenshots/diff/admin-users-diff.png",
|
|
||||||
"baseImagePath": "/home/runner/work/immich/immich/screenshots/base/admin-users.png",
|
|
||||||
"prImagePath": "/home/runner/work/immich/immich/screenshots/pr/admin-users.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "albums-list",
|
|
||||||
"baseExists": true,
|
|
||||||
"prExists": true,
|
|
||||||
"diffPixels": 126081,
|
|
||||||
"totalPixels": 2073600,
|
|
||||||
"changePercent": 6.080295138888888,
|
|
||||||
"diffImagePath": "/home/runner/work/immich/immich/screenshots/diff/albums-list-diff.png",
|
|
||||||
"baseImagePath": "/home/runner/work/immich/immich/screenshots/base/albums-list.png",
|
|
||||||
"prImagePath": "/home/runner/work/immich/immich/screenshots/pr/albums-list.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "archive",
|
|
||||||
"baseExists": true,
|
|
||||||
"prExists": true,
|
|
||||||
"diffPixels": 101086,
|
|
||||||
"totalPixels": 2073600,
|
|
||||||
"changePercent": 4.874903549382716,
|
|
||||||
"diffImagePath": "/home/runner/work/immich/immich/screenshots/diff/archive-diff.png",
|
|
||||||
"baseImagePath": "/home/runner/work/immich/immich/screenshots/base/archive.png",
|
|
||||||
"prImagePath": "/home/runner/work/immich/immich/screenshots/pr/archive.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "explore",
|
|
||||||
"baseExists": true,
|
|
||||||
"prExists": true,
|
|
||||||
"diffPixels": 100268,
|
|
||||||
"totalPixels": 2073600,
|
|
||||||
"changePercent": 4.83545524691358,
|
|
||||||
"diffImagePath": "/home/runner/work/immich/immich/screenshots/diff/explore-diff.png",
|
|
||||||
"baseImagePath": "/home/runner/work/immich/immich/screenshots/base/explore.png",
|
|
||||||
"prImagePath": "/home/runner/work/immich/immich/screenshots/pr/explore.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "favorites",
|
|
||||||
"baseExists": true,
|
|
||||||
"prExists": true,
|
|
||||||
"diffPixels": 657589,
|
|
||||||
"totalPixels": 2073600,
|
|
||||||
"changePercent": 31.712432484567906,
|
|
||||||
"diffImagePath": "/home/runner/work/immich/immich/screenshots/diff/favorites-diff.png",
|
|
||||||
"baseImagePath": "/home/runner/work/immich/immich/screenshots/base/favorites.png",
|
|
||||||
"prImagePath": "/home/runner/work/immich/immich/screenshots/pr/favorites.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "map",
|
|
||||||
"baseExists": true,
|
|
||||||
"prExists": true,
|
|
||||||
"diffPixels": 1293490,
|
|
||||||
"totalPixels": 2073600,
|
|
||||||
"changePercent": 62.378954475308646,
|
|
||||||
"diffImagePath": "/home/runner/work/immich/immich/screenshots/diff/map-diff.png",
|
|
||||||
"baseImagePath": "/home/runner/work/immich/immich/screenshots/base/map.png",
|
|
||||||
"prImagePath": "/home/runner/work/immich/immich/screenshots/pr/map.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "people",
|
|
||||||
"baseExists": true,
|
|
||||||
"prExists": true,
|
|
||||||
"diffPixels": 7907,
|
|
||||||
"totalPixels": 2073600,
|
|
||||||
"changePercent": 0.38131751543209874,
|
|
||||||
"diffImagePath": "/home/runner/work/immich/immich/screenshots/diff/people-diff.png",
|
|
||||||
"baseImagePath": "/home/runner/work/immich/immich/screenshots/base/people.png",
|
|
||||||
"prImagePath": "/home/runner/work/immich/immich/screenshots/pr/people.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "photos-timeline",
|
|
||||||
"baseExists": true,
|
|
||||||
"prExists": true,
|
|
||||||
"diffPixels": 1149491,
|
|
||||||
"totalPixels": 2073600,
|
|
||||||
"changePercent": 55.43455825617284,
|
|
||||||
"diffImagePath": "/home/runner/work/immich/immich/screenshots/diff/photos-timeline-diff.png",
|
|
||||||
"baseImagePath": "/home/runner/work/immich/immich/screenshots/base/photos-timeline.png",
|
|
||||||
"prImagePath": "/home/runner/work/immich/immich/screenshots/pr/photos-timeline.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "sharing",
|
|
||||||
"baseExists": true,
|
|
||||||
"prExists": true,
|
|
||||||
"diffPixels": 109526,
|
|
||||||
"totalPixels": 2073600,
|
|
||||||
"changePercent": 5.281925154320987,
|
|
||||||
"diffImagePath": "/home/runner/work/immich/immich/screenshots/diff/sharing-diff.png",
|
|
||||||
"baseImagePath": "/home/runner/work/immich/immich/screenshots/base/sharing.png",
|
|
||||||
"prImagePath": "/home/runner/work/immich/immich/screenshots/pr/sharing.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "trash",
|
|
||||||
"baseExists": true,
|
|
||||||
"prExists": true,
|
|
||||||
"diffPixels": 112470,
|
|
||||||
"totalPixels": 2073600,
|
|
||||||
"changePercent": 5.423900462962963,
|
|
||||||
"diffImagePath": "/home/runner/work/immich/immich/screenshots/diff/trash-diff.png",
|
|
||||||
"baseImagePath": "/home/runner/work/immich/immich/screenshots/base/trash.png",
|
|
||||||
"prImagePath": "/home/runner/work/immich/immich/screenshots/pr/trash.png"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "user-settings",
|
|
||||||
"baseExists": true,
|
|
||||||
"prExists": true,
|
|
||||||
"diffPixels": 126625,
|
|
||||||
"totalPixels": 2073600,
|
|
||||||
"changePercent": 6.106529706790123,
|
|
||||||
"diffImagePath": "/home/runner/work/immich/immich/screenshots/diff/user-settings-diff.png",
|
|
||||||
"baseImagePath": "/home/runner/work/immich/immich/screenshots/base/user-settings.png",
|
|
||||||
"prImagePath": "/home/runner/work/immich/immich/screenshots/pr/user-settings.png"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
Before Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 37 KiB |
@@ -0,0 +1,63 @@
|
|||||||
|
###################################################################################
|
||||||
|
# Database
|
||||||
|
###################################################################################
|
||||||
|
|
||||||
|
DB_HOSTNAME=immich_postgres
|
||||||
|
DB_USERNAME=postgres
|
||||||
|
DB_PASSWORD=postgres
|
||||||
|
DB_DATABASE_NAME=immich
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
###################################################################################
|
||||||
|
# Redis
|
||||||
|
###################################################################################
|
||||||
|
|
||||||
|
REDIS_HOSTNAME=immich_redis
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
###################################################################################
|
||||||
|
# Upload File Config
|
||||||
|
###################################################################################
|
||||||
|
|
||||||
|
UPLOAD_LOCATION=absolute_location_on_your_machine_where_you_want_to_store_the_backup
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
###################################################################################
|
||||||
|
# JWT SECRET
|
||||||
|
###################################################################################
|
||||||
|
|
||||||
|
JWT_SECRET=randomstringthatissolongandpowerfulthatnoonecanguess
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
###################################################################################
|
||||||
|
# MAPBOX
|
||||||
|
####################################################################################
|
||||||
|
|
||||||
|
# ENABLE_MAPBOX is either true of false -> if true, you have to provide MAPBOX_KEY
|
||||||
|
ENABLE_MAPBOX=false
|
||||||
|
MAPBOX_KEY=
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
###################################################################################
|
||||||
|
# WEB
|
||||||
|
###################################################################################
|
||||||
|
|
||||||
|
# This is the URL of your vm/server where you host Immich, so that the web frontend
|
||||||
|
# know where can it make the request to.
|
||||||
|
# For example: If your server IP address is 10.1.11.50, the environment variable will
|
||||||
|
# be VITE_SERVER_ENDPOINT=http://10.1.11.50:2283/api
|
||||||
|
# !CAUTION! THERE IS NO FORWARD SLASH AT THE END
|
||||||
|
|
||||||
|
VITE_SERVER_ENDPOINT=
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
# Database
|
||||||
|
DB_HOSTNAME=immich_postgres_test
|
||||||
|
DB_USERNAME=postgres
|
||||||
|
DB_PASSWORD=postgres
|
||||||
|
DB_DATABASE_NAME=e2e_test
|
||||||
|
|
||||||
|
# Redis
|
||||||
|
REDIS_HOSTNAME=immich_redis_test
|
||||||
|
|
||||||
|
# Upload File Config
|
||||||
|
UPLOAD_LOCATION=./upload
|
||||||
|
|
||||||
|
# JWT SECRET
|
||||||
|
JWT_SECRET=randomstringthatissolongandpowerfulthatnoonecanguess
|
||||||
|
|
||||||
|
# MAPBOX
|
||||||
|
## ENABLE_MAPBOX is either true of false -> if true, you have to provide MAPBOX_KEY
|
||||||
|
ENABLE_MAPBOX=false
|
||||||
|
|
||||||
|
# WEB
|
||||||
|
MAPBOX_KEY=
|
||||||
|
VITE_SERVER_ENDPOINT=http://localhost:2283/api
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
.env
|
||||||
@@ -0,0 +1,109 @@
|
|||||||
|
version: "3.8"
|
||||||
|
|
||||||
|
services:
|
||||||
|
immich-server:
|
||||||
|
image: immich-server-dev:latest
|
||||||
|
build:
|
||||||
|
context: ../server
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
command: npm run start:dev immich
|
||||||
|
volumes:
|
||||||
|
- ../server:/usr/src/app
|
||||||
|
- ${UPLOAD_LOCATION}:/usr/src/app/upload
|
||||||
|
- /usr/src/app/node_modules
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
environment:
|
||||||
|
- NODE_ENV=development
|
||||||
|
depends_on:
|
||||||
|
- redis
|
||||||
|
- database
|
||||||
|
|
||||||
|
immich-machine-learning:
|
||||||
|
image: immich-machine-learning-dev:latest
|
||||||
|
build:
|
||||||
|
context: ../machine-learning
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
command: npm run start:dev
|
||||||
|
volumes:
|
||||||
|
- ../machine-learning:/usr/src/app
|
||||||
|
- ${UPLOAD_LOCATION}:/usr/src/app/upload
|
||||||
|
- /usr/src/app/node_modules
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
environment:
|
||||||
|
- NODE_ENV=development
|
||||||
|
depends_on:
|
||||||
|
- database
|
||||||
|
|
||||||
|
immich-microservices:
|
||||||
|
image: immich-microservices:latest
|
||||||
|
build:
|
||||||
|
context: ../server
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
command: npm run start:dev microservices
|
||||||
|
volumes:
|
||||||
|
- ../server:/usr/src/app
|
||||||
|
- ${UPLOAD_LOCATION}:/usr/src/app/upload
|
||||||
|
- /usr/src/app/node_modules
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
environment:
|
||||||
|
- NODE_ENV=development
|
||||||
|
depends_on:
|
||||||
|
- database
|
||||||
|
- immich-server
|
||||||
|
|
||||||
|
immich-web:
|
||||||
|
image: immich-web-dev:1.9.0
|
||||||
|
build:
|
||||||
|
context: ../web
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
target: dev
|
||||||
|
command: npm run dev --host
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
ports:
|
||||||
|
- 3000:3000
|
||||||
|
- 24678:24678
|
||||||
|
volumes:
|
||||||
|
- ../web:/usr/src/app
|
||||||
|
- /usr/src/app/node_modules
|
||||||
|
restart: always
|
||||||
|
|
||||||
|
redis:
|
||||||
|
container_name: immich_redis
|
||||||
|
image: redis:6.2
|
||||||
|
|
||||||
|
database:
|
||||||
|
container_name: immich_postgres
|
||||||
|
image: postgres:14
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
environment:
|
||||||
|
POSTGRES_PASSWORD: ${DB_PASSWORD}
|
||||||
|
POSTGRES_USER: ${DB_USERNAME}
|
||||||
|
POSTGRES_DB: ${DB_DATABASE_NAME}
|
||||||
|
PG_DATA: /var/lib/postgresql/data
|
||||||
|
volumes:
|
||||||
|
- pgdata:/var/lib/postgresql/data
|
||||||
|
ports:
|
||||||
|
- 5432:5432
|
||||||
|
|
||||||
|
immich-proxy:
|
||||||
|
container_name: immich_proxy
|
||||||
|
image: immich-proxy-dev:latest
|
||||||
|
build:
|
||||||
|
context: ../nginx
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
ports:
|
||||||
|
- 2283:80
|
||||||
|
- 2284:443
|
||||||
|
logging:
|
||||||
|
driver: none
|
||||||
|
depends_on:
|
||||||
|
- immich-server
|
||||||
|
restart: always
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
pgdata:
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
version: "3.8"
|
||||||
|
|
||||||
|
services:
|
||||||
|
immich-server:
|
||||||
|
image: altran1502/immich-server:staging
|
||||||
|
entrypoint: ["/bin/sh", "./start-server.sh"]
|
||||||
|
volumes:
|
||||||
|
- ${UPLOAD_LOCATION}:/usr/src/app/upload
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
environment:
|
||||||
|
- NODE_ENV=production
|
||||||
|
depends_on:
|
||||||
|
- redis
|
||||||
|
- database
|
||||||
|
restart: always
|
||||||
|
|
||||||
|
immich-microservices:
|
||||||
|
image: altran1502/immich-server:staging
|
||||||
|
entrypoint: ["/bin/sh", "./start-microservices.sh"]
|
||||||
|
volumes:
|
||||||
|
- ${UPLOAD_LOCATION}:/usr/src/app/upload
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
environment:
|
||||||
|
- NODE_ENV=production
|
||||||
|
depends_on:
|
||||||
|
- redis
|
||||||
|
- database
|
||||||
|
restart: always
|
||||||
|
|
||||||
|
immich-machine-learning:
|
||||||
|
image: altran1502/immich-machine-learning:staging
|
||||||
|
entrypoint: ["/bin/sh", "./entrypoint.sh"]
|
||||||
|
volumes:
|
||||||
|
- ${UPLOAD_LOCATION}:/usr/src/app/upload
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
environment:
|
||||||
|
- NODE_ENV=production
|
||||||
|
depends_on:
|
||||||
|
- database
|
||||||
|
restart: always
|
||||||
|
|
||||||
|
immich-web:
|
||||||
|
image: altran1502/immich-web:staging
|
||||||
|
entrypoint: ["/bin/sh", "./entrypoint.sh"]
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
restart: always
|
||||||
|
|
||||||
|
redis:
|
||||||
|
container_name: immich_redis
|
||||||
|
image: redis:6.2
|
||||||
|
restart: always
|
||||||
|
|
||||||
|
database:
|
||||||
|
container_name: immich_postgres
|
||||||
|
image: postgres:14
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
environment:
|
||||||
|
POSTGRES_PASSWORD: ${DB_PASSWORD}
|
||||||
|
POSTGRES_USER: ${DB_USERNAME}
|
||||||
|
POSTGRES_DB: ${DB_DATABASE_NAME}
|
||||||
|
PG_DATA: /var/lib/postgresql/data
|
||||||
|
volumes:
|
||||||
|
- pgdata:/var/lib/postgresql/data
|
||||||
|
restart: always
|
||||||
|
|
||||||
|
immich-proxy:
|
||||||
|
container_name: immich_proxy
|
||||||
|
image: altran1502/immich-proxy:staging
|
||||||
|
ports:
|
||||||
|
- 2283:80
|
||||||
|
- 2284:443
|
||||||
|
logging:
|
||||||
|
driver: none
|
||||||
|
depends_on:
|
||||||
|
- immich-server
|
||||||
|
restart: always
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
pgdata:
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
version: "3.8"
|
||||||
|
|
||||||
|
services:
|
||||||
|
immich_server_test:
|
||||||
|
image: immich-server-dev:latest
|
||||||
|
build:
|
||||||
|
context: ../server
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
command: npm run test:e2e
|
||||||
|
expose:
|
||||||
|
- "3000"
|
||||||
|
volumes:
|
||||||
|
- ../server:/usr/src/app
|
||||||
|
- /usr/src/app/node_modules
|
||||||
|
env_file:
|
||||||
|
- .env.test
|
||||||
|
environment:
|
||||||
|
- NODE_ENV=development
|
||||||
|
depends_on:
|
||||||
|
- redis
|
||||||
|
- database
|
||||||
|
|
||||||
|
redis:
|
||||||
|
container_name: immich_redis_test
|
||||||
|
image: redis:6.2
|
||||||
|
|
||||||
|
database:
|
||||||
|
container_name: immich_postgres_test
|
||||||
|
image: postgres:14
|
||||||
|
env_file:
|
||||||
|
- .env.test
|
||||||
|
environment:
|
||||||
|
POSTGRES_PASSWORD: ${DB_PASSWORD}
|
||||||
|
POSTGRES_USER: ${DB_USERNAME}
|
||||||
|
POSTGRES_DB: ${DB_DATABASE_NAME}
|
||||||
|
PG_DATA: /var/lib/postgresql/data
|
||||||
|
volumes:
|
||||||
|
- /var/lib/postgresql/data
|
||||||
|
ports:
|
||||||
|
- 5432:5432
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
version: "3.8"
|
||||||
|
|
||||||
|
services:
|
||||||
|
immich-server:
|
||||||
|
image: altran1502/immich-server:release
|
||||||
|
entrypoint: ["/bin/sh", "./start-server.sh"]
|
||||||
|
volumes:
|
||||||
|
- ${UPLOAD_LOCATION}:/usr/src/app/upload
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
environment:
|
||||||
|
- NODE_ENV=production
|
||||||
|
depends_on:
|
||||||
|
- redis
|
||||||
|
- database
|
||||||
|
restart: always
|
||||||
|
|
||||||
|
immich-microservices:
|
||||||
|
image: altran1502/immich-server:release
|
||||||
|
entrypoint: ["/bin/sh", "./start-microservices.sh"]
|
||||||
|
volumes:
|
||||||
|
- ${UPLOAD_LOCATION}:/usr/src/app/upload
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
environment:
|
||||||
|
- NODE_ENV=production
|
||||||
|
depends_on:
|
||||||
|
- redis
|
||||||
|
- database
|
||||||
|
restart: always
|
||||||
|
|
||||||
|
immich-machine-learning:
|
||||||
|
image: altran1502/immich-machine-learning:release
|
||||||
|
entrypoint: ["/bin/sh", "./entrypoint.sh"]
|
||||||
|
volumes:
|
||||||
|
- ${UPLOAD_LOCATION}:/usr/src/app/upload
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
environment:
|
||||||
|
- NODE_ENV=production
|
||||||
|
depends_on:
|
||||||
|
- database
|
||||||
|
restart: always
|
||||||
|
|
||||||
|
immich-web:
|
||||||
|
image: altran1502/immich-web:release
|
||||||
|
entrypoint: ["/bin/sh", "./entrypoint.sh"]
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
restart: always
|
||||||
|
|
||||||
|
redis:
|
||||||
|
container_name: immich_redis
|
||||||
|
image: redis:6.2
|
||||||
|
restart: always
|
||||||
|
|
||||||
|
database:
|
||||||
|
container_name: immich_postgres
|
||||||
|
image: postgres:14
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
environment:
|
||||||
|
POSTGRES_PASSWORD: ${DB_PASSWORD}
|
||||||
|
POSTGRES_USER: ${DB_USERNAME}
|
||||||
|
POSTGRES_DB: ${DB_DATABASE_NAME}
|
||||||
|
PG_DATA: /var/lib/postgresql/data
|
||||||
|
volumes:
|
||||||
|
- pgdata:/var/lib/postgresql/data
|
||||||
|
restart: always
|
||||||
|
|
||||||
|
immich-proxy:
|
||||||
|
container_name: immich_proxy
|
||||||
|
image: altran1502/immich-proxy:release
|
||||||
|
ports:
|
||||||
|
- 2283:80
|
||||||
|
- 2284:443
|
||||||
|
logging:
|
||||||
|
driver: none
|
||||||
|
depends_on:
|
||||||
|
- immich-server
|
||||||
|
restart: always
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
pgdata:
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
This directory exists because of the F-Droid build process. F-Droid is using the same directory structure as Fastlane for the app metadata.
|
||||||
|
|
||||||
|
Because F-Droid expects the metadata to be located in the root of the repository we need to have this symlink.
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../mobile/android/fastlane/metadata
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
node_modules/
|
||||||
|
upload/
|
||||||
|
dist/
|
||||||
|
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
module.exports = {
|
||||||
|
parser: '@typescript-eslint/parser',
|
||||||
|
parserOptions: {
|
||||||
|
project: 'tsconfig.json',
|
||||||
|
sourceType: 'module',
|
||||||
|
},
|
||||||
|
plugins: ['@typescript-eslint/eslint-plugin'],
|
||||||
|
extends: [
|
||||||
|
'plugin:@typescript-eslint/recommended',
|
||||||
|
'plugin:prettier/recommended',
|
||||||
|
],
|
||||||
|
root: true,
|
||||||
|
env: {
|
||||||
|
node: true,
|
||||||
|
jest: true,
|
||||||
|
},
|
||||||
|
ignorePatterns: ['.eslintrc.js'],
|
||||||
|
rules: {
|
||||||
|
'@typescript-eslint/interface-name-prefix': 'off',
|
||||||
|
'@typescript-eslint/explicit-function-return-type': 'off',
|
||||||
|
'@typescript-eslint/explicit-module-boundary-types': 'off',
|
||||||
|
'@typescript-eslint/no-explicit-any': 'off',
|
||||||
|
},
|
||||||
|
};
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
# compiled output
|
||||||
|
/dist
|
||||||
|
/node_modules
|
||||||
|
|
||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
pnpm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
lerna-debug.log*
|
||||||
|
|
||||||
|
# OS
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
|
# Tests
|
||||||
|
/coverage
|
||||||
|
/.nyc_output
|
||||||
|
|
||||||
|
# IDEs and editors
|
||||||
|
/.idea
|
||||||
|
.project
|
||||||
|
.classpath
|
||||||
|
.c9/
|
||||||
|
*.launch
|
||||||
|
.settings/
|
||||||
|
*.sublime-workspace
|
||||||
|
|
||||||
|
# IDE - VSCode
|
||||||
|
.vscode/*
|
||||||
|
!.vscode/settings.json
|
||||||
|
!.vscode/tasks.json
|
||||||
|
!.vscode/launch.json
|
||||||
|
!.vscode/extensions.json
|
||||||
|
|
||||||
|
upload/
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"singleQuote": true,
|
||||||
|
"trailingComma": "all"
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
FROM node:16-bullseye-slim
|
||||||
|
|
||||||
|
ARG DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
|
WORKDIR /usr/src/app
|
||||||
|
|
||||||
|
COPY package.json package-lock.json ./
|
||||||
|
|
||||||
|
RUN apt-get update
|
||||||
|
RUN apt-get install gcc g++ make cmake python3 python3-pip ffmpeg -y
|
||||||
|
|
||||||
|
RUN npm install
|
||||||
|
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
RUN npm run build
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
|
||||||
|
# Microservices for Immich
|
||||||
|
|
||||||
|
## Image Classifier
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
# npm run typeorm migration:run
|
||||||
|
npm run build && npm run start:prod
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"collection": "@nestjs/schematics",
|
||||||
|
"sourceRoot": "src"
|
||||||
|
}
|
||||||
@@ -0,0 +1,83 @@
|
|||||||
|
{
|
||||||
|
"name": "nest_microservices",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"description": "",
|
||||||
|
"author": "",
|
||||||
|
"private": true,
|
||||||
|
"license": "UNLICENSED",
|
||||||
|
"scripts": {
|
||||||
|
"prebuild": "rimraf dist",
|
||||||
|
"build": "nest build",
|
||||||
|
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
|
||||||
|
"start": "nest start",
|
||||||
|
"start:dev": "nest start --watch",
|
||||||
|
"start:debug": "nest start --debug --watch",
|
||||||
|
"start:prod": "node dist/main",
|
||||||
|
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
|
||||||
|
"test": "jest",
|
||||||
|
"test:watch": "jest --watch",
|
||||||
|
"test:cov": "jest --coverage",
|
||||||
|
"test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
|
||||||
|
"test:e2e": "jest --config ./test/jest-e2e.json"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@nestjs/common": "^8.0.0",
|
||||||
|
"@nestjs/core": "^8.0.0",
|
||||||
|
"@nestjs/mapped-types": "^1.0.1",
|
||||||
|
"@nestjs/platform-express": "^8.0.0",
|
||||||
|
"@nestjs/typeorm": "^8.0.3",
|
||||||
|
"@tensorflow-models/coco-ssd": "^2.2.2",
|
||||||
|
"@tensorflow-models/mobilenet": "^2.1.0",
|
||||||
|
"@tensorflow/tfjs": "^3.15.0",
|
||||||
|
"@tensorflow/tfjs-converter": "^3.15.0",
|
||||||
|
"@tensorflow/tfjs-core": "^3.15.0",
|
||||||
|
"@tensorflow/tfjs-node": "^3.15.0",
|
||||||
|
"@tensorflow/tfjs-node-gpu": "^3.15.0",
|
||||||
|
"@trpc/server": "^9.20.3",
|
||||||
|
"pg": "^8.7.3",
|
||||||
|
"reflect-metadata": "^0.1.13",
|
||||||
|
"rimraf": "^3.0.2",
|
||||||
|
"rxjs": "^7.2.0",
|
||||||
|
"typeorm": "^0.2.45"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@nestjs/cli": "^8.2.4",
|
||||||
|
"@nestjs/schematics": "^8.0.0",
|
||||||
|
"@nestjs/testing": "^8.0.0",
|
||||||
|
"@types/express": "^4.17.13",
|
||||||
|
"@types/jest": "27.4.1",
|
||||||
|
"@types/node": "^16.0.0",
|
||||||
|
"@types/supertest": "^2.0.11",
|
||||||
|
"@typescript-eslint/eslint-plugin": "^5.0.0",
|
||||||
|
"@typescript-eslint/parser": "^5.0.0",
|
||||||
|
"eslint": "^8.0.1",
|
||||||
|
"eslint-config-prettier": "^8.3.0",
|
||||||
|
"eslint-plugin-prettier": "^4.0.0",
|
||||||
|
"jest": "^27.2.5",
|
||||||
|
"prettier": "^2.3.2",
|
||||||
|
"source-map-support": "^0.5.20",
|
||||||
|
"supertest": "^6.1.3",
|
||||||
|
"ts-jest": "^27.0.3",
|
||||||
|
"ts-loader": "^9.2.3",
|
||||||
|
"ts-node": "^10.0.0",
|
||||||
|
"tsconfig-paths": "^3.10.1",
|
||||||
|
"typescript": "^4.3.5"
|
||||||
|
},
|
||||||
|
"jest": {
|
||||||
|
"moduleFileExtensions": [
|
||||||
|
"js",
|
||||||
|
"json",
|
||||||
|
"ts"
|
||||||
|
],
|
||||||
|
"rootDir": "src",
|
||||||
|
"testRegex": ".*\\.spec\\.ts$",
|
||||||
|
"transform": {
|
||||||
|
"^.+\\.(t|j)s$": "ts-jest"
|
||||||
|
},
|
||||||
|
"collectCoverageFrom": [
|
||||||
|
"**/*.(t|j)s"
|
||||||
|
],
|
||||||
|
"coverageDirectory": "../coverage",
|
||||||
|
"testEnvironment": "node"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
import { Module } from '@nestjs/common';
|
||||||
|
import { ImageClassifierModule } from './image-classifier/image-classifier.module';
|
||||||
|
import { databaseConfig } from './config/database.config';
|
||||||
|
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||||
|
import { ObjectDetectionModule } from './object-detection/object-detection.module';
|
||||||
|
|
||||||
|
@Module({
|
||||||
|
imports: [
|
||||||
|
TypeOrmModule.forRoot(databaseConfig),
|
||||||
|
ImageClassifierModule,
|
||||||
|
ObjectDetectionModule,
|
||||||
|
],
|
||||||
|
controllers: [],
|
||||||
|
providers: [],
|
||||||
|
})
|
||||||
|
export class AppModule {}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
import { TypeOrmModuleOptions } from '@nestjs/typeorm';
|
||||||
|
|
||||||
|
export const databaseConfig: TypeOrmModuleOptions = {
|
||||||
|
type: 'postgres',
|
||||||
|
host: process.env.DB_HOSTNAME || 'immich_postgres',
|
||||||
|
port: 5432,
|
||||||
|
username: process.env.DB_USERNAME,
|
||||||
|
password: process.env.DB_PASSWORD,
|
||||||
|
database: process.env.DB_DATABASE_NAME,
|
||||||
|
synchronize: false,
|
||||||
|
};
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
import { Body, Controller, Post } from '@nestjs/common';
|
||||||
|
import { ImageClassifierService } from './image-classifier.service';
|
||||||
|
|
||||||
|
@Controller('image-classifier')
|
||||||
|
export class ImageClassifierController {
|
||||||
|
constructor(
|
||||||
|
private readonly imageClassifierService: ImageClassifierService,
|
||||||
|
) { }
|
||||||
|
|
||||||
|
@Post('/tag-image')
|
||||||
|
async tagImage(@Body('thumbnailPath') thumbnailPath: string) {
|
||||||
|
return await this.imageClassifierService.tagImage(thumbnailPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
import { Module } from '@nestjs/common';
|
||||||
|
import { ImageClassifierService } from './image-classifier.service';
|
||||||
|
import { ImageClassifierController } from './image-classifier.controller';
|
||||||
|
|
||||||
|
@Module({
|
||||||
|
controllers: [ImageClassifierController],
|
||||||
|
providers: [ImageClassifierService],
|
||||||
|
})
|
||||||
|
export class ImageClassifierModule {}
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
import { Injectable, Logger } from '@nestjs/common';
|
||||||
|
import * as mobilenet from '@tensorflow-models/mobilenet';
|
||||||
|
import * as cocoSsd from '@tensorflow-models/coco-ssd';
|
||||||
|
import * as tf from '@tensorflow/tfjs-node';
|
||||||
|
import * as fs from 'fs';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class ImageClassifierService {
|
||||||
|
private readonly MOBILENET_VERSION = 2;
|
||||||
|
private readonly MOBILENET_ALPHA = 1.0;
|
||||||
|
|
||||||
|
private mobileNetModel: mobilenet.MobileNet;
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
Logger.log(
|
||||||
|
`Running Node TensorFlow Version : ${tf.version['tfjs']}`,
|
||||||
|
'ImageClassifier',
|
||||||
|
);
|
||||||
|
mobilenet
|
||||||
|
.load({
|
||||||
|
version: this.MOBILENET_VERSION,
|
||||||
|
alpha: this.MOBILENET_ALPHA,
|
||||||
|
})
|
||||||
|
.then((mobilenetModel) => (this.mobileNetModel = mobilenetModel));
|
||||||
|
}
|
||||||
|
|
||||||
|
async tagImage(thumbnailPath: string) {
|
||||||
|
try {
|
||||||
|
const isExist = fs.existsSync(thumbnailPath);
|
||||||
|
if (isExist) {
|
||||||
|
const tags = [];
|
||||||
|
const image = fs.readFileSync(thumbnailPath);
|
||||||
|
const decodedImage = tf.node.decodeImage(image, 3) as tf.Tensor3D;
|
||||||
|
const predictions = await this.mobileNetModel.classify(decodedImage);
|
||||||
|
|
||||||
|
for (const prediction of predictions) {
|
||||||
|
if (prediction.probability >= 0.1) {
|
||||||
|
tags.push(...prediction.className.split(',').map((e) => e.trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tf.dispose(decodedImage);
|
||||||
|
return tags;
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.log('Error reading file ', e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
import { NestFactory } from '@nestjs/core';
|
||||||
|
import { AppModule } from './app.module';
|
||||||
|
import { Logger } from '@nestjs/common';
|
||||||
|
|
||||||
|
async function bootstrap() {
|
||||||
|
const app = await NestFactory.create(AppModule);
|
||||||
|
|
||||||
|
await app.listen(3001, () => {
|
||||||
|
if (process.env.NODE_ENV == 'development') {
|
||||||
|
Logger.log(
|
||||||
|
'Running Immich Machine Learning in DEVELOPMENT environment',
|
||||||
|
'IMMICH MICROSERVICES',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (process.env.NODE_ENV == 'production') {
|
||||||
|
Logger.log(
|
||||||
|
'Running Immich Machine Learning in PRODUCTION environment',
|
||||||
|
'IMMICH MICROSERVICES',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
bootstrap();
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
import { Body, Controller, Post } from '@nestjs/common';
|
||||||
|
import { ObjectDetectionService } from './object-detection.service';
|
||||||
|
import { Logger } from '@nestjs/common';
|
||||||
|
|
||||||
|
@Controller('object-detection')
|
||||||
|
export class ObjectDetectionController {
|
||||||
|
constructor(
|
||||||
|
private readonly objectDetectionService: ObjectDetectionService,
|
||||||
|
) { }
|
||||||
|
|
||||||
|
@Post('/detect-object')
|
||||||
|
async detectObject(@Body('thumbnailPath') thumbnailPath: string) {
|
||||||
|
return await this.objectDetectionService.detectObject(thumbnailPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
import { Module } from '@nestjs/common';
|
||||||
|
import { ObjectDetectionService } from './object-detection.service';
|
||||||
|
import { ObjectDetectionController } from './object-detection.controller';
|
||||||
|
|
||||||
|
@Module({
|
||||||
|
controllers: [ObjectDetectionController],
|
||||||
|
providers: [ObjectDetectionService],
|
||||||
|
})
|
||||||
|
export class ObjectDetectionModule {}
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
import { Injectable, Logger } from '@nestjs/common';
|
||||||
|
import * as cocoSsd from '@tensorflow-models/coco-ssd';
|
||||||
|
import * as tf from '@tensorflow/tfjs-node';
|
||||||
|
import * as fs from 'fs';
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class ObjectDetectionService {
|
||||||
|
private cocoSsdModel: cocoSsd.ObjectDetection;
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
Logger.log(
|
||||||
|
`Running Node TensorFlow Version : ${tf.version['tfjs']}`,
|
||||||
|
'ObjectDetection',
|
||||||
|
);
|
||||||
|
cocoSsd.load().then((model) => (this.cocoSsdModel = model));
|
||||||
|
}
|
||||||
|
async detectObject(thumbnailPath: string) {
|
||||||
|
try {
|
||||||
|
const isExist = fs.existsSync(thumbnailPath);
|
||||||
|
if (isExist) {
|
||||||
|
const tags = new Set();
|
||||||
|
const image = fs.readFileSync(thumbnailPath);
|
||||||
|
const decodedImage = tf.node.decodeImage(image, 3) as tf.Tensor3D;
|
||||||
|
const predictions = await this.cocoSsdModel.detect(decodedImage);
|
||||||
|
|
||||||
|
for (const result of predictions) {
|
||||||
|
if (result.score > 0.5) {
|
||||||
|
tags.add(result.class);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tf.dispose(decodedImage);
|
||||||
|
return [...tags];
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.log('Error reading file ', e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"extends": "./tsconfig.json",
|
||||||
|
"exclude": ["node_modules", "test", "dist", "**/*spec.ts"]
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"module": "commonjs",
|
||||||
|
"declaration": true,
|
||||||
|
"removeComments": true,
|
||||||
|
"emitDecoratorMetadata": true,
|
||||||
|
"experimentalDecorators": true,
|
||||||
|
"allowSyntheticDefaultImports": true,
|
||||||
|
"target": "es2017",
|
||||||
|
"sourceMap": true,
|
||||||
|
"outDir": "./dist",
|
||||||
|
"baseUrl": "./",
|
||||||
|
"incremental": true,
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"strictNullChecks": false,
|
||||||
|
"noImplicitAny": false,
|
||||||
|
"strictBindCallApply": false,
|
||||||
|
"forceConsistentCasingInFileNames": false,
|
||||||
|
"noFallthroughCasesInSwitch": false
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
# Miscellaneous
|
||||||
|
*.class
|
||||||
|
*.log
|
||||||
|
*.pyc
|
||||||
|
*.swp
|
||||||
|
.DS_Store
|
||||||
|
.atom/
|
||||||
|
.buildlog/
|
||||||
|
.history
|
||||||
|
.svn/
|
||||||
|
*.ipa
|
||||||
|
*.zip
|
||||||
|
|
||||||
|
# IntelliJ related
|
||||||
|
*.iml
|
||||||
|
*.ipr
|
||||||
|
*.iws
|
||||||
|
.idea/
|
||||||
|
|
||||||
|
# The .vscode folder contains launch configuration and tasks you configure in
|
||||||
|
# VS Code which you may wish to be included in version control, so this line
|
||||||
|
# is commented out by default.
|
||||||
|
#.vscode/
|
||||||
|
|
||||||
|
# Flutter/Dart/Pub related
|
||||||
|
**/doc/api/
|
||||||
|
**/ios/Flutter/.last_build_id
|
||||||
|
.dart_tool/
|
||||||
|
.flutter-plugins
|
||||||
|
.flutter-plugins-dependencies
|
||||||
|
.packages
|
||||||
|
.pub-cache/
|
||||||
|
.pub/
|
||||||
|
/build/
|
||||||
|
|
||||||
|
# Web related
|
||||||
|
lib/generated_plugin_registrant.dart
|
||||||
|
|
||||||
|
# Symbolication related
|
||||||
|
app.*.symbols
|
||||||
|
|
||||||
|
# Obfuscation related
|
||||||
|
app.*.map.json
|
||||||
|
|
||||||
|
# Android Studio will place build artifacts here
|
||||||
|
/android/app/debug
|
||||||
|
/android/app/profile
|
||||||
|
/android/app/release
|
||||||
|
|
||||||
|
# Fastlane
|
||||||
|
ios/fastlane/report.xml
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
# This file tracks properties of this Flutter project.
|
||||||
|
# Used by Flutter tool to assess capabilities and perform upgrades etc.
|
||||||
|
#
|
||||||
|
# This file should be version controlled.
|
||||||
|
|
||||||
|
version:
|
||||||
|
revision: cd41fdd495f6944ecd3506c21e94c6567b073278
|
||||||
|
channel: stable
|
||||||
|
|
||||||
|
project_type: app
|
||||||
|
|
||||||
|
# Tracks metadata for the flutter migrate command
|
||||||
|
migration:
|
||||||
|
platforms:
|
||||||
|
- platform: root
|
||||||
|
create_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
|
||||||
|
base_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
|
||||||
|
- platform: android
|
||||||
|
create_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
|
||||||
|
base_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
|
||||||
|
- platform: ios
|
||||||
|
create_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
|
||||||
|
base_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
|
||||||
|
- platform: linux
|
||||||
|
create_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
|
||||||
|
base_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
|
||||||
|
- platform: macos
|
||||||
|
create_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
|
||||||
|
base_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
|
||||||
|
- platform: web
|
||||||
|
create_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
|
||||||
|
base_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
|
||||||
|
- platform: windows
|
||||||
|
create_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
|
||||||
|
base_revision: cd41fdd495f6944ecd3506c21e94c6567b073278
|
||||||
|
|
||||||
|
# User provided section
|
||||||
|
|
||||||
|
# List of Local paths (relative to this file) that should be
|
||||||
|
# ignored by the migrate tool.
|
||||||
|
#
|
||||||
|
# Files that are not part of the templates will be ignored by default.
|
||||||
|
unmanaged_files:
|
||||||
|
- 'lib/main.dart'
|
||||||
|
- 'ios/Runner.xcodeproj/project.pbxproj'
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
# Immich Mobile Application - Flutter
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
# This file configures the analyzer, which statically analyzes Dart code to
|
||||||
|
# check for errors, warnings, and lints.
|
||||||
|
#
|
||||||
|
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
|
||||||
|
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
|
||||||
|
# invoked from the command line by running `flutter analyze`.
|
||||||
|
|
||||||
|
# The following line activates a set of recommended lints for Flutter apps,
|
||||||
|
# packages, and plugins designed to encourage good coding practices.
|
||||||
|
include: package:flutter_lints/flutter.yaml
|
||||||
|
|
||||||
|
linter:
|
||||||
|
# The lint rules applied to this project can be customized in the
|
||||||
|
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
|
||||||
|
# included above or to enable additional rules. A list of all available lints
|
||||||
|
# and their documentation is published at
|
||||||
|
# https://dart-lang.github.io/linter/lints/index.html.
|
||||||
|
#
|
||||||
|
# Instead of disabling a lint rule for the entire project in the
|
||||||
|
# section below, it can also be suppressed for a single line of code
|
||||||
|
# or a specific dart file by using the `// ignore: name_of_lint` and
|
||||||
|
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
|
||||||
|
# producing the lint.
|
||||||
|
rules:
|
||||||
|
# avoid_print: false # Uncomment to disable the `avoid_print` rule
|
||||||
|
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
|
||||||
|
use_build_context_synchronously: false
|
||||||
|
|
||||||
|
# Additional information about this file can be found at
|
||||||
|
# https://dart.dev/guides/language/analysis-options
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
gradle-wrapper.jar
|
||||||
|
/.gradle
|
||||||
|
/captures/
|
||||||
|
/gradlew
|
||||||
|
/gradlew.bat
|
||||||
|
/local.properties
|
||||||
|
GeneratedPluginRegistrant.java
|
||||||
|
|
||||||
|
# Remember to never publicly share your keystore.
|
||||||
|
# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
|
||||||
|
key.properties
|
||||||
|
**/*.keystore
|
||||||
|
**/*.jks
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
source "https://rubygems.org"
|
||||||
|
|
||||||
|
gem "fastlane"
|
||||||
@@ -0,0 +1,218 @@
|
|||||||
|
GEM
|
||||||
|
remote: https://rubygems.org/
|
||||||
|
specs:
|
||||||
|
CFPropertyList (3.0.5)
|
||||||
|
rexml
|
||||||
|
addressable (2.8.0)
|
||||||
|
public_suffix (>= 2.0.2, < 5.0)
|
||||||
|
artifactory (3.0.15)
|
||||||
|
atomos (0.1.3)
|
||||||
|
aws-eventstream (1.2.0)
|
||||||
|
aws-partitions (1.566.0)
|
||||||
|
aws-sdk-core (3.130.0)
|
||||||
|
aws-eventstream (~> 1, >= 1.0.2)
|
||||||
|
aws-partitions (~> 1, >= 1.525.0)
|
||||||
|
aws-sigv4 (~> 1.1)
|
||||||
|
jmespath (~> 1.0)
|
||||||
|
aws-sdk-kms (1.55.0)
|
||||||
|
aws-sdk-core (~> 3, >= 3.127.0)
|
||||||
|
aws-sigv4 (~> 1.1)
|
||||||
|
aws-sdk-s3 (1.113.0)
|
||||||
|
aws-sdk-core (~> 3, >= 3.127.0)
|
||||||
|
aws-sdk-kms (~> 1)
|
||||||
|
aws-sigv4 (~> 1.4)
|
||||||
|
aws-sigv4 (1.4.0)
|
||||||
|
aws-eventstream (~> 1, >= 1.0.2)
|
||||||
|
babosa (1.0.4)
|
||||||
|
claide (1.1.0)
|
||||||
|
colored (1.2)
|
||||||
|
colored2 (3.1.2)
|
||||||
|
commander (4.6.0)
|
||||||
|
highline (~> 2.0.0)
|
||||||
|
declarative (0.0.20)
|
||||||
|
digest-crc (0.6.4)
|
||||||
|
rake (>= 12.0.0, < 14.0.0)
|
||||||
|
domain_name (0.5.20190701)
|
||||||
|
unf (>= 0.0.5, < 1.0.0)
|
||||||
|
dotenv (2.7.6)
|
||||||
|
emoji_regex (3.2.3)
|
||||||
|
excon (0.92.0)
|
||||||
|
faraday (1.10.0)
|
||||||
|
faraday-em_http (~> 1.0)
|
||||||
|
faraday-em_synchrony (~> 1.0)
|
||||||
|
faraday-excon (~> 1.1)
|
||||||
|
faraday-httpclient (~> 1.0)
|
||||||
|
faraday-multipart (~> 1.0)
|
||||||
|
faraday-net_http (~> 1.0)
|
||||||
|
faraday-net_http_persistent (~> 1.0)
|
||||||
|
faraday-patron (~> 1.0)
|
||||||
|
faraday-rack (~> 1.0)
|
||||||
|
faraday-retry (~> 1.0)
|
||||||
|
ruby2_keywords (>= 0.0.4)
|
||||||
|
faraday-cookie_jar (0.0.7)
|
||||||
|
faraday (>= 0.8.0)
|
||||||
|
http-cookie (~> 1.0.0)
|
||||||
|
faraday-em_http (1.0.0)
|
||||||
|
faraday-em_synchrony (1.0.0)
|
||||||
|
faraday-excon (1.1.0)
|
||||||
|
faraday-httpclient (1.0.1)
|
||||||
|
faraday-multipart (1.0.3)
|
||||||
|
multipart-post (>= 1.2, < 3)
|
||||||
|
faraday-net_http (1.0.1)
|
||||||
|
faraday-net_http_persistent (1.2.0)
|
||||||
|
faraday-patron (1.0.0)
|
||||||
|
faraday-rack (1.0.0)
|
||||||
|
faraday-retry (1.0.3)
|
||||||
|
faraday_middleware (1.2.0)
|
||||||
|
faraday (~> 1.0)
|
||||||
|
fastimage (2.2.6)
|
||||||
|
fastlane (2.204.3)
|
||||||
|
CFPropertyList (>= 2.3, < 4.0.0)
|
||||||
|
addressable (>= 2.8, < 3.0.0)
|
||||||
|
artifactory (~> 3.0)
|
||||||
|
aws-sdk-s3 (~> 1.0)
|
||||||
|
babosa (>= 1.0.3, < 2.0.0)
|
||||||
|
bundler (>= 1.12.0, < 3.0.0)
|
||||||
|
colored
|
||||||
|
commander (~> 4.6)
|
||||||
|
dotenv (>= 2.1.1, < 3.0.0)
|
||||||
|
emoji_regex (>= 0.1, < 4.0)
|
||||||
|
excon (>= 0.71.0, < 1.0.0)
|
||||||
|
faraday (~> 1.0)
|
||||||
|
faraday-cookie_jar (~> 0.0.6)
|
||||||
|
faraday_middleware (~> 1.0)
|
||||||
|
fastimage (>= 2.1.0, < 3.0.0)
|
||||||
|
gh_inspector (>= 1.1.2, < 2.0.0)
|
||||||
|
google-apis-androidpublisher_v3 (~> 0.3)
|
||||||
|
google-apis-playcustomapp_v1 (~> 0.1)
|
||||||
|
google-cloud-storage (~> 1.31)
|
||||||
|
highline (~> 2.0)
|
||||||
|
json (< 3.0.0)
|
||||||
|
jwt (>= 2.1.0, < 3)
|
||||||
|
mini_magick (>= 4.9.4, < 5.0.0)
|
||||||
|
multipart-post (~> 2.0.0)
|
||||||
|
naturally (~> 2.2)
|
||||||
|
optparse (~> 0.1.1)
|
||||||
|
plist (>= 3.1.0, < 4.0.0)
|
||||||
|
rubyzip (>= 2.0.0, < 3.0.0)
|
||||||
|
security (= 0.1.3)
|
||||||
|
simctl (~> 1.6.3)
|
||||||
|
terminal-notifier (>= 2.0.0, < 3.0.0)
|
||||||
|
terminal-table (>= 1.4.5, < 2.0.0)
|
||||||
|
tty-screen (>= 0.6.3, < 1.0.0)
|
||||||
|
tty-spinner (>= 0.8.0, < 1.0.0)
|
||||||
|
word_wrap (~> 1.0.0)
|
||||||
|
xcodeproj (>= 1.13.0, < 2.0.0)
|
||||||
|
xcpretty (~> 0.3.0)
|
||||||
|
xcpretty-travis-formatter (>= 0.0.3)
|
||||||
|
gh_inspector (1.1.3)
|
||||||
|
google-apis-androidpublisher_v3 (0.16.0)
|
||||||
|
google-apis-core (>= 0.4, < 2.a)
|
||||||
|
google-apis-core (0.4.2)
|
||||||
|
addressable (~> 2.5, >= 2.5.1)
|
||||||
|
googleauth (>= 0.16.2, < 2.a)
|
||||||
|
httpclient (>= 2.8.1, < 3.a)
|
||||||
|
mini_mime (~> 1.0)
|
||||||
|
representable (~> 3.0)
|
||||||
|
retriable (>= 2.0, < 4.a)
|
||||||
|
rexml
|
||||||
|
webrick
|
||||||
|
google-apis-iamcredentials_v1 (0.10.0)
|
||||||
|
google-apis-core (>= 0.4, < 2.a)
|
||||||
|
google-apis-playcustomapp_v1 (0.7.0)
|
||||||
|
google-apis-core (>= 0.4, < 2.a)
|
||||||
|
google-apis-storage_v1 (0.11.0)
|
||||||
|
google-apis-core (>= 0.4, < 2.a)
|
||||||
|
google-cloud-core (1.6.0)
|
||||||
|
google-cloud-env (~> 1.0)
|
||||||
|
google-cloud-errors (~> 1.0)
|
||||||
|
google-cloud-env (1.5.0)
|
||||||
|
faraday (>= 0.17.3, < 2.0)
|
||||||
|
google-cloud-errors (1.2.0)
|
||||||
|
google-cloud-storage (1.36.1)
|
||||||
|
addressable (~> 2.8)
|
||||||
|
digest-crc (~> 0.4)
|
||||||
|
google-apis-iamcredentials_v1 (~> 0.1)
|
||||||
|
google-apis-storage_v1 (~> 0.1)
|
||||||
|
google-cloud-core (~> 1.6)
|
||||||
|
googleauth (>= 0.16.2, < 2.a)
|
||||||
|
mini_mime (~> 1.0)
|
||||||
|
googleauth (1.1.2)
|
||||||
|
faraday (>= 0.17.3, < 3.a)
|
||||||
|
jwt (>= 1.4, < 3.0)
|
||||||
|
memoist (~> 0.16)
|
||||||
|
multi_json (~> 1.11)
|
||||||
|
os (>= 0.9, < 2.0)
|
||||||
|
signet (>= 0.16, < 2.a)
|
||||||
|
highline (2.0.3)
|
||||||
|
http-cookie (1.0.4)
|
||||||
|
domain_name (~> 0.5)
|
||||||
|
httpclient (2.8.3)
|
||||||
|
jmespath (1.6.1)
|
||||||
|
json (2.6.1)
|
||||||
|
jwt (2.3.0)
|
||||||
|
memoist (0.16.2)
|
||||||
|
mini_magick (4.11.0)
|
||||||
|
mini_mime (1.1.2)
|
||||||
|
multi_json (1.15.0)
|
||||||
|
multipart-post (2.0.0)
|
||||||
|
nanaimo (0.3.0)
|
||||||
|
naturally (2.2.1)
|
||||||
|
optparse (0.1.1)
|
||||||
|
os (1.1.4)
|
||||||
|
plist (3.6.0)
|
||||||
|
public_suffix (4.0.6)
|
||||||
|
rake (13.0.6)
|
||||||
|
representable (3.1.1)
|
||||||
|
declarative (< 0.1.0)
|
||||||
|
trailblazer-option (>= 0.1.1, < 0.2.0)
|
||||||
|
uber (< 0.2.0)
|
||||||
|
retriable (3.1.2)
|
||||||
|
rexml (3.2.5)
|
||||||
|
rouge (2.0.7)
|
||||||
|
ruby2_keywords (0.0.5)
|
||||||
|
rubyzip (2.3.2)
|
||||||
|
security (0.1.3)
|
||||||
|
signet (0.16.1)
|
||||||
|
addressable (~> 2.8)
|
||||||
|
faraday (>= 0.17.5, < 3.0)
|
||||||
|
jwt (>= 1.5, < 3.0)
|
||||||
|
multi_json (~> 1.10)
|
||||||
|
simctl (1.6.8)
|
||||||
|
CFPropertyList
|
||||||
|
naturally
|
||||||
|
terminal-notifier (2.0.0)
|
||||||
|
terminal-table (1.8.0)
|
||||||
|
unicode-display_width (~> 1.1, >= 1.1.1)
|
||||||
|
trailblazer-option (0.1.2)
|
||||||
|
tty-cursor (0.7.1)
|
||||||
|
tty-screen (0.8.1)
|
||||||
|
tty-spinner (0.9.3)
|
||||||
|
tty-cursor (~> 0.7)
|
||||||
|
uber (0.1.0)
|
||||||
|
unf (0.1.4)
|
||||||
|
unf_ext
|
||||||
|
unf_ext (0.0.8.1)
|
||||||
|
unicode-display_width (1.8.0)
|
||||||
|
webrick (1.7.0)
|
||||||
|
word_wrap (1.0.0)
|
||||||
|
xcodeproj (1.21.0)
|
||||||
|
CFPropertyList (>= 2.3.3, < 4.0)
|
||||||
|
atomos (~> 0.1.3)
|
||||||
|
claide (>= 1.0.2, < 2.0)
|
||||||
|
colored2 (~> 3.1)
|
||||||
|
nanaimo (~> 0.3.0)
|
||||||
|
rexml (~> 3.2.4)
|
||||||
|
xcpretty (0.3.0)
|
||||||
|
rouge (~> 2.0.7)
|
||||||
|
xcpretty-travis-formatter (1.0.1)
|
||||||
|
xcpretty (~> 0.2, >= 0.0.7)
|
||||||
|
|
||||||
|
PLATFORMS
|
||||||
|
x86_64-darwin-21
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
fastlane
|
||||||
|
|
||||||
|
BUNDLED WITH
|
||||||
|
2.3.7
|
||||||