HumanSignal / label-studio

Label Studio is a multi-type data labeling and annotation tool with standardized output format
https://labelstud.io
Apache License 2.0
19.47k stars 2.42k forks source link

Upgrade label-studio version (in docker) causes web UI to be completely blank #6182

Open mkrupczak3 opened 3 months ago

mkrupczak3 commented 3 months ago

Describe the bug I have a label-studio instance running locally on linux with docker-compose. Whenever I try to upgrade the label-studio version from 1.9.0 to any newer version, the web UI for label-studio upon login is completely blank.

I have tried running a shell in the label-studio-app container and triggering the upgrade there with pip before updating the container tag to newer version, however this has no effect and the issue still occurs.

To Reproduce Steps to reproduce the behavior:

  1. Launch a label-studio instance version 1.9.0 using docker
  2. Create a project, import data
  3. Stop the container and update tag to newer label-studio version
  4. Upon login, the user interface for label-studio will be completely blank

Expected behavior The expected contract for docker containers is that software upgrade is done atomically by incrementing the container's tag. The container's state is supposed to be ephemeral, so it should not be dependent on manual execution of a shell within the container to perform the upgrade there (such changes will disappear upon re-launch of the container anyways).

Screenshots Example error output from label-studio when upgrading from 1.9.0 to 1.10.0:

Starting new HTTPS connection (1): pypi.org:443
[https://pypi.org:443](https://pypi.org/) "GET /pypi/label-studio/json HTTP/1.1" 200 32487

   ╔══════════════════════════════════════╗
   ║                                      ║
   ║   Update available 1.10.0 → 1.13.0   ║
   ║   Run pip install -U label-studio    ║
   ║                                      ║
   ╚══════════════════════════════════════╝

Traceback (most recent call last):
  File "/usr/local/lib/python3.10/dist-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
psycopg2.errors.UndefinedColumn: column htx_user.is_deleted does not exist
LINE 1: ...", "htx_user"."is_staff", "htx_user"."is_active", "htx_user"...
                                                             ^

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/local/bin/label-studio", line 6, in <module>
    sys.exit(main())
  File "/label-studio/label_studio/server.py", line 353, in main
    _init(input_args, config)
  File "/label-studio/label_studio/server.py", line 189, in _init
    user = _create_user(input_args, config)
  File "/label-studio/label_studio/server.py", line 141, in _create_user
    user = User.objects.filter(email=DEFAULT_USERNAME).first()
  File "/usr/local/lib/python3.10/dist-packages/django/db/models/query.py", line 674, in first
    for obj in (self if self.ordered else self.order_by('pk'))[:1]:
  File "/usr/local/lib/python3.10/dist-packages/django/db/models/query.py", line 280, in __iter__
    self._fetch_all()
  File "/usr/local/lib/python3.10/dist-packages/django/db/models/query.py", line 1324, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "/usr/local/lib/python3.10/dist-packages/django/db/models/query.py", line 51, in __iter__
    results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)
  File "/usr/local/lib/python3.10/dist-packages/django/db/models/sql/compiler.py", line 1175, in execute_sql
    cursor.execute(sql, params)
  File "/usr/local/lib/python3.10/dist-packages/sentry_sdk/integrations/django/__init__.py", line 629, in execute
    return real_execute(self, sql, params)
  File "/usr/local/lib/python3.10/dist-packages/django/db/backends/utils.py", line 66, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "/usr/local/lib/python3.10/dist-packages/django/db/backends/utils.py", line 75, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "/usr/local/lib/python3.10/dist-packages/django/db/backends/utils.py", line 79, in _execute
    with self.db.wrap_database_errors:
  File "/usr/local/lib/python3.10/dist-packages/django/db/utils.py", line 90, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/usr/local/lib/python3.10/dist-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: column htx_user.is_deleted does not exist
LINE 1: ...", "htx_user"."is_staff", "htx_user"."is_active", "htx_user"...
                                                             ^

Environment (please complete the following information):

Additional context

Running label-studio with a modified version of the example docker-compose.yml file.

mkrupczak3 commented 3 months ago

Posted here on the label-studio Slack:

https://label-studio.slack.com/archives/CQ8LYQ0J2/p1723232435489269

jombooth commented 3 months ago

Hi @mkrupczak3,

Migrations should be automatic but it looks like you've got one that failed to run. Let's get that fixed. Try these steps:

$ docker compose up -d
$ docker exec -it label-studio-app-1 bash
$ cd label_studio
$ python3 manage.py migrate

then hit ctrl+d to exit the docker shell and run docker compose restart.

mkrupczak3 commented 3 months ago

Thanks @jombooth,

I performed your suggested troubleshooting steps, however it seems that label-studio did not recognize the need for a migration:

I have no name!@91ae1ff040fd:~/label_studio$ python3 manage.py migrate
=> Database and media directory: /label-studio/data
=> Static URL is set to: /static/
Read environment variables from: /label-studio/data/.env
get 'SECRET_KEY' casted as '<class 'str'>' with default ''
[Tracing] Create new propagation context: {'trace_id': 'b1aeafb6179c46c180ce2d2c178fac11', 'span_id': 'a562ebc486c5a053', 'parent_span_id': None, 'dynamic_sampling_context': None}
Starting new HTTPS connection (1): pypi.org:443
https://pypi.org:443 "GET /pypi/label-studio/json HTTP/1.1" 200 32487
/usr/local/lib/python3.10/dist-packages/pydantic/_internal/_fields.py:160: UserWarning: Field "model_provider_connection_create" has conflict with protected namespace "model_".

