Просмотр исходного кода

chore: Consolidate & improve docker-compose config

Now there is a single docker-compose file in the root, and
everything is configured so that no manual setup or
configuration is needed to get started.
Michael Bromley 1 год назад
Родитель
Сommit
2a8c17ec66

+ 7 - 5
.github/workflows/build_and_test.yml

@@ -60,23 +60,25 @@ jobs:
       mariadb:
         image: bitnami/mariadb:10.3
         env:
-          ALLOW_EMPTY_PASSWORD: yes
+          MARIADB_ROOT_USER: vendure
+          MARIADB_ROOT_PASSWORD: password
         ports:
           - 3306
         options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
       mysql:
         image: bitnami/mysql:8.0
         env:
-          ALLOW_EMPTY_PASSWORD: yes
           MYSQL_AUTHENTICATION_PLUGIN: mysql_native_password
+          MYSQL_ROOT_USER: vendure
+          MYSQL_ROOT_PASSWORD: password
         ports:
           - 3306
         options: --health-cmd="mysqladmin ping --silent" --health-interval=10s --health-timeout=20s --health-retries=10
       postgres:
-        image: postgres:12
+        image: postgres:16
         env:
-          POSTGRES_USER: admin
-          POSTGRES_PASSWORD: secret
+          POSTGRES_USER: vendure
+          POSTGRES_PASSWORD: password
         ports:
           - 5432
         options: --health-cmd=pg_isready --health-interval=10s --health-timeout=5s --health-retries=3

+ 29 - 17
README.md

