【问题标题】:Access Pgadmin4 in Production within dockerized django application在 dockerized django 应用程序中访问生产环境中的 Pgadmin4
【发布时间】:2021-01-23 19:55:54
【问题描述】:

我不确定它有多大意义,但我正在学习 docker 使用 Gunicorn + Nginx + AWS 部署 Django 应用程序。 到目前为止,它工作正常,我在生产中对其进行了单元测试。 我的问题是我现在如何访问 pgAdmin4?

docker-compose.staging.yml

version: '3.8'

# networks: 
#   public_network:
#     name: public_network
#     driver: bridge

services:
  web:
    build: 
      context: .
      dockerfile: Dockerfile.prod
    # image: <aws-account-id>.dkr.ecr.<aws-region>.amazonaws.com/django-ec2:web
    command: gunicorn djangotango.wsgi:application --bind 0.0.0.0:8000
    volumes:
      # - .:/home/app/web/
      - static_volume:/home/app/web/static
      - media_volume:/home/app/web/media    
    expose:
      - 8000
    env_file:
      - ./.env.staging
    networks: 
      service_network:
 
  db:
    image: postgres:12.0-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    env_file:
      - ./.env.staging.db
    networks: 
      service_network:
    # depends_on: 
    #   - web
  
  pgadmin:
    image: dpage/pgadmin4
    env_file: 
      - ./.env.staging.db
    ports:
      - "8080:80"
    volumes:
      - pgadmin-data:/var/lib/pgadmin
    depends_on: 
      - db
    links: 
      - "db:pgsql-server"
    environment: 
      - PGADMIN_DEFAULT_EMAIL=pgadmin4@pgadmin.org
      - PGADMIN_DEFAULT_PASSWORD=fakepassword
      - PGADMIN_LISTEN_PORT=80
    networks: 
      service_network:

  nginx-proxy:
    build: nginx
    # image: <aws-account-id>.dkr.ecr.<aws-region>.amazonaws.com/django-ec2:nginx-proxy
    restart: always
    ports:
      - 443:443  
      - 80:80
    networks: 
      service_network:
    volumes:
      - static_volume:/home/app/web/static
      - media_volume:/home/app/web/media 
      - certs:/etc/nginx/certs
      - html:/usr/share/nginx/html
      - vhost:/etc/nginx/vhost.d
      - /var/run/docker.sock:/tmp/docker.sock:ro
    labels:
      - "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy"
    depends_on:
      - web

  nginx-proxy-letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    env_file:
      - .env.staging.proxy-companion
    networks: 
      service_network:
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - certs:/etc/nginx/certs
      - html:/usr/share/nginx/html
      - vhost:/etc/nginx/vhost.d
    depends_on:
      - nginx-proxy
  
networks: 
  service_network:
   
volumes:
  postgres_data:
  pgadmin-data:
  static_volume:
  media_volume:
  certs:
  html:
  vhost:

我可以通过我的域名(如 xyz.example.com)访问 django 应用程序。我刚刚在这里展示了 docker-compose。 同样在本地,我可以通过 localhost:8080 访问 pgadmin4。

是否有可能在生产中做到这一点?如果是怎么办? 我会使用 AWS RDS 作为数据库,但现在我的数据库在 docker 容器中,所以我正在考虑如何访问它?

【问题讨论】:

    标签: django postgresql amazon-web-services docker


    【解决方案1】:

    我找到了一些文档。

    https://www.pgadmin.org/docs/pgadmin4/development/container_deployment.html

    访问您的 pgadmin 页面的 url 将在 nginx 中配置。这个例子:

    server {
        listen 80;
        return 301 https://$host$request_uri;
    }
    
    server {
        listen 443;
        server_name _;
    
        ssl_certificate /etc/nginx/server.cert;
        ssl_certificate_key /etc/nginx/server.key;
    
        ssl on;
        ssl_session_cache builtin:1000 shared:SSL:10m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
        ssl_prefer_server_ciphers on;
    
        location /pgadmin4/ {
            proxy_set_header X-Script-Name /pgadmin4;
            proxy_set_header X-Scheme $scheme;
            proxy_set_header Host $host;
            proxy_pass http://localhost:5050/;
            proxy_redirect off;
        }
    }
    

    我在这里发现的重要部分是位置 /pgadmin4/ 重定向到 localhost:5050。在您的情况下,它将是 localhost:8080。

    看起来您在另一篇文章中包含了您的 nginx 配置: https://www.digitalocean.com/community/questions/no-live-upstream-while-connecting-to-upstream-jwilder-ngnix-proxy

    upstream djangotango.meghaggarwal.com {
        server web:8000;
    }
    
    server {
    
        listen 80;
        listen 443;
        server_name djangotango.meghaggarwal.com
    
        location / {
            proxy_pass http://djangotango.meghaggarwal.com;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $host;
            proxy_redirect off;
    
        }
    
        location /static/ {
          alias /home/app/web/static/;
          add_header Access-Control-Allow-Origin *;
        }
    
            location /media/ {
            alias /home/app/web/media/;
            add_header Access-Control-Allow-Origin *;
    
    }
    
    }
    
    

    我建议添加如下部分:

    
        location /pgadmin4/ {
            proxy_set_header X-Script-Name /pgadmin4;
            proxy_set_header X-Scheme $scheme;
            proxy_set_header Host $host;
            proxy_pass http://localhost:8080/;
            proxy_redirect off;
        }
    
    

    它可能不是您需要添加的唯一配置...我只是浏览了文档。如果这不能解决问题,我相信该链接可能会为您提供更多帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-06
      • 2011-10-25
      • 2021-01-06
      • 2021-11-23
      • 2014-05-21
      • 2011-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多