DuckDB, Django и apache2 Permission Denied в производстве

У меня проблема с базой данных duckdb, которую я не могу понять.

После того как я создал базу данных .db и поместил ее в корень apache2/Django webapp, а также предоставил www-data доступ к ней и ее каталогу, я все равно получаю отказ в разрешении.

Вот странная часть(и):

  1. Я не получаю ошибку разрешения при установлении соединения, я получаю ее только в части fetchdf().
con = duckdb(database='path/to/db.db',read_only=True)

P = con.execute('SELECT * FROM products LIMIT 1;')

p = p.fetchdf() # Here's where the error gets thrown

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
duckdb.duckdb.IOException: IO Error: Permission denied
  1. Когда я запускаю тот же самый код python с www-data, все работает хорошо. Также и в ситуации runserver все работает без проблем. Похоже, что проблема связана с производственной средой.

Я подозреваю, что duckdb хочет получить доступ к определенному каталогу или файлу, который я должен сделать доступным в конфигурации apache2, но мы с AI не знаем, что и где.

Помочь?

Я попробовал изменить temp_directory, home_directory, extension_directory и secret_directory на каталог в корневом каталоге webapp.

Я попробовал переместить файл db в другой каталог и дал apache разрешение на него также в .conf.

Похоже на проблему с SELinux, если вы уже пытались изменить права доступа к файлу, а ошибка с отказом в разрешении не исчезла, очень вероятно, что SELinux блокирует доступ.

Вы можете попробовать выполнить следующие команды, чтобы проверить, не блокирует ли SELinux доступ, и устранить проблему:

sudo ausearch -c 'python' --raw | audit2allow -M duckdb_access
sudo semodule -i duckdb_access.pp

sudo ausearch -c 'python' --raw | audit2allow -M duckdb_access: Эта команда ищет в журналах аудита SELinux любые отказы в доступе, с которыми сталкивался процесс python. Затем она использует audit2allow для создания модуля политики SELinux с именем duckdb_access (может быть и другое имя, я просто выбрал это имя), содержащего правила для разрешения этих доступов.

sudo semodule -i duckdb_access.pp: Устанавливает модуль генерируемой политики (duckdb_access.pp), позволяющий python выполнить процесс.

Если это решит проблему, вы будете знать, что причиной ошибки был SELinux.

Вернуться на верх