@@ -62,32 +62,44 @@ Packages must be built (i.e. TypeScript compiled, admin ui app built, certain as
 
 Note that this can take a few minutes.
 
-### 3. Set up the server
+### 3. Start the docker containers
 
-The server requires an SQL database to be available. The simplest option is to use SQLite, but if you have Docker available you can use the [dev-server docker-compose file](./packages/dev-server/docker-compose.yml) which will start up both MariaDB and Postgres as well as their GUI management tools.
+All the necessary infrastructure is defined in the root [docker-compose.yml](./docker-compose.yml) file. At a minimum,
+you will need to start a database, for example:
 
-Vendure uses [TypeORM](http://typeorm.io), and officially supports **MySQL**, **PostgreSQL** and **SQLite**, though other TypeORM-supported databases may work.
+```bash
+docker-compose up -d mariadb
+```
 
-1. Configure the [dev config](./packages/dev-server/dev-config.ts), making sure the connection settings in the `getDbConfig()` function are correct for the database type you will be using.
-2. Create the database using your DB admin tool of choice (e.g. phpMyAdmin if you are using the docker image suggested above). Name it according to the `getDbConfig()` settings. If you are using SQLite, you can skip this step.
-3. Populate mock data: 
-   ```bash
-    cd packages/dev-server
-    DB=<mysql|postgres|sqlite> npm run populate
-    ```
-   If you do not specify the `DB` variable, it will default to "mysql".
+MariaDB/MySQL is the default that will be used by the dev server if you don't explicitly set the `DB` environment variable.
 
-### 4. Run the dev server
+If for example you are doing development on the Elasticsearch plugin, you will also need to start the Elasticsearch container:
 
+```bash
+docker-compose up -d elasticsearch
 ```
+
+### 4. Populate test data
+
+Vendure uses [TypeORM](http://typeorm.io), and officially supports **MySQL**, **MariaDB**, **PostgreSQL** and **SQLite**.
+
+The first step is to populate the dev server with some test data:
+
+```bash
 cd packages/dev-server
-DB=<mysql|postgres|sqlite> npm run start
-```
-Or if you are in the root package 
+
+[DB=mysql|postres|sqlite] npm run populate
+ ```
+
+If you do not specify the `DB` variable, it will default to "mysql". If you specifically want to develop against Postgres,
+you need to run the `postgres_16` container and then run `DB=postgres npm run populate`. 
+
+### 5. Run the dev server
+
 ```
-DB=<mysql|postgres|sqlite> npm run dev-server:start
+cd packages/dev-server
+[DB=mysql|postgres|sqlite] npm run start
 ```
-If you do not specify the `DB` argument, it will default to "mysql".
 
 ### Testing admin ui changes locally
 

+ 1 - 1
SECURITY.md

@@ -11,4 +11,4 @@
 
 ## Reporting a Vulnerability
 
-To report a security vulnarability, email [contact@vendure.io](mailto:contact@vendure.io).
+To report a security vulnerability, email [contact@vendure.io](mailto:contact@vendure.io).

+ 117 - 0
docker-compose.yml

@@ -0,0 +1,117 @@
+# This contains the services required to develop and test Vendure
+# locally. It includes multiple SQL databases (for testing specific
+# versions), Elasticsearch, Redis etc.
+version: '3.7'
+name: vendure-monorepo
+services:
+  mariadb:
+    image: 'bitnami/mariadb:latest'
+    container_name: mariadb
+    environment:
+      MARIADB_DATABASE: vendure-dev
+      MARIADB_ROOT_USER: vendure
+      MARIADB_ROOT_PASSWORD: password
+    volumes:
+      - 'mariadb_data:/bitnami'
+    ports:
+      - '3306:3306'
+  mysql_8:
+    image: bitnami/mysql:8.0
+    container_name: mysql-8
+    environment:
+      MYSQL_AUTHENTICATION_PLUGIN: mysql_native_password
+      MYSQL_DATABASE: vendure-dev
+      MYSQL_ROOT_USER: vendure
+      MYSQL_ROOT_PASSWORD: password
+    volumes:
+      - 'mysql_data:/bitnami'
+    ports:
+      - '3306:3306'
+  mysql_5:
+    image: bitnami/mysql:5.7
+    container_name: mysql-5.7
+    environment:
+      MYSQL_AUTHENTICATION_PLUGIN: mysql_native_password
+      MYSQL_DATABASE: vendure-dev
+      MYSQL_ROOT_USER: vendure
+      MYSQL_ROOT_PASSWORD: password
+    volumes:
+      - 'mysql_data:/bitnami'
+    ports:
+      - '3306:3306'
+  postgres_12:
+    image: postgres:12.3
+    container_name: postgres_12
+    environment:
+      POSTGRES_DB: vendure-dev
+      POSTGRES_USER: vendure
+      POSTGRES_PASSWORD: password
+      PGDATA: /var/lib/postgresql/data
+    volumes:
+      - postgres_12_data:/var/lib/postgresql/data
+    ports:
+      - "5432:5432"
+    command: postgres -c shared_preload_libraries=pg_stat_statements -c pg_stat_statements.track=all -c pg_stat_statements.max=100000 -c max_connections=200
+  postgres_16:
+    image: postgres:16
+    container_name: postgres_16
+    environment:
+      POSTGRES_DB: vendure-dev
+      POSTGRES_USER: vendure
+      POSTGRES_PASSWORD: password
+      PGDATA: /var/lib/postgresql/data
+    volumes:
+      - postgres_16_data:/var/lib/postgresql/data
+    ports:
+      - "5432:5432"
+    command: postgres -c shared_preload_libraries=pg_stat_statements -c pg_stat_statements.track=all -c pg_stat_statements.max=100000 -c max_connections=200
+  # This is the Keycloak service which is used
+  # to test the Keycloak auth strategy
+  keycloak:
+    image: quay.io/keycloak/keycloak
+    ports:
+      - "9000:8080"
+    environment:
+      KEYCLOAK_ADMIN: admin
+      KEYCLOAK_ADMIN_PASSWORD: admin
+    command:
+      - start-dev
+      - --import-realm
+    volumes:
+      - keycloak_data:/opt/keycloak/data
+  elasticsearch:
+    image: docker.elastic.co/elasticsearch/elasticsearch:7.10.2
+    container_name: elasticsearch
+    environment:
+      - discovery.type=single-node
+      - bootstrap.memory_lock=true
+      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
+    ulimits:
+      memlock:
+        soft: -1
+        hard: -1
+    volumes:
+      - esdata:/usr/share/elasticsearch/data
+    ports:
+      - 9200:9200
+  redis:
+    image: bitnami/redis:7.4.1
+    hostname: redis
+    container_name: redis
+    environment:
+      - ALLOW_EMPTY_PASSWORD=yes
+    ports:
+      - "6379:6379"
+volumes:
+  postgres_16_data:
+    driver: local
+  postgres_12_data:
+    driver: local
+  mariadb_data:
+    driver: local
+  mysql_data:
+    driver: local
+  keycloak_data:
+    driver: local
+  esdata:
+    driver: local

+ 6 - 6
e2e-common/test-config.ts

@@ -72,8 +72,8 @@ function getDbConfig(): DataSourceOptions {
                 type: 'postgres',
                 host: '127.0.0.1',
                 port: process.env.CI ? +(process.env.E2E_POSTGRES_PORT || 5432) : 5432,
-                username: 'admin',
-                password: 'secret',
+                username: 'vendure',
+                password: 'password',
             };
         case 'mariadb':
             return {
@@ -81,8 +81,8 @@ function getDbConfig(): DataSourceOptions {
                 type: 'mariadb',
                 host: '127.0.0.1',
                 port: process.env.CI ? +(process.env.E2E_MARIADB_PORT || 3306) : 3306,
-                username: 'root',
-                password: '',
+                username: 'vendure',
+                password: 'password',
             };
         case 'mysql':
             return {
@@ -90,8 +90,8 @@ function getDbConfig(): DataSourceOptions {
                 type: 'mysql',
                 host: '127.0.0.1',
                 port: process.env.CI ? +(process.env.E2E_MYSQL_PORT || 3306) : 3306,
-                username: 'root',
-                password: '',
+                username: 'vendure',
+                password: 'password',
             };
         case 'sqljs':
         default:

+ 1 - 0
package-lock.json

@@ -4338,6 +4338,7 @@
         },
         "node_modules/@clack/prompts/node_modules/is-unicode-supported": {
             "version": "1.3.0",
+            "extraneous": true,
             "inBundle": true,
             "license": "MIT",
             "engines": {

+ 26 - 9
packages/dev-server/dev-config.ts

@@ -8,6 +8,7 @@ import {
     DefaultLogger,
     DefaultSearchPlugin,
     dummyPaymentHandler,
+    FacetValue,
     LanguageCode,
     LogLevel,
     VendureConfig,
@@ -62,8 +63,23 @@ export const devConfig: VendureConfig = {
         paymentMethodHandlers: [dummyPaymentHandler],
     },
 
-    customFields: {},
-    logger: new DefaultLogger({ level: LogLevel.Verbose }),
+    customFields: {
+        Product: [
+            {
+                name: 'test',
+                type: 'relation',
+                entity: Asset,
+            },
+        ],
+        FacetValue: [
+            {
+                name: 'childFacetValue',
+                type: 'relation',
+                entity: FacetValue,
+            },
+        ],
+    },
+    logger: new DefaultLogger({ level: LogLevel.Info }),
     importExportOptions: {
         importAssetsDir: path.join(__dirname, 'import-assets'),
     },
@@ -130,19 +146,19 @@ function getDbConfig(): DataSourceOptions {
         case 'postgres':
             console.log('Using postgres connection');
             return {
-                synchronize: false,
+                synchronize: true,
                 type: 'postgres',
                 host: process.env.DB_HOST || 'localhost',
                 port: Number(process.env.DB_PORT) || 5432,
-                username: process.env.DB_USERNAME || 'postgres',
-                password: process.env.DB_PASSWORD || 'postgres',
-                database: process.env.DB_NAME || 'vendure',
+                username: process.env.DB_USERNAME || 'vendure',
+                password: process.env.DB_PASSWORD || 'password',
+                database: process.env.DB_NAME || 'vendure-dev',
                 schema: process.env.DB_SCHEMA || 'public',
             };
         case 'sqlite':
             console.log('Using sqlite connection');
             return {
-                synchronize: false,
+                synchronize: true,
                 type: 'better-sqlite3',
                 database: path.join(__dirname, 'vendure.sqlite'),
             };
@@ -155,6 +171,7 @@ function getDbConfig(): DataSourceOptions {
                 location: path.join(__dirname, 'vendure.sqlite'),
             };
         case 'mysql':
+        case 'mariadb':
         default:
             console.log('Using mysql connection');
             return {
@@ -162,8 +179,8 @@ function getDbConfig(): DataSourceOptions {
                 type: 'mariadb',
                 host: '127.0.0.1',
                 port: 3306,
-                username: 'root',
-                password: '',
+                username: 'vendure',
+                password: 'password',
                 database: 'vendure-dev',
             };
     }

+ 0 - 111
packages/dev-server/docker-compose.yml

@@ -1,111 +0,0 @@
-version: '3.7'
-services:
-  mariadb:
-    image: 'bitnami/mariadb:latest'
-    container_name: mariadb
-    environment:
-      - ALLOW_EMPTY_PASSWORD=yes
-    volumes:
-      - 'mariadb_data:/bitnami'
-    ports:
-      - '3306:3306'
-  phpmyadmin:
-    image: 'phpmyadmin/phpmyadmin:latest'
-    container_name: phpmyadmin
-    environment:
-      - PMA_HOST=mariadb
-      - PMA_USER=root
-    ports:
-      - 8080:80
-    volumes:
-      - /sessions
-  mysql:
-    image: bitnami/mysql:8.0
-    container_name: mysql-8
-    environment:
-      ALLOW_EMPTY_PASSWORD: 'yes'
-      MYSQL_AUTHENTICATION_PLUGIN: mysql_native_password
-    volumes:
-      - 'mysql_data:/bitnami'
-    ports:
-      - '3306:3306'
-  mysql5:
-    image: bitnami/mysql:5.7
-    container_name: mysql-5.7
-    environment:
-      ALLOW_EMPTY_PASSWORD: 'yes'
-    volumes:
-      - 'mysql_data:/bitnami'
-    ports:
-      - '3306:3306'
-  phpmyadmin-mysql5:
-    image: 'phpmyadmin/phpmyadmin:latest'
-    container_name: phpmyadmin-mysql5
-    environment:
-      - PMA_HOST=mysql-5.7
-      - PMA_USER=root
-    ports:
-      - 8082:80
-    volumes:
-      - /sessions
-  phpmyadmin-mysql:
-    image: 'phpmyadmin/phpmyadmin:latest'
-    container_name: phpmyadmin-mysql
-    environment:
-      - PMA_HOST=mysql
-      - PMA_USER=root
-    ports:
-      - 8082:80
-    volumes:
-      - /sessions
-  postgres:
-    image: postgres:12.3
-    container_name: postgres
-    environment:
-      POSTGRES_DB: vendure
-      POSTGRES_USER: postgres
-      POSTGRES_PASSWORD: postgres
-      PGDATA: /var/lib/postgresql/data
-    volumes:
-      - postgres_data:/var/lib/postgresql/data
-    ports:
-      - "5432:5432"
-    command: postgres -c shared_preload_libraries=pg_stat_statements -c pg_stat_statements.track=all -c pg_stat_statements.max=100000 -c max_connections=200
-  pgadmin:
-    container_name: pgadmin
-    image: dpage/pgadmin4:4.18
-    environment:
-      PGADMIN_DEFAULT_EMAIL: admin@localhost.dev
-      PGADMIN_DEFAULT_PASSWORD: secret
-      PGADMIN_LISTEN_PORT: 80
-    ports:
-      - "8081:80"
-    volumes:
-      - pgadmin_data:/var/lib/pgadmin
-    links:
-      - "postgres:pgsql-server"
-  keycloak:
-    image: quay.io/keycloak/keycloak
-    ports:
-      - "9000:8080"
-    environment:
-      KEYCLOAK_ADMIN: admin
-      KEYCLOAK_ADMIN_PASSWORD: admin
-    command:
-      - start-dev
-      - --import-realm
-    volumes:
-      - keycloak_data:/opt/keycloak/data
-volumes:
-  postgres_data:
-    driver: local
-  pgadmin_data:
-    driver: local
-  mariadb_data:
-    driver: local
-  mysql_data:
-    driver: local
-  phpmyadmin_data:
-    driver: local
-  keycloak_data:
-    driver: local

+ 0 - 24
packages/elasticsearch-plugin/docker-compose.yml

@@ -1,24 +0,0 @@
-version: "3"
-services:
-  elasticsearch:
-    image: docker.elastic.co/elasticsearch/elasticsearch:7.10.2
-    container_name: elasticsearch
-    environment:
-      - discovery.type=single-node
-      - bootstrap.memory_lock=true
-      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
-    ulimits:
-      memlock:
-        soft: -1
-        hard: -1
-    volumes:
-      - esdata:/usr/share/elasticsearch/data
-    ports:
-      - 9200:9200
-    networks:
-      - esnet
-volumes:
-  esdata:
-    driver: local
-networks:
-  esnet:

+ 0 - 18
packages/job-queue-plugin/docker-compose.yml

@@ -1,18 +0,0 @@
-version: "3"
-services:
-  redis:
-    image: bitnami/redis:6.2
-    hostname: redis
-    container_name: redis
-    environment:
-      - ALLOW_EMPTY_PASSWORD=yes
-    ports:
-      - "6379:6379"
-  redis-commander:
-    container_name: redis-commander
-    hostname: redis-commander
-    image: rediscommander/redis-commander:latest
-    environment:
-      - REDIS_HOSTS=local:redis:6379
-    ports:
-      - "8085:8081"