【Linux】sqlite3でのInsertが「attempt to write a readonly database」で失敗した話

この記事は約3分で読めます。

 

djangoとsqlite3でログイン制のwebアプリケーションを作成してローカルでの動作確認を終えて本番環境にデプロイし、試しに適当なユーザー名とパスワードでユーザー登録をしようとしたところ↓のエラーに遭遇

 

sqlite3.OperationalError: attempt to write a readonly database

 

 

どうせ権限の問題だろーと思い、とりあえず↓で権限とか所有者の確認

 

ls -l <dbのパス>
ls -l <dbを格納しているディレクトリ>

 

rootになっていたのと権限が足りなかったのが原因と思い、とりあえず所有者をApacheにして権限も全開にしてあとで検証しつつ締めなおそうということで↓を実行。

 

chmod 777 <dbのパス>
chown apache:apache <dbのパス>

 

ですが、権限を全部開放して所有者とグループをapache(www-data)にしても治らず途方に暮れていましたが、以下のコマンドを実行することで解決しました。

 

sudo setsebool -P httpd_unified 1

 

ちゃんとしたエラー理由とかは↓に書いてありますが、英語なのと、そもそもサーバー回りが良く分かっていないので、何を言っているか分かりませんでしたが、SELinuxが原因っぽい?

 

元ネタ:

https://stackoverflow.com/questions/21054245/attempt-to-write-a-readonly-database-django-w-selinux-error

 

 

ちなみにSELinuxというのは強制アクセス制御機能を加えるものらしくこれのせいでいくら権限を付与してもダメだったらしい。

 

 

【ざっくりと理解する】SELinuxとは?

 

 

まあこれでとりあえずは、sqlite3.OperationalError: attempt to write a readonly databaseは出なくなり本番環境でも動いたので、777にしていた権限も締めなおして一件落着。

 

ローカルでの開発作業も大変ですが、エラーメッセージを読めばまだなんとかなる感じがしますけど、サーバーにデータをアップロードしてApacheとかでデプロイする系の作業はエラーメッセージを見ても解決策が良く分からないことが多いので解決にスゴイ時間が掛かります。。。

 

 

関連記事:CentOS7でApache+wsgi+FlaskでWebアプリをデプロイする上でのエラー原因&解決法

 

 

 

コメント

タイトルとURLをコピーしました