Сохранение модели Django не работает в режиме демона, но работает в режиме runserver

Я сохраняю репо github на сервер, как только пользователь добавляет свое репо github, смотрите эту модель.

class Repo(models.Model):
    url = models.CharField(help_text='github repo cloneable',max_length=600)
    def save(self, *args, **kwargs):
        # os.system('git clone https://github.com/somegithubrepo.git')
        os.system('git clone {}'.format(self.url))
        super(Repo, self).save(*args, **kwargs)

Все работает хорошо, как я хочу, как на локальном сервере, так и на удаленном сервере, таком как digitalOcean Droplet, когда я добавляю публичный github repo, клон всегда успешен.

он работает, когда я запускаю сервер следующим образом: python3 manage.py runserver 0.0.0.0:800

Но когда я запускаю в режиме демона с gunicorn и nginx, это не работает,

Все работает, даже сохранение данных в базе данных, только не происходит клонирование в режиме демона, что не так?

это мой gunicorn.service

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=root
Group=www-data

WorkingDirectory=/var/www/myproject
Environment="PATH=/root/.local/share/virtualenvs/myproject-9citYRnS/bin"
ExecStart=/usr/local/bin/pipenv run gunicorn --access-logfile - --workers 3 --bind unix:/var/www/myproject/config.sock -m 007 myproject.wsgi:application

[Install]
WantedBy=multi-user.target

Обратите внимание еще раз, все работает, даже gunicorn, данные сохраняются в базе данных, только он не клонирует github repo, даже не выдает никаких ошибок.\

Что случилось? Кто-нибудь может помочь мне решить эту проблему?

У меня была такая же проблема с apache. Это означает, что база данных не доступна для записи для пользователя www-data.

Если он использует sqlite, вам нужно убедиться, что sqlite db файл. После того, как я сделал это, он работает:

sudo chown www-data:www-data db/sqlite.db
sudo chown www-data:www-data db

Также требуется возможность записи каталога, так как будет создан временный файл блокировки.

В файле модулей systemd вы перезаписываете переменную PATH пользователя root в Environment с путем к virtualenv. Поэтому у пользователя root нет обычных элементов в PATH, например /usr/bin, где обычно находится команда git. Поэтому нужно использовать абсолютный путь git, например /usr/bin/git, или добавить каталог bin git'а в PATH, например:

Environment="PATH=/usr/bin:/root/.local/share/virtualenvs/myproject-9citYRnS/bin"
Вернуться на верх