Open mkrupczak3 opened 3 months ago
Posted here on the label-studio Slack:
https://label-studio.slack.com/archives/CQ8LYQ0J2/p1723232435489269
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
.
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.
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.
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"...
^
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.
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
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.
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)
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.
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
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
?
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)
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
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?
JS console shows a 404 error upon page load:
I should note I am accessing the server using an SSH tunnel, unsure if this is affecting it in any way
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
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.
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?
Will try when I get back to my desk later today
I tried setting LABEL_STUDIO_HOST
to empty for both the app and the database container, however it did not resolve the issue
This issue was fixed in 1.12.1
, so please consider upgrade to this version or to the latest: 1.13.0
@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
Kind of at my wit's end with this issue
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.
I have the same issue. I didn't have it before. just suddenly happened. I tried all suggestions above nothing worked.
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
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 settingmodel_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 settingmodel_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 settingmodel_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 settingmodel_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 settingmodel_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 settingmodel_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 settingmodel_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:
Please upgrade to the latest LS version - 1.13.1. It happens after the chrome browser update.
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.
I don't think this problem is related to the original issue. Please create a new one and provide there:
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.
@Lef-F doesn't the latest LS version help you? 1.13.1
@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
.
@Lef-F what about this - https://github.com/HumanSignal/label-studio/issues/6182#issuecomment-2310235077 ?
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
@Lef-F thanks for reporting an incorrect pointer on the latest tag, the discrepancy has been resolved
@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"
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;
}
}
}
@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.
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
![Uploading 1a9640f366a11eb946d076c6f7c1cd6.png…]()
{ "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
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:
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:
Environment (please complete the following information):
Additional context
Running label-studio with a modified version of the example
docker-compose.yml
file.