chore: use pnpm instead of npm

This commit is contained in:
Min Idzelis 2025-07-05 14:49:22 +00:00
parent 733de34f0a
commit 0c63b9f358
36 changed files with 25759 additions and 62403 deletions

View File

@ -10,8 +10,9 @@ cd "${IMMICH_WORKSPACE}/server" || (
exit 1 exit 1
) )
CI=1 pnpm install
while true; do while true; do
run_cmd node ./node_modules/.bin/nest start --debug "0.0.0.0:9230" --watch run_cmd pnpm exec nest start --debug "0.0.0.0:9230" --watch
log "Nest API Server crashed with exit code $?. Respawning in 3s ..." log "Nest API Server crashed with exit code $?. Respawning in 3s ..."
sleep 3 sleep 3
done done

View File

@ -16,7 +16,7 @@ until curl --output /dev/null --silent --head --fail "http://127.0.0.1:${IMMICH_
done done
while true; do while true; do
run_cmd node ./node_modules/.bin/vite dev --host 0.0.0.0 --port "${DEV_PORT}" run_cmd pnpm exec vite dev --host 0.0.0.0 --port "${DEV_PORT}"
log "Web crashed with exit code $?. Respawning in 3s ..." log "Web crashed with exit code $?. Respawning in 3s ..."
sleep 3 sleep 3
done done

28
.github/package-lock.json generated vendored
View File

@ -1,28 +0,0 @@
{
"name": ".github",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"devDependencies": {
"prettier": "^3.5.3"
}
},
"node_modules/prettier": {
"version": "3.6.1",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.1.tgz",
"integrity": "sha512-5xGWRa90Sp2+x1dQtNpIpeOQpTDBs9cZDmA/qs2vDNN2i18PdapqY7CmBeyLlMuGqXJRIOPaCaVZTLNQRWUH/A==",
"dev": true,
"license": "MIT",
"bin": {
"prettier": "bin/prettier.cjs"
},
"engines": {
"node": ">=14"
},
"funding": {
"url": "https://github.com/prettier/prettier?sponsor=1"
}
}
}
}

View File

@ -33,21 +33,24 @@ jobs:
with: with:
persist-credentials: false persist-credentials: false
# Setup .npmrc file to publish to npm - name: Setup pnpm
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
with:
node-version-file: './cli/.nvmrc'
registry-url: 'https://registry.npmjs.org'
cache: 'npm'
cache-dependency-path: '**/package-lock.json'
- name: Prepare SDK - name: Setup Node
run: npm ci --prefix ../open-api/typescript-sdk/ uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
- name: Build SDK with:
run: npm run build --prefix ../open-api/typescript-sdk/ node-version-file: './server/.nvmrc'
- run: npm ci registry-url: 'https://registry.npmjs.org'
- run: npm run build cache: 'pnpm'
- run: npm publish cache-dependency-path: '**/pnpm-lock.yaml'
- name: Setup typescript-sdk
run: pnpm install && pnpm run build
working-directory: ./open-api/typescript-sdk
- run: pnpm install --frozen-lockfile
- run: pnpm build
- run: pnpm publish
if: ${{ github.event_name == 'release' }} if: ${{ github.event_name == 'release' }}
env: env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

View File

@ -53,21 +53,24 @@ jobs:
with: with:
persist-credentials: false persist-credentials: false
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name: Setup Node - name: Setup Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with: with:
node-version-file: './docs/.nvmrc' node-version-file: './cli/.nvmrc'
cache: 'npm' cache: 'pnpm'
cache-dependency-path: '**/package-lock.json' cache-dependency-path: '**/pnpm-lock.yaml'
- name: Run npm install - name: Run install
run: npm ci run: pnpm install
- name: Check formatting - name: Check formatting
run: npm run format run: pnpm format
- name: Run build - name: Run build
run: npm run build run: pnpm build
- name: Upload build output - name: Upload build output
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2

View File

@ -33,7 +33,7 @@ jobs:
with: with:
node-version-file: './server/.nvmrc' node-version-file: './server/.nvmrc'
cache: 'npm' cache: 'npm'
cache-dependency-path: '**/package-lock.json' cache-dependency-path: '**/pnpm-lock.yaml'
- name: Fix formatting - name: Fix formatting
run: make install-all && make format-all run: make install-all && make format-all

View File

@ -20,18 +20,21 @@ jobs:
with: with:
persist-credentials: false persist-credentials: false
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
# Setup .npmrc file to publish to npm # Setup .npmrc file to publish to npm
- uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with: with:
node-version-file: './open-api/typescript-sdk/.nvmrc' node-version-file: './open-api/typescript-sdk/.nvmrc'
registry-url: 'https://registry.npmjs.org' registry-url: 'https://registry.npmjs.org'
cache: 'npm' cache: 'pnpm'
cache-dependency-path: '**/package-lock.json' cache-dependency-path: '**/pnpm-lock.yaml'
- name: Install deps - name: Install deps
run: npm ci run: pnpm install --frozen-lockfile
- name: Build - name: Build
run: npm run build run: pnpm build
- name: Publish - name: Publish
run: npm publish run: pnpm publish
env: env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

View File

