From 85cec480dca98a802d3d9f22d92dbe8a3b41acbe Mon Sep 17 00:00:00 2001 From: Taka Goto Date: Thu, 31 Jan 2019 21:27:23 -0600 Subject: [PATCH] Dockerize postgraphile --- dockerfiles/README.md | 9 +++---- postgraphile/.dockerignore | 7 ++++++ postgraphile/Dockerfile | 9 +++++++ postgraphile/README.md | 14 ++++++++++- postgraphile/package.json | 10 ++++---- postgraphile/src/config/parse.ts | 43 +++++++++++++++++++++----------- postgraphile/yarn.lock | 7 +++--- 7 files changed, 71 insertions(+), 28 deletions(-) create mode 100644 postgraphile/.dockerignore create mode 100644 postgraphile/Dockerfile diff --git a/dockerfiles/README.md b/dockerfiles/README.md index d5e8fca3..da98e79e 100644 --- a/dockerfiles/README.md +++ b/dockerfiles/README.md @@ -7,10 +7,7 @@ S By default, vDB is configured towards the Kovan deploy. The configuration values can be overridden using environment variables, using the same hierarchical naming pattern but in CAPS and using underscores. For example, the contract address for the `Pit` can be set with the variable `CONTRACT_ADDRESS_PIT="0x123..."`. ## To use the container: -1. Setup a postgres database with owner `vulcanize` - * `vulcanize` does not _have_ to be owner, but otherwise permissions for - connection, tables, and sequences need to be added for the `public` and - `maker` schemas manually when the migrations have been run. +1. Setup a postgres database with superuser `vulcanize` 2. Set the env variables `DATABASE_NAME`, `DATABASE_HOSTNAME`, `DATABASE_PORT`, `DATABASE_USER` & `DATABASE_PASSWORD` 3. Run the DB migrations: @@ -26,7 +23,9 @@ e` * `rc-service continuousLogSync start` ### Automated -The steps above have been rolled into a script: `/app/startup_script.sh`, which just assumes the DB env variables have been set, and defaults the rest to Kovan according to `environments/staging.toml`. +The steps above have been rolled into a script: `/app/startup_script.sh`, which just assumes the DB env variables have been set, and defaults the rest to Kovan according to `environments/staging.toml`. This can be called with something like: + +`docker run -d -e DATABASE_NAME=vulcanize_pubic -e DATABASE_HOSTNAME=localhost -e DATABASE_PORT=5432 -e DATABASE_USER=vulcanize -e DATABASE_PASSWORD=vulcanize ./startup_script.sh` ### Logging When running, vDB services log to `/vulcanizedb.log`. diff --git a/postgraphile/.dockerignore b/postgraphile/.dockerignore new file mode 100644 index 00000000..1e5df4d8 --- /dev/null +++ b/postgraphile/.dockerignore @@ -0,0 +1,7 @@ +package-lock.json +yarn.lock +node_modules +Dockerfile +README.md +spec +.dockerignore diff --git a/postgraphile/Dockerfile b/postgraphile/Dockerfile new file mode 100644 index 00000000..4a98c0e3 --- /dev/null +++ b/postgraphile/Dockerfile @@ -0,0 +1,9 @@ +FROM mhart/alpine-node:10 +RUN apk --update --no-cache add make g++ python findutils postgresql-dev + +WORKDIR /app +COPY . /app +run yarn install +RUN ["./node_modules/typescript/bin/tsc"] +EXPOSE 3000 +CMD ["node", "/app/build/dist/src/index.js"] diff --git a/postgraphile/README.md b/postgraphile/README.md index 684247da..048a1f7a 100644 --- a/postgraphile/README.md +++ b/postgraphile/README.md @@ -2,6 +2,18 @@ This application utilizes Postgraphile to expose GraphQL endpoints for exposure of the varied data that VulcanizeDB tracks. +## Docker use +_Note: currently this image is ~500MB large (unpacked)_ + +Build the docker image in this directory. Start the `GraphiQL` frontend by: +* Setting the env variables for the database connection: `DATABASE_HOST`, + `DATABASE_NAME`, `DATABASE_USER`, `DATABASE_PASSWORD` (and optionally + `DATABASE_PORT` if running on non-standard port). + * The specified user needs to be `superuser` on the vulcanizeDB database +* Run the container (ex. `docker run -e DATABASE_HOST=localhost -e DATABASE_NAME=vulcanize_public -e DATABASE_USER=vulcanize -e DATABASE_PASSWORD=vulcanize -d postgraphile:latest`) +* GraphiQL is available at `:3000/graphiql` + + ## Building *This application assumes the use of the [Yarn package manager](https://yarnpkg.com/en/). The use of npm may produce unexpected results.* @@ -16,4 +28,4 @@ Provide the built bundle to node as a runnable script: `node ./build/dist/vulcan ## Testing -Tests are executed via Jasmine with a console reporter via the `yarn test` task. \ No newline at end of file +Tests are executed via Jasmine with a console reporter via the `yarn test` task. diff --git a/postgraphile/package.json b/postgraphile/package.json index 9c3dc3fa..9809865a 100644 --- a/postgraphile/package.json +++ b/postgraphile/package.json @@ -22,22 +22,22 @@ "homepage": "https://github.com/vulcanize/vulcanizedb", "dependencies": { "express-session": "1.15.6", + "graphql-subscriptions": "0.5.8", "lodash": "4.17.10", "passport": "0.4.0", + "pg": "6.4.2", "pg-native": "3.0.0", "postgraphile": "4.0.0-rc.4", - "graphql-subscriptions": "0.5.8", "subscriptions-transport-ws": "0.9.14", - "toml": "2.3.3", - "pg": "6.4.2" + "toml": "2.3.3" }, "devDependencies": { - "@types/graphql": "^0.13.4", "@types/express": "4.16.0", "@types/express-session": "1.15.10", + "@types/graphql": "^0.13.4", "@types/jasmine": "2.8.8", "@types/lodash": "4.14.116", - "@types/node": "10.9.3", + "@types/node": "^10.12.21", "@types/passport": "0.4.6", "awesome-typescript-loader": "5.2.0", "jasmine": "3.2.0", diff --git a/postgraphile/src/config/parse.ts b/postgraphile/src/config/parse.ts index 762ba18b..513aa4fe 100644 --- a/postgraphile/src/config/parse.ts +++ b/postgraphile/src/config/parse.ts @@ -6,34 +6,49 @@ export const MISSING_PATH_MESSAGE = `No path to config toml file provided, ` + `please check the value of ${CONFIG_PATH_KEY} in your environment`; export const MISSING_HOST_MESSAGE = 'No database host provided in config toml'; -export const MISSING_DATABASE_MESSAGE = 'No database name provided in config ' - + 'toml'; +export const MISSING_USER_MESSAGE = 'No database user & password provided in config toml'; +export const MISSING_DATABASE_MESSAGE = 'No database name provided in config toml'; export function parseConfig( readCallback: ReadFileSyncCallback, tomlParseCallback: TomlParseCallback, configPath?: string ): DatabaseConfig { - if (!configPath || configPath.length < 1) { - throw new Error(MISSING_PATH_MESSAGE); + let host = ''; + let port = ''; + let database = ''; + let user = ''; + let password = ''; + + if (configPath) { + const tomlContents = readCallback(`${configPath}`).toString(); + const parsedToml = tomlParseCallback(tomlContents); + + host = parsedToml['database']['hostname']; + port = parsedToml['database']['port']; + database = parsedToml['database']['name']; + user = parsedToml['database']['user']; + password = parsedToml['database']['password']; } - const tomlContents = readCallback(`${configPath}`).toString(); - const parsedToml = tomlParseCallback(tomlContents); + // Overwrite config values with env. vars if such are set + host = process.env.DATABASE_HOST || host; + port = process.env.DATABASE_PORT || port; + database = process.env.DATABASE_NAME || database; + user = process.env.DATABASE_USER || user; + password = process.env.DATABASE_PASSWORD || password; - const host = parsedToml['database']['hostname']; - const port = parsedToml['database']['port']; - const database = parsedToml['database']['name']; - const user = parsedToml['database']['user'] || ''; - const password = parsedToml['database']['password'] || ''; - - if (!host || host.length < 1) { + if (!host) { throw new Error(MISSING_HOST_MESSAGE); } - if (!database || database.length < 1) { + if (!database) { throw new Error(MISSING_DATABASE_MESSAGE); } + if (!user || !password) { + throw new Error(MISSING_USER_MESSAGE); + } + return { host: `postgres://${user}:${password}@${host}:${port}`, database }; } diff --git a/postgraphile/yarn.lock b/postgraphile/yarn.lock index 825c7c4e..c0e913de 100644 --- a/postgraphile/yarn.lock +++ b/postgraphile/yarn.lock @@ -108,9 +108,10 @@ version "10.9.4" resolved "https://registry.yarnpkg.com/@types/node/-/node-10.9.4.tgz#0f4cb2dc7c1de6096055357f70179043c33e9897" -"@types/node@10.9.3": - version "10.9.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.9.3.tgz#85f288502503ade0b3bfc049fe1777b05d0327d5" +"@types/node@^10.12.21": + version "10.12.21" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.21.tgz#7e8a0c34cf29f4e17a36e9bd0ea72d45ba03908e" + integrity sha512-CBgLNk4o3XMnqMc0rhb6lc77IwShMEglz05deDcn2lQxyXEZivfwgYJu7SMha9V5XcrP6qZuevTHV/QrN2vjKQ== "@types/passport@0.4.6": version "0.4.6"