Django 模型保存不在守护进程模式下工作,但与 runserver 一起工作

Django model save not working in daemon mode but working with 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)中一切正常,当我添加 public github 回购时,克隆总是成功。

当我 运行 服务器像这样时它工作: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 存储库,甚至没有触发任何错误。\

这有什么问题吗?谁能帮我解决这个问题?

在 systemd 单元文件中,您用 virtualenv 的路径覆盖 Environment 中 root 用户的 PATH 变量。因此 root 用户在 PATH 中没有通常的项目,例如/usr/bin 其中 git 命令通常存在。所以你需要使用git的绝对路径,例如/usr/bin/git,或者将git的bin目录添加到PATH,例如:

Environment="PATH=/usr/bin:/root/.local/share/virtualenvs/myproject-9citYRnS/bin"