@ -80,30 +80,33 @@ jobs:
with: with:
persist-credentials: false persist-credentials: false
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name: Setup Node - name: Setup Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with: with:
node-version-file: './server/.nvmrc' node-version-file: './server/.nvmrc'
cache: 'npm' cache: 'pnpm'
cache-dependency-path: '**/package-lock.json' cache-dependency-path: '**/pnpm-lock.yaml'
- name: Run npm install - name: Run package manager install
run: npm ci run: pnpm install
- name: Run linter - name: Run linter
run: npm run lint run: pnpm lint
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
- name: Run formatter - name: Run formatter
run: npm run format run: pnpm format
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
- name: Run tsc - name: Run tsc
run: npm run check run: pnpm check
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
- name: Run small tests & coverage - name: Run small tests & coverage
run: npm test run: pnpm test
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
cli-unit-tests: cli-unit-tests:
@ -123,34 +126,37 @@ jobs:
with: with:
persist-credentials: false persist-credentials: false
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name: Setup Node - name: Setup Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with: with:
node-version-file: './cli/.nvmrc' node-version-file: './server/.nvmrc'
cache: 'npm' cache: 'pnpm'
cache-dependency-path: '**/package-lock.json' cache-dependency-path: '**/pnpm-lock.yaml'
- name: Setup typescript-sdk - name: Setup typescript-sdk
run: npm ci && npm run build run: pnpm install && pnpm run build
working-directory: ./open-api/typescript-sdk working-directory: ./open-api/typescript-sdk
- name: Install deps - name: Install deps
run: npm ci run: pnpm install
- name: Run linter - name: Run linter
run: npm run lint run: pnpm lint
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
- name: Run formatter - name: Run formatter
run: npm run format run: pnpm format
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
- name: Run tsc - name: Run tsc
run: npm run check run: pnpm check
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
- name: Run unit tests & coverage - name: Run unit tests & coverage
run: npm run test run: pnpm test
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
cli-unit-tests-win: cli-unit-tests-win:
@ -170,27 +176,30 @@ jobs:
with: with:
persist-credentials: false persist-credentials: false
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name: Setup Node - name: Setup Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with: with:
node-version-file: './cli/.nvmrc' node-version-file: './server/.nvmrc'
cache: 'npm' cache: 'pnpm'
cache-dependency-path: '**/package-lock.json' cache-dependency-path: '**/pnpm-lock.yaml'
- name: Setup typescript-sdk - name: Setup typescript-sdk
run: npm ci && npm run build run: pnpm install --frozen-lockfile && pnpm build
working-directory: ./open-api/typescript-sdk working-directory: ./open-api/typescript-sdk
- name: Install deps - name: Install deps
run: npm ci run: pnpm install --frozen-lockfile
# Skip linter & formatter in Windows test. # Skip linter & formatter in Windows test.
- name: Run tsc - name: Run tsc
run: npm run check run: pnpm check
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
- name: Run unit tests & coverage - name: Run unit tests & coverage
run: npm run test run: pnpm test
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
web-lint: web-lint:
@ -210,30 +219,33 @@ jobs:
with: with:
persist-credentials: false persist-credentials: false
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name: Setup Node - name: Setup Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with: with:
node-version-file: './web/.nvmrc' node-version-file: './server/.nvmrc'
cache: 'npm' cache: 'pnpm'
cache-dependency-path: '**/package-lock.json' cache-dependency-path: '**/pnpm-lock.yaml'
- name: Run setup typescript-sdk - name: Run setup typescript-sdk
run: npm ci && npm run build run: pnpm install --frozen-lockfile && pnpm build
working-directory: ./open-api/typescript-sdk working-directory: ./open-api/typescript-sdk
- name: Run npm install - name: Run npm install
run: npm ci run: pnpm rebuild && pnpm install --frozen-lockfile
- name: Run linter - name: Run linter
run: npm run lint:p run: pnpm lint:p
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
- name: Run formatter - name: Run formatter
run: npm run format run: pnpm format
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
- name: Run svelte checks - name: Run svelte checks
run: npm run check:svelte run: pnpm check:svelte
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
web-unit-tests: web-unit-tests:
@ -253,26 +265,29 @@ jobs:
with: with:
persist-credentials: false persist-credentials: false
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name: Setup Node - name: Setup Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with: with:
node-version-file: './web/.nvmrc' node-version-file: './server/.nvmrc'
cache: 'npm' cache: 'pnpm'
cache-dependency-path: '**/package-lock.json' cache-dependency-path: '**/pnpm-lock.yaml'
- name: Run setup typescript-sdk - name: Run setup typescript-sdk
run: npm ci && npm run build run: pnpm install --frozen-lockfile && pnpm build
working-directory: ./open-api/typescript-sdk working-directory: ./open-api/typescript-sdk
- name: Run npm install - name: Run npm install
run: npm ci run: pnpm install --frozen-lockfile
- name: Run tsc - name: Run tsc
run: npm run check:typescript run: pnpm check:typescript
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
- name: Run unit tests & coverage - name: Run unit tests & coverage
run: npm run test run: pnpm test
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
i18n-tests: i18n-tests:
@ -288,18 +303,21 @@ jobs:
with: with:
persist-credentials: false persist-credentials: false
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name: Setup Node - name: Setup Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with: with:
node-version-file: './web/.nvmrc' node-version-file: './server/.nvmrc'
cache: 'npm' cache: 'pnpm'
cache-dependency-path: '**/package-lock.json' cache-dependency-path: '**/pnpm-lock.yaml'
- name: Install dependencies - name: Install dependencies
run: npm --prefix=web ci run: pnpm --filter=immich-web install --frozen-lockfile
- name: Format - name: Format
run: npm --prefix=web run format:i18n run: pnpm --filter=immich-web format:i18n
- name: Find file changes - name: Find file changes
uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4 uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4
@ -334,32 +352,35 @@ jobs:
with: with:
persist-credentials: false persist-credentials: false
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name: Setup Node - name: Setup Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with: with:
node-version-file: './e2e/.nvmrc' node-version-file: './server/.nvmrc'
cache: 'npm' cache: 'pnpm'
cache-dependency-path: '**/package-lock.json' cache-dependency-path: '**/pnpm-lock.yaml'
- name: Run setup typescript-sdk - name: Run setup typescript-sdk
run: npm ci && npm run build run: pnpm install --frozen-lockfile && pnpm build
working-directory: ./open-api/typescript-sdk working-directory: ./open-api/typescript-sdk
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
- name: Install dependencies - name: Install dependencies
run: npm ci run: pnpm install --frozen-lockfile
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
- name: Run linter - name: Run linter
run: npm run lint run: pnpm lint
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
- name: Run formatter - name: Run formatter
run: npm run format run: pnpm format
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
- name: Run tsc - name: Run tsc
run: npm run check run: pnpm check
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
server-medium-tests: server-medium-tests:
@ -379,18 +400,21 @@ jobs:
with: with:
persist-credentials: false persist-credentials: false
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name: Setup Node - name: Setup Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with: with:
node-version-file: './server/.nvmrc' node-version-file: './server/.nvmrc'
cache: 'npm' cache: 'pnpm'
cache-dependency-path: '**/package-lock.json' cache-dependency-path: '**/pnpm-lock.yaml'
- name: Run npm install - name: Run npm install
run: npm ci run: pnpm install --frozen-lockfile
- name: Run medium tests - name: Run medium tests
run: npm run test:medium run: pnpm test:medium
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
e2e-tests-server-cli: e2e-tests-server-cli:
@ -414,25 +438,33 @@ jobs:
persist-credentials: false persist-credentials: false
submodules: 'recursive' submodules: 'recursive'
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name: Setup Node - name: Setup Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with: with:
node-version-file: './e2e/.nvmrc' node-version-file: './server/.nvmrc'
cache: 'npm' cache: 'pnpm'
cache-dependency-path: '**/package-lock.json' cache-dependency-path: '**/pnpm-lock.yaml'
- name: Run setup typescript-sdk - name: Run setup typescript-sdk
run: npm ci && npm run build run: pnpm install --frozen-lockfile && pnpm build
working-directory: ./open-api/typescript-sdk working-directory: ./open-api/typescript-sdk
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
- name: Run setup web
run: pnpm install --frozen-lockfile && pnpm exec svelte-kit sync
working-directory: ./web
if: ${{ !cancelled() }}
- name: Run setup cli - name: Run setup cli
run: npm ci && npm run build run: pnpm install --frozen-lockfile && pnpm build
working-directory: ./cli working-directory: ./cli
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
- name: Install dependencies - name: Install dependencies
run: npm ci run: pnpm install --frozen-lockfile
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
- name: Docker build - name: Docker build
@ -440,7 +472,7 @@ jobs:
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
- name: Run e2e tests (api & cli) - name: Run e2e tests (api & cli)
run: npm run test run: pnpm test
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
e2e-tests-web: e2e-tests-web:
@ -464,20 +496,23 @@ jobs:
persist-credentials: false persist-credentials: false
submodules: 'recursive' submodules: 'recursive'
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name: Setup Node - name: Setup Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with: with:
node-version-file: './e2e/.nvmrc' node-version-file: './server/.nvmrc'
cache: 'npm' cache: 'pnpm'
cache-dependency-path: '**/package-lock.json' cache-dependency-path: '**/pnpm-lock.yaml'
- name: Run setup typescript-sdk - name: Run setup typescript-sdk
run: npm ci && npm run build run: pnpm install --frozen-lockfile && pnpm build
working-directory: ./open-api/typescript-sdk working-directory: ./open-api/typescript-sdk
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
- name: Install dependencies - name: Install dependencies
run: npm ci run: pnpm install --frozen-lockfile
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
- name: Install Playwright Browsers - name: Install Playwright Browsers
@ -584,18 +619,21 @@ jobs:
with: with:
persist-credentials: false persist-credentials: false
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name: Setup Node - name: Setup Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with: with:
node-version-file: './.github/.nvmrc' node-version-file: './server/.nvmrc'
cache: 'npm' cache: 'pnpm'
cache-dependency-path: '**/package-lock.json' cache-dependency-path: '**/pnpm-lock.yaml'
- name: Run npm install - name: Run npm install
run: npm ci run: pnpm install --frozen-lockfile
- name: Run formatter - name: Run formatter
run: npm run format run: pnpm format
if: ${{ !cancelled() }} if: ${{ !cancelled() }}
shellcheck: shellcheck:
@ -627,18 +665,21 @@ jobs:
with: with:
persist-credentials: false persist-credentials: false
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name: Setup Node - name: Setup Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with: with:
node-version-file: './server/.nvmrc' node-version-file: './server/.nvmrc'
cache: 'npm' cache: 'pnpm'
cache-dependency-path: '**/package-lock.json' cache-dependency-path: '**/pnpm-lock.yaml'
- name: Install server dependencies - name: Install server dependencies
run: npm --prefix=server ci run: pnpm --filter immich install --frozen-lockfile
- name: Build the app - name: Build the app
run: npm --prefix=server run build run: pnpm --filter immich build
- name: Run API generation - name: Run API generation
run: make open-api run: make open-api
@ -690,28 +731,31 @@ jobs:
with: with:
persist-credentials: false persist-credentials: false
- name: Setup pnpm
uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4.1.0
- name: Setup Node - name: Setup Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0 uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with: with:
node-version-file: './server/.nvmrc' node-version-file: './server/.nvmrc'
cache: 'npm' cache: 'pnpm'
cache-dependency-path: '**/package-lock.json' cache-dependency-path: '**/pnpm-lock.yaml'
- name: Install server dependencies - name: Install server dependencies
run: npm ci run: pnpm install --frozen-lockfile
- name: Build the app - name: Build the app
run: npm run build run: pnpm build
- name: Run existing migrations - name: Run existing migrations
run: npm run migrations:run run: pnpm migrations:run
- name: Test npm run schema:reset command works - name: Test npm run schema:reset command works
run: npm run schema:reset run: pnpm schema:reset
- name: Generate new migrations - name: Generate new migrations
continue-on-error: true continue-on-error: true
run: npm run migrations:generate src/TestMigration run: pnpm migrations:generate src/TestMigration
- name: Find file changes - name: Find file changes
uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4 uses: tj-actions/verify-changed-files@a1c6acee9df209257a246f2cc6ae8cb6581c1edf # v20.0.4
@ -730,7 +774,7 @@ jobs:
exit 1 exit 1
- name: Run SQL generation - name: Run SQL generation
run: npm run sync:sql run: pnpm sync:sql
env: env:
DB_URL: postgres://postgres:postgres@localhost:5432/immich DB_URL: postgres://postgres:postgres@localhost:5432/immich

