GitHub Actions部署Django应用报错:用户www-datas不存在
问题:GitHub Actions部署Django到Apache2 WSGI时chown用户错误
错误场景
通过GitHub Actions配置脚本,在Ubuntu服务器的Apache2 WSGI环境下自动部署Python Django应用(支持全新安装或更新),但在「Set Project - Env path」步骤执行chown命令时失败,错误信息如下:
USER_RUN: www-datas chown: invalid user: ‘www-datas:www-datas’ Error: Process completed with exit code 1.
相关GitHub Workflow配置
name: Django-wsgi env: PROJECT_NAME: 'myproject' PROJECT_DOMAIN: 'myproject.tld' PROJECT_ENV: 'venv_myproject' PROJECT_PATH: '/var/www/vhosts' PROJECT_GIT_REPO: 'github.com/xxxx/plop.git' PYTHON_VERSION: '3.10' USER_RUN: 'www-datas' on: push: branches: [ "main" ] pull_request: branches: [ "main" ] permissions: contents: read jobs: build: runs-on: ubuntu-latest strategy: max-parallel: 4 steps: - uses: actions/checkout@v3 - name: 'Set Project - Env path' run: | sudo mkdir -p '${{ env.PROJECT_PATH }}/${{ env.PROJECT_ENV }}/${{ env.PROJECT_DOMAIN }}/httpdocs' chown -R ${{ env.USER_RUN }}:${{ env.USER_RUN }} '${{ env.PROJECT_PATH }}/${{ env.PROJECT_ENV }}/${{ env.PROJECT_DOMAIN }}/httpdocs' cd '${{ env.PROJECT_PATH }}/${{ env.PROJECT_ENV }}/${{ env.PROJECT_DOMAIN }}/httpdocs' - name: 'Set Project - Prerequisites' run: | sudo apt-get update sudo apt-get install python3-pip -y sudo apt-get install apache2 libapache2-mod-wsgi-py3 -y sudo apt-get install libpq-dev python-is-python3 python3-dev -y - name: Configure Apache2 WSGI run: | if [ -f ${{ env.PROJECT_ENV }}.conf ]; then cp ${{ env.PROJECT_ENV }}.conf /etc/apache2/sites-available/${{ env.PROJECT_ENV }}.conf; fi - name: 'Set up Python version' uses: actions/setup-python@v4 with: python-version: ${{ env.PYTHON_VERSION }} check-latest: true cache : 'pip' - name: 'Create and start virtual environment' run: | cd '${{ env.PROJECT_PATH }}/${{ env.PROJECT_ENV }}/${{ env.PROJECT_DOMAIN }}/httpdocs' python -m venv ${{ env.PROJECT_ENV }} source ${{ env.PROJECT_ENV }}/bin/activate - name: 'Install Dependencies' run: | cd '${{ env.PROJECT_PATH }}/${{ env.PROJECT_ENV }}/${{ env.PROJECT_DOMAIN }}/httpdocs' python -m pip install --upgrade --force pip if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - name: Run migrations run: | python '${{ env.PROJECT_PATH }}/${{ env.PROJECT_ENV }}/${{ env.PROJECT_DOMAIN }}/httpdocs/manage.py' makemigrations python '${{ env.PROJECT_PATH }}/${{ env.PROJECT_ENV }}/${{ env.PROJECT_DOMAIN }}/httpdocs/manage.py' migrate python '${{ env.PROJECT_PATH }}/${{ env.PROJECT_ENV }}/${{ env.PROJECT_DOMAIN }}/httpdocs/manage.py' migrate --run-syncdb python '${{ env.PROJECT_PATH }}/${{ env.PROJECT_ENV }}/${{ env.PROJECT_DOMAIN }}/httpdocs/manage.py' check deploy: permissions: contents: none runs-on: ubuntu-latest needs: build environment: name: 'Development' url: ${{ env.PROJECT_DOMAIN }} steps: - name: 'Deploy Web App' id: deploy-to-webapp run: if [ -d .git ]; then git pull; else; git clone 'https://${{secrets.GIT_USR}}:${{secrets.GIT_PWD}}@${{ env.PROJECT_GIT_REPO }}' ; fi - name: Run migrations run: | python '${{ env.PROJECT_PATH }}/${{ env.PROJECT_ENV }}/${{ env.PROJECT_DOMAIN }}/httpdocs/manage.py' makemigrations python '${{ env.PROJECT_PATH }}/${{ env.PROJECT_ENV }}/${{ env.PROJECT_DOMAIN }}/httpdocs/manage.py' migrate python '${{ env.PROJECT_PATH }}/${{ env.PROJECT_ENV }}/${{ env.PROJECT_DOMAIN }}/httpdocs/manage.py' migrate --run-syncdb python '${{ env.PROJECT_PATH }}/${{ env.PROJECT_ENV }}/${{ env.PROJECT_DOMAIN }}/httpdocs/manage.py' check
解决方案
1. 修正用户名拼写错误
Ubuntu系统中Apache的默认运行用户是www-data(单数形式),而非配置中的www-datas。修改env中的USER_RUN值:
USER_RUN: 'www-data'
2. 调整步骤执行顺序
当前chown步骤在安装Apache2之前执行,此时www-data用户尚未创建(Apache安装过程中才会生成该用户)。将「Set Project - Env path」步骤移到「Set Project - Prerequisites」步骤之后:
jobs: build: runs-on: ubuntu-latest strategy: max-parallel: 4 steps: - uses: actions/checkout@v3 - name: 'Set Project - Prerequisites' run: | sudo apt-get update sudo apt-get install python3-pip -y sudo apt-get install apache2 libapache2-mod-wsgi-py3 -y sudo apt-get install libpq-dev python-is-python3 python3-dev -y - name: 'Set Project - Env path' run: | sudo mkdir -p '${{ env.PROJECT_PATH }}/${{ env.PROJECT_ENV }}/${{ env.PROJECT_DOMAIN }}/httpdocs' sudo chown -R ${{ env.USER_RUN }}:${{ env.USER_RUN }} '${{ env.PROJECT_PATH }}/${{ env.PROJECT_ENV }}/${{ env.PROJECT_DOMAIN }}/httpdocs' cd '${{ env.PROJECT_PATH }}/${{ env.PROJECT_ENV }}/${{ env.PROJECT_DOMAIN }}/httpdocs'
3. 给chown命令添加sudo权限
创建目录时使用了sudo,但chown命令未加sudo,普通用户无法修改系统目录权限,需补充sudo:
sudo chown -R ${{ env.USER_RUN }}:${{ env.USER_RUN }} '${{ env.PROJECT_PATH }}/${{ env.PROJECT_ENV }}/${{ env.PROJECT_DOMAIN }}/httpdocs'
额外优化点
deploy阶段的git pull/clone未指定目标目录,会在当前工作目录执行,建议明确路径:
if [ -d '${{ env.PROJECT_PATH }}/${{ env.PROJECT_ENV }}/${{ env.PROJECT_DOMAIN }}/httpdocs/.git' ]; then cd '${{ env.PROJECT_PATH }}/${{ env.PROJECT_ENV }}/${{ env.PROJECT_DOMAIN }}/httpdocs' && git pull; else git clone 'https://${{secrets.GIT_USR}}:${{secrets.GIT_PWD}}@${{ env.PROJECT_GIT_REPO }}' '${{ env.PROJECT_PATH }}/${{ env.PROJECT_ENV }}/${{ env.PROJECT_DOMAIN }}/httpdocs'; fi
- 迁移命令需在虚拟环境中执行,先激活虚拟环境再运行:
cd '${{ env.PROJECT_PATH }}/${{ env.PROJECT_ENV }}/${{ env.PROJECT_DOMAIN }}/httpdocs' source ${{ env.PROJECT_ENV }}/bin/activate python manage.py makemigrations python manage.py migrate python manage.py migrate --run-syncdb python manage.py check
内容的提问来源于stack exchange,提问作者MiKDO
相关产品推荐
相关产品推荐

