From 33fff73c811d09bd5457ab74a3d6d3476f141ed9 Mon Sep 17 00:00:00 2001 From: Yuren Ju Date: Wed, 27 Sep 2023 11:17:03 +0800 Subject: [PATCH 1/5] feat: integrate web into server docker image --- .../docker/docker-compose.yml | 4 +-- apps/docker/project.json | 25 +++++++++++++++ apps/server/Dockerfile | 1 + apps/server/src/app/app.module.ts | 18 +++++++++++ package-lock.json | 32 +++++++++++++++++++ package.json | 1 + 6 files changed, 79 insertions(+), 2 deletions(-) rename docker-compose.yml => apps/docker/docker-compose.yml (79%) create mode 100644 apps/docker/project.json diff --git a/docker-compose.yml b/apps/docker/docker-compose.yml similarity index 79% rename from docker-compose.yml rename to apps/docker/docker-compose.yml index d4330e5..e7bef97 100644 --- a/docker-compose.yml +++ b/apps/docker/docker-compose.yml @@ -2,7 +2,7 @@ version: '3' services: server: build: - context: . + context: ../.. dockerfile: apps/server/Dockerfile ports: - '3000:3000' @@ -19,4 +19,4 @@ services: ports: - '27017:27017' volumes: - - './apps/server/scripts/init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js:ro' + - '../server/scripts/init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js:ro' diff --git a/apps/docker/project.json b/apps/docker/project.json new file mode 100644 index 0000000..cbec64c --- /dev/null +++ b/apps/docker/project.json @@ -0,0 +1,25 @@ +{ + "name": "docker", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "apps/docker", + "projectType": "application", + "targets": { + "build": { + "dependsOn": [ + { + "target": "build", + "projects": ["web", "server"] + } + ], + "command": "docker compose -f apps/docker/docker-compose.yml --env-file=apps/server/.env.local build" + }, + "up": { + "dependsOn": ["build"], + "command": "docker-compose -f apps/docker/docker-compose.yml --env-file=./apps/server/.env.local up --detach" + }, + "down": { + "command": "docker-compose -f apps/docker/docker-compose.yml down" + } + }, + "tags": [] +} diff --git a/apps/server/Dockerfile b/apps/server/Dockerfile index 131ac1a..9e72755 100644 --- a/apps/server/Dockerfile +++ b/apps/server/Dockerfile @@ -18,6 +18,7 @@ COPY package.json package-lock.json . RUN npm --omit=dev -f install COPY dist/apps/server server +COPY dist/apps/web web # TODO: this is only for developement, we should remove it for production COPY apps/server/.env.local . diff --git a/apps/server/src/app/app.module.ts b/apps/server/src/app/app.module.ts index a1e03c4..8f8fe77 100644 --- a/apps/server/src/app/app.module.ts +++ b/apps/server/src/app/app.module.ts @@ -1,12 +1,15 @@ import { Module } from '@nestjs/common'; import { MongooseModule } from '@nestjs/mongoose'; import { ConfigModule, ConfigService } from '@nestjs/config'; +import { ServeStaticModule } from '@nestjs/serve-static'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { UsersModule } from '../user/user.module'; import { Config, getConfig } from '../config/configuration'; import { AuthModule } from '../auth/auth.module'; +import { join } from 'path'; +import { existsSync } from 'fs'; @Module({ imports: [ @@ -27,6 +30,21 @@ import { AuthModule } from '../auth/auth.module'; }; }, }), + ServeStaticModule.forRootAsync({ + useFactory: () => { + const clientPath = join(__dirname, '..', 'web'); + + if (existsSync(clientPath)) { + return [ + { + rootPath: clientPath, + }, + ]; + } else { + return []; + } + }, + }), UsersModule, AuthModule, ], diff --git a/package-lock.json b/package-lock.json index 884fed1..1c44af5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "@nestjs/mongoose": "^10.0.1", "@nestjs/passport": "^10.0.2", "@nestjs/platform-express": "^10.0.2", + "@nestjs/serve-static": "^4.0.0", "@semaphore-protocol/group": "^3.11.0", "@semaphore-protocol/identity": "^3.11.0", "@semaphore-protocol/proof": "^3.11.0", @@ -8695,6 +8696,37 @@ "typescript": ">=4.8.2" } }, + "node_modules/@nestjs/serve-static": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nestjs/serve-static/-/serve-static-4.0.0.tgz", + "integrity": "sha512-8cTrNV2ngdHIjiLNsXePnw0+KY1ThrZGz/WeyAG5gIvmZNDbnZBOrPoYlKL+MOzlXlQStxR5jKLYmn+nJeoncQ==", + "dependencies": { + "path-to-regexp": "0.2.5" + }, + "peerDependencies": { + "@fastify/static": "^6.5.0", + "@nestjs/common": "^9.0.0 || ^10.0.0", + "@nestjs/core": "^9.0.0 || ^10.0.0", + "express": "^4.18.1", + "fastify": "^4.7.0" + }, + "peerDependenciesMeta": { + "@fastify/static": { + "optional": true + }, + "express": { + "optional": true + }, + "fastify": { + "optional": true + } + } + }, + "node_modules/@nestjs/serve-static/node_modules/path-to-regexp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.2.5.tgz", + "integrity": "sha512-l6qtdDPIkmAmzEO6egquYDfqQGPMRNGjYtrU13HAXb3YSRrt7HSb1sJY0pKp6o2bAa86tSB6iwaW2JbthPKr7Q==" + }, "node_modules/@nestjs/testing": { "version": "10.2.5", "resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-10.2.5.tgz", diff --git a/package.json b/package.json index ccbe2f0..2a0e5b9 100644 --- a/package.json +++ b/package.json @@ -76,6 +76,7 @@ "@nestjs/mongoose": "^10.0.1", "@nestjs/passport": "^10.0.2", "@nestjs/platform-express": "^10.0.2", + "@nestjs/serve-static": "^4.0.0", "@semaphore-protocol/group": "^3.11.0", "@semaphore-protocol/identity": "^3.11.0", "@semaphore-protocol/proof": "^3.11.0", From 48ea4b6c9f053de88abf779b16d9336bb33b0bee Mon Sep 17 00:00:00 2001 From: Yuren Ju Date: Wed, 27 Sep 2023 13:16:17 +0800 Subject: [PATCH 2/5] fix: ensure docker images can be built --- apps/docker/project.json | 4 ++++ apps/server/.env.example | 7 +++++++ apps/server/project.json | 12 +++++++++--- apps/server/scripts/copy-env-file.js | 19 +++++++++++++++++++ package.json | 7 +------ 5 files changed, 40 insertions(+), 9 deletions(-) create mode 100644 apps/server/.env.example create mode 100644 apps/server/scripts/copy-env-file.js diff --git a/apps/docker/project.json b/apps/docker/project.json index cbec64c..921b542 100644 --- a/apps/docker/project.json +++ b/apps/docker/project.json @@ -6,6 +6,10 @@ "targets": { "build": { "dependsOn": [ + { + "target": "copy-env-file", + "projects": ["server"] + }, { "target": "build", "projects": ["web", "server"] diff --git a/apps/server/.env.example b/apps/server/.env.example new file mode 100644 index 0000000..6d3c748 --- /dev/null +++ b/apps/server/.env.example @@ -0,0 +1,7 @@ +MONGO_INITDB_ROOT_USERNAME=initdbrootusername +MONGO_INITDB_ROOT_PASSWORD=initdbrootpassword +MONGO_DATABASE=dpassport +MONGO_DATABASE_USERNAME=dpassportusername +MONGO_DATABASE_PASSWORD=dpassportpassword +MONGO_HOST=localhost +MONGO_CONTAINER_NAME=dpassport-mongo diff --git a/apps/server/project.json b/apps/server/project.json index f14ee20..b0d0c4b 100644 --- a/apps/server/project.json +++ b/apps/server/project.json @@ -73,9 +73,15 @@ } } }, - "docker-build": { - "dependsOn": ["build"], - "command": "docker build -f apps/server/Dockerfile . -t server" + "setup-db": { + "command": "node apps/server/scripts/setup-db.js" + }, + "start-db": { + "command": "node apps/server/scripts/start-db.js" + }, + "copy-env-file": { + "dependsOn": ["setup-db"], + "command": "node apps/server/scripts/copy-env-file.js" } }, "tags": [] diff --git a/apps/server/scripts/copy-env-file.js b/apps/server/scripts/copy-env-file.js new file mode 100644 index 0000000..afcdd56 --- /dev/null +++ b/apps/server/scripts/copy-env-file.js @@ -0,0 +1,19 @@ +const { existsSync, copyFileSync } = require('fs'); +const { join } = require('path'); + +function copyEnvFile() { + const serverPath = join(__dirname, '..'); + const targetPath = join(serverPath, '.env.local'); + const examplePath = join(serverPath, '.env.example'); + + if (!existsSync(targetPath)) { + console.log('.env.local not exists, copy from .env.example'); + copyFileSync(examplePath, targetPath); + } else { + console.log('.env.local does exist, do nothing.'); + } +} + +if (require.main === module) { + copyEnvFile(); +} diff --git a/package.json b/package.json index 2a0e5b9..c2532c5 100644 --- a/package.json +++ b/package.json @@ -4,12 +4,7 @@ "license": "MIT", "scripts": { "start": "nx serve web", - "acceptance": "nx acceptance acceptance", - "setup:db": "node apps/server/scripts/setup-db.js", - "start:db": "node apps/server/scripts/start-db.js", - "predocker-compose:up": "nx build server && npm run setup:db", - "docker-compose:up": "docker-compose --env-file=./apps/server/.env.local up --build --detach", - "docker-compose:down": "docker-compose down" + "acceptance": "nx acceptance acceptance" }, "private": true, "devDependencies": { From 8a786dd83e372138d351dd00d5ef62e9827be2f6 Mon Sep 17 00:00:00 2001 From: Yuren Ju Date: Wed, 27 Sep 2023 13:33:14 +0800 Subject: [PATCH 3/5] fix: always upload screen records --- .github/workflows/ci.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 3bfa449..a61fe11 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -33,6 +33,7 @@ jobs: VITE_MOCK_WALLET_PRIVATE_KEY: '0x8b806ec6cc2cbc6f75e1e0a0b020dba4d02f1a8578b9a8e2fb1f53f5a1c83e99' VITE_INFURA_PROJECT_ID: '25e33bb59b0b4803813c8f238cceb14e' - uses: actions/upload-artifact@v3 + if: always() with: name: screen-records path: /home/runner/work/tw-did/tw-did/dist/cypress/apps/*/videos/*.mp4 From 48029c5e3f8e7fa258dd89aa0b622d95c1ef5776 Mon Sep 17 00:00:00 2001 From: Yuren Ju Date: Wed, 27 Sep 2023 14:04:29 +0800 Subject: [PATCH 4/5] fix: click connect button only if disconnect button is not there --- apps/sample-verifier-e2e/src/e2e/verifier.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/sample-verifier-e2e/src/e2e/verifier.ts b/apps/sample-verifier-e2e/src/e2e/verifier.ts index ab78d01..c5f3df4 100644 --- a/apps/sample-verifier-e2e/src/e2e/verifier.ts +++ b/apps/sample-verifier-e2e/src/e2e/verifier.ts @@ -16,7 +16,12 @@ Given('I am on the sample-verifier website', () => { }); Given('I am logged into sample-verifier website', () => { - cy.get('[data-testid=connect-button]').click(); + const dataAttr = '[data-testid=disconnect-button]'; + cy.get(dataAttr).then((res) => { + if (res.length === 0) { + cy.get('[data-testid=connect-button]').click(); + } + }); }); Given( From e178d3d3d6b7b85fca09a0181c0fd87e6d6a4481 Mon Sep 17 00:00:00 2001 From: Yuren Ju Date: Wed, 27 Sep 2023 14:14:17 +0800 Subject: [PATCH 5/5] fix: update README for docker --- README.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/README.md b/README.md index 117b83b..c85a945 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,26 @@ Once the servers are running, navigate to `http://localhost:4300/` in your brows We use the `preview` subcommand for the `sample-verifier` server due to an issue with the `ethr-did-resolver` package, which causes errors on the Vite development server. An issue has already been filed to address this. Note that the service may operate more slowly than usual because the `preview` subcommand triggers a rebuild of `sample-verifier` whenever you save changes. This is a temporary workaround. +## Docker Commands + +We have a few Docker-related commands that enable the system to run within a Docker environment. If you want to run the environment using `docker-compose`, you can use the following command: + +```bash +nx up docker +``` + +This command leverages Nx's dependency management to build the necessary projects and then initiates `docker-compose up` to start MongoDB, the server, and the front-end website together. When you are done and wish to shut down the services, you can use the following command: + +```bash +nx down docker +``` + +If you simply want to build a Docker image, you can use this command: + +```bash +nx build docker +``` + ## E2E Tests Locally If you are planning to run e2e tests locally, you'll also need to set a `VITE_MOCK_WALLET_PRIVATE_KEY` in your `.env.local` file. Due to security reasons, please reach out to @yurenju to obtain this key.