View File

@ -40,7 +40,7 @@ open-api-typescript:
cd ./open-api && bash ./bin/generate-open-api.sh typescript cd ./open-api && bash ./bin/generate-open-api.sh typescript
sql: sql:
npm --prefix server run sync:sql pnpm --filter immich run sync:sql
attach-server: attach-server:
docker exec -it docker_immich-server_1 sh docker exec -it docker_immich-server_1 sh
@ -50,31 +50,40 @@ renovate:
MODULES = e2e server web cli sdk docs .github MODULES = e2e server web cli sdk docs .github
# directory to package name mapping function
# cli = @immich/cli
# docs = documentation
# e2e = immich-e2e
# open-api/typescript-sdk = @immich/sdk
# server = immich
# web = immich-web
map-package = $(subst sdk,@immich/sdk,$(subst cli,@immich/cli,$(subst docs,documentation,$(subst e2e,immich-e2e,$(subst server,immich,$(subst web,immich-web,$1))))))
audit-%: audit-%:
npm --prefix $(subst sdk,open-api/typescript-sdk,$*) audit fix pnpm --filter $(call map-package,$*) audit fix
install-%: install-%:
npm --prefix $(subst sdk,open-api/typescript-sdk,$*) i pnpm --filter $(call map-package,$*) install $(if $(FROZEN),--frozen-lockfile) $(if $(OFFLINE),--offline)
ci-%:
npm --prefix $(subst sdk,open-api/typescript-sdk,$*) ci
build-cli: build-sdk build-cli: build-sdk
build-web: build-sdk build-web: build-sdk
build-%: install-% build-%: install-%
npm --prefix $(subst sdk,open-api/typescript-sdk,$*) run build pnpm --filter $(call map-package,$*) run build
format-%: format-%:
npm --prefix $* run format:fix pnpm --filter $(call map-package,$*) run format:fix
lint-%: lint-%:
npm --prefix $* run lint:fix pnpm --filter $(call map-package,$*) run lint:fix
lint-web:
pnpm --filter $(call map-package,$*) run lint:p
check-%: check-%:
npm --prefix $* run check pnpm --filter $(call map-package,$*) run check
check-web: check-web:
npm --prefix web run check:typescript pnpm --filter immich-web run check:typescript
npm --prefix web run check:svelte pnpm --filter immich-web run check:svelte
test-%: test-%:
npm --prefix $* run test pnpm --filter $(call map-package,$*) run test
test-e2e: test-e2e:
docker compose -f ./e2e/docker-compose.yml build docker compose -f ./e2e/docker-compose.yml build
npm --prefix e2e run test pnpm --filter immich-e2e run test
npm --prefix e2e run test:web pnpm --filter immich-e2e run test:web
test-medium: test-medium:
docker run \ docker run \
--rm \ --rm \
@ -84,19 +93,28 @@ test-medium:
-v ./server/tsconfig.json:/usr/src/app/tsconfig.json \ -v ./server/tsconfig.json:/usr/src/app/tsconfig.json \
-e NODE_ENV=development \ -e NODE_ENV=development \
immich-server:latest \ immich-server:latest \
-c "npm ci && npm run test:medium -- --run" -c "pnpm test:medium -- --run"
test-medium-dev: test-medium-dev:
docker exec -it immich_server /bin/sh -c "npm run test:medium" docker exec -it immich_server /bin/sh -c "pnpm run test:medium"
build-all: $(foreach M,$(filter-out e2e .github,$(MODULES)),build-$M) ; install-all:
install-all: $(foreach M,$(MODULES),install-$M) ; pnpm -r --filter '!documentation' install
ci-all: $(foreach M,$(filter-out .github,$(MODULES)),ci-$M) ;
check-all: $(foreach M,$(filter-out sdk cli docs .github,$(MODULES)),check-$M) ; build-all: $(foreach M,$(filter-out e2e docs .github,$(MODULES)),build-$M) ;
lint-all: $(foreach M,$(filter-out sdk docs .github,$(MODULES)),lint-$M) ;
format-all: $(foreach M,$(filter-out sdk,$(MODULES)),format-$M) ; check-all:
audit-all: $(foreach M,$(MODULES),audit-$M) ; pnpm -r --filter '!documentation' run "/^(check|check\:svelte|check\:typescript)$/"
hygiene-all: lint-all format-all check-all sql audit-all; lint-all:
test-all: $(foreach M,$(filter-out sdk docs .github,$(MODULES)),test-$M) ; pnpm -r --filter '!documentation' run lint:fix
format-all:
pnpm -r --filter '!documentation' run format:fix
audit-all:
pnpm -r --filter '!documentation' audit fix
hygiene-all: audit-all
pnpm -r --filter '!documentation' run "/(format:fix|check|check:svelte|check:typescript|sql)/"
test-all:
pnpm -r --filter '!documentation' run "/^test/"
clean: clean:
find . -name "node_modules" -type d -prune -exec rm -rf {} + find . -name "node_modules" -type d -prune -exec rm -rf {} +

