Сохранение модели 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"