immich-app / immich

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

Does not support Cyrillic domain #12897

Open rtx4d opened 1 week ago

rtx4d commented 1 week ago

The bug

My domain consists of Cyrillic characters (https://фото.большойчлен.рф), the mobile app show error that the server is unavailable If i convert it via Punycode, it works correctly (https://xn--n1aalg.xn--90ailhbncb6fh7b.xn--p1ai)

The OS that Immich Server is running on

Fedora Server 40

Version of Immich Server

v1.115.0

Version of Immich Mobile App

1.115.0 build.159

Platform with the issue

Your docker-compose.yml content

#
# WARNING: Make sure to use the docker-compose.yml of the current release:
#
# https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
#
# The compose file on main may not be compatible with the latest release.
#

name: immich

services:
  immich-server:
    container_name: immich_server
    image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
    # extends:
    #   file: hwaccel.transcoding.yml
    #   service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding
    volumes:
      # Do not edit the next line. If you want to change the media storage location on your system, edit the value of UPLOAD_LOCATION in the .env file
      - ${UPLOAD_LOCATION}:/usr/src/app/upload
      - /etc/localtime:/etc/localtime:ro
    env_file:
      - .env
    ports:
      - 2283:3001
    depends_on:
      - redis
      - database
    restart: always
    healthcheck:
      disable: false

  immich-machine-learning:
    container_name: immich_machine_learning
    # For hardware acceleration, add one of -[armnn, cuda, openvino] to the image tag.
    # Example tag: ${IMMICH_VERSION:-release}-cuda
    image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
    # extends: # uncomment this section for hardware acceleration - see https://immich.app/docs/features/ml-hardware-acceleration
    #   file: hwaccel.ml.yml
    #   service: cpu # set to one of [armnn, cuda, openvino, openvino-wsl] for accelerated inference - use the `-wsl` version for WSL2 where applicable
    volumes:
      - model-cache:/cache
    env_file:
      - .env
    restart: always
    healthcheck:
      disable: false

  redis:
    container_name: immich_redis
    image: docker.io/redis:6.2-alpine@sha256:2d1463258f2764328496376f5d965f20c6a67f66ea2b06dc42af351f75248792
    healthcheck:
      test: redis-cli ping || exit 1
    restart: always

  database:
    container_name: immich_postgres
    image: docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_USER: ${DB_USERNAME}
      POSTGRES_DB: ${DB_DATABASE_NAME}
      POSTGRES_INITDB_ARGS: '--data-checksums'
    volumes:
      # Do not edit the next line. If you want to change the database storage location on your system, edit the value of DB_DATA_LOCATION in the .env file
      - ${DB_DATA_LOCATION}:/var/lib/postgresql/data
    healthcheck:
      test: pg_isready --dbname='${DB_DATABASE_NAME}' --username='${DB_USERNAME}' || exit 1; Chksum="$$(psql --dbname='${DB_DATABASE_NAME}' --username='${DB_USERNAME}' --tuples-only --no-align --command='SELECT COALESCE(SUM(checksum_failures), 0) FROM pg_stat_database')"; echo "checksum failure count is $$Chksum"; [ "$$Chksum" = '0' ] || exit 1
      interval: 5m
      start_interval: 30s
      start_period: 5m
    command: ["postgres", "-c", "shared_preload_libraries=vectors.so", "-c", 'search_path="$$user", public, vectors', "-c", "logging_collector=on", "-c", "max_wal_size=2GB", "-c", "shared_buffers=512MB", "-c", "wal_compression=on"]
    restart: always

volumes:
  model-cache:

Your .env content

# You can find documentation for all the supported env variables at https://immich.app/docs/install/environment-variables

# The location where your uploaded files are stored
UPLOAD_LOCATION=/mnt/raid4k/immich-library
# The location where your database files are stored
DB_DATA_LOCATION=./postgres

# To set a timezone, uncomment the next line and change Etc/UTC to a TZ identifier from this list: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones#List
# TZ=Etc/UTC

# The Immich version to use. You can pin this to a specific version like "v1.71.0"
IMMICH_VERSION=release

# Connection secret for postgres. You should change it to a random password
# Please use only the characters `A-Za-z0-9`, without special characters or spaces
DB_PASSWORD=postgres

# The values below this line do not need to be changed
###################################################################################
DB_USERNAME=postgres
DB_DATABASE_NAME=immich

Reproduction steps

  1. Open mobile App
  2. Enter domain - https://фото.большойчлен.рф/api
  3. Get error Screenshot_20240924_223030

Relevant log output

FormatException: %D1%84%D0%BE%D1%82%D0%BE.%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%BE%D0%B9%D1%87%D0%BB%D0%B5%D0%BD.%D1%80%D1%84 is not a valid link-local address but contains %. Scope id should be used as part of link-local address. (at character 1)
%D1%84%D0%BE%D1%82%D0%BE.%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%BE%D0%B9%D1%87%D...
^

#0      _NativeSocket.escapeLinkLocalAddress (dart:io-patch/socket_patch.dart:582)
#1      _NativeSocket.startConnect (dart:io-patch/socket_patch.dart:696)
#2      _RawSocket.startConnect (dart:io-patch/socket_patch.dart:1920)
#3      RawSocket.startConnect (dart:io-patch/socket_patch.dart:27)
#4      RawSecureSocket.startConnect (dart:io/secure_socket.dart:299)
#5      SecureSocket.startConnect (dart:io/secure_socket.dart:77)
#6      _ConnectionTarget.connect (dart:_http/http_impl.dart:2487)
#7      _HttpClient._getConnection.connect (dart:_http/http_impl.dart:2930)
#8      _HttpClient._getConnection (dart:_http/http_impl.dart:2935)
#9      _HttpClient._openUrl (dart:_http/http_impl.dart:2790)
#10     _HttpClient.openUrl (dart:_http/http_impl.dart:2627)
#11     IOClient.send (package:http/src/io_client.dart:63)
#12     BaseClient._sendUnstreamed (package:http/src/base_client.dart:93)
#13     BaseClient.get (package:http/src/base_client.dart:27)
#14     ApiService._isEndpointAvailable (package:immich_mobile/services/api.service.dart:108)
#15     ApiService._resolveEndpoint (package:immich_mobile/services/api.service.dart:87)
#16     ApiService.resolveAndSetEndpoint (package:immich_mobile/services/api.service.dart:69)
#17     LoginForm.build.getServerLoginCredential (package:immich_mobile/widgets/forms/login/login_form.dart:103)
#18     _InkResponseState.handleTap (package:flutter/src/material/ink_well.dart:1170)
#19     GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:351)
#20     TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:656)
#21     BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:313)
#22     BaseTapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:246)
#23     PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:703)
#24     PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:98)
#25     PointerRouter._dispatchEventToRoutes.<anonymous closure> (package:flutter/src/gestures/pointer_router.dart:143)
#26     _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:633)
#27     PointerRouter._dispatchEventToRoutes (package:flutter/src/gestures/pointer_router.dart:141)
#28     PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:127)
#29     GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:501)
#30     GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:481)
#31     RendererBinding.dispatchEvent (package:flutter/src/rendering/binding.dart:450)
#32     GestureBinding._handlePointerEventImmediately (package:flutter/src/gestures/binding.dart:426)
#33     GestureBinding.handlePointerEvent (package:flutter/src/gestures/binding.dart:389)
#34     GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:336)
#35     GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:305)
#36     _invoke1 (dart:ui/hooks.dart:328)
#37     PlatformDispatcher._dispatchPointerDataPacket (dart:ui/platform_dispatcher.dart:442)
#38     _dispatchPointerDataPacket (dart:ui/hooks.dart:262)

Additional information

No response

sacredd commented 1 week ago

Домен зачотный )) Ip не статический? Заходил бы по ip

rtx4d commented 1 week ago

The domain is cool )) Is the IP not static? I would go by IP

It is static, but I want to run everything through the domain, for use SSL certificate

danieldietzler commented 1 week ago

Please stick to English in any comments

CyberCreator commented 1 week ago

Let me express my gratitude for naming your domain. This is probably the funniest thing I've seen on GitHub recently.)