View File

@ -6,8 +6,10 @@ Please see the [Immich CLI documentation](https://immich.app/docs/features/comma
Before building the CLI, you must build the immich server and the open-api client. To build the server run the following in the server folder: Before building the CLI, you must build the immich server and the open-api client. To build the server run the following in the server folder:
$ npm install # if you don't have node installed
$ npm run build $ npm install -g pnpm
$ pnpm install
$ pnpm build
Then, to build the open-api client run the following in the open-api folder: Then, to build the open-api client run the following in the open-api folder:
@ -15,8 +17,10 @@ Then, to build the open-api client run the following in the open-api folder:
To run the Immich CLI from source, run the following in the cli folder: To run the Immich CLI from source, run the following in the cli folder:
$ npm install # if you don't have node installed
$ npm run build $ npm install -g pnpm
$ pnpm install
$ pnpm build
$ ts-node . $ ts-node .
You'll need ts-node, the easiest way to install it is to use npm: You'll need ts-node, the easiest way to install it is to use npm:

4617
cli/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -27,14 +27,18 @@ services:
target: dev target: dev
restart: unless-stopped restart: unless-stopped
volumes: volumes:
- ../Makefile:/usr/src/app/Makefile
- ../package.json:/usr/src/app/package.json
- ../pnpm-lock.yaml:/usr/src/app/pnpm-lock.yaml
- ../pnpm-workspace.yaml:/usr/src/app/pnpm-workspace.yaml
- ../server:/usr/src/app/server - ../server:/usr/src/app/server
- ../open-api:/usr/src/app/open-api - ../open-api:/usr/src/app/open-api
- ${UPLOAD_LOCATION}/photos:/usr/src/app/server/upload - ${UPLOAD_LOCATION}/photos:/usr/src/app/server/upload
- ${UPLOAD_LOCATION}/photos/upload:/usr/src/app/server/upload/upload - ${UPLOAD_LOCATION}/photos/upload:/usr/src/app/server/upload/upload
- /usr/src/app/server/node_modules
- /etc/localtime:/etc/localtime:ro - /etc/localtime:/etc/localtime:ro
env_file: env_file:
- .env - .env
# user: ${UID:-1000}:${GID:-1000}
environment: environment:
IMMICH_REPOSITORY: immich-app/immich IMMICH_REPOSITORY: immich-app/immich
IMMICH_REPOSITORY_URL: https://github.com/immich-app/immich IMMICH_REPOSITORY_URL: https://github.com/immich-app/immich
@ -68,6 +72,7 @@ services:
image: immich-web-dev:latest image: immich-web-dev:latest
# Needed for rootless docker setup, see https://github.com/moby/moby/issues/45919 # Needed for rootless docker setup, see https://github.com/moby/moby/issues/45919
# user: 0:0 # user: 0:0
# user: ${UID:-1000}:${GID:-1000}
build: build:
context: ../ context: ../
dockerfile: web/Dockerfile dockerfile: web/Dockerfile
@ -78,11 +83,14 @@ services:
- 3000:3000 - 3000:3000
- 24678:24678 - 24678:24678
volumes: volumes:
- ../Makefile:/usr/src/app/Makefile
- ../package.json:/usr/src/app/package.json
- ../pnpm-lock.yaml:/usr/src/app/pnpm-lock.yaml
- ../pnpm-workspace.yaml:/usr/src/app/pnpm-workspace.yaml
- ../web:/usr/src/app/web - ../web:/usr/src/app/web
- ../i18n:/usr/src/app/i18n - ../i18n:/usr/src/app/i18n
- ../open-api/:/usr/src/app/open-api/ - ../open-api:/usr/src/app/open-api
# - ../../ui:/usr/ui # - ../../ui:/usr/ui
- /usr/src/app/web/node_modules
ulimits: ulimits:
nofile: nofile:
soft: 1048576 soft: 1048576

View File

@ -1,2 +1,7 @@
build/ build/
.docusaurus/ .docusaurus/
# Ignore files for PNPM, NPM and YARN
pnpm-lock.yaml
package-lock.json
yarn.lock

View File

@ -5,7 +5,7 @@ This website is built using [Docusaurus](https://docusaurus.io/), a modern stati
### Installation ### Installation
``` ```
$ npm install $ pnpm install
``` ```
### Local Development ### Local Development

View File

@ -200,7 +200,7 @@ When the Dev Container starts, it automatically:
1. **Runs post-create script** (`container-server-post-create.sh`): 1. **Runs post-create script** (`container-server-post-create.sh`):
- Adjusts file permissions for the `node` user - Adjusts file permissions for the `node` user
- Installs dependencies: `npm install` in all packages - Installs dependencies: `pnpm install` in all packages
- Builds TypeScript SDK: `npm run build` in `open-api/typescript-sdk` - Builds TypeScript SDK: `npm run build` in `open-api/typescript-sdk`
2. **Starts development servers** via VS Code tasks: 2. **Starts development servers** via VS Code tasks:

View File

@ -56,7 +56,7 @@ If you only want to do web development connected to an existing, remote backend,
1. Build the Immich SDK - `cd open-api/typescript-sdk && npm i && npm run build && cd -` 1. Build the Immich SDK - `cd open-api/typescript-sdk && npm i && npm run build && cd -`
2. Enter the web directory - `cd web/` 2. Enter the web directory - `cd web/`
3. Install web dependencies - `npm i` 3. Install web dependencies - `pnpm i`
4. Start the web development server 4. Start the web development server
```bash ```bash

View File

@ -5,7 +5,7 @@
### Unit tests ### Unit tests
Unit are run by calling `npm run test` from the `server/` directory. Unit are run by calling `npm run test` from the `server/` directory.
You need to run `npm install` (in `server/`) before _once_. You need to run `pnpm install` (in `server/`) before _once_.
### End to end tests ### End to end tests

20545
docs/package-lock.json generated

File diff suppressed because it is too large Load Diff

7469
e2e/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -79,7 +79,7 @@ export const tempDir = tmpdir();
export const asBearerAuth = (accessToken: string) => ({ Authorization: `Bearer ${accessToken}` }); export const asBearerAuth = (accessToken: string) => ({ Authorization: `Bearer ${accessToken}` });
export const asKeyAuth = (key: string) => ({ 'x-api-key': key }); export const asKeyAuth = (key: string) => ({ 'x-api-key': key });
export const immichCli = (args: string[]) => export const immichCli = (args: string[]) =>
executeCommand('node', ['node_modules/.bin/immich', '-d', `/${tempDir}/immich/`, ...args]).promise; executeCommand('pnpm', ['exec', 'immich', '-d', `/${tempDir}/immich/`, ...args], { cwd: '../cli' }).promise;
export const immichAdmin = (args: string[]) => export const immichAdmin = (args: string[]) =>
executeCommand('docker', ['exec', '-i', 'immich-e2e-server', '/bin/bash', '-c', `immich-admin ${args.join(' ')}`]); executeCommand('docker', ['exec', '-i', 'immich-e2e-server', '/bin/bash', '-c', `immich-admin ${args.join(' ')}`]);
export const specialCharStrings = ["'", '"', ',', '{', '}', '*']; export const specialCharStrings = ["'", '"', ',', '{', '}', '*'];

View File

@ -28,11 +28,11 @@ function dart {
function typescript { function typescript {
npx --yes oazapfts --optimistic --argumentStyle=object --useEnumType immich-openapi-specs.json typescript-sdk/src/fetch-client.ts npx --yes oazapfts --optimistic --argumentStyle=object --useEnumType immich-openapi-specs.json typescript-sdk/src/fetch-client.ts
npm --prefix typescript-sdk ci && npm --prefix typescript-sdk run build pnpm --filter @immich/sdk install --frozen-lockfile && pnpm --filter @immich/sdk build
} }
# requires server to be built # requires server to be built
npm run sync:open-api --prefix=../server (cd .. && pnpm --filter immich install && pnpm --filter immich build && pnpm --filter immich sync:open-api)
if [[ $1 == 'dart' ]]; then if [[ $1 == 'dart' ]]; then
dart dart

View File

@ -5,7 +5,7 @@ A TypeScript SDK for interfacing with the [Immich](https://immich.app/) API.
## Install ## Install
```bash ```bash
npm i --save @immich/sdk pnpm i --save @immich/sdk
``` ```
## Usage ## Usage

View File

@ -1,57 +0,0 @@
{
"name": "@immich/sdk",
"version": "1.135.3",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@immich/sdk",
"version": "1.135.3",
"license": "GNU Affero General Public License version 3",
"dependencies": {
"@oazapfts/runtime": "^1.0.2"
},
"devDependencies": {
"@types/node": "^22.15.33",
"typescript": "^5.3.3"
}
},
"node_modules/@oazapfts/runtime": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/@oazapfts/runtime/-/runtime-1.0.4.tgz",
"integrity": "sha512-7t6C2shug/6tZhQgkCa532oTYBLEnbASV/i1SG1rH2GB4h3aQQujYciYSPT92hvN4IwTe8S2hPkN/6iiOyTlCg==",
"license": "MIT"
},
"node_modules/@types/node": {
"version": "22.15.34",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.34.tgz",
"integrity": "sha512-8Y6E5WUupYy1Dd0II32BsWAx5MWdcnRd8L84Oys3veg1YrYtNtzgO4CFhiBg6MDSjk7Ay36HYOnU7/tuOzIzcw==",
"dev": true,
"license": "MIT",
"dependencies": {
"undici-types": "~6.21.0"
}
},
"node_modules/typescript": {
"version": "5.8.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz",
"integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
"dev": true,
"license": "Apache-2.0",
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
},
"engines": {
"node": ">=14.17"
}
},
"node_modules/undici-types": {
"version": "6.21.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
"integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
"dev": true,
"license": "MIT"
}
}
}