You may be able to resolve this warning by setting `model_config['protected_namespaces'] = ()`.
  warnings.warn(
/usr/local/lib/python3.10/dist-packages/pydantic/_internal/_fields.py:160: UserWarning: Field "model_provider_connection_view" has conflict with protected namespace "model_".

You may be able to resolve this warning by setting `model_config['protected_namespaces'] = ()`.
  warnings.warn(
/usr/local/lib/python3.10/dist-packages/pydantic/_internal/_fields.py:160: UserWarning: Field "model_provider_connection_change" has conflict with protected namespace "model_".

You may be able to resolve this warning by setting `model_config['protected_namespaces'] = ()`.
  warnings.warn(
/usr/local/lib/python3.10/dist-packages/pydantic/_internal/_fields.py:160: UserWarning: Field "model_provider_connection_delete" has conflict with protected namespace "model_".

You may be able to resolve this warning by setting `model_config['protected_namespaces'] = ()`.
  warnings.warn(
Operations to perform:
  Apply all migrations: admin, auth, authtoken, contenttypes, core, data_export, data_import, data_manager, django_rq, io_storages, labels_manager, ml, ml_model_providers, ml_models, organizations, projects, sessions, tasks, users, webhooks
Running migrations:
  No migrations to apply.
jombooth commented 3 months ago

Ah, I should have mentioned that it'll be necessary to switch your label studio version to the later one that you're trying to run before running the above steps :sweat_smile:. Try changing your version to 1.10 and rebuilding your containers (docker-compose up --build) before the steps I shared above.

mkrupczak3 commented 3 months ago

I had updated the containers to 1.10 and used --force-recreate, still no effect.

Encountering a crash loop now with the following output:

Operations to perform:
  Apply all migrations: admin, auth, authtoken, contenttypes, core, data_export, data_import, data_manager, django_rq, io_storages, labels_manager, ml, organizations, projects, sessions, tasks, users, webhooks
Running migrations:
  No migrations to apply.
=> Migrations completed.
./deploy/docker-entrypoint.sh: Launching /label-studio/deploy/docker-entrypoint.d/app/31-run-label-studio-init.sh
=> Run label-studio init...
=> Database and media directory: /label-studio/data
=> Static URL is set to: /static/
=> Database and media directory: /label-studio/data
=> Static URL is set to: /static/
Read environment variables from: /label-studio/data/.env
get 'SECRET_KEY' casted as '<class 'str'>' with default ''
[Tracing] Create new propagation context: {'trace_id': '619567a7df2b40ab9322b9c2cd5c6041', 'span_id': '8d19de90a697f9c7', 'parent_span_id': None, 'dynamic_sampling_context': None}
Starting new HTTPS connection (1): pypi.org:443
https://pypi.org:443 "GET /pypi/label-studio/json HTTP/1.1" 200 32487

   ╔══════════════════════════════════════╗
   ║                                      ║
   ║   Update available 1.10.0 → 1.13.0   ║
   ║   Run pip install -U label-studio    ║
   ║                                      ║
   ╚══════════════════════════════════════╝

Traceback (most recent call last):
  File "/usr/local/lib/python3.10/dist-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
psycopg2.errors.UndefinedColumn: column htx_user.is_deleted does not exist
LINE 1: ...", "htx_user"."is_staff", "htx_user"."is_active", "htx_user"...
                                                             ^

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/local/bin/label-studio", line 6, in <module>
    sys.exit(main())
  File "/label-studio/label_studio/server.py", line 353, in main
    _init(input_args, config)
  File "/label-studio/label_studio/server.py", line 189, in _init
    user = _create_user(input_args, config)
  File "/label-studio/label_studio/server.py", line 141, in _create_user
    user = User.objects.filter(email=DEFAULT_USERNAME).first()
  File "/usr/local/lib/python3.10/dist-packages/django/db/models/query.py", line 674, in first
    for obj in (self if self.ordered else self.order_by('pk'))[:1]:
  File "/usr/local/lib/python3.10/dist-packages/django/db/models/query.py", line 280, in __iter__
    self._fetch_all()
  File "/usr/local/lib/python3.10/dist-packages/django/db/models/query.py", line 1324, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "/usr/local/lib/python3.10/dist-packages/django/db/models/query.py", line 51, in __iter__
    results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)
  File "/usr/local/lib/python3.10/dist-packages/django/db/models/sql/compiler.py", line 1175, in execute_sql
    cursor.execute(sql, params)
  File "/usr/local/lib/python3.10/dist-packages/sentry_sdk/integrations/django/__init__.py", line 629, in execute
    return real_execute(self, sql, params)
  File "/usr/local/lib/python3.10/dist-packages/django/db/backends/utils.py", line 66, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "/usr/local/lib/python3.10/dist-packages/django/db/backends/utils.py", line 75, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "/usr/local/lib/python3.10/dist-packages/django/db/backends/utils.py", line 79, in _execute
    with self.db.wrap_database_errors:
  File "/usr/local/lib/python3.10/dist-packages/django/db/utils.py", line 90, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/usr/local/lib/python3.10/dist-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: column htx_user.is_deleted does not exist
LINE 1: ...", "htx_user"."is_staff", "htx_user"."is_active", "htx_user"...
                                                             ^
mkrupczak3 commented 3 months ago

I attempted with Caitlin's instructions via support thread, adding python3 label_studio/manage.py migrate in front of the label-studio run command in my docker compose file. I encountered the same issue where the script does not recognize the need for a migration:

[mwk@sisyphus label-studio]$ docker logs -f label-studio-app-1 
=> Database and media directory: /label-studio/data
=> Static URL is set to: /static/
Read environment variables from: /label-studio/data/.env
get 'SECRET_KEY' casted as '<class 'str'>' with default ''
[Tracing] Create new propagation context: {'trace_id': 'fc21c095aa7f48f8b5559893f13ee8ed', 'span_id': 'b3606cde1ece73e0', 'parent_span_id': None, 'dynamic_sampling_context': None}
Starting new HTTPS connection (1): pypi.org:443
https://pypi.org:443 "GET /pypi/label-studio/json HTTP/1.1" 200 32487

   ╔══════════════════════════════════════╗
   ║                                      ║
   ║   Update available 1.10.0 → 1.13.0   ║
   ║   Run pip install -U label-studio    ║
   ║                                      ║
   ╚══════════════════════════════════════╝

Operations to perform:
  Apply all migrations: admin, auth, authtoken, contenttypes, core, data_export, data_import, data_manager, django_rq, io_storages, labels_manager, ml, organizations, projects, sessions, tasks, users, webhooks
Running migrations:
  No migrations to apply.
=> Database and media directory: /label-studio/data
=> Static URL is set to: /static/
=> Database and media directory: /label-studio/data
=> Static URL is set to: /static/
Read environment variables from: /label-studio/data/.env
get 'SECRET_KEY' casted as '<class 'str'>' with default ''
[Tracing] Create new propagation context: {'trace_id': '5f476ba88a104eeab5ee9cbd224508b9', 'span_id': 'be2a2622b2852857', 'parent_span_id': None, 'dynamic_sampling_context': None}
Starting new HTTPS connection (1): pypi.org:443
https://pypi.org:443 "GET /pypi/label-studio/json HTTP/1.1" 200 32487

   ╔══════════════════════════════════════╗
   ║                                      ║
   ║   Update available 1.10.0 → 1.13.0   ║
   ║   Run pip install -U label-studio    ║
   ║                                      ║
   ╚══════════════════════════════════════╝

Performing system checks...

System check identified no issues (1 silenced).
August 09, 2024 - 22:04:44
Django version 3.2.23, using settings 'core.settings.label_studio'
Starting development server at http://0.0.0.0:8080/
Quit the server with CONTROL-C.
^C
[mwk@sisyphus label-studio]$ docker ps
CONTAINER ID   IMAGE                             COMMAND                  CREATED          STATUS          PORTS                                                                                          NAMES
e59e2da8252c   heartexlabs/label-studio:1.10.0   "./deploy/docker-ent…"   27 seconds ago   Up 26 seconds   8080/tcp, 0.0.0.0:8080->8085/tcp, :::8080->8085/tcp, 0.0.0.0:443->8086/tcp, :::443->8086/tcp   labelstudio_nginx
481482c38476   heartexlabs/label-studio:1.10.0   "./deploy/docker-ent…"   27 seconds ago   Up 26 seconds   8000/tcp, 8080/tcp                                                                             label-studio-app-1
0024171a07d4   postgres:11.5                     "docker-entrypoint.s…"   27 seconds ago   Up 27 seconds   5432/tcp                                                                                       label-studio-db-1
[mwk@sisyphus label-studio]$ docker exec -it label-studio-app-1 /bin/bash
groups: cannot find name for group ID 968
I have no name!@481482c38476:~$ python3 label_studio/manage.py migrate
=> Database and media directory: /label-studio/data
=> Static URL is set to: /static/
Read environment variables from: /label-studio/data/.env
get 'SECRET_KEY' casted as '<class 'str'>' with default ''
[Tracing] Create new propagation context: {'trace_id': '421a58c2ec8048009592626cadef7009', 'span_id': 'a35cbd3d8c770d95', 'parent_span_id': None, 'dynamic_sampling_context': None}
Starting new HTTPS connection (1): pypi.org:443
https://pypi.org:443 "GET /pypi/label-studio/json HTTP/1.1" 200 32487

   ╔══════════════════════════════════════╗
   ║                                      ║
   ║   Update available 1.10.0 → 1.13.0   ║
   ║   Run pip install -U label-studio    ║
   ║                                      ║
   ╚══════════════════════════════════════╝

Operations to perform:
  Apply all migrations: admin, auth, authtoken, contenttypes, core, data_export, data_import, data_manager, django_rq, io_storages, labels_manager, ml, organizations, projects, sessions, tasks, users, webhooks
Running migrations:
  No migrations to apply.
mkrupczak3 commented 3 months ago

I attempted to upgrade label-studio using pip in the container then migrate, but also encountered an error:

I have no name!@87daec1c0581:~/label_studio$ python3 manage.py migrate
=> Database and media directory: /label-studio/data
=> Static URL is set to: /static/
Read environment variables from: /label-studio/data/.env
get 'SECRET_KEY' casted as '<class 'str'>' with default ''
[Tracing] Create new propagation context: {'trace_id': '4793a218e98048abbacb2a82e383f4c1', 'span_id': '858fa8a94b687139', 'parent_span_id': None, 'dynamic_sampling_context': None}
Starting new HTTPS connection (1): pypi.org:443
https://pypi.org:443 "GET /pypi/label-studio/json HTTP/1.1" 200 32487
Traceback (most recent call last):
  File "/label-studio/label_studio/manage.py", line 23, in <module>
    execute_from_command_line(sys.argv)
  File "/label-studio/.local/lib/python3.10/site-packages/django/core/management/__init__.py", line 419, in execute_from_command_line
    utility.execute()
  File "/label-studio/.local/lib/python3.10/site-packages/django/core/management/__init__.py", line 395, in execute
    django.setup()
  File "/label-studio/.local/lib/python3.10/site-packages/django/__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/label-studio/.local/lib/python3.10/site-packages/django/apps/registry.py", line 114, in populate
    app_config.import_models()
  File "/label-studio/.local/lib/python3.10/site-packages/django/apps/config.py", line 301, in import_models
    self.models_module = import_module(models_module_name)
  File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 883, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "/label-studio/label_studio/data_export/models.py", line 21, in <module>
    from tasks.models import Annotation
  File "/label-studio/label_studio/tasks/models.py", line 27, in <module>
    from data_manager.managers import PreparedTaskManager, TaskManager
  File "/label-studio/label_studio/data_manager/managers.py", line 26, in <module>
    class _Operator(BaseModel):
  File "/label-studio/.local/lib/python3.10/site-packages/pydantic/_internal/_model_construction.py", line 96, in __new__
    private_attributes = inspect_namespace(
  File "/label-studio/.local/lib/python3.10/site-packages/pydantic/_internal/_model_construction.py", line 401, in inspect_namespace
    raise PydanticUserError(
pydantic.errors.PydanticUserError: A non-annotated attribute was detected: `EQUAL = 'equal'`. All model fields require a type annotation; if `EQUAL` is not meant to be a field, you may be able to resolve this error by annotating it as a `ClassVar` or updating `model_config['ignored_types']`.

For further information visit https://errors.pydantic.dev/2.8/u/model-field-missing-annotation
Sentry is attempting to send 2 pending events
Waiting up to 2 seconds
Press Ctrl-C to quit
jombooth commented 3 months ago

I'm not really sure what effect upgrading with pip inside the container would have. Can you instead try Label Studio 1.11.0 and rebuild your containers? I think I understand what happened here; I suspect a newer version of LS was running at some point and it ran the migration 0009_auto_20231201_0001 which will delete your user.is_deleted column.

mkrupczak3 commented 3 months ago

I'll try that soon

I should note: I'm re-creating the containers each time, but not building myself (using the pre-built images from docker hub)

mkrupczak3 commented 3 months ago

Tried label studio 1.11.0 but still no luck:

I have no name!@31d472712473:~/label_studio$ python3 manage.py migrate
=> Database and media directory: /label-studio/data
=> Static URL is set to: /static/
Read environment variables from: /label-studio/data/.env
get 'SECRET_KEY' casted as '<class 'str'>' with default ''
[Tracing] Create new propagation context: {'trace_id': '801039114d63486990b4f5740d4b7305', 'span_id': 'b4169a4087a3b941', 'parent_span_id': None, 'dynamic_sampling_context': None}
Starting new HTTPS connection (1): pypi.org:443
https://pypi.org:443 "GET /pypi/label-studio/json HTTP/1.1" 200 32487

   ╔══════════════════════════════════════╗
   ║                                      ║
   ║   Update available 1.11.0 → 1.13.0   ║
   ║   Run pip install -U label-studio    ║
   ║                                      ║
   ╚══════════════════════════════════════╝

Operations to perform:
  Apply all migrations: admin, auth, authtoken, contenttypes, core, data_export, data_import, data_manager, django_rq, io_storages, labels_manager, ml, organizations, projects, sessions, tasks, users, webhooks
Running migrations:
  No migrations to apply.
mkrupczak3 commented 3 months ago

Here is our docker-compose.yml file BTW:

version: "3.9"
services:
  nginx:
    user: "1001:968"
    build: .
    image: heartexlabs/label-studio:1.9.0
    restart: unless-stopped
    container_name: labelstudio_nginx
    ports:
      - "8080:8085"
      - "443:8086"
    depends_on:
      - app
    environment:
      - LABEL_STUDIO_HOST=${LABEL_STUDIO_HOST:-}
    #   Optional: Specify SSL termination certificate & key
    #   Just drop your cert.pem and cert.key into folder 'deploy/nginx/certs'
      - NGINX_SSL_CERT=/certs/cert.pem
      - NGINX_SSL_CERT_KEY=/certs/cert.key
    volumes:
      - /theta/label-studio/data:/label-studio/data:rw
    # - /etc/letsencrypt/live/sisyphus.theta.limited:/certs:ro
      - /etc/letsencrypt/live/sisyphus.theta.limited/cert.pem:/certs/cert.pem
      - /etc/letsencrypt/live/sisyphus.theta.limited/chain.pem:/certs/chain.pem
      - /etc/letsencrypt/live/sisyphus.theta.limited/fullchain.pem:/certs/fullchain.pem
      - /etc/letsencrypt/live/sisyphus.theta.limited/privkey.pem:/certs/privkey.pem      
    #   Optional: Override nginx default conf
      - /theta/projects/label-studio/nginx.conf:/etc/nginx/nginx.conf
    command: nginx

  app:
    user: "1001:968"
    stdin_open: true
    tty: true
    build: .
    image: heartexlabs/label-studio:1.9.0
    restart: unless-stopped
    expose:
      - "8000"
    depends_on:
      - db
    environment:
      - LABEL_STUDIO_LOCAL_FILES_SERVING_ENABLED=true
      - LABEL_STUDIO_LOCAL_FILES_DOCUMENT_ROOT=/theta
      - LABEL_STUDIO_DISABLE_SIGNUP_WITHOUT_LINK=true
      - DJANGO_DB=default
      - POSTGRE_NAME=postgres
      - POSTGRE_USER=postgres
      - POSTGRE_PASSWORD=
      - POSTGRE_PORT=5432
      - POSTGRE_HOST=db
      - LABEL_STUDIO_HOST=${LABEL_STUDIO_HOST:-}
      - JSON_LOG=1
    #      - LOG_LEVEL=DEBUG
    volumes:
      - /theta/label-studio/data:/label-studio/data:rw
      - /theta:/theta:rw
    command: label-studio-uwsgi

  db:
    image: postgres:11.5
    hostname: db
    restart: unless-stopped
    # Optional: Enable TLS on PostgreSQL
    # Just drop your server.crt and server.key into folder 'deploy/pgsql/certs'
    # NOTE: Both files must have permissions u=rw (0600) or less
    #    command: >
    #      -c ssl=on
    #      -c ssl_cert_file=/var/lib/postgresql/certs/server.crt
    #      -c ssl_key_file=/var/lib/postgresql/certs/server.key
    environment:
      - POSTGRES_HOST_AUTH_METHOD=trust
    volumes:
      - /theta/postgres-data:/var/lib/postgresql/data
      - /theta/projects/label-studio/deploy/pgsql/certs:/var/lib/postgresql/certs:ro
jombooth commented 3 months ago

Tried label studio 1.11.0 but still no luck:

I have no name!@31d472712473:~/label_studio$ python3 manage.py migrate
=> Database and media directory: /label-studio/data
=> Static URL is set to: /static/
Read environment variables from: /label-studio/data/.env
get 'SECRET_KEY' casted as '<class 'str'>' with default ''
[Tracing] Create new propagation context: {'trace_id': '801039114d63486990b4f5740d4b7305', 'span_id': 'b4169a4087a3b941', 'parent_span_id': None, 'dynamic_sampling_context': None}
Starting new HTTPS connection (1): pypi.org:443
https://pypi.org:443 "GET /pypi/label-studio/json HTTP/1.1" 200 32487

   ╔══════════════════════════════════════╗
   ║                                      ║
   ║   Update available 1.11.0 → 1.13.0   ║
   ║   Run pip install -U label-studio    ║
   ║                                      ║
   ╚══════════════════════════════════════╝

Operations to perform:
  Apply all migrations: admin, auth, authtoken, contenttypes, core, data_export, data_import, data_manager, django_rq, io_storages, labels_manager, ml, organizations, projects, sessions, tasks, users, webhooks
Running migrations:
  No migrations to apply.

I don't think the fact that no migrations were found indicates a problem; rather I think this demonstrates that indeed, a newer version of Label Studio had been running previously, which is why attempts to run earlier versions without rolling back the migrations from 1.11 led to errors. What happens now if you docker-compose up --build with the image tags in your compose file bumped up to 1.11? That is, heartexlabs/label-studio:1.9.0 replaced with heartexlabs/label-studio:1.11.0?

mkrupczak3 commented 3 months ago

Can't use --build as I don't have the Dockerfile locally. Pulling the images from dockerhub.

I do use --force-recreate though but have still been encountering the issue. Here is the full output from docker-compose on startup and with a web browser client connecting and encountering the blank page issue:

[mwk@sisyphus label-studio]$ docker-compose up --build --force-recreate
WARN[0000] /theta/projects/label-studio/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion 
[+] Building 0.0s (2/2) FINISHED                                 docker:default
 => [app internal] load .dockerignore                                      0.0s
 => => transferring context: 2B                                            0.0s
 => [app internal] load build definition from Dockerfile                   0.0s
 => => transferring dockerfile: 2B                                         0.0s
failed to solve: failed to read dockerfile: open /var/lib/docker/tmp/buildkit-mount2565012794/Dockerfile: no such file or directory
[mwk@sisyphus label-studio]$ docker-compose up --force-recreate
WARN[0000] /theta/projects/label-studio/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion 
[+] Running 4/4
 ✔ Network label-studio_default  Created                                   0.2s 
 ✔ Container label-studio-db-1   Created                                   0.0s 
 ✔ Container label-studio-app-1  Created                                   0.0s 
 ✔ Container labelstudio_nginx   Created                                   0.0s 
Attaching to app-1, db-1, labelstudio_nginx
db-1               | 2024-08-12 19:11:38.519 UTC [1] LOG:  listening on IPv4 address "0.0.0.0", port 5432
db-1               | 2024-08-12 19:11:38.519 UTC [1] LOG:  listening on IPv6 address "::", port 5432
db-1               | 2024-08-12 19:11:38.524 UTC [1] LOG:  listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
db-1               | 2024-08-12 19:11:38.549 UTC [24] LOG:  database system was shut down at 2024-08-12 19:11:21 UTC
db-1               | 2024-08-12 19:11:38.555 UTC [1] LOG:  database system is ready to accept connections
app-1              | ./deploy/docker-entrypoint.sh: Looking for init scripts in /label-studio/deploy/docker-entrypoint.d/app/
app-1              | ./deploy/docker-entrypoint.sh: Launching /label-studio/deploy/docker-entrypoint.d/app/11-configure-custom-cabundle.sh
app-1              | ./deploy/docker-entrypoint.sh: Launching /label-studio/deploy/docker-entrypoint.d/app/20-wait-for-db.sh
app-1              | => Waiting for postgres...
app-1              | => Postgres is up.
app-1              | ./deploy/docker-entrypoint.sh: Launching /label-studio/deploy/docker-entrypoint.d/app/30-run-db-migrations.sh
app-1              | => Do database migrations...
labelstudio_nginx  | ./deploy/docker-entrypoint.sh: Looking for init scripts in /label-studio/deploy/docker-entrypoint.d/nginx/
labelstudio_nginx  | ./deploy/docker-entrypoint.sh: Launching /label-studio/deploy/docker-entrypoint.d/nginx/10-configure-nginx.sh
labelstudio_nginx  | => Copy nginx config file...
labelstudio_nginx  | => Configure system resolver...
labelstudio_nginx  | => Replacing nginx certs...
labelstudio_nginx  | => Successfully replaced nginx certs.
labelstudio_nginx  | => Replacing app endpoint...
labelstudio_nginx  | => Successfully replaced app endpoint.
labelstudio_nginx  | => Skipping adding subpath to nginx config.
labelstudio_nginx  | ./deploy/docker-entrypoint.sh: Configuration complete; ready for start up
app-1              | => Database and media directory: /label-studio/data
app-1              | => Static URL is set to: /static/
app-1              | Read environment variables from: /label-studio/data/.env
app-1              | get 'SECRET_KEY' casted as '<class 'str'>' with default REDACTED
app-1              | [Tracing] Create new propagation context: {'trace_id': 'REDACTED', 'span_id': 'REDACTED', 'parent_span_id': None, 'dynamic_sampling_context': None}
app-1              | Starting new HTTPS connection (1): pypi.org:443
app-1              | https://pypi.org:443 "GET /pypi/label-studio/json HTTP/1.1" 200 32487
app-1              | 
app-1              |    ╔══════════════════════════════════════╗
app-1              |    ║                                      ║
app-1              |    ║   Update available 1.11.0 → 1.13.0   ║
app-1              |    ║   Run pip install -U label-studio    ║
app-1              |    ║                                      ║
app-1              |    ╚══════════════════════════════════════╝
app-1              | 
app-1              | Operations to perform:
app-1              |   Apply all migrations: admin, auth, authtoken, contenttypes, core, data_export, data_import, data_manager, django_rq, io_storages, labels_manager, ml, organizations, projects, sessions, tasks, users, webhooks
app-1              | Running migrations:
app-1              |   No migrations to apply.
app-1              | => Migrations completed.
app-1              | ./deploy/docker-entrypoint.sh: Launching /label-studio/deploy/docker-entrypoint.d/app/31-run-label-studio-init.sh
app-1              | => Run label-studio init...
app-1              | => Database and media directory: /label-studio/data
app-1              | => Static URL is set to: /static/
app-1              | => Database and media directory: /label-studio/data
app-1              | => Static URL is set to: /static/
app-1              | Read environment variables from: /label-studio/data/.env
app-1              | get 'SECRET_KEY' casted as '<class 'str'>' with default ''
app-1              | [Tracing] Create new propagation context: {'trace_id': 'REDACTED', 'span_id': 'REDACTED', 'parent_span_id': None, 'dynamic_sampling_context': None}
app-1              | Starting new HTTPS connection (1): pypi.org:443
app-1              | https://pypi.org:443 "GET /pypi/label-studio/json HTTP/1.1" 200 32487
app-1              | 
app-1              |    ╔══════════════════════════════════════╗
app-1              |    ║                                      ║
app-1              |    ║   Update available 1.11.0 → 1.13.0   ║
app-1              |    ║   Run pip install -U label-studio    ║
app-1              |    ║                                      ║
app-1              |    ╚══════════════════════════════════════╝
app-1              | 
app-1              | 
app-1              | Label Studio has been successfully initialized.
app-1              | => label-studio init completed.
app-1              | ./deploy/docker-entrypoint.sh: Configuration complete; ready for start up
app-1              | [uWSGI] getting INI configuration from /label-studio/deploy/uwsgi.ini
app-1              | [log-encoder] registered format:applogger ${msg}
app-1              | [log-encoder] registered json:default {"timestamp": "${strftime:%d/%b/%Y:%H:%M:%S %z}", "source": "uwsgi", "levelname": "INFO", "message": "${msg}"}
app-1              | [log-encoder] registered nl
app-1              | *** Starting uWSGI 2.0.23 (64bit) on [Mon Aug 12 19:11:46 2024] ***
app-1              | 
app-1              | compiled with version: 11.4.0 on 17 January 2024 05:44:29
app-1              | 
app-1              | os: Linux-4.18.0-513.9.1.el8_9.x86_64 #1 SMP Sat Dec 2 05:23:44 EST 2023
app-1              | 
app-1              | nodename: REDACTED
app-1              | 
app-1              | machine: x86_64
app-1              | 
app-1              | clock source: unix
app-1              | 
app-1              | detected number of CPU cores: 4
app-1              | 
app-1              | current working directory: /label-studio
app-1              | 
app-1              | writing pidfile to /tmp/uwsgi.pid
app-1              | 
app-1              | detected binary path: /usr/local/bin/uwsgi
app-1              | 
app-1              | !!! no internal routing support, rebuild with pcre support !!!
app-1              | 
app-1              | chdir() to /label-studio/label_studio
app-1              | 
app-1              | your memory page size is 4096 bytes
app-1              | 
app-1              | detected max file descriptor number: 1048576
app-1              | 
app-1              | lock engine: pthread robust mutexes
app-1              | 
app-1              | thunder lock: enabled
app-1              | 
app-1              | uWSGI http bound on :8000 fd 8
app-1              | 
app-1              | uwsgi socket 0 bound to TCP address 127.0.0.1:35247 (port auto-assigned) fd 7
app-1              | 
app-1              | Python version: 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0]
app-1              | 
app-1              | Python main interpreter initialized at 0x56413ed2d2a0
app-1              | 
app-1              | python threads support enabled
app-1              | 
app-1              | your server socket listen backlog is limited to 100 connections
app-1              | 
app-1              | your mercy for graceful operations on workers is 3 seconds
app-1              | 
app-1              | mapped 712755 bytes (696 KB) for 4 cores
app-1              | 
app-1              | *** Operational MODE: preforking ***
app-1              | 
app-1              | spawned uWSGI master process (pid: 1)
app-1              | 
app-1              | spawned uWSGI worker 1 (pid: 39, cores: 1)
app-1              | 
app-1              | spawned uWSGI worker 2 (pid: 40, cores: 1)
app-1              | 
app-1              | spawned uWSGI worker 3 (pid: 41, cores: 1)
app-1              | 
app-1              | spawned uWSGI worker 4 (pid: 42, cores: 1)
app-1              | 
app-1              | *** Stats server enabled on :1717 fd: 22 ***
app-1              | 
app-1              | spawned uWSGI http 1 (pid: 43)
app-1              | 
app-1              | => Database and media directory: /label-studio/data
app-1              | 
app-1              | => Static URL is set to: /static/
app-1              | 
app-1              | => Database and media directory: /label-studio/data
app-1              | 
app-1              | => Database and media directory: /label-studio/data
app-1              | 
app-1              | => Database and media directory: /label-studio/data
app-1              | 
app-1              | => Static URL is set to: /static/
app-1              | 
app-1              | => Static URL is set to: /static/
app-1              | 
app-1              | => Static URL is set to: /static/
app-1              | 
app-1              | Read environment variables from: /label-studio/data/.env
app-1              | 
app-1              | Read environment variables from: /label-studio/data/.env
app-1              | 
app-1              | Read environment variables from: /label-studio/data/.env
app-1              | 
app-1              | Read environment variables from: /label-studio/data/.env
app-1              | 
app-1              | get 'SECRET_KEY' casted as '<class 'str'>' with default REDACTED
app-1              | 
app-1              | get 'SECRET_KEY' casted as '<class 'str'>' with default REDACTED
app-1              | 
app-1              | get 'SECRET_KEY' casted as '<class 'str'>' with default REDACTED
app-1              | 
app-1              | get 'SECRET_KEY' casted as '<class 'str'>' with default REDACTED
app-1              | 
app-1              | [Tracing] Create new propagation context: {'trace_id': 'REDACTED', 'span_id': 'REDACTED', 'parent_span_id': None, 'dynamic_sampling_context': None}
app-1              | 
app-1              | [Tracing] Create new propagation context: {'trace_id': 'REDACTED', 'span_id': 'REDACTED', 'parent_span_id': None, 'dynamic_sampling_context': None}
app-1              | 
app-1              | [Tracing] Create new propagation context: {'trace_id': 'REDACTED', 'span_id': 'REDACTED', 'parent_span_id': None, 'dynamic_sampling_context': None}
app-1              | 
app-1              | [Tracing] Create new propagation context: {'trace_id': 'REDACTED', 'span_id': 'REDACTED', 'parent_span_id': None, 'dynamic_sampling_context': None}
app-1              | 
app-1              | WSGI app 0 (mountpoint='') ready in 3 seconds on interpreter 0x56413ed2d2a0 pid: 39 (default app)
app-1              | 
app-1              | WSGI app 0 (mountpoint='') ready in 3 seconds on interpreter 0x56413ed2d2a0 pid: 41 (default app)
app-1              | 
app-1              | WSGI app 0 (mountpoint='') ready in 3 seconds on interpreter 0x56413ed2d2a0 pid: 40 (default app)
app-1              | 
app-1              | WSGI app 0 (mountpoint='') ready in 3 seconds on interpreter 0x56413ed2d2a0 pid: 42 (default app)
app-1              | 
labelstudio_nginx  | {"timestamp":"1723489912906","http":{"method":"GET","request_id":"dfcc3b28b5c89b0876746e5d4349cf63","status_code":302,"content_type":"","useragent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:129.0) Gecko/20100101 Firefox/129.0","referrer":"","x_forwarded_for":"","url":"/","version":"HTTP/1.1","connection":"1","connection_requests":"1"},"network":{"bytes_written":1601,"bytes_read":1063,"client":{"ip":"172.29.0.1","port":53224},"destination":{"ip":"172.29.0.4","port":8086},"nginx":{"request_time":"0.334","upstream_connect_time":"0.001","upstream_response_time":"0.335","upstream_header_time":"0.335"}}}
labelstudio_nginx  | {"timestamp":"1723489913293","http":{"method":"GET","request_id":"e054ce69f9a58b4c091eaf2740190d58","status_code":200,"content_type":"","useragent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:129.0) Gecko/20100101 Firefox/129.0","referrer":"","x_forwarded_for":"","url":"/sw.js","version":"HTTP/1.1","connection":"1","connection_requests":"2"},"network":{"bytes_written":7656,"bytes_read":991,"client":{"ip":"172.29.0.1","port":53224},"destination":{"ip":"172.29.0.4","port":8086},"nginx":{"request_time":"0.294","upstream_connect_time":"0.001","upstream_response_time":"0.295","upstream_header_time":"0.295"}}}
labelstudio_nginx  | {"timestamp":"1723489913511","http":{"method":"GET","request_id":"206be0bbff912a1351dfd36d3a05fe4a","status_code":200,"content_type":"","useragent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:129.0) Gecko/20100101 Firefox/129.0","referrer":"","x_forwarded_for":"","url":"/projects/","version":"HTTP/1.1","connection":"4","connection_requests":"1"},"network":{"bytes_written":8602,"bytes_read":1072,"client":{"ip":"172.29.0.1","port":53228},"destination":{"ip":"172.29.0.4","port":8086},"nginx":{"request_time":"0.464","upstream_connect_time":"0.001","upstream_response_time":"0.464","upstream_header_time":"0.464"}}}
labelstudio_nginx  | {"timestamp":"1723489913628","http":{"method":"GET","request_id":"53ed7645af21612f145b9233d4458ab2","status_code":200,"content_type":"","useragent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:129.0) Gecko/20100101 Firefox/129.0","referrer":"https://localhost:8443/projects/","x_forwarded_for":"","url":"/static/css/uikit.e49a7a43adbd.css","version":"HTTP/1.1","connection":"4","connection_requests":"2"},"network":{"bytes_written":1791,"bytes_read":998,"client":{"ip":"172.29.0.1","port":53228},"destination":{"ip":"172.29.0.4","port":8086},"nginx":{"request_time":"0.000","upstream_connect_time":"","upstream_response_time":"","upstream_header_time":""}}}
labelstudio_nginx  | {"timestamp":"1723489913629","http":{"method":"GET","request_id":"bcb663ede09354373e61a0887a7f2ba7","status_code":200,"content_type":"","useragent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:129.0) Gecko/20100101 Firefox/129.0","referrer":"https://localhost:8443/projects/","x_forwarded_for":"","url":"/static/css/main.05101f5b0b98.css","version":"HTTP/1.1","connection":"1","connection_requests":"3"},"network":{"bytes_written":5345,"bytes_read":997,"client":{"ip":"172.29.0.1","port":53224},"destination":{"ip":"172.29.0.4","port":8086},"nginx":{"request_time":"0.000","upstream_connect_time":"","upstream_response_time":"","upstream_header_time":""}}}
labelstudio_nginx  | {"timestamp":"1723489913655","http":{"method":"GET","request_id":"3e4f7e74832d2496e647c66be81a9a2a","status_code":200,"content_type":"","useragent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:129.0) Gecko/20100101 Firefox/129.0","referrer":"https://localhost:8443/projects/","x_forwarded_for":"","url":"/static/js/Toast.min.9135be1633df.js","version":"HTTP/1.1","connection":"1","connection_requests":"4"},"network":{"bytes_written":1338,"bytes_read":1069,"client":{"ip":"172.29.0.1","port":53224},"destination":{"ip":"172.29.0.4","port":8086},"nginx":{"request_time":"0.000","upstream_connect_time":"","upstream_response_time":"","upstream_header_time":""}}}
labelstudio_nginx  | {"timestamp":"1723489913655","http":{"method":"GET","request_id":"1ae1b697a19b5d29f9a83438d177107c","status_code":200,"content_type":"","useragent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:129.0) Gecko/20100101 Firefox/129.0","referrer":"https://localhost:8443/projects/","x_forwarded_for":"","url":"/static/js/helpers.9a01b074ff58.js","version":"HTTP/1.1","connection":"4","connection_requests":"3"},"network":{"bytes_written":5014,"bytes_read":1068,"client":{"ip":"172.29.0.1","port":53228},"destination":{"ip":"172.29.0.4","port":8086},"nginx":{"request_time":"0.000","upstream_connect_time":"","upstream_response_time":"","upstream_header_time":""}}}
labelstudio_nginx  | {"timestamp":"1723489913680","http":{"method":"GET","request_id":"e51f2d343fee09a8730ca298089a5f12","status_code":200,"content_type":"","useragent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:129.0) Gecko/20100101 Firefox/129.0","referrer":"https://localhost:8443/projects/","x_forwarded_for":"","url":"/static/css/Toast.min.0479912dd9c5.css","version":"HTTP/1.1","connection":"1","connection_requests":"5"},"network":{"bytes_written":1057,"bytes_read":1085,"client":{"ip":"172.29.0.1","port":53224},"destination":{"ip":"172.29.0.4","port":8086},"nginx":{"request_time":"0.000","upstream_connect_time":"","upstream_response_time":"","upstream_header_time":""}}}
labelstudio_nginx  | 2024/08/12 19:11:53 [error] 23#23: *6 open() "/label-studio/label_studio/frontend/dist/react-app/main.css" failed (2: No such file or directory), client: 172.29.0.1, server: , request: "GET /react-app/main.css?v=a9766f HTTP/1.1", host: "localhost:8443", referrer: "https://localhost:8443/projects/"
labelstudio_nginx  | {"timestamp":"1723489913680","http":{"method":"GET","request_id":"be2db5c454f016ad1d87b633252b9020","status_code":404,"content_type":"","useragent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:129.0) Gecko/20100101 Firefox/129.0","referrer":"https://localhost:8443/projects/","x_forwarded_for":"","url":"/react-app/main.css?v=a9766f","version":"HTTP/1.1","connection":"6","connection_requests":"1"},"network":{"bytes_written":348,"bytes_read":992,"client":{"ip":"172.29.0.1","port":53244},"destination":{"ip":"172.29.0.4","port":8086},"nginx":{"request_time":"0.000","upstream_connect_time":"","upstream_response_time":"","upstream_header_time":""}}}
labelstudio_nginx  | 2024/08/12 19:11:53 [error] 25#25: *7 open() "/label-studio/label_studio/frontend/dist/react-app/main.js" failed (2: No such file or directory), client: 172.29.0.1, server: , request: "GET /react-app/main.js?v=a9766f HTTP/1.1", host: "localhost:8443", referrer: "https://localhost:8443/projects/"
labelstudio_nginx  | {"timestamp":"1723489913696","http":{"method":"GET","request_id":"b4ba95282e22b524ae27fa15db6c5a58","status_code":404,"content_type":"","useragent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:129.0) Gecko/20100101 Firefox/129.0","referrer":"https://localhost:8443/projects/","x_forwarded_for":"","url":"/react-app/main.js?v=a9766f","version":"HTTP/1.1","connection":"7","connection_requests":"1"},"network":{"bytes_written":348,"bytes_read":962,"client":{"ip":"172.29.0.1","port":53250},"destination":{"ip":"172.29.0.4","port":8086},"nginx":{"request_time":"0.000","upstream_connect_time":"","upstream_response_time":"","upstream_header_time":""}}}
labelstudio_nginx  | {"timestamp":"1723489913696","http":{"method":"GET","request_id":"80cef4896776c8df14aac429cf335805","status_code":200,"content_type":"","useragent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:129.0) Gecko/20100101 Firefox/129.0","referrer":"https://localhost:8443/projects/","x_forwarded_for":"","url":"/static/fonts/roboto/roboto.css","version":"HTTP/1.1","connection":"8","connection_requests":"1"},"network":{"bytes_written":972,"bytes_read":1078,"client":{"ip":"172.29.0.1","port":53258},"destination":{"ip":"172.29.0.4","port":8086},"nginx":{"request_time":"0.000","upstream_connect_time":"","upstream_response_time":"","upstream_header_time":""}}}
labelstudio_nginx  | {"timestamp":"1723489913703","http":{"method":"GET","request_id":"70bcf1ad71ab4bb1ead903019802a500","status_code":200,"content_type":"","useragent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:129.0) Gecko/20100101 Firefox/129.0","referrer":"https://localhost:8443/projects/","x_forwarded_for":"","url":"/static/js/jquery.min.e6c2415c0ace.js","version":"HTTP/1.1","connection":"9","connection_requests":"1"},"network":{"bytes_written":30947,"bytes_read":1072,"client":{"ip":"172.29.0.1","port":53260},"destination":{"ip":"172.29.0.4","port":8086},"nginx":{"request_time":"0.000","upstream_connect_time":"","upstream_response_time":"","upstream_header_time":""}}}
labelstudio_nginx  | 2024/08/12 19:11:53 [error] 22#22: *9 open() "/label-studio/label_studio/frontend/dist/react-app/main.js" failed (2: No such file or directory), client: 172.29.0.1, server: , request: "GET /react-app/main.js?v=a9766f HTTP/1.1", host: "localhost:8443", referrer: "https://localhost:8443/projects/"
labelstudio_nginx  | {"timestamp":"1723489913763","http":{"method":"GET","request_id":"1128909c88fed0923fb528bc27b31fbf","status_code":404,"content_type":"","useragent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:129.0) Gecko/20100101 Firefox/129.0","referrer":"https://localhost:8443/projects/","x_forwarded_for":"","url":"/react-app/main.js?v=a9766f","version":"HTTP/1.1","connection":"9","connection_requests":"2"},"network":{"bytes_written":348,"bytes_read":962,"client":{"ip":"172.29.0.1","port":53260},"destination":{"ip":"172.29.0.4","port":8086},"nginx":{"request_time":"0.000","upstream_connect_time":"","upstream_response_time":"","upstream_header_time":""}}}
labelstudio_nginx  | {"timestamp":"1723489913819","http":{"method":"GET","request_id":"94dbb5f4b43f4fd47c089066accbb373","status_code":200,"content_type":"","useragent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:129.0) Gecko/20100101 Firefox/129.0","referrer":"https://localhost:8443/static/fonts/roboto/roboto.css","x_forwarded_for":"","url":"/static/fonts/roboto/roboto-v20-latin_cyrillic-regular.woff2","version":"HTTP/1.1","connection":"9","connection_requests":"3"},"network":{"bytes_written":22931,"bytes_read":1059,"client":{"ip":"172.29.0.1","port":53260},"destination":{"ip":"172.29.0.4","port":8086},"nginx":{"request_time":"0.000","upstream_connect_time":"","upstream_response_time":"","upstream_header_time":""}}}
labelstudio_nginx  | {"timestamp":"1723489913839","http":{"method":"GET","request_id":"ee1ec809f407e23bcdfed63b418229d1","status_code":200,"content_type":"","useragent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:129.0) Gecko/20100101 Firefox/129.0","referrer":"https://localhost:8443/projects/","x_forwarded_for":"","url":"/static/images/favicon.58c0a5114450.ico","version":"HTTP/1.1","connection":"9","connection_requests":"4"},"network":{"bytes_written":22327,"bytes_read":1054,"client":{"ip":"172.29.0.1","port":53260},"destination":{"ip":"172.29.0.4","port":8086},"nginx":{"request_time":"0.000","upstream_connect_time":"","upstream_response_time":"","upstream_header_time":""}}}
labelstudio_nginx  | {"timestamp":"1723489914286","http":{"method":"GET","request_id":"db455d098636e6e9b8dcab9a783d1960","status_code":200,"content_type":"","useragent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:129.0) Gecko/20100101 Firefox/129.0","referrer":"","x_forwarded_for":"","url":"/sw.js","version":"HTTP/1.1","connection":"9","connection_requests":"5"},"network":{"bytes_written":7656,"bytes_read":974,"client":{"ip":"172.29.0.1","port":53260},"destination":{"ip":"172.29.0.4","port":8086},"nginx":{"request_time":"0.283","upstream_connect_time":"0.001","upstream_response_time":"0.283","upstream_header_time":"0.283"}}}
^CGracefully stopping... (press Ctrl+C again to force)
mkrupczak3 commented 3 months ago

g new HTTPS connection (1): pypi.org:443 https://pypi.org:443 "GET /pypi/label-studio/json HTTP/1.1" 200 32487

And actually, the earlier label-studio 1.9.0 runs fine while any later versions seem to choke on the data due to the following:

django.db.utils.ProgrammingError: column htx_user.is_deleted does not exist
jombooth commented 3 months ago

This makes sense; the column discussed was added and then removed, so a version of LS that predates the column will also work. Your logs from Docker show the backend seemingly working okay with 1.11, so let's proceed from there. Do you see anything on the js console when you're running 1.11 and try to open the app?

mkrupczak3 commented 3 months ago

JS console shows a 404 error upon page load:

image

I should note I am accessing the server using an SSH tunnel, unsure if this is affecting it in any way

jombooth commented 3 months ago

Could you try this in the container while running 1.11, much like we did before?

$ docker compose up -d
$ docker exec -it label-studio-app-1 bash
$ cd label_studio
$ python3 manage.py collectstatic
mkrupczak3 commented 3 months ago

Here's the output from that command:

[mwk@sisyphus label-studio]$ docker exec -it label-studio-app-1 bash
groups: cannot find name for group ID 968
I have no name!@bb385964aae4:~$ cd label_studio/
I have no name!@bb385964aae4:~/label_studio$ python3 manage.py collectstatic
=> Database and media directory: /label-studio/data
=> Static URL is set to: /static/
Read environment variables from: /label-studio/data/.env
get 'SECRET_KEY' casted as '<class 'str'>' with default ''
[Tracing] Create new propagation context: {'trace_id': 'b4164a462b2c4d31b1b5add989c61cd7', 'span_id': 'a30f55185d4723d6', 'parent_span_id': None, 'dynamic_sampling_context': None}
Starting new HTTPS connection (1): pypi.org:443
https://pypi.org:443 "GET /pypi/label-studio/json HTTP/1.1" 200 32487

   ╔══════════════════════════════════════╗
   ║                                      ║
   ║   Update available 1.11.0 → 1.13.0   ║
   ║   Run pip install -U label-studio    ║
   ║                                      ║
   ╚══════════════════════════════════════╝

You have requested to collect static files at the destination
location as specified in your settings:

    /label-studio/label_studio/core/static_build

This will overwrite existing files!
Are you sure you want to do this?

Type 'yes' to continue, or 'no' to cancel: yes
Found another file with the destination path 'drf-yasg/redoc/redoc.min.js'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'css/Toast.min.css'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'css/codemirror.css'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'css/error.css'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'css/login.css'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'css/main.css'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'css/uikit.css'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'css/users.css'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'drf-yasg/redoc/redoc.min.js'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'fonts/roboto/roboto-v20-latin_cyrillic-300.eot'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'fonts/roboto/roboto-v20-latin_cyrillic-300.svg'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'fonts/roboto/roboto-v20-latin_cyrillic-300.ttf'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'fonts/roboto/roboto-v20-latin_cyrillic-300.woff'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'fonts/roboto/roboto-v20-latin_cyrillic-300.woff2'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'fonts/roboto/roboto-v20-latin_cyrillic-500.eot'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'fonts/roboto/roboto-v20-latin_cyrillic-500.svg'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'fonts/roboto/roboto-v20-latin_cyrillic-500.ttf'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'fonts/roboto/roboto-v20-latin_cyrillic-500.woff'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'fonts/roboto/roboto-v20-latin_cyrillic-500.woff2'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'fonts/roboto/roboto-v20-latin_cyrillic-500italic.eot'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'fonts/roboto/roboto-v20-latin_cyrillic-500italic.svg'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'fonts/roboto/roboto-v20-latin_cyrillic-500italic.ttf'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'fonts/roboto/roboto-v20-latin_cyrillic-500italic.woff'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'fonts/roboto/roboto-v20-latin_cyrillic-500italic.woff2'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'fonts/roboto/roboto-v20-latin_cyrillic-italic.eot'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'fonts/roboto/roboto-v20-latin_cyrillic-italic.svg'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'fonts/roboto/roboto-v20-latin_cyrillic-italic.ttf'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'fonts/roboto/roboto-v20-latin_cyrillic-italic.woff'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'fonts/roboto/roboto-v20-latin_cyrillic-italic.woff2'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'fonts/roboto/roboto-v20-latin_cyrillic-regular.eot'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'fonts/roboto/roboto-v20-latin_cyrillic-regular.svg'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'fonts/roboto/roboto-v20-latin_cyrillic-regular.ttf'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'fonts/roboto/roboto-v20-latin_cyrillic-regular.woff'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'fonts/roboto/roboto-v20-latin_cyrillic-regular.woff2'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'fonts/roboto/roboto.css'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'icons/arrow.svg'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'icons/cross.svg'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'icons/gear.svg'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'icons/github.svg'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'icons/logo-black.svg'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'icons/menu.svg'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'icons/office.svg'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'icons/slack.svg'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'images/favicon.ico'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'images/favicon.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'images/heidi-tip.svg'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'images/heidi.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'images/human_signal_logo.svg'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'images/label_studio_logo.svg'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'images/login-bg.svg'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'images/opossum_broken.svg'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'images/opossum_hanging.svg'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'images/opossum_looking.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'images/slack.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'js/478.chunk.js'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'js/478.chunk.js.map'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'js/Toast.min.js'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'js/decode-audio.wasm'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'js/helpers.js'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'js/jquery.min.js'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'js/luxon.min.js'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'js/sw-fallback.js'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'js/sw.js'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'js/vue.js'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'js/xml.js'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'samples/game.wav'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'samples/hypertext.html'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'samples/kittens.jpg'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'samples/kittens1.jpg'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'samples/kittens2.jpg'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'samples/opossum_snow.mp4'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'samples/paragraphs.json'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'samples/sample-task-sin.csv'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'samples/sample.jpg'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'samples/sample.mp3'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'samples/sample.pdf'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'samples/trees_in_snow.jpg'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'samples/chairs/chair1.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'samples/chairs/chair2.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'samples/chairs/chair3.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'samples/chairs/chair4.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/activity-recognition.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/asr-hypotheses.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/automatic-speech-recognition-using-segments.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/automatic-speech-recognition.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/change-point-detection.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/content-based-image-search.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/coreference-resolution-and-entity-linking.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/document-retrieval.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/freeform-metadata.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/generative-chatbot-assessment.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/generative-pairwise-human-preference.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/generative-supervised-llm.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/html-entity-recognition.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/image-captioning.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/image-classification.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/intent-classification-and-slot-filling.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/intent-classification.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/inventory-tracking.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/keypoints.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/llm-ranker.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/machine-translation.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/multipage.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/named-entity-recognition.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/object-detection-with-bounding-boxes.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/optical-character-recognition.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/outliers-anomaly-detection.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/pairwise-classification.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/pairwise-regression.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/pdf-classification.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/question-answering.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/relation-extraction.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/repeater-tag-multi-page-document-annotation.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/response-generation.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/response-selection.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/semantic-segmentation-with-masks.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/semantic-segmentation-with-polygons.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/serp-ranking.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/signal-quality-detection.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/signal-quality.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/sound-event-detection.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/speaker-segmentation.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/tabular-data.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/taxonomy.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/text-classification.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/text-summarization.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/text-to-image.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/thumbnail-audio-sentiment.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/thumbnail-conversation-sentiment.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/time-series-forecasting.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/video-classification.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/video-timeline-segmentation.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/visual-genome.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/visual-question-answering.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.
Found another file with the destination path 'templates/visual-ranker.png'. It will be ignored since only the first encountered file is collected. If this is not what you want, make sure every static file has a unique path.

0 static files copied to '/label-studio/label_studio/core/static_build', 333 unmodified, 105 post-processed.
jombooth commented 3 months ago

Chatted with a coworker about this, he suggested setting LABEL_STUDIO_HOST= (that is, having the variable be empty). Could you give that a shot?

mkrupczak3 commented 3 months ago

Will try when I get back to my desk later today

mkrupczak3 commented 3 months ago

I tried setting LABEL_STUDIO_HOST to empty for both the app and the database container, however it did not resolve the issue

farioas commented 3 months ago

This issue was fixed in 1.12.1, so please consider upgrade to this version or to the latest: 1.13.0

mkrupczak3 commented 3 months ago

@farioas I just tried using 1.13.0, it had the same issue as previous versions. The UI is completely blank on any version later than 1.9.0

mkrupczak3 commented 3 months ago

Kind of at my wit's end with this issue

punnerud commented 3 months ago

I got the same error, ended up cloning the repo and running "docker build path" locally and using that docker image for running. Now its gone if I use the newest build (1.13.2 beta). If I build locally using 1.13.1 I get the same error.

fsalmasri commented 3 months ago

I have the same issue. I didn't have it before. just suddenly happened. I tried all suggestions above nothing worked.

farioas commented 3 months ago

Guys, you're trying to mix a lot of different issues without providing much details.

@mkrupczak3 I see you're doing an override of nginx file, please provide this file:

      - /theta/projects/label-studio/nginx.conf:/etc/nginx/nginx.conf
fsalmasri commented 3 months ago

Here is my running docker.

Attaching to label-studio, nginx, postgres postgres | 2024-08-26 13:27:17.987 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432 postgres | 2024-08-26 13:27:17.987 UTC [1] LOG: listening on IPv6 address "::", port 5432 postgres | 2024-08-26 13:27:17.993 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432" postgres | 2024-08-26 13:27:18.035 UTC [23] LOG: database system was shut down at 2024-08-26 13:27:13 UTC postgres | 2024-08-26 13:27:18.047 UTC [1] LOG: database system is ready to accept connections label-studio | ./deploy/docker-entrypoint.sh: Looking for init scripts in /label-studio/deploy/docker-entrypoint.d/app/ label-studio | ./deploy/docker-entrypoint.sh: Launching /label-studio/deploy/docker-entrypoint.d/app/11-configure-custom-cabundle.sh label-studio | ./deploy/docker-entrypoint.sh: Launching /label-studio/deploy/docker-entrypoint.d/app/20-wait-for-db.sh label-studio | => Waiting for postgres... label-studio | => Postgres is up. label-studio | ./deploy/docker-entrypoint.sh: Launching /label-studio/deploy/docker-entrypoint.d/app/30-run-db-migrations.sh label-studio | => Do database migrations... nginx | ./deploy/docker-entrypoint.sh: Looking for init scripts in /label-studio/deploy/docker-entrypoint.d/nginx/ nginx | ./deploy/docker-entrypoint.sh: Launching /label-studio/deploy/docker-entrypoint.d/nginx/10-configure-nginx.sh nginx | => Copy nginx config file... nginx | => Configure system resolver... nginx | => Skipping replace nginx certs. nginx | => Replacing app endpoint... nginx | => Successfully replaced app endpoint. nginx | => Skipping adding subpath to nginx config. nginx | ./deploy/docker-entrypoint.sh: Configuration complete; ready for start up label-studio | => Database and media directory: /label-studio/data label-studio | => Static URL is set to: /static/ label-studio | Read environment variables from: /label-studio/data/.env label-studio | get 'SECRET_KEY' casted as '<class 'str'>' with default '' label-studio | [Tracing] Create new propagation context: {'trace_id': '61cf78e3e8084995a32fdb3b5941524e', 'span_id': 'be01106efd2d2da2', 'parent_span_id': None, 'dynamic_sampling_context': None} label-studio | Starting new HTTPS connection (1): pypi.org:443 label-studio | https://pypi.org:443 "GET /pypi/label-studio/json HTTP/1.1" 200 32786 label-studio | /usr/local/lib/python3.10/dist-packages/pydantic/_internal/_fields.py:160: UserWarning: Field "model_provider_connectioncreate" has conflict with protected namespace "model". label-studio | label-studio | You may be able to resolve this warning by setting model_config['protected_namespaces'] = (). label-studio | warnings.warn( label-studio | /usr/local/lib/python3.10/dist-packages/pydantic/_internal/_fields.py:160: UserWarning: Field "model_provider_connectionview" has conflict with protected namespace "model". label-studio | label-studio | You may be able to resolve this warning by setting model_config['protected_namespaces'] = (). label-studio | warnings.warn( label-studio | /usr/local/lib/python3.10/dist-packages/pydantic/_internal/_fields.py:160: UserWarning: Field "model_provider_connectionchange" has conflict with protected namespace "model". label-studio | label-studio | You may be able to resolve this warning by setting model_config['protected_namespaces'] = (). label-studio | warnings.warn( label-studio | /usr/local/lib/python3.10/dist-packages/pydantic/_internal/_fields.py:160: UserWarning: Field "model_provider_connectiondelete" has conflict with protected namespace "model". label-studio | label-studio | You may be able to resolve this warning by setting model_config['protected_namespaces'] = (). label-studio | warnings.warn( label-studio | Operations to perform: label-studio | Apply all migrations: admin, auth, authtoken, contenttypes, core, data_export, data_import, data_manager, django_rq, io_storages, labels_manager, ml, ml_model_providers, ml_models, organizations, projects, sessions, tasks, users, webhooks label-studio | Running migrations: label-studio | No migrations to apply. label-studio | => Migrations completed. label-studio | ./deploy/docker-entrypoint.sh: Launching /label-studio/deploy/docker-entrypoint.d/app/31-run-label-studio-init.sh label-studio | => Run label-studio init... label-studio | => Database and media directory: /label-studio/data label-studio | => Static URL is set to: /static/ label-studio | => Database and media directory: /label-studio/data label-studio | => Static URL is set to: /static/ label-studio | Read environment variables from: /label-studio/data/.env label-studio | get 'SECRET_KEY' casted as '<class 'str'>' with default '' label-studio | [Tracing] Create new propagation context: {'trace_id': '67d8d942cb9645b0afc036435c73c2b2', 'span_id': 'bcaaa3058cdfb47d', 'parent_span_id': None, 'dynamic_sampling_context': None} label-studio | Starting new HTTPS connection (1): pypi.org:443 label-studio | https://pypi.org:443 "GET /pypi/label-studio/json HTTP/1.1" 200 32786 postgres | 2024-08-26 13:27:28.993 UTC [33] ERROR: duplicate key value violates unique constraint "htx_user_email_key" postgres | 2024-08-26 13:27:28.993 UTC [33] DETAIL: Key (email)=(feras@c.com) already exists. postgres | 2024-08-26 13:27:28.993 UTC [33] STATEMENT: INSERT INTO "htx_user" ("password", "last_login", "is_superuser", "last_activity", "username", "email", "first_name", "last_name", "phone", "avatar", "is_staff", "is_active", "date_joined", "activity_at", "active_organization_id", "allow_newsletters") VALUES ('pbkdf2_sha256$260000$VqeBfltkDJaRdhZCfV43VU$1Lfhzg4iHNOg6ky9zMs2qNM7zs1WyUbk+ZQ1RCmJMXo=', NULL, false, '2024-08-26T13:27:28.737140+00:00'::timestamptz, '', 'feras@c.com', '', '', '', '', false, true, '2024-08-26T13:27:28.737187+00:00'::timestamptz, '2024-08-26T13:27:28.991661+00:00'::timestamptz, NULL, NULL) RETURNING "htx_user"."id" label-studio | User feras@c.com already exists label-studio | label-studio | Label Studio has been successfully initialized. label-studio | => label-studio init completed. label-studio | ./deploy/docker-entrypoint.sh: Configuration complete; ready for start up label-studio | [uWSGI] getting INI configuration from /label-studio/deploy/uwsgi.ini label-studio | [log-encoder] registered format:applogger ${msg} label-studio | [log-encoder] registered json:default {"timestamp": "${strftime:%d/%b/%Y:%H:%M:%S %z}", "source": "uwsgi", "levelname": "INFO", "message": "${msg}"} label-studio | [log-encoder] registered nl label-studio | Starting uWSGI 2.0.26 (64bit) on [Mon Aug 26 13:27:29 2024] label-studio | label-studio | compiled with version: 11.4.0 on 19 August 2024 13:11:35 label-studio | label-studio | os: Linux-6.8.0-1014-aws #15-Ubuntu SMP Thu Aug 8 19:13:06 UTC 2024 label-studio | label-studio | nodename: d7e661f25ac8 label-studio | label-studio | machine: x86_64 label-studio | label-studio | clock source: unix label-studio | label-studio | detected number of CPU cores: 2 label-studio | label-studio | current working directory: /label-studio label-studio | label-studio | writing pidfile to /tmp/uwsgi.pid label-studio | label-studio | detected binary path: /usr/local/bin/uwsgi label-studio | label-studio | !!! no internal routing support, rebuild with pcre support !!! label-studio | label-studio | chdir() to /label-studio/label_studio label-studio | label-studio | your memory page size is 4096 bytes label-studio | label-studio | detected max file descriptor number: 1048576 label-studio | label-studio | lock engine: pthread robust mutexes label-studio | label-studio | thunder lock: enabled label-studio | label-studio | uWSGI http bound on :8000 fd 8 label-studio | label-studio | uwsgi socket 0 bound to TCP address 127.0.0.1:35173 (port auto-assigned) fd 7 label-studio | label-studio | Python version: 3.10.12 (main, Jul 29 2024, 16:56:48) [GCC 11.4.0] label-studio | label-studio | Python main interpreter initialized at 0x61a7d3d1e3f0 label-studio | label-studio | python threads support enabled label-studio | label-studio | your server socket listen backlog is limited to 100 connections label-studio | label-studio | your mercy for graceful operations on workers is 3 seconds label-studio | label-studio | mapped 712755 bytes (696 KB) for 4 cores label-studio | label-studio | Operational MODE: preforking label-studio | label-studio | spawned uWSGI master process (pid: 1) label-studio | label-studio | spawned uWSGI worker 1 (pid: 35, cores: 1) label-studio | label-studio | spawned uWSGI worker 2 (pid: 36, cores: 1) label-studio | label-studio | spawned uWSGI worker 3 (pid: 37, cores: 1) label-studio | label-studio | spawned uWSGI worker 4 (pid: 38, cores: 1) label-studio | label-studio | Stats server enabled on :1717 fd: 22 label-studio | label-studio | spawned uWSGI http 1 (pid: 39) label-studio | label-studio | => Database and media directory: /label-studio/data label-studio | label-studio | => Static URL is set to: /static/ label-studio | label-studio | Read environment variables from: /label-studio/data/.env label-studio | label-studio | get 'SECRET_KEY' casted as '<class 'str'>' with default '' label-studio | label-studio | [Tracing] Create new propagation context: {'trace_id': '589761ab5f5b46bba58cab0aec484480', 'span_id': '988fe7c5e1890fc6', 'parent_span_id': None, 'dynamic_sampling_context': None} label-studio | label-studio | => Database and media directory: /label-studio/data label-studio | label-studio | => Static URL is set to: /static/ label-studio | label-studio | => Database and media directory: /label-studio/data label-studio | label-studio | => Static URL is set to: /static/ label-studio | label-studio | => Database and media directory: /label-studio/data label-studio | label-studio | => Static URL is set to: /static/ label-studio | label-studio | Read environment variables from: /label-studio/data/.env label-studio | label-studio | Read environment variables from: /label-studio/data/.env label-studio | label-studio | get 'SECRET_KEY' casted as '<class 'str'>' with default '' label-studio | label-studio | get 'SECRET_KEY' casted as '<class 'str'>' with default '' label-studio | label-studio | Read environment variables from: /label-studio/data/.env label-studio | label-studio | get 'SECRET_KEY' casted as '<class 'str'>' with default '' label-studio | label-studio | [Tracing] Create new propagation context: {'trace_id': '8410281c9f654a5b93241f8cae231a4d', 'span_id': 'b4eb8afe63e3283b', 'parent_span_id': None, 'dynamic_sampling_context': None} label-studio | label-studio | [Tracing] Create new propagation context: {'trace_id': 'e73f73847ed74e4591da55b2f6751877', 'span_id': 'b1d26daf13fe3f5b', 'parent_span_id': None, 'dynamic_sampling_context': None} label-studio | label-studio | [Tracing] Create new propagation context: {'trace_id': 'feb974f406f844c08293dc77f4257d07', 'span_id': 'bd135e5ced9b713a', 'parent_span_id': None, 'dynamic_sampling_context': None} label-studio | label-studio | WSGI app 0 (mountpoint='') ready in 13 seconds on interpreter 0x61a7d3d1e3f0 pid: 35 (default app) label-studio | label-studio | WSGI app 0 (mountpoint='') ready in 13 seconds on interpreter 0x61a7d3d1e3f0 pid: 38 (default app) label-studio | label-studio | WSGI app 0 (mountpoint='') ready in 13 seconds on interpreter 0x61a7d3d1e3f0 pid: 36 (default app) label-studio | label-studio | WSGI app 0 (mountpoint='') ready in 14 seconds on interpreter 0x61a7d3d1e3f0 pid: 37 (default app) label-studio | label-studio | /usr/local/lib/python3.10/dist-packages/pydantic/_internal/_fields.py:160: UserWarning: Field "model_provider_connectioncreate" has conflict with protected namespace "model". label-studio | label-studio | You may be able to resolve this warning by setting model_config['protected_namespaces'] = (). label-studio | warnings.warn( label-studio | label-studio | /usr/local/lib/python3.10/dist-packages/pydantic/_internal/_fields.py:160: UserWarning: Field "model_provider_connectionview" has conflict with protected namespace "model". label-studio | label-studio | You may be able to resolve this warning by setting model_config['protected_namespaces'] = (). label-studio | warnings.warn( label-studio | label-studio | /usr/local/lib/python3.10/dist-packages/pydantic/_internal/_fields.py:160: UserWarning: Field "model_provider_connectionchange" has conflict with protected namespace "model". label-studio | label-studio | You may be able to resolve this warning by setting model_config['protected_namespaces'] = (). label-studio | warnings.warn( label-studio | label-studio | /usr/local/lib/python3.10/dist-packages/pydantic/_internal/_fields.py:160: UserWarning: Field "model_provider_connectiondelete" has conflict with protected namespace "model". label-studio | label-studio | You may be able to resolve this warning by setting model_config['protected_namespaces'] = (). label-studio | warnings.warn( label-studio | label-studio | {"asctime": "26/Aug/2024:13:27:45 +0000", "name": "core.utils.common", "funcName": "custom_exception_handler", "lineno": 91, "levelname": "ERROR", "user_id": null, "message": "2b23cccf-9b06-47dc-98ed-ea90ee607ae9 Authentication credentials were not provided.", "exc_info": "Traceback (most recent call last):\n File \"/usr/local/lib/python3.10/dist-packages/rest_framework/views.py\", line 497, in dispatch\n self.initial(request, *args, *kwargs)\n File \"/usr/local/lib/python3.10/dist-packages/sentry_sdk/integrations/django/init.py\", line 305, in sentry_patched_drf_initial\n return old_drf_initial(self, request, args, *kwargs)\n File \"/usr/local/lib/python3.10/dist-packages/rest_framework/views.py\", line 415, in initial\n self.check_permissions(request)\n File \"/usr/local/lib/python3.10/dist-packages/rest_framework/views.py\", line 333, in check_permissions\n self.permission_denied(\n File \"/usr/local/lib/python3.10/dist-packages/rest_framework/views.py\", line 174, in permission_denied\n raise exceptions.NotAuthenticated()\nrest_framework.exceptions.NotAuthenticated: Authentication credentials were not provided.", "request_id": null} label-studio | label-studio | {"asctime": "26/Aug/2024:13:27:45 +0000", "name": "django.request", "funcName": "log_response", "lineno": 224, "levelname": "WARNING", "user_id": null, "message": "Unauthorized: /api/projects/", "status_code": 401, "request": "<WSGIRequest: GET '/api/projects/?page=1%26page%5fsize=30%26include=id%2ctitle%2ccreated%5fby%2ccreated%5fat%2ccolor%2cis%5fpublished%2cassignment%5fsettings'>", "request_id": null} label-studio | label-studio | {"asctime": "26/Aug/2024:13:27:45 +0000", "name": "django.request", "funcName": "log_response", "lineno": 224, "levelname": "WARNING", "user_id": null, "message": "Unauthorized: /api/projects/", "status_code": 401, "request": "<WSGIRequest: GET '/api/projects/?page=1%26page%5fsize=30%26include=id%2ctitle%2ccreated%5fby%2ccreated%5fat%2ccolor%2cis%5fpublished%2cassignment%5fsettings'>", "request_id": null} label-studio | nginx | {"timestamp":"1724678865110","http":{"method":"GET","request_id":"2d52dbf6f04597fbe854101f031ec5cc","status_code":401,"content_type":"","useragent":"Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36","referrer":"","x_forwarded_for":"","url":"/api/projects?page=1%26page%5fsize=30%26include=id%2ctitle%2ccreated%5fby%2ccreated%5fat%2ccolor%2cis%5fpublished%2cassignment%5fsettings","version":"HTTP/1.1","connection":"1","connection_requests":"1"},"network":{"bytes_written":1360,"bytes_read":312,"client":{"ip":"205.169.39.12","port":31538},"destination":{"ip":"172.22.0.4","port":80},"nginx":{"request_time":"0.350","upstream_connect_time":"0.001","upstream_response_time":"0.350","upstream_header_time":"0.350"}}} nginx | 2024/08/26 13:27:45 [info] 19#19: 1 client 205.169.39.12 closed keepalive connection

Here is my compose file:

services:

  nginx:
    image: heartexlabs/label-studio:latest
    container_name: nginx
    restart: unless-stopped
    ports:
      - "80:80"
      - "8080:8085"
      - "8081:8086"
    depends_on:
      - app
    env_file:
      - env.list
    volumes:
      - ./mydata:/label-studio/data:rw
      - ./deploy/nginx/certs:/certs:ro
      - ./deploy/my.conf:/etc/nginx/nginx.conf
    command: nginx

  app:
    stdin_open: true
    tty: true
    image: heartexlabs/label-studio:1.13.1
    container_name: label-studio
    restart: unless-stopped
    expose:
      - "8000"
    depends_on:
      - db
    env_file:
      - env.list
    volumes:
      - ./mydata:/label-studio/data:rw
    command: label-studio-uwsgi

  db:
    image: postgres:11.5
    container_name: postgres
    hostname: db
    restart: unless-stopped
    env_file:
      - env.list
    volumes:
      - ${POSTGRES_DATA_DIR:-./postgres-data}:/var/lib/postgresql/data
      - ./deploy/pgsql/certs:/var/lib/postgresql/certs:ro

Everything was working normally. suddenly I have this now: image

makseq commented 3 months ago

Please upgrade to the latest LS version - 1.13.1. It happens after the chrome browser update.

fsalmasri commented 3 months ago

Please upgrade to the latest LS version - 1.13.1. It happens after the chrome browser update.

Already updates. Tested on three browsers. didn't work.

makseq commented 3 months ago

I don't think this problem is related to the original issue. Please create a new one and provide there:

  1. /version page output
  2. screenshot with browser console opened where errors are usually displayed
Lef-F commented 2 months ago

Experiencing the same issue after the latest Google Chrome upgrade Version 128.0.6613.85 (Official Build) (arm64).

I noticed that the div that contains the table containing the tasks has width and height set to 0px.

<div class="dm-table__auto-size" block="dm-table" style="overflow: visible; height: 0px; width: 0px;"></div>

Manually setting the width and height to anything over 0px reveals the contents on the UI.

I tried opening Label Studio in Vivaldi and Microsoft Edge and the UI shows just fine there. I haven't discovered the root cause of the issue atm. There are no errors in the web dev console.

makseq commented 2 months ago

@Lef-F doesn't the latest LS version help you? 1.13.1

Lef-F commented 2 months ago

@makseq just tested 1.13.1 and the issue persists in Google Chrome Version 128.0.6613.85 (Official Build) (arm64).

FYI the heartexlabs/label-studio:latest tag is pointing to 1.13.0 instead of 1.13.1. Had to directly pull heartexlabs/label-studio:1.13.1.

makseq commented 2 months ago

@Lef-F what about this - https://github.com/HumanSignal/label-studio/issues/6182#issuecomment-2310235077 ?

hlomzik commented 2 months ago

Guys, please, start a new issue with this problem because it's not related to original one, which was a backend issue leading to empty frontend. And provide an errors from the console to help us to resolve it. As a reminder: https://github.com/HumanSignal/label-studio/issues/6182#issuecomment-2310235077

farioas commented 2 months ago

@Lef-F thanks for reporting an incorrect pointer on the latest tag, the discrepancy has been resolved

makseq commented 2 months ago

@Lef-F what do you see on /version page? And yes, let's create another issue. Something like "Data manager page doesn't load fully"

mkrupczak3 commented 2 months ago

Guys, you're trying to mix a lot of different issues without providing much details.

@mkrupczak3 I see you're doing an override of nginx file, please provide this file:

      - /theta/projects/label-studio/nginx.conf:/etc/nginx/nginx.conf

@farioas Here is the nginx.conf for my label-studio docker setup (which the web UI goes completely blank any version other than 1.9.0 is used):

worker_processes auto;
daemon off;
pid /tmp/nginx.pid;

events {
  worker_connections 1024;
}

http {
  ##
  # Temp folders
  ##
  proxy_temp_path /tmp/proxy_temp;
  client_body_temp_path /tmp/client_temp;
  fastcgi_temp_path /tmp/fastcgi_temp;
  uwsgi_temp_path /tmp/uwsgi_temp;
  scgi_temp_path /tmp/scgi_temp;

  ##
  # Basic Settings
  ##
  sendfile on;
  tcp_nopush on;
  tcp_nodelay on;
  types_hash_max_size 2048;
  server_tokens off;

  ##
  # Logging Settings
  ##
  map $msec $msec_no_decimal { ~(.*)\.(.*) $1$2; }

  log_format json_detailed escape=json
  '{'
    '"timestamp":"$msec_no_decimal",'
    '"http":{'
      '"method":"$request_method",'
      '"request_id":"$request_id",'
      '"status_code":$status,'
      '"content_type":"$content_type",'
      '"useragent":"$http_user_agent",'
      '"referrer":"$http_referer",'
      '"x_forwarded_for":"$http_x_forwarded_for",'
      '"url":"$request_uri",'
      '"version":"$server_protocol",'
      '"connection":"$connection",'
      '"connection_requests":"$connection_requests"'
    '},'
    '"network":{'
      '"bytes_written":$bytes_sent,'
      '"bytes_read":$request_length,'
      '"client":{'
        '"ip":"$remote_addr",'
        '"port":$remote_port'
      '},'
      '"destination":{'
        '"ip":"$server_addr",'
        '"port":$server_port'
      '},'
      '"nginx":{'
        '"request_time":"$request_time",'
        '"upstream_connect_time":"$upstream_connect_time",'
        '"upstream_response_time":"$upstream_response_time",'
        '"upstream_header_time":"$upstream_header_time"'
      '}'
    '}'
  '}';
  access_log /dev/stdout json_detailed;
  error_log /dev/stderr info;

  # MIME
  include /etc/nginx/mime.types;
  default_type application/octet-stream;

  ##
  # SSL Settings
  ##
  ssl_protocols          TLSv1.2 TLSv1.3;
  ssl_ciphers            ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;

  ##
  # Gzip Settings
  ##
  gzip            on;
  gzip_vary       on;
  gzip_proxied    any;
  gzip_comp_level 6;
  gzip_types      text/plain text/css text/xml application/json application/javascript application/rss+xml application/atom+xml image/svg+xml;

#  # Commented out to fix reload issue -mwk 2023-12-31
#  include resolv.conf;

  server {
    listen      8085;
    add_header X-Request-ID $request_id; # Return to client

    # The lines below are handled by entrypoint.sh.
    # Do not delete it.
    listen 8086 ssl;
    ssl_certificate /certs/fullchain.pem;
    ssl_certificate_key /certs/privkey.pem;

    if ($request_method !~ ^(GET|POST|PUT|PATCH|DELETE|HEAD|CONNECT|OPTIONS)$) {
      return 405;
    }

    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Max-Age 3600;
    add_header Access-Control-Expose-Headers Content-Length;
    add_header Access-Control-Allow-Headers Range;
    add_header Strict-Transport-Security "max-age=31536000";
    add_header X-Frame-Options "SAMEORIGIN" always;

    client_max_body_size 200m;   # adjust to taste

    if ($request_method = OPTIONS) {
        return 204;
    }

    location /static/ {
        alias /label-studio/label_studio/core/static_build/;
    }

    # Frontend react
    # Source: https://github.com/heartexlabs/label-studio-frontend
    location /label-studio-frontend/ {
        alias /label-studio/label_studio/frontend/dist/lsf/;
    }

    # Data Manager
    # Source: https://github.com/heartexlabs/dm2
    location /dm/ {
        alias /label-studio/label_studio/frontend/dist/dm/;
    }

    # LabelStudio frontend
    # Source: https://github.com/heartexlabs/label-studio/blob/HEAD/label_studio/frontend/src
    location /react-app/ {
        alias /label-studio/label_studio/frontend/dist/react-app/;
    }

    location /nginx_health {
        return 200;
    }

    location = /favicon.ico {
      alias /label-studio/label_studio/core/static_build/images/favicon.ico;
    }

    location ~ ^/file_download/(.*?)/(.*?)/(.*) {
        internal;
        # Extract the remote URL parts
        set $download_protocol $1;
        set $download_host $2;
        set $download_path $3;
        # Reconstruct the remote URL
        set $download_url $download_protocol://$download_host/$download_path;
        # Hide GCS headers
        proxy_hide_header      x-goog-hash;
        proxy_hide_header      x-goog-generation;
        proxy_hide_header      x-goog-metageneration;
        proxy_hide_header      x-goog-stored-content-encoding;
        proxy_hide_header      x-goog-stored-content-length;
        proxy_hide_header      x-goog-storage-class;
        proxy_hide_header      x-guploader-uploadid;
        # Hide AWS headers
        proxy_hide_header      x-amz-delete-marker;
        proxy_hide_header      x-amz-id-2;
        proxy_hide_header      x-amz-request-id;
        proxy_hide_header      x-amz-version-id;
        proxy_hide_header      x-amz-meta-server-side-encryption;
        proxy_hide_header      x-amz-server-side-encryption;
        # Headers for the remote server, unset Authorization and Cookie for security reasons.
        proxy_set_header Host $download_host;
        proxy_set_header Authorization '';
        proxy_set_header Cookie '';
        proxy_hide_header Content-Disposition;
        add_header Content-Disposition $upstream_http_content_disposition;
        # Stops the local disk from being written to (just forwards data through)
        proxy_max_temp_file_size 0;
        # Proxy the remote file through to the client
        proxy_pass $download_url$is_args$args;
        proxy_intercept_errors on;
        error_page 301 302 307 = @handle_redirect;
    }

    location @handle_redirect {
        set $saved_redirect_location '$upstream_http_location';
        proxy_pass $saved_redirect_location;
    }

    location / {
        absolute_redirect off;
        proxy_connect_timeout 90;
        proxy_send_timeout 90;
        proxy_read_timeout 90;
        send_timeout 90;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_set_header X-Request-ID $request_id;
        proxy_pass_header Content-Type;
        proxy_redirect off;
        proxy_pass http://localhost:8000/;
    }

    error_page   500 502 503 504  /50x.html;

    location = /50x.html {
        root   /usr/share/nginx/html;
    }
  }
}
farioas commented 2 months ago

@mkrupczak3 Your nginx.conf is incompatible with newer version of Label Studio after migration to a monorepo for frontend dependencies in https://github.com/HumanSignal/label-studio/releases/tag/1.11.0.

Compare it with https://github.com/HumanSignal/label-studio/blob/develop/deploy/default.conf, almost all paths has changed. You need to compare both these files, find the differences and make the changes in your file.

new-bajie commented 2 months ago

I am using version 1.9.0 and recently found that the tasks uploaded after creating a project cannot be seen. However, you can click on the Label ALL Tables annotation and the Actions button will be grayed out, which has not happened before. This is how I use Docker and local deployment

d9c03d87e1662dcd0126dd7207b2dc5

![Uploading 1a9640f366a11eb946d076c6f7c1cd6.png…]()

new-bajie commented 2 months ago
1a9640f366a11eb946d076c6f7c1cd6
new-bajie commented 2 months ago

{ "total_annotations": 0, "total_predictions": 0, "total": 1, "tasks": [ { "id": 1, "drafts": [], "annotators": [], "inner_id": 1, "cancelled_annotations": 0, "total_annotations": 0, "total_predictions": 0, "completed_at": null, "annotations_results": "", "predictions_results": "", "file_upload": null, "storage_filename": null, "annotations_ids": "", "predictions_model_versions": "", "updated_by": [], "is_allocated": false, "data": { "image": "/data/upload/3/7ca4ff29-0.JPG" }, "meta": {}, "created_at": "2024-09-05T18:02:58.492717+08:00", "updated_at": "2024-09-05T18:02:58.492717+08:00", "is_labeled": false, "overlap": 1, "comment_count": 0, "unresolved_comment_count": 0, "last_comment_updated_at": null, "project": 3, "comment_authors": [], "assigner": [] } ] }

http://127.0.0.1:1910/api/tasks?page=1&page_size=30&view=3&project=3