docker - Dockerize pgAdmin - CSRF 令牌不匹配
问题描述
我一直在尝试解决一个问题,即当我尝试登录到 Nginx 代理后面的 pgAdmin(在 docker 容器中)时,我收到一个错误,即 CSRF 令牌不匹配。
坦率地说,这个问题是否与 nginx 相关我不确定,但配置文件如下:
Docker 群服务:
pgAdmin:
image: dpage/pgadmin4
networks:
- my-network
ports:
- 9102:80
environment:
- PGADMIN_DEFAULT_EMAIL=${PGADMIN_DEFAULT_EMAIL}
- PGADMIN_DEFAULT_PASSWORD=${PGADMIN_DEFAULT_PASSWORD}
- PGADMIN_CONFIG_SERVER_MODE=True
volumes:
- /home/docker-container/pgadmin/persist-data:/var/lib/pgadmin
- /home/docker-container/pgadmin/persist-data/servers.json:/pgadmin4/servers.json
deploy:
placement:
constraints: [node.hostname == my-host-name]
Nginx 配置:
server {
listen 443 ssl;
server_name my-server-name;
location / {
proxy_pass http://pgAdmin/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-CSRF-Token $http_x_pga_csrftoken;
}
ssl_certificate /home/nginx/ssl/certificate.crt;
ssl_certificate_key /home/nginx/ssl/private.key;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_prefer_server_ciphers on;
server {
listen 80;
server_name my-server-name;
return 301 https://my-server-name $request_uri;
}
我可以通过两种方式访问 pgAdmin:
- 第一种方法是直接主机 ip 像 172.23.53.2:9102
- 第二种方式是通过 Nginx 代理。
当我尝试通过直接主机 ip 访问 pgAdmin 时没有错误,但是当我尝试通过 dns 访问时(例如 my-server.pgadmin.com ),当我登录到 pgAdmin 仪表板时出现错误。
错误是:
错误的请求
CSRF 令牌不匹配。
我对这个错误的第一个看法是 nginx 没有将 CSRF Token 标头传递给 pgAdmin。由于这些原因,我已经多次更改了 nginx 配置文件,但仍然出现此错误。
什么可能是这个错误的根源,我该如何解决这个问题?
解决方案
尝试使用默认端口“5050:80”。它解决了我这边的同样问题。
还建议使用字符串。
参考: https ://docs.docker.com/compose/compose-file/compose-file-v3/#ports
推荐阅读
- python - 使用 reg ex 和 re.sub 匹配模式
- svg - 如何指定 SVG 文档中重用元素的线条粗细?
- python - 导入错误:尝试在没有已知父包的情况下进行相对导入
- python - 在 tika 中改变语言
- sql - 如何在 sql 中添加动态列以满足以下要求
- html - 如何将域设置为 HTML ahrefs
- java - 使用Java将笛卡尔坐标转换为不同的比例
- java - 在Java内部如何工作==运算符,无法分析
- angular - 如何调试 Angular 项目中损坏的 ng lint
- python - 如何使用 sympy.plotting 绘制 SymPy 的内置函数