View File

@ -29,5 +29,6 @@
}, },
"volta": { "volta": {
"node": "22.17.0" "node": "22.17.0"
} },
"packageManager": "pnpm@10.12.3+sha512.467df2c586056165580ad6dfb54ceaad94c5a30f80893ebdec5a44c5aa73c205ae4a5bb9d5ed6bb84ea7c249ece786642bbb49d06a307df218d03da41c317417"
} }

10
package.json Normal file
View File

@ -0,0 +1,10 @@
{
"name": "immich-monorepo",
"version": "0.0.1",
"description": "monorepo for immich and friends",
"private": true,
"packageManager": "pnpm@10.12.4",
"engines": {
"pnpm": ">=10.0.0"
}
}

25306
pnpm-lock.yaml generated Normal file

File diff suppressed because it is too large Load Diff

79
pnpm-workspace.yaml Normal file
View File

@ -0,0 +1,79 @@
packages:
- cli
- docs
- e2e
- open-api/typescript-sdk
- server
- web
- .github
ignoredBuiltDependencies:
- '@nestjs/core'
- '@scarf/scarf'
- '@swc/core'
- bcrypt
- canvas
- core-js
- core-js-pure
- cpu-features
- es5-ext
- esbuild
- msgpackr-extract
- postman-code-generators
- protobufjs
- ssh2
- utimes
onlyBuiltDependencies:
- sharp
- '@tailwindcss/oxide'
overrides:
canvas: 2.11.2
sharp: ^0.34.2
'@img/sharp-darwin-arm64': '-'
'@img/sharp-darwin-x64': '-'
'@img/sharp-libvips-darwin-arm64': '-'
'@img/sharp-libvips-darwin-x64': '-'
'@img/sharp-libvips-linux-arm': '-'
'@img/sharp-libvips-linux-ppc64': '-'
'@img/sharp-libvips-linux-s390x': '-'
'@img/sharp-libvips-linuxmusl-arm64': '-'
'@img/sharp-linux-arm64': '-'
'@img/sharp-linux-s390x': '-'
'@img/sharp-linuxmusl-arm64': '-'
'@img/sharp-wasm32': '-'
'@img/sharp-win32-arm64': '-'
'@img/sharp-win32-ia32': '-'
'@img/sharp-win32-x64': '-'
packageExtensions:
nestjs-kysely:
dependencies:
tslib: '*'
nestjs-otel:
dependencies:
tslib: '*'
'@photo-sphere-viewer/equirectangular-video-adapter':
dependencies:
three: '*'
'@photo-sphere-viewer/video-plugin':
dependencies:
three: '*'
sharp:
dependencies:
node-addon-api: '*'
node-gyp: '*'
'@immich/ui':
dependencies:
tailwindcss: ^4.1.11
tailwind-variants:
dependencies:
tailwindcss: ^4.1.11
dedupePeerDependents: false
packageImportMethod: hardlink
preferWorkspacePackages: true
shamefullyHoist: false
injectWorkspacePackages: true

