Search code examples
djangodockernginxuwsgi

django.db.utils.OperationalError: attempt to write a readonly database


i'm trying to deploy my first web app.

I'm using django + docker + nginx + uwsgi. Trying to deploy firstly in my laptop.

When i'm run my web application using django server everything ok, also it looks ok when i'm trying start web app with docker without nginx, but when i'm using with nginx proxy have a problem with writing data to DB (login/logout user sessions). If i go only to read pages, web app working fine with static files and crashing during user session changes (log in/log out)

Problem with rights of my default database issue picture

app_1    | Internal Server Error: /logout/
app_1    | Traceback (most recent call last):
app_1    |   File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
app_1    |     return self.cursor.execute(sql, params)
app_1    |   File "/usr/local/lib/python3.8/site-packages/django/db/backends/sqlite3/base.py", line 413, in execute
app_1    |     return Database.Cursor.execute(self, query, params)
app_1    | sqlite3.OperationalError: attempt to write a readonly database

(venv) yhobby@hp-probook-450-g5:~/PycharmProjects/web_naas$ ls -la
total 52
drwxrwsrwx 8 www-data yhobby 4096 Nov 19 15:16 .
drwsrwsrwt 9 yhobby   yhobby 4096 Nov 18 16:09 ..
drwxrwsrwx 6 www-data yhobby 4096 Nov 19 13:59 app
-rwxrwxrwx 1 yhobby   yhobby  293 Nov 19 14:51 docker-compose-deploy.yml
-rwxrwxrwx 1 yhobby   yhobby  202 Nov 19 11:35 docker-compose.yml
-rwxrwxrwx 1 yhobby   yhobby  701 Nov 19 15:16 Dockerfile
drwxrwsr-x 8 yhobby   yhobby 4096 Nov 19 09:06 .git
-rw-rw-r-- 1 yhobby   yhobby  100 Nov 19 08:40 .gitignore
drwxrwsr-x 3 yhobby   yhobby 4096 Nov 19 15:28 .idea
drwxrwsrwx 2 yhobby   yhobby 4096 Nov 19 15:11 proxy
-rwxrwxrwx 1 yhobby   yhobby   29 Nov 18 16:09 README.md
drwxrwsrwx 2 yhobby   yhobby 4096 Nov 18 18:40 scripts
drwxrwsrwx 6 yhobby   yhobby 4096 Nov 18 16:13 venv

(venv) yhobby@hp-probook-450-g5:~/PycharmProjects/web_naas/app$ ls -la
total 17820
drwxrwsrwx 6 www-data yhobby     4096 Nov 19 13:59 .
drwxrwsrwx 8 www-data yhobby     4096 Nov 19 15:16 ..
drwxrwsrwx 7 yhobby   yhobby     4096 Nov 19 12:13 dashboard
-rwxrwxrwx 1 yhobby   yhobby   131072 Nov 19 13:59 db.sqlite3
drwxrwsrwx 8 yhobby   yhobby     4096 Nov 19 08:43 .git
-rwxrwxrwx 1 yhobby   yhobby       92 Nov 19 08:43 .gitignore
-rwxrwxrwx 1 yhobby   yhobby 18075648 Oct  2 06:15 ip_core.db
-rwxrwxrwx 1 yhobby   yhobby      660 Nov 19 08:43 manage.py
drwxrwsrwx 3 yhobby   yhobby     4096 Nov 19 14:48 naas
-rwxrwxrwx 1 yhobby   yhobby       29 Nov 19 08:43 README.md
-rwxrwxrwx 1 yhobby   yhobby      187 Nov 19 08:43 requirements.txt
drwxrwsrwx 4 yhobby   yhobby     4096 Nov 19 12:06 static
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    },
    'ip_core': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'ip_core.db',
    }
}

web_naas/Dockerfile # root folder web_naas/

# pull official base image
FROM python:3.8-alpine

# set environment variables
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
ENV PATH="/scripts:${PATH}"

# install dependencies
COPY app/requirements.txt /requirements.txt
RUN apk add --update --no-cache --virtual .tmp gcc libc-dev linux-headers
RUN pip install -r /requirements.txt
RUN apk del .tmp

# copy directory
RUN mkdir /app
COPY ./app /app

# set work directory
WORKDIR /app

# copy directory
COPY ./scripts /scripts
RUN chmod +x /scripts/*
RUN chmod 777 /app/db.sqlite3

RUN mkdir -p /vol/web/media
RUN mkdir -p /vol/web/static

RUN adduser -D user
RUN chown -R user:user /vol
RUN chmod -R 777 /vol/web
USER user

CMD ["entrypoint.sh"]

web_naas/docker-compose.yml # root folder

version: '3.7'

services:
  app:
    build: .
    ports:
      - "8000:8000"
    volumes:
      - ./app:/app
    command: sh -c "python manage.py runserver 0.0.0.0:8000"
    environment:
      - DEBUG=1

docker-compose-deploy.yml

version: '3.7'

services:
  app:
    build: .
    volumes:
      - static_data:/vol/web
    environment:
      - DEBUG=1

  proxy:
    build:
      context: ./proxy
    volumes:
      - static_data:/vol/static
    ports:
      - "8080:8080"
    depends_on:
      - app

volumes:
  static_data:

web_naas/proxy/Dockerfile

FROM nginxinc/nginx-unprivileged:1-alpine

COPY ./default.conf /etc/nginx/conf.d/default.conf
COPY ./uwsgi_params /etc/nginx/uwsgi_params

USER root

RUN mkdir -p /vol/static
RUN chmod 777 /vol/static

USER nginx

web_naas/proxy/default.conf

server {
    listen 8080;

    location /static {
        alias /vol/static;
    }

    location / {
        uwsgi_pass app:8000;
        include /etc/nginx/uwsgi_params;
    }
}

web_naas/scripts/entrypoint.sh

#!/bin/sh

set -e

python manage.py collectstatic --noinput

uwsgi --socket :8000 --master --enable-threads --module naas.wsgi

Solution

  • The problem was a lack of rights inside the docker container

    Added the following line inside the file

    web_naas/Dockerfile # root folder

    RUN chown -R user:user /app