zylon-ai / private-gpt

Interact with your documents using the power of GPT, 100% privately, no data leaks
https://privategpt.dev
Apache License 2.0
53.56k stars 7.19k forks source link

[BUG] Another permissions error when installing with docker-compose #2013

Open salimfadhley opened 1 month ago

salimfadhley commented 1 month ago

Pre-check

Description

This looks similar, but not the same as #1876

As for following the instructions, I've not seen any relevant guide to installing with Docker, hence working a bit blind.

Background: I'm trying to run this on an Asustor NAS, which offers very little ability to customize the environment. Ideally, I'd just like to be able to run this by pasting a docker-compose file into Portainer, and having it work it's magic from there:


sal@halob:/volume1/home/sal/apps/private-gpt $ docker-compose up
[+] Running 3/3
 ✔ Network private-gpt_default          Created                                                                                                                                   0.1s
 ✔ Container private-gpt-ollama-1       Created                                                                                                                                   0.1s
 ✔ Container private-gpt-private-gpt-1  Created                                                                                                                                   0.1s
Attaching to ollama-1, private-gpt-1
ollama-1       | Couldn't find '/root/.ollama/id_ed25519'. Generating new private key.
ollama-1       | Your new public key is:
ollama-1       |
ollama-1       | ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBNQkShAIoUDyyueUTiCHM9/AZfZ+rxnUZgmh+YByBVB
ollama-1       |
ollama-1       | 2024/07/23 23:20:28 routes.go:1096: INFO server config env="map[CUDA_VISIBLE_DEVICES: GPU_DEVICE_ORDINAL: HIP_VISIBLE_DEVICES: HSA_OVERRIDE_GFX_VERSION: OLLAMA_DEBUG:false OLLAMA_FLASH_ATTENTION:false OLLAMA_HOST:http://0.0.0.0:11434 OLLAMA_INTEL_GPU:false OLLAMA_KEEP_ALIVE:5m0s OLLAMA_LLM_LIBRARY: OLLAMA_MAX_LOADED_MODELS:0 OLLAMA_MAX_QUEUE:512 OLLAMA_MAX_VRAM:0 OLLAMA_MODELS:/root/.ollama/models OLLAMA_NOHISTORY:false OLLAMA_NOPRUNE:false OLLAMA_NUM_PARALLEL:0 OLLAMA_ORIGINS:[http://localhost https://localhost http://localhost:* https://localhost:* http://127.0.0.1 https://127.0.0.1 http://127.0.0.1:* https://127.0.0.1:* http://0.0.0.0 https://0.0.0.0 http://0.0.0.0:* https://0.0.0.0:* app://* file://* tauri://*] OLLAMA_RUNNERS_DIR: OLLAMA_SCHED_SPREAD:false OLLAMA_TMPDIR: ROCR_VISIBLE_DEVICES:]"
ollama-1       | time=2024-07-23T23:20:28.317Z level=INFO source=images.go:778 msg="total blobs: 0"
ollama-1       | time=2024-07-23T23:20:28.317Z level=INFO source=images.go:785 msg="total unused blobs removed: 0"
ollama-1       | time=2024-07-23T23:20:28.317Z level=INFO source=routes.go:1143 msg="Listening on [::]:11434 (version 0.2.6)"
ollama-1       | time=2024-07-23T23:20:28.318Z level=INFO source=payload.go:30 msg="extracting embedded files" dir=/tmp/ollama1112441504/runners
private-gpt-1  | 23:20:29.406 [INFO    ] private_gpt.settings.settings_loader - Starting application with profiles=['default', 'docker']
ollama-1       | time=2024-07-23T23:20:33.589Z level=INFO source=payload.go:44 msg="Dynamic LLM libraries [cpu_avx cpu_avx2 cuda_v11 rocm_v60102 cpu]"
ollama-1       | time=2024-07-23T23:20:33.589Z level=INFO source=gpu.go:205 msg="looking for compatible GPUs"
ollama-1       | time=2024-07-23T23:20:33.589Z level=WARN source=gpu.go:225 msg="CPU does not have minimum vector extensions, GPU inference disabled" required=avx detected="no vector extensions"
ollama-1       | time=2024-07-23T23:20:33.590Z level=INFO source=types.go:105 msg="inference compute" id=0 library=cpu compute="" driver=0.0 name="" total="31.1 GiB" available="28.1 GiB"
private-gpt-1  | There was a problem when trying to write in your cache folder (/nonexistent/.cache/huggingface/hub). You should set the environment variable TRANSFORMERS_CACHE to a writable directory.
private-gpt-1  | None of PyTorch, TensorFlow >= 2.0, or Flax have been found. Models won't be available and only tokenizers, configuration and file/data utilities can be used.
private-gpt-1  | 23:20:40.419 [INFO    ] private_gpt.components.llm.llm_component - Initializing the LLM in mode=ollama
private-gpt-1  | Traceback (most recent call last):
private-gpt-1  |   File "/home/worker/app/.venv/lib/python3.11/site-packages/injector/__init__.py", line 798, in get
private-gpt-1  |     return self._context[key]
private-gpt-1  |            ~~~~~~~~~~~~~^^^^^
private-gpt-1  | KeyError: <class 'private_gpt.ui.ui.PrivateGptUi'>
private-gpt-1  |
private-gpt-1  | During handling of the above exception, another exception occurred:
private-gpt-1  |
private-gpt-1  | Traceback (most recent call last):
private-gpt-1  |   File "/home/worker/app/.venv/lib/python3.11/site-packages/injector/__init__.py", line 798, in get
private-gpt-1  |     return self._context[key]
private-gpt-1  |            ~~~~~~~~~~~~~^^^^^
private-gpt-1  | KeyError: <class 'private_gpt.server.ingest.ingest_service.IngestService'>
private-gpt-1  |
private-gpt-1  | During handling of the above exception, another exception occurred:
private-gpt-1  |
private-gpt-1  | Traceback (most recent call last):
private-gpt-1  |   File "/home/worker/app/.venv/lib/python3.11/site-packages/injector/__init__.py", line 798, in get
private-gpt-1  |     return self._context[key]
private-gpt-1  |            ~~~~~~~~~~~~~^^^^^
private-gpt-1  | KeyError: <class 'private_gpt.components.vector_store.vector_store_component.VectorStoreComponent'>
private-gpt-1  |
private-gpt-1  | During handling of the above exception, another exception occurred:
private-gpt-1  |
private-gpt-1  | Traceback (most recent call last):
private-gpt-1  |   File "<frozen runpy>", line 198, in _run_module_as_main
private-gpt-1  |   File "<frozen runpy>", line 88, in _run_code
private-gpt-1  |   File "/home/worker/app/private_gpt/__main__.py", line 5, in <module>
private-gpt-1  |     from private_gpt.main import app
private-gpt-1  |   File "/home/worker/app/private_gpt/main.py", line 6, in <module>
private-gpt-1  |     app = create_app(global_injector)
private-gpt-1  |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
private-gpt-1  |   File "/home/worker/app/private_gpt/launcher.py", line 63, in create_app
private-gpt-1  |     ui = root_injector.get(PrivateGptUi)
private-gpt-1  |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
private-gpt-1  |   File "/home/worker/app/.venv/lib/python3.11/site-packages/injector/__init__.py", line 91, in wrapper
private-gpt-1  |     return function(*args, **kwargs)
private-gpt-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^
private-gpt-1  |   File "/home/worker/app/.venv/lib/python3.11/site-packages/injector/__init__.py", line 974, in get
private-gpt-1  |     provider_instance = scope_instance.get(interface, binding.provider)
private-gpt-1  |                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
private-gpt-1  |   File "/home/worker/app/.venv/lib/python3.11/site-packages/injector/__init__.py", line 91, in wrapper
private-gpt-1  |     return function(*args, **kwargs)
private-gpt-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^
private-gpt-1  |   File "/home/worker/app/.venv/lib/python3.11/site-packages/injector/__init__.py", line 800, in get
private-gpt-1  |     instance = self._get_instance(key, provider, self.injector)
private-gpt-1  |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
private-gpt-1  |   File "/home/worker/app/.venv/lib/python3.11/site-packages/injector/__init__.py", line 811, in _get_instance
private-gpt-1  |     return provider.get(injector)
private-gpt-1  |            ^^^^^^^^^^^^^^^^^^^^^^
private-gpt-1  |   File "/home/worker/app/.venv/lib/python3.11/site-packages/injector/__init__.py", line 264, in get
private-gpt-1  |     return injector.create_object(self._cls)
private-gpt-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
private-gpt-1  |   File "/home/worker/app/.venv/lib/python3.11/site-packages/injector/__init__.py", line 998, in create_object
private-gpt-1  |     self.call_with_injection(init, self_=instance, kwargs=additional_kwargs)
private-gpt-1  |   File "/home/worker/app/.venv/lib/python3.11/site-packages/injector/__init__.py", line 1031, in call_with_injection
private-gpt-1  |     dependencies = self.args_to_inject(
private-gpt-1  |                    ^^^^^^^^^^^^^^^^^^^^
private-gpt-1  |   File "/home/worker/app/.venv/lib/python3.11/site-packages/injector/__init__.py", line 91, in wrapper
private-gpt-1  |     return function(*args, **kwargs)
private-gpt-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^
private-gpt-1  |   File "/home/worker/app/.venv/lib/python3.11/site-packages/injector/__init__.py", line 1079, in args_to_inject
private-gpt-1  |     instance: Any = self.get(interface)
private-gpt-1  |                     ^^^^^^^^^^^^^^^^^^^
private-gpt-1  |   File "/home/worker/app/.venv/lib/python3.11/site-packages/injector/__init__.py", line 91, in wrapper
private-gpt-1  |     return function(*args, **kwargs)
private-gpt-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^
private-gpt-1  |   File "/home/worker/app/.venv/lib/python3.11/site-packages/injector/__init__.py", line 974, in get
private-gpt-1  |     provider_instance = scope_instance.get(interface, binding.provider)
private-gpt-1  |                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
private-gpt-1  |   File "/home/worker/app/.venv/lib/python3.11/site-packages/injector/__init__.py", line 91, in wrapper
private-gpt-1  |     return function(*args, **kwargs)
private-gpt-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^
private-gpt-1  |   File "/home/worker/app/.venv/lib/python3.11/site-packages/injector/__init__.py", line 800, in get
private-gpt-1  |     instance = self._get_instance(key, provider, self.injector)
private-gpt-1  |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
private-gpt-1  |   File "/home/worker/app/.venv/lib/python3.11/site-packages/injector/__init__.py", line 811, in _get_instance
private-gpt-1  |     return provider.get(injector)
private-gpt-1  |            ^^^^^^^^^^^^^^^^^^^^^^
private-gpt-1  |   File "/home/worker/app/.venv/lib/python3.11/site-packages/injector/__init__.py", line 264, in get
private-gpt-1  |     return injector.create_object(self._cls)
private-gpt-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
private-gpt-1  |   File "/home/worker/app/.venv/lib/python3.11/site-packages/injector/__init__.py", line 998, in create_object
private-gpt-1  |     self.call_with_injection(init, self_=instance, kwargs=additional_kwargs)
private-gpt-1  |   File "/home/worker/app/.venv/lib/python3.11/site-packages/injector/__init__.py", line 1031, in call_with_injection
private-gpt-1  |     dependencies = self.args_to_inject(
private-gpt-1  |                    ^^^^^^^^^^^^^^^^^^^^
private-gpt-1  |   File "/home/worker/app/.venv/lib/python3.11/site-packages/injector/__init__.py", line 91, in wrapper
private-gpt-1  |     return function(*args, **kwargs)
private-gpt-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^
private-gpt-1  |   File "/home/worker/app/.venv/lib/python3.11/site-packages/injector/__init__.py", line 1079, in args_to_inject
private-gpt-1  |     instance: Any = self.get(interface)
private-gpt-1  |                     ^^^^^^^^^^^^^^^^^^^
private-gpt-1  |   File "/home/worker/app/.venv/lib/python3.11/site-packages/injector/__init__.py", line 91, in wrapper
private-gpt-1  |     return function(*args, **kwargs)
private-gpt-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^
private-gpt-1  |   File "/home/worker/app/.venv/lib/python3.11/site-packages/injector/__init__.py", line 974, in get
private-gpt-1  |     provider_instance = scope_instance.get(interface, binding.provider)
private-gpt-1  |                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
private-gpt-1  |   File "/home/worker/app/.venv/lib/python3.11/site-packages/injector/__init__.py", line 91, in wrapper
private-gpt-1  |     return function(*args, **kwargs)
private-gpt-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^
private-gpt-1  |   File "/home/worker/app/.venv/lib/python3.11/site-packages/injector/__init__.py", line 800, in get
private-gpt-1  |     instance = self._get_instance(key, provider, self.injector)
private-gpt-1  |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
private-gpt-1  |   File "/home/worker/app/.venv/lib/python3.11/site-packages/injector/__init__.py", line 811, in _get_instance
private-gpt-1  |     return provider.get(injector)
private-gpt-1  |            ^^^^^^^^^^^^^^^^^^^^^^
private-gpt-1  |   File "/home/worker/app/.venv/lib/python3.11/site-packages/injector/__init__.py", line 264, in get
private-gpt-1  |     return injector.create_object(self._cls)
private-gpt-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
private-gpt-1  |   File "/home/worker/app/.venv/lib/python3.11/site-packages/injector/__init__.py", line 998, in create_object
private-gpt-1  |     self.call_with_injection(init, self_=instance, kwargs=additional_kwargs)
private-gpt-1  |   File "/home/worker/app/.venv/lib/python3.11/site-packages/injector/__init__.py", line 1040, in call_with_injection
private-gpt-1  |     return callable(*full_args, **dependencies)
private-gpt-1  |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
private-gpt-1  |   File "/home/worker/app/private_gpt/components/vector_store/vector_store_component.py", line 114, in __init__
private-gpt-1  |     client = QdrantClient(
private-gpt-1  |              ^^^^^^^^^^^^^
private-gpt-1  |   File "/home/worker/app/.venv/lib/python3.11/site-packages/qdrant_client/qdrant_client.py", line 117, in __init__
private-gpt-1  |     self._client = QdrantLocal(
private-gpt-1  |                    ^^^^^^^^^^^^
private-gpt-1  |   File "/home/worker/app/.venv/lib/python3.11/site-packages/qdrant_client/local/qdrant_local.py", line 66, in __init__
private-gpt-1  |     self._load()
private-gpt-1  |   File "/home/worker/app/.venv/lib/python3.11/site-packages/qdrant_client/local/qdrant_local.py", line 97, in _load
private-gpt-1  |     os.makedirs(self.location, exist_ok=True)
private-gpt-1  |   File "<frozen os>", line 215, in makedirs
private-gpt-1  |   File "<frozen os>", line 225, in makedirs
private-gpt-1  | PermissionError: [Errno 13] Permission denied: 'local_data/private_gpt'
^CGracefully stopping... (press Ctrl+C again to force)
[+] Stopping 2/2
 ✔ Container private-gpt-private-gpt-1  Stopped                                                                                                                                   0.3s
 ✔ Container private-gpt-ollama-1       Stopped  

Steps to Reproduce

  1. Clone the repo
  2. docker-compose build
  3. docker-compose up

Expected Behavior

It should just run

Actual Behavior

Error, as reported above

Environment

Running on an Asustor router, docker 25.0.5

Additional Information

No response

Version

latest

Setup Checklist

NVIDIA GPU Setup Checklist

salimfadhley commented 1 month ago

Just a request: One thing that would make this project way more accessible is if it could work in Portainer, a widely used tool for launching containerized applications. Asustor NAS servers support this application, and for apps that support it, launching a new service might be as simple as just pasting in a docker-compose file, or providing a path to a git repo with a docker-compose file. Portainer can take care of most things like building the images (if no official images exist), and then provides a handy control panel so the admin can browse logs.

It really helps if the default Docker config "just works". Failing that, could we have a section on how to install with Docker? I couldn't see a mention of Docker in the manual.

jaluma commented 1 month ago

Have you tried latest changes? It's like an read/write problem in your host machine. We've updated our docker-compose compatibility to have different profiles.

theodufort commented 3 weeks ago

Same error here

iguy0 commented 2 weeks ago

Same issue here. I tried to change the UID/GID to match the user i have on my linux system(1000) and got this when building: => ERROR [private-gpt-ollama app 1/10] RUN addgroup --system --gid ${GROUP_GID} worker

I then modified the Dockerfile.ollama and the user creation looks like this: 31 # Define the User ID (UID) for the non-root user 32 # UID 100 is chosen to avoid conflicts with existing system users 33 ARG UID=1000 34 35 # Define the Group ID (GID) for the non-root user 36 # GID 65534 is often used for the 'nogroup' or 'nobody' group 37 ARG GID=1000 38 ARG UGNAME=worker 39 40 RUN addgroup --system --gid ${GID} ${UGNAME} 41 42 RUN adduser --system --disabled-password --home /home/${UGNAME} \ 43 --uid ${UID} --ingroup ${UGNAME} ${UGNAME} 44 45 #RUN adduser --system --gid ${GID} --uid ${UID} --home /home/worker worker 46 WORKDIR /home/worker/app

It worked!

jaluma commented 2 days ago

Sorry for the delay :(

I just pushed a generic fix in https://github.com/zylon-ai/private-gpt/pull/2059. If somebody can check if this issue is fixed, it would be nice!

@salimfadhley @iguy0 @theodufort @vilaca