我创建了两个应用程序(后端(fast api.在8000端口上工作),前端(react ).在80端口上工作)它们相互通信.

我的Docker-Compose文件:

version: '3.7'
services:
  frontend:
    container_name: "frontend"
    build: 
      context: ./frontend
    stop_signal: SIGTERM
    ports:
      - "80:80"
    volumes:
      - ./uploads:/app/uploads
    networks:
      - good_network
    depends_on:
      - backend

  backend:
    container_name: "backend"
    build:
      context: ./backend
    stop_signal: SIGTERM
    ports:
      - "8000:8000"
    networks:
      - good_network
    volumes:
      - ./uploads:/app/uploads
    depends_on:
      - postgres

  postgres:
    container_name: "postgres"
    image: postgres:16.0
    healthcheck:
      test: [ "CMD-SHELL", "pg_isready -d sugar -U postgres" ]
      interval: 5s
      timeout: 5s
      retries: 5
      start_period: 5s
    restart: unless-stopped
    ports:
      - "5432:5432"
    volumes:
      - ./postgres_data:/var/lib/postgresql/data
    networks:
      - good_network

networks:
  good_network:

volumes:
  postgres_data:

帮助我配置证书:(.

我的try :

uvicorn.run(..., ssl_keyfile="./privkey.pem", ssl_certfile="./fullchain.pem")  # Problem with cors :/

我试过使用certbot,但我创建了一个certfiles,但我不明白该怎么办.

推荐答案

我通过nginx和后端子域解决了这个问题.

对于特写阅读器:

# Number of simultaneously processed connections
events {
  worker_connections 1024;
}

http {

    # for example configuration for your python application
    # port means where future requests 
    # from the below specified block will be forwarded
    upstream web {
        server <your_host>:<application_port>;
    }

    server {
        listen 80;

        server_name <your_host>;

        location / {
            proxy_pass http://web;
            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-Forwarded-Proto http;
        }
    }

    # This is a server configuration block in Nginx that determines how
    # to handle requests for a specific domain or IP address and port. 
    # In this case, the server listens for requests on port 443 
    # using an SSL certificate to secure the connection and passes them 
    # to the backend server named "back" via HTTP using the proxy_pass directive.
    server {
        listen 443 ssl;
        server_name <your_host>;
        
        # your cert files (for example, generated by certbot)
        ssl_certificate /etc/letsencrypt/live/<your_host>/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/<your_host>/privkey.pem;
        ssl_trusted_certificate /etc/letsencrypt/live/<your_host>/chain.pem;

        location / {
            proxy_pass http://web;
            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-Forwarded-Proto https;
        }
}

我的nginx.conf:

events {
  worker_connections 1024;
}

http {

    # backend

    upstream back {
        server back.mysite.ru:8000;
    }

    server {
        listen 80;
        server_name back.mysite.ru;

        location / {
            proxy_pass http://back;
            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-Forwarded-Proto http;
        }
    }

    server {
        listen 443 ssl;
        server_name back.mysite.ru;

        ssl_certificate /etc/letsencrypt/live/back.mysite.ru/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/back.mysite.ru/privkey.pem;
        ssl_trusted_certificate /etc/letsencrypt/live/back.mysite.ru/chain.pem;

        location / {
            proxy_pass http://back;
            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-Forwarded-Proto https;
        }
    }

    # frontend

    upstream front {
        server mysite.ru:80;
    }

    server {
        listen 80;
        server_name mysite.ru;

        location / {
            proxy_pass http://front;
            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-Forwarded-Proto http;
        }
    }

    server {
        listen 443 ssl;
        server_name mysite.ru;

        ssl_certificate /etc/letsencrypt/live/mysite.ru/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/mysite.ru/privkey.pem;
        ssl_trusted_certificate /etc/letsencrypt/live/mysite.ru/chain.pem;

        location / {
            proxy_pass http://front;
            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-Forwarded-Proto https;
        }
    }
}

我在 docker 集装箱里的nginx:

nginx:
    build: ./nginx
    ports:
      - "443:443"
    volumes:
      - /etc/letsencrypt:/etc/letsencrypt
    depends_on:
      - frontend
      - backend

这个docker容器在容器内部运行Nginx,并将其配置为侦听端口443.容器还在容器内部挂载了一个本地/etc/letsencrypt目录,以便Nginx可以使用存储在此目录中的SSL证书.

我的nginx文档文件:

FROM nginx

COPY nginx.conf /etc/nginx/nginx.conf

Python相关问答推荐

使用decorator 自动继承父类

Python中的锁定类和线程以实现dict移动

如何使用关键参数按列对Pandas rame进行排序

当测试字符串100%包含查询字符串时,为什么t fuzzywuzzy s Process.extractBests不给出100%分数?

除了Python之外,可以替代bare?

将从Python接收的原始字节图像数据转换为C++ Qt QIcon以显示在QStandardProject中

Tkinter滑动条标签.我不确定如何删除滑动块标签或更改其文本

ambda将时间戳与组内另一列的所有时间戳进行比较

Google Drive API获取文件计量数据

三个给定的坐标可以是矩形的点吗

难以在Manim中正确定位对象

在Google Colab中设置Llama-2出现问题-加载判断点碎片时Cell-run失败

未删除映射表的行

如何记录脚本输出

将pandas Dataframe转换为3D numpy矩阵

修复mypy错误-赋值中的类型不兼容(表达式具有类型xxx,变量具有类型yyy)

如何在Python数据框架中加速序列的符号化

如何在WSL2中更新Python到最新版本(3.12.2)?

ruamel.yaml dump:如何阻止map标量值被移动到一个新的缩进行?

人口全部乱序 - Python—Matplotlib—映射