immich-app / immich

High performance self-hosted photo and video management solution.
https://immich.app
GNU Affero General Public License v3.0
44.56k stars 2.17k forks source link

Docs do not mention that @immich/cli requires node v20. #5195

Closed sbell8-chwy closed 9 months ago

sbell8-chwy commented 9 months ago

The bug

I think this commit broke the cli: https://github.com/immich-app/immich/commit/7e38e7c949aee4ec68dc8fca6bd087955996e568

ReferenceError: File is not defined
    at Asset.getFileObject (/home/steven/.nvm/versions/node/v18.6.0/lib/node_modules/@immich/cli/dist/cores/models/asset.js:87:9)
    at async Asset.process (/home/steven/.nvm/versions/node/v18.6.0/lib/node_modules/@immich/cli/dist/cores/models/asset.js:56:26)
    at async Upload.run (/home/steven/.nvm/versions/node/v18.6.0/lib/node_modules/@immich/cli/dist/commands/upload.js:37:13)
    at async Command.<anonymous> (/home/steven/.nvm/versions/node/v18.6.0/lib/node_modules/@immich/cli/dist/index.js:30:5)

Specifically what I think happened. It seems the file cores/models/crawled-asset.js was renamed to cores/models/asset.js. As part of that rename two fields in the Asset class were changed from being of type fs.ReadStream and Buffer to File.

File is a js browser api not available in npm, causing the above ReferenceError.

The OS that Immich Server is running on

Pop-OS

Version of Immich Server

1.86.0

Version of Immich Mobile App

1.87.0 build.111

Platform with the issue

Your docker-compose.yml content

version: "3.8"

services:
  immich-server:
    container_name: immich_server
    image: ghcr.io/immich-app/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
      - typesense
    restart: always

  immich-microservices:
    container_name: immich_microservices
    image: ghcr.io/immich-app/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
      - typesense
    restart: always

  immich-machine-learning:
    container_name: immich_machine_learning
    image: ghcr.io/immich-app/immich-machine-learning:release
    volumes:
      - ${UPLOAD_LOCATION}:/usr/src/app/upload
      - model-cache:/cache
    env_file:
      - .env
    environment:
      - NODE_ENV=production
    restart: always

  immich-web:
    container_name: immich_web
    image: ghcr.io/immich-app/immich-web:release
    entrypoint: ["/bin/sh", "./entrypoint.sh"]
    env_file:
      - .env
    restart: always

  typesense:
    container_name: immich_typesense
    image: typesense/typesense:0.24.0
    environment:
      - TYPESENSE_API_KEY=${TYPESENSE_API_KEY}
      - TYPESENSE_DATA_DIR=/data
    logging:
      driver: none
    volumes:
      - tsdata:/data
    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: ghcr.io/immich-app/immich-proxy:release
    environment:
      # Make sure these values get passed through from the env file
      - IMMICH_SERVER_URL
      - IMMICH_WEB_URL
    ports:
      - 2283:8080
    logging:
      driver: none
    depends_on:
      - immich-server
    restart: always

volumes:
  pgdata:
  model-cache:
  tsdata:

Your .env content

###################################################################################
# Database
###################################################################################

DB_HOSTNAME=immich_postgres
DB_USERNAME=REDACTED
DB_PASSWORD=REDACTED
DB_DATABASE_NAME=immich

# Optional Database settings:
# DB_PORT=5432

###################################################################################
# Redis
###################################################################################

REDIS_HOSTNAME=immich_redis

# Optional Redis settings:
# REDIS_PORT=6379
# REDIS_DBINDEX=0
# REDIS_PASSWORD=
# REDIS_SOCKET=

###################################################################################
# Upload File Location
#
# This is the location where uploaded files are stored.
###################################################################################

UPLOAD_LOCATION=/mnt/shares/drobo-public/ImmichDrive

###################################################################################
# Typesense
###################################################################################
TYPESENSE_API_KEY=REDACTED

###################################################################################
# JWT SECRET
#
# This JWT_SECRET is used to sign the authentication keys for user login
# You should set it to a long randomly generated value
# You can use this command to generate one: openssl rand -base64 128
###################################################################################

JWT_SECRET=REDACTED

###################################################################################
# Reverse Geocoding
#
# Reverse geocoding is done locally which has a small impact on memory usage
# This memory usage can be altered by changing the REVERSE_GEOCODING_PRECISION variable
# This ranges from 0-3 with 3 being the most precise
# 3 - Cities > 500 population: ~200MB RAM
# 2 - Cities > 1000 population: ~150MB RAM
# 1 - Cities > 5000 population: ~80MB RAM
# 0 - Cities > 15000 population: ~40MB RAM
####################################################################################

# DISABLE_REVERSE_GEOCODING=false
# REVERSE_GEOCODING_PRECISION=3

####################################################################################
# WEB - Optional
#
# Custom message on the login page, should be written in HTML form.
# For example:
# PUBLIC_LOGIN_PAGE_MESSAGE="This is a demo instance of Immich.<br><br>Email: <i>demo@demo.de</i><br>Password: <i>demo</i>"
####################################################################################

PUBLIC_LOGIN_PAGE_MESSAGE="The Bell family photos"

####################################################################################
# Alternative Service Addresses - Optional
#
# This is an advanced feature for users who may be running their immich services on different hosts.
# It will not change which address or port that services bind to within their containers, but it will change where other services look for their peers.
# Note: immich-microservices is bound to 3002, but no references are made
####################################################################################

IMMICH_WEB_URL=http://immich-web:3000
IMMICH_SERVER_URL=http://immich-server:3001
IMMICH_MACHINE_LEARNING_URL=http://immich-machine-learning:3003

Reproduction steps

1. Install the latest cli
2. Login with cli (immich login-key {host} {key})
3. Attempt to upload any images (immich upload {directory/file})

Additional information

No response

alextran1502 commented 9 months ago

Can you type node --version and report back your version?

jrasm91 commented 9 months ago

From the stack trace the OP is using 18.6. File as a top level global object was added in node version 20.

alextran1502 commented 9 months ago

Ah we need to update the documentation

sbell8-chwy commented 9 months ago

Ah, I'll switch my node version and try again. I was unaware File was added recently in node.

sbell8-chwy commented 9 months ago

Upgrading to node v20 does appear to fix the problem. Installing v20 then reinstalling @immich/cli and running did in fact work and upload images. I can close this bug unless you want to leave it open as a documentation update ticket.

jrasm91 commented 9 months ago

Let's leave it open until a doc change is added that specifies this requires node v20.