使用Docker 打造 Astro + Strapi 双剑合璧开发环境

349 阅读1分钟

网站要改版,经过一番调研选择 strapi 做为CMS 提供数据接口等服务 和 astro 开发前台页面。
一个前端开发搞定web项目的开发场景~

实现功能:

  1. 利用nginx反向代理将项目页面和后台管理配置到一个域名下面
  2. strapi 使用 postgres 数据库
  3. astro 使用 SSR

项目目录划分:

backend (strapi代码)
frontend (astro代码)
nginx (代理服务器)

docker-compose 文件如下:

version: '3'
name: "fullstack-app"
services:
  # 数据库服务
  strapiDB:
    container_name: strapiPG
    platform: linux/amd64 #for platform error on Apple M1 chips
    restart: unless-stopped
    env_file: .env
    image: postgres:14.5-alpine
    environment:
      POSTGRES_USER: ${DATABASE_USERNAME}
      POSTGRES_PASSWORD: ${DATABASE_PASSWORD}
      POSTGRES_DB: ${DATABASE_NAME}
    volumes:
      - strapipg-data:/var/lib/postgresql/data/ #using a volume
      #- ./data:/var/lib/postgresql/data/ # if you want to use a bind folder

    ports:
      - "5432:5432"
    networks:
      - myapp # 加入到myapp网络

  # 数据库管理
  strapiAdminer:
    container_name: strapiAdminer
    image: adminer
    restart: unless-stopped
    ports:
      - '9090:8080'
    environment:
      - ADMINER_DEFAULT_SERVER=strapiDB
    networks:
      - myapp
    depends_on:
      - strapiDB

  # Strapi CMS
  strapi:
    container_name: mystrapi
    build: 
      context: ./backend
      dockerfile: ./docker/Dockerfile
    image: mystrapisql:latest
    restart: unless-stopped
    env_file: .env
    environment:
      DATABASE_CLIENT: ${DATABASE_CLIENT}
      DATABASE_HOST: strapiDB
      DATABASE_PORT: ${DATABASE_PORT}
      DATABASE_NAME: ${DATABASE_NAME}
      DATABASE_USERNAME: ${DATABASE_USERNAME}
      DATABASE_PASSWORD: ${DATABASE_PASSWORD}
      JWT_SECRET: ${JWT_SECRET}
      ADMIN_JWT_SECRET: ${ADMIN_JWT_SECRET}
      APP_KEYS: ${APP_KEYS}
      NODE_ENV: ${NODE_ENV}
    volumes:
      - ./backend/config:/opt/app/config
      - ./backend/src:/opt/app/src
      - ./backend/package.json:/opt/package.json
      - ./backend/yarn.lock:/opt/yarn.lock

      - ./backend/.env:/opt/app/.env
      - ./backend/public/uploads:/opt/app/public/uploads
    ports:
      - "1337:1337"
    networks:
      - myapp
    depends_on:
      - strapiDB

  # Astro
  app:
    container_name: myastro
    build:
      context: ./frontend
      dockerfile: ./docker/Dockerfile
    restart: unless-stopped
    ports:
      - "3000:4321"
    environment:
      - PUBLIC_STRAPI_URL=http://strapi:1337 #important
      - PUBLIC_STRAPI_ASSETS_URL=https://www.shougongmi.com #important public host
    networks:
      - myapp
    depends_on:
      - strapi
  
  nodejsapp: 
    container_name: mynodeapp
    build:
      context: ./nodejs
    environment:
      NODE_ENV: production
    ports:
      - 3001:3000
    networks:
      - myapp

  nginx:
    image: nginx:latest
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - $PWD/nginx/conf/logs:/var/log/nginx
      - $PWD/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
      - $PWD/nginx/conf.d:/etc/nginx/conf.d
      - $PWD/nginx/ssl:/etc/nginx/ssl/
      - $PWD/nginx/html:/usr/share/nginx/html
    networks:
      - myapp
    depends_on:
      - app

volumes:
  strapi-data:
  strapipg-data:

# 创建自定义网络
networks:
  myapp:
    driver: bridge