我克隆了一个 Django+Node.js 开源项目,其目标是上传和注释文本文档,并将注释保存在Postgres db中。该项目具有docker-compose 的堆栈文件,适用于 Django 开发和生产设置。这两个堆栈文件都可以使用 Postgres 数据库开箱即用。
现在我想把这个项目上传到谷歌云——作为我的第一个容器化应用程序。作为第一步,我只想将持久存储移动到Cloud SQL,而不是堆栈文件中包含的 Postgres 映像。我的堆栈文件(Django dev)如下所示
version: "3.7"
services:
backend:
image: python:3.6
volumes:
- .:/src
- venv:/src/venv
command: ["/src/app/tools/dev-django.sh", "0.0.0.0:8000"]
environment:
ADMIN_USERNAME: "admin"
ADMIN_PASSWORD: "${DJANGO_ADMIN_PASSWORD}"
ADMIN_EMAIL: "admin@example.com"
# DATABASE_URL: "postgres://doccano:doccano@postgres:5432/doccano?sslmode=disable"
DATABASE_URL: "postgres://${CLOUDSQL_USER}:${CLOUDSQL_PASSWORD}@sql_proxy:5432/postgres?sslmode=disable"
ALLOW_SIGNUP: "False"
DEBUG: "True"
ports:
- 8000:8000
depends_on:
- sql_proxy
networks:
- network-overall
frontend:
image: node:13.7.0
command: ["/src/frontend/dev-nuxt.sh"]
volumes:
- .:/src
- node_modules:/src/frontend/node_modules
ports:
- 3000:3000
depends_on:
- backend
networks:
- network-overall
sql_proxy:
image: gcr.io/cloudsql-docker/gce-proxy:1.16
command:
- "/cloud_sql_proxy"
- "-dir=/cloudsql"
- "-instances=${CLOUDSQL_CONNECTION_NAME}=tcp:0.0.0.0:5432"
- "-credential_file=/root/keys/keyfile.json"
volumes:
- ${GCP_KEY_PATH}:/root/keys/keyfile.json:ro
- cloudsql:/cloudsql
networks:
- network-overall
volumes:
node_modules:
venv:
cloudsql:
networks:
network-overall:
我有一堆模型,例如Django 后端中的项目,我可以使用 Django 管理界面查看、修改、添加和删除它们,但是在尝试通过 Node.js 视图访问它们时,我得到一个403 Forbidden错误。这是我所有的 Django 模型的情况。
作为参考,在上面的堆栈文件中,我列出了与最初克隆的 Docker-compose 堆栈文件的唯一区别,其中DATABASE_URL
用于指向本地 Postgres Docker 映像,如下
postgres:
image: postgres:12.0-alpine
volumes:
- postgres_data:/var/lib/postgresql/data/
environment:
POSTGRES_USER: "doccano"
POSTGRES_PASSWORD: "${POSTGRES_PASSWORD}"
POSTGRES_DB: "doccano"
networks:
- network-backend
为了检查我的 GCP 密钥是否正确,我尝试单独部署 Cloud SQL 代理容器并与之交互(添加、删除和更新包含表中的行),这是可能的。但是,我可以在已部署的 Docker-compose 堆栈中成功使用 Django 管理界面这一事实应该已经证明 Cloud SQL 代理一切正常。
无论如何,我都不是经验丰富的 Node.js 开发人员,并且对 Django 和 Django admin 有一点经验。我使用 Docker-compose 设置的目的是我不必为复杂的 js 视图而烦恼,而只需要处理 Python 业务逻辑。