DuckDB, Django и apache2 Permission Denied в производстве
У меня проблема с базой данных duckdb, которую я не могу понять.
После того как я создал базу данных .db
и поместил ее в корень apache2/Django webapp
, а также предоставил www-data
доступ к ней и ее каталогу, я все равно получаю отказ в разрешении.
Вот странная часть(и):
- Я не получаю ошибку разрешения при установлении соединения, я получаю ее только в части
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
- Когда я запускаю тот же самый код 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.