5
server/.npmignore Normal file
View File

@ -0,0 +1,5 @@
src
tsconfig*
eslint*
pnpm*
coverage

View File

@ -1,54 +1,67 @@
# dev build # dev build
FROM ghcr.io/immich-app/base-server-dev:202505131114@sha256:cf4507bbbf307e9b6d8ee9418993321f2b85867da8ce14d0a20ccaf9574cb995 AS dev FROM ghcr.io/immich-app/base-server-dev:commit-95312641aeba3ecaab9d73d05ca5d9746ab633b6 AS dev
RUN apt-get install --no-install-recommends -yqq tini && \ ENV COREPACK_ENABLE_AUTO_PIN=0 \
COREPACK_ENABLE_DOWNLOAD_PROMPT=0 \
CI=1
RUN echo "umask 000" >> /etc/profile && \
echo "umask 000" >> /etc/bash.bashrc && \
umask 000 && \
corepack enable && \
corepack install -g pnpm && \
apt-get update && \
apt-get install --no-install-recommends -yqq tini make && \
rm -rf /var/lib/apt/lists && \
rm -rf /usr/src/app && \ rm -rf /usr/src/app && \
mkdir -p /usr/src/app mkdir -p /usr/src/app
WORKDIR /usr/src/app WORKDIR /usr/src/app
COPY ./server/package* ./server/ COPY ./server ./server/
WORKDIR /usr/src/app/server COPY Makefile ./package* ./pnpm* ./
RUN npm ci && \
# exiftool-vendored.pl, sharp-linux-x64 and sharp-linux-arm64 are the only ones we need RUN umask 000 && mkdir -p /buildcache/pnpm-store && \
# they're marked as optional dependencies, so we need to copy them manually after pruning pnpm config set store-dir /buildcache/pnpm-store && \
rm -rf node_modules/@img/sharp-libvips* && \ SHARP_IGNORE_GLOBAL_LIBVIPS=true make setup-server-dev
rm -rf node_modules/@img/sharp-linuxmusl-x64
ENV PATH="${PATH}:/usr/src/app/bin" \ ENV PATH="${PATH}:/usr/src/app/bin" \
IMMICH_ENV=development \ IMMICH_ENV=development \
NVIDIA_DRIVER_CAPABILITIES=all \ NVIDIA_DRIVER_CAPABILITIES=all
NVIDIA_VISIBLE_DEVICES=all
ENTRYPOINT ["tini", "--", "/bin/sh"] ENTRYPOINT ["tini", "--", "/bin/sh"]
FROM dev AS dev-container-server FROM dev AS dev-container-server
RUN rm -rf /usr/src/app
RUN apt-get update && \ RUN apt-get update && \
apt-get install sudo inetutils-ping openjdk-11-jre-headless \ apt-get install sudo inetutils-ping openjdk-11-jre-headless \
vim nano \ vim nano -y --no-install-recommends --fix-missing && \
-y --no-install-recommends --fix-missing rm -rf /var/lib/apt/lists
RUN usermod -aG sudo node && \
echo "node ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \
# create workspaces dirs
mkdir -p /workspaces/immich && \
mkdir /immich-devcontainer;
RUN usermod -aG sudo node WORKDIR /workspaces/immich
RUN echo "node ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers # Remove app dir from dev container
RUN mkdir -p /workspaces/immich RUN rm -rf /usr/src/app
RUN chown node -R /workspaces
COPY --chown=node:node --chmod=777 ../.devcontainer/server/*.sh /immich-devcontainer/
USER node COPY --chmod=777 ../.devcontainer/server/*.sh /immich-devcontainer/
COPY --chown=node:node .. /tmp/create-dep-cache/
WORKDIR /tmp/create-dep-cache
RUN make ci-all && rm -rf /tmp/create-dep-cache
WORKDIR /workspaces/immich
FROM dev-container-server AS dev-container-mobile FROM dev-container-server AS dev-container-mobile
USER root USER root
# Enable multiarch for arm64 if necessary # Enable multiarch for arm64 if necessary
RUN if [ "$(dpkg --print-architecture)" = "arm64" ]; then \ RUN if [ "$(dpkg --print-architecture)" = "arm64" ]; then \
dpkg --add-architecture amd64 && \ sudo dpkg --add-architecture amd64 && \
apt-get update && \ sudo apt-get install -y --no-install-recommends \
apt-get install -y --no-install-recommends \
qemu-user-static \ qemu-user-static \
libc6:amd64 \ libc6:amd64 \
libstdc++6:amd64 \ libstdc++6:amd64 \
libgcc1:amd64; \ libgcc1:amd64 && \
rm -rf /var/lib/apt/lists; \
fi fi
# Flutter SDK # Flutter SDK
@ -65,57 +78,68 @@ RUN mkdir -p ${FLUTTER_HOME} \
&& rm flutter.tar.xz \ && rm flutter.tar.xz \
&& chown -R node ${FLUTTER_HOME} && chown -R node ${FLUTTER_HOME}
USER node RUN wget -qO- https://dcm.dev/pgp-key.public | gpg --dearmor -o /usr/share/keyrings/dcm.gpg \
RUN sudo apt-get update \ && echo 'deb [signed-by=/usr/share/keyrings/dcm.gpg arch=amd64] https://dcm.dev/debian stable main' | tee /etc/apt/sources.list.d/dart_stable.list \
&& wget -qO- https://dcm.dev/pgp-key.public | sudo gpg --dearmor -o /usr/share/keyrings/dcm.gpg \ && apt-get update \
&& echo 'deb [signed-by=/usr/share/keyrings/dcm.gpg arch=amd64] https://dcm.dev/debian stable main' | sudo tee /etc/apt/sources.list.d/dart_stable.list \ && apt-get install dcm -y && \
&& sudo apt-get update \ && rm -rf /var/lib/apt/lists
&& sudo apt-get install dcm -y
COPY --chmod=777 ../.devcontainer/mobile/container-mobile-post-create.sh /immich-devcontainer/container-mobile-post-create.sh COPY --chmod=777 ../.devcontainer/mobile/container-mobile-post-create.sh /immich-devcontainer/container-mobile-post-create.sh
RUN dart --disable-analytics RUN dart --disable-analytics
USER node
FROM dev AS prod # server production build
FROM dev AS server-prod
COPY server . RUN pnpm --filter immich install --frozen-lockfile && \
RUN npm run build pnpm --filter immich build && \
RUN npm prune --omit=dev --omit=optional pnpm --filter immich --prod --no-optional deploy /output/server-pruned
COPY --from=dev /usr/src/app/server/node_modules/@img ./node_modules/@img
COPY --from=dev /usr/src/app/server/node_modules/exiftool-vendored.pl ./node_modules/exiftool-vendored.pl
# web build # web production build
FROM node:22.16.0-alpine3.20@sha256:2289fb1fba0f4633b08ec47b94a89c7e20b829fc5679f9b7b298eaa2f1ed8b7e AS web FROM dev AS web-prod
WORKDIR /usr/src/app COPY ./open-api/typescript-sdk ./open-api/typescript-sdk/
COPY ./web ./web/ COPY ./web ./web/
COPY ./i18n ./i18n/ COPY ./i18n ./i18n/
RUN pnpm install --filter @immich/sdk --filter immich-web --frozen-lockfile && \
pnpm --filter @immich/sdk build && \
pnpm --filter immich-web build
FROM dev AS cli-prod
COPY ./cli ./cli/
COPY ./open-api/typescript-sdk ./open-api/typescript-sdk/ COPY ./open-api/typescript-sdk ./open-api/typescript-sdk/
RUN pnpm install --filter @immich/sdk --filter @immich/cli --frozen-lockfile && \
WORKDIR /usr/src/app/open-api/typescript-sdk pnpm --filter @immich/sdk build && \
RUN npm ci && npm run build pnpm --filter @immich/cli build && \
pnpm --filter @immich/cli --prod --no-optional deploy /output/cli-pruned
WORKDIR /usr/src/app/web
RUN npm ci && npm run build
# prod build # prod build
FROM ghcr.io/immich-app/base-server-prod:202505061115@sha256:9971d3a089787f0bd01f4682141d3665bcf5efb3e101a88e394ffd25bee4eedb FROM ghcr.io/immich-app/base-server-prod:commit-95312641aeba3ecaab9d73d05ca5d9746ab633b6
WORKDIR /usr/src/app
ENV NODE_ENV=production \ ENV NODE_ENV=production \
NVIDIA_DRIVER_CAPABILITIES=all \ NVIDIA_DRIVER_CAPABILITIES=all \
NVIDIA_VISIBLE_DEVICES=all NVIDIA_VISIBLE_DEVICES=all \
COPY --from=prod /usr/src/app/server/node_modules ./node_modules COREPACK_ENABLE_DOWNLOAD_PROMPT=0
COPY --from=prod /usr/src/app/server/dist ./dist
COPY --from=prod /usr/src/app/server/bin ./bin RUN corepack enable && \
COPY --from=web /usr/src/app/web/build /build/www corepack install -g pnpm && \
COPY ./server/resources resources mkdir -p /usr/src/app/upload
COPY ./server/package.json server/package-lock.json ./
COPY ./server/start*.sh ./ WORKDIR /usr/src/app
COPY "docker/scripts/get-cpus.sh" ./ COPY --from=server-prod /output/server-pruned/dist ./dist
RUN npm install -g @immich/cli && npm cache clean --force COPY --from=server-prod /output/server-pruned/bin ./bin
COPY --from=server-prod /output/server-pruned/package.json ./
COPY --from=server-prod /output/server-pruned/node_modules/ ./node_modules
COPY --from=web-prod /usr/src/app/web/build /build/www
COPY --from=cli-prod /output/cli-pruned ./cli
RUN ln -S ./cli/bin/immich /usr/src/app/bin/immich
COPY server/resources ./resources/
COPY server/start*.sh docker/scripts/get-cpus.sh ./
COPY LICENSE /licenses/LICENSE.txt COPY LICENSE /licenses/LICENSE.txt
COPY LICENSE /LICENSE COPY LICENSE /LICENSE
ENV PATH="${PATH}:/usr/src/app/bin" ENV PATH="${PATH}:/usr/src/app/bin"
ARG BUILD_ID ARG BUILD_ID

View File

@ -1,5 +1,6 @@
#!/usr/bin/env bash #!/usr/bin/env bash
cd /usr/src/app/server || exit 1 cd /usr/src/app || exit
npm install FROZEN=1 make install-server
node ./node_modules/.bin/nest start --debug "0.0.0.0:9230" --watch -- "$@" cd /usr/src/app/server || exit
pnpm exec nest start --debug "0.0.0.0:9230" --watch -- "$@"

18496
server/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -176,5 +176,6 @@
}, },
"overrides": { "overrides": {
"sharp": "^0.34.2" "sharp": "^0.34.2"
} },
"packageManager": "pnpm@10.12.3+sha512.467df2c586056165580ad6dfb54ceaad94c5a30f80893ebdec5a44c5aa73c205ae4a5bb9d5ed6bb84ea7c249ece786642bbb49d06a307df218d03da41c317417"
} }

View File

@ -1,16 +1,20 @@
FROM node:22.16.0-alpine3.20@sha256:2289fb1fba0f4633b08ec47b94a89c7e20b829fc5679f9b7b298eaa2f1ed8b7e FROM node:22.16.0-alpine3.20@sha256:2289fb1fba0f4633b08ec47b94a89c7e20b829fc5679f9b7b298eaa2f1ed8b7e
ENV COREPACK_ENABLE_AUTO_PIN=0 \
COREPACK_ENABLE_DOWNLOAD_PROMPT=0
RUN apk add --no-cache tini make RUN corepack enable && corepack install -g pnpm && \
apk add --no-cache tini make && \
mkdir -p /buildcache/pnpm-store && \
chmod 777 -R /buildcache && \
pnpm config set store-dir /buildcache/pnpm-store
USER node USER node
WORKDIR /usr/src/app WORKDIR /usr/src/app
COPY --chown=node:node ./web ./web/
COPY --chown=node:node ./open-api ./open-api/ COPY --chown=node:node ./open-api ./open-api/
COPY --chown=node:node Makefile ./ COPY --chown=node:node ./web ./web/
COPY --chown=node:node ./Makefile ./package* ./pnpm* ./
RUN make setup-web-dev
WORKDIR /usr/src/app/web WORKDIR /usr/src/app/web
RUN npm ci
ENV CHOKIDAR_USEPOLLING=true ENV CHOKIDAR_USEPOLLING=true
EXPOSE 24678 EXPOSE 24678
EXPOSE 3000 EXPOSE 3000

View File

@ -1,16 +1,14 @@
#!/usr/bin/env sh #!/usr/bin/env sh
TYPESCRIPT_SDK=/usr/src/app/open-api/typescript-sdk echo "Setup dev env"
(
cd /usr/src/app/web || exit 1 cd /usr/src/app || exit
npm --prefix "$TYPESCRIPT_SDK" install FROZEN=1 OFFLINE=1 make setup-web-dev
npm --prefix "$TYPESCRIPT_SDK" run build )
npm install
COUNT=0 COUNT=0
UPSTREAM="${IMMICH_SERVER_URL:-http://immich-server:2283/}" UPSTREAM="${IMMICH_SERVER_URL:-http://immich-server:2283/}"
until wget --spider --quiet "${UPSTREAM}/api/server/config" > /dev/null 2>&1; do until wget --spider --quiet "${UPSTREAM}/api/server/config" >/dev/null 2>&1; do
if [ $((COUNT % 10)) -eq 0 ]; then if [ $((COUNT % 10)) -eq 0 ]; then
echo "Waiting for $UPSTREAM to start..." echo "Waiting for $UPSTREAM to start..."
fi fi
@ -19,5 +17,4 @@ until wget --spider --quiet "${UPSTREAM}/api/server/config" > /dev/null 2>&1; do
done done
echo "Connected to $UPSTREAM" echo "Connected to $UPSTREAM"
pnpm exec vite dev --host 0.0.0.0 --port 3000
node ./node_modules/.bin/vite dev --host 0.0.0.0 --port 3000

10950
web/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -107,5 +107,6 @@
}, },
"volta": { "volta": {
"node": "22.17.0" "node": "22.17.0"
} },
"packageManager": "pnpm@10.12.3+sha512.467df2c586056165580ad6dfb54ceaad94c5a30f80893ebdec5a44c5aa73c205ae4a5bb9d5ed6bb84ea7c249ece786642bbb49d06a307df218d03da41c317417"
} }