Amazon Elastic Beanstalk not serving django static files

后端 未结 8 2051
你的背包
你的背包 2021-02-18 19:40

I am trying to put up a simple django app on elastic beanstalk. I thought I had the static parts of the app figured out as it works with heroku and on a server that was set up

相关标签:
8条回答
  • 2021-02-18 19:44

    I came across the same problem today, and I realized that I forgot this option in the .ebextensions/.config file. Make sure you have it too

    option_settings:
      - namespace: aws:elasticbeanstalk:container:python:staticfiles
        option_name: /static/
        value: static/
    
    0 讨论(0)
  • 2021-02-18 19:54

    If your environment uses a platform branch based on Amazon Linux 2, the right settings for .config file inside .ebextensions folder

    aws:elasticbeanstalk:environment:proxy:staticfiles:
        /static: static
    

    Inside your project settings.py you should have:

    STATIC_URL = '/static/'
    STATIC_ROOT = 'static'
    
    0 讨论(0)
  • 2021-02-18 19:58

    To support multiple apps and do this you need to run collectstatic

    Settings.py

    STATIC_ROOT = os.path.join(BASE_DIR, "static")
    

    Make sure you have a folder called "static" in your root

    In your ebs config file eg. (02_python.config or similar)

    option_settings:
        ...
        "aws:elasticbeanstalk:container:python:staticfiles":
            /static/: "static/"
    

    Then before you upload to ebs run python manage.py collectstatic

    This collects all the static files in one folder which you have already pointed to in your config.

    Then you can run eb deploy like normal

    Opptionally if you don't want to commit the static files to your source control twice and want the server to do this for you add this to your config

    container_commands:
    01_collectstatic:
        command: "source /opt/python/run/venv/bin/activate && python manage.py collectstatic --noinput"
    

    So your file should look something like this:

    container_commands:
    01_collectstatic:
      command: "source /opt/python/run/venv/bin/activate && python manage.py collectstatic --noinput"
    
    
    option_settings:
        "aws:elasticbeanstalk:container:python":
          WSGIPath: app/wsgi.py
        "aws:elasticbeanstalk:container:python:staticfiles":
          /static/: "static/"
    

    This will run collect static for you when you run eb deploy

    0 讨论(0)
  • 2021-02-18 20:00

    For me, the problem was having

    STATIC_ROOT = os.path.join(os.path.dirname(__file__), 'static')
    

    Instead, I changed it to

    STATIC_ROOT = 'static'
    

    Also, my .conf file has

    option_settings:
      "aws:elasticbeanstalk:container:python:staticfiles":
        "/static/": "static/"
    
    0 讨论(0)
  • 2021-02-18 20:00

    Just so you guys know, namespace for static files in recent versions of EBS, changed to aws:elasticbeanstalk:environment:proxy:staticfiles, like this:

    option_settings:
      aws:elasticbeanstalk:environment:proxy:staticfiles:
        /static: static
    
    0 讨论(0)
  • 2021-02-18 20:02

    All previous answers didn't help me This works for me.

    Basically I created two steps inside .ebextensions

    01_django.config

    container_commands:
        01_migrate:
            command: "source /opt/python/current/env && source /opt/python/run/venv/bin/activate && cd /opt/python/current/app && python manage.py migrate --noinput"
            leader_only: true
        02_touch_superuser:
            command: "source /opt/python/current/env && source /opt/python/run/venv/bin/activate && cd /opt/python/current/app && python manage.py touch_superuser"
            leader_only: true
    option_settings:
        aws:elasticbeanstalk:container:python:
            WSGIPath: config/wsgi.py
            NumProcesses: 2
            NumThreads: 10
        aws:elasticbeanstalk:application:environment:
            STAGING: 1
            DJANGO_SETTINGS_MODULE: config.settings.production
        aws:elasticbeanstalk:container:python:staticfiles:
            "/static/": "htdocs/static/"
            "/media/": "htdocs/media/"
    

    config/wsgi.py Could be a different path in your project

    02_collec_static.config

    files:
      "/opt/elasticbeanstalk/hooks/appdeploy/post/10_collect_static.sh":
        mode: "000755"
        owner: root
        group: root
        content: |
          set -xe
    
          source /opt/python/current/env
          source /opt/python/run/venv/bin/activate
          cd /opt/python/current/app && python manage.py collectstatic --noinput
    
          echo "Statics collected...!!"
    
    

    An important thing, you settings/*.py should match with your static path that EBS serves, in my case this is my config.

    ...
    PROJECT_PATH = dirname(dirname(dirname(__file__)))
    MEDIA_ROOT = os.path.join(PROJECT_PATH, 'htdocs/media')
    STATIC_ROOT = os.path.join(PROJECT_PATH, 'htdocs/static')
    ...
    
    0 讨论(0)
提交回复
热议问题