Skip to content
This repository was archived by the owner on Sep 20, 2023. It is now read-only.

Commit

Permalink
[Meta-Txn] New relayer service (#2292)
Browse files Browse the repository at this point in the history
* Initial checkin

* Prod configs

* prettier

* Review feedback
  • Loading branch information
Franck authored May 17, 2019
1 parent 51618e9 commit b89a591
Show file tree
Hide file tree
Showing 21 changed files with 40,213 additions and 4,998 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ Servers and packages that provide extra functionality to DApps (e.g. search or a
| [`@origin/ipfs-proxy`](/infra/ipfs-proxy) | Layer between IPFS and clients to prevent malicious use |
| [`@origin/messaging`](/infra/messaging) | Messaging server |
| [`@origin/notifications`](/infra/notifications) | Delivers in browser notifications |
| [`@origin/relayer`](/infra/relayer) | Meta-txn relayer service |
| [`@origin/tests`](/infra/tests) | Runs integration tests in Docker Compose |
| [`@origin/token-transfer-client`](/infra/token-transfer-client) | Client for delivering tokens |
| [`@origin/token-transfer-server`](/infra/token-transfer-server) | Server for delivering tokens |
Expand Down
21 changes: 21 additions & 0 deletions devops/dockerfiles/origin-relayer
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
FROM node:10 as build

WORKDIR /app

ENV NODE_ENV=production

# Install envkey-source to make environment available for sequelize migration
RUN curl -s -L -o envkey-source.tar.gz https://github.com/envkey/envkey-source/releases/download/v1.2.5/envkey-source_1.2.5_linux_amd64.tar.gz
RUN tar -zxf envkey-source.tar.gz 2> /dev/null
RUN rm envkey-source.tar.gz
RUN mv envkey-source /usr/local/bin

COPY package*.json ./
COPY lerna.json ./
COPY ./packages/contracts ./packages/contracts
COPY ./infra/bridge ./infra/bridge
COPY ./infra/relayer ./infra/relayer

RUN npm install --unsafe-perm

CMD eval $(envkey-source) && npm run start --prefix infra/relayer
9 changes: 9 additions & 0 deletions devops/kubernetes/charts/origin/templates/_helpers.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -183,3 +183,12 @@ We truncate at 63 chars because some Kubernetes name fields are limited to this
{{- printf "%s.originprotocol.com" $prefix -}}
{{- end -}}
{{- end -}}

{{- define "relayer.host" -}}
{{- if eq .Release.Namespace "prod" -}}
{{- printf "relayer.originprotocol.com" }}
{{- else -}}
{{- printf "relayer.%s.originprotocol.com" .Release.Namespace -}}
{{- end -}}
{{- end -}}

52 changes: 52 additions & 0 deletions devops/kubernetes/charts/origin/templates/relayer.deployment.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ template "relayer.fullname" . }}
labels:
app: {{ template "relayer.fullname" . }}
app.kubernetes.io/name: origin
helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/version: {{ .Chart.AppVersion }}
app.kubernetes.io/component: frontend
app.kubernetes.io/part-of: origin-relayer
spec:
replicas: {{ default 1 .Values.relayerReplicas }}
selector:
matchLabels:
app: {{ template "relayer.fullname" . }}
template:
metadata:
labels:
app: {{ template "relayer.fullname" . }}
release: "{{ .Release.Name }}"
spec:
containers:
- name: origin-relayer
image: "{{ .Values.containerRegistry }}/{{ .Release.Namespace }}/{{ .Values.relayerImage }}:{{ .Values.relayerImageTag }}"
imagePullPolicy: Always
env:
- name: ENVKEY
valueFrom:
secretKeyRef:
name: {{ template "relayer.fullname" . }}
key: ENVKEY
ports:
- containerPort: 4001
- name: cloudsql-proxy
image: gcr.io/cloudsql-docker/gce-proxy:1.11
command: ["/cloud_sql_proxy",
"-instances={{ .Values.databaseInstance }}=tcp:5432",
"-credential_file=/secrets/cloudsql/credentials.json"]
securityContext:
runAsUser: 2 # non-root user
allowPrivilegeEscalation: false
volumeMounts:
- name: cloudsql-instance-credentials
mountPath: /secrets/cloudsql
readOnly: true
volumes:
- name: cloudsql-instance-credentials
secret:
secretName: cloudsql-instance-credentials
36 changes: 36 additions & 0 deletions devops/kubernetes/charts/origin/templates/relayer.ingress.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: {{ template "relayer.fullname" . }}
labels:
app: {{ template "relayer.fullname" . }}
app.kubernetes.io/name: origin
helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/version: {{ .Chart.AppVersion }}
app.kubernetes.io/component: frontend
app.kubernetes.io/part-of: origin-relayer
annotations:
kubernetes.io/ingress.class: {{ .Release.Namespace }}-ingress
kubernetes.io/tls-acme: "true"
certmanager.k8s.io/cluster-issuer: {{ .Values.clusterIssuer }}
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/cors-allow-headers: "DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type"
nginx.ingress.kubernetes.io/cors-allow-methods: "GET, POST"
nginx.ingress.kubernetes.io/cors-allow-origin: "*"
nginx.ingress.kubernetes.io/limit-rps: "10"
spec:
tls:
- secretName: {{ template "relayer.host" . }}
hosts:
- {{ template "relayer.host" . }}
rules:
- host: {{ template "relayer.host" . }}
http:
paths:
- path: /
backend:
serviceName: {{ template "relayer.fullname" . }}
servicePort: 5100
16 changes: 16 additions & 0 deletions devops/kubernetes/charts/origin/templates/relayer.secret.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
apiVersion: v1
kind: Secret
metadata:
name: {{ template "relayer.fullname" . }}
labels:
app: {{ template "relayer.fullname" . }}
app.kubernetes.io/name: origin
helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/version: {{ .Chart.AppVersion }}
app.kubernetes.io/component: frontend
app.kubernetes.io/part-of: origin-relayer
type: Opaque
data:
ENVKEY: {{ required "Set a .Values.relayerEnvKey" .Values.relayerEnvKey | b64enc | quote}}
20 changes: 20 additions & 0 deletions devops/kubernetes/charts/origin/templates/relayer.service.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
apiVersion: v1
kind: Service
metadata:
name: {{ template "relayer.fullname" . }}
labels:
app: {{ template "relayer.fullname" . }}
app.kubernetes.io/name: origin
helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
app.kubernetes.io/instance: {{ .Release.Name }}
app.kubernetes.io/version: {{ .Chart.AppVersion }}
app.kubernetes.io/component: backend
app.kubernetes.io/part-of: origin-relayer
spec:
type: NodePort
selector:
app: {{ template "relayer.fullname" . }}
ports:
- name: http
port: 5100
4 changes: 4 additions & 0 deletions devops/kubernetes/charts/origin/values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -61,3 +61,7 @@ cronImageTag: latest
# origin-admin
adminImage: origin-admin
adminImageTag: latest

# origin-relayer
relayerImage: origin-relayer
relayerImageTag: latest
Binary file modified devops/kubernetes/values/origin/secrets-dev.enc
Binary file not shown.
Binary file modified devops/kubernetes/values/origin/secrets-prod.enc
Binary file not shown.
Binary file modified devops/kubernetes/values/origin/secrets-staging.enc
Binary file not shown.
4 changes: 4 additions & 0 deletions devops/kubernetes/values/origin/values-dev.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -56,3 +56,7 @@ cronImageTag: '9898f9d'
# origin-admin
adminImage: origin-admin
adminImageTag: '09d63fe'

# origin-relayer
relayerImage: origin-relayer
relayerImageTag: 'latest'
4 changes: 4 additions & 0 deletions devops/kubernetes/values/origin/values-prod.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -54,4 +54,8 @@ linkingImageTag: 'latest'
cronImage: origin-cron
cronImageTag: 'latest'

# origin-relayer
relayerImage: origin-relayer
relayerImageTag: 'latest'

ipfsLoadBalancerIP: 35.233.189.126
4 changes: 4 additions & 0 deletions devops/kubernetes/values/origin/values-staging.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -56,3 +56,7 @@ cronImageTag: 'latest'
# origin-admin
adminImage: origin-admin
adminImageTag: 'latest'

# origin-relayer
relayerImage: origin-relayer
relayerImageTag: 'latest'
9 changes: 9 additions & 0 deletions infra/relayer/.eslintrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
const baseConfig = require('../../.eslintrc.js')

module.exports = {
...baseConfig,
rules: {
...baseConfig.rules,
camelcase: ['error', { properties: 'never' }]
}
}
1 change: 1 addition & 0 deletions infra/relayer/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Meta-txn relayer service.
46 changes: 46 additions & 0 deletions infra/relayer/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
{
"name": "@origin/relayer",
"description": "Origin relayer service",
"version": "0.1.0",
"engines": {
"node": "10.x"
},
"author": "Origin Protocol Inc",
"license": "MIT",
"bugs": {
"url": "https://github.com/OriginProtocol/origin/issues"
},
"dependencies": {
"@origin/contracts": "^0.8.6",
"cors": "^2.8.5",
"dotenv": "^6.2.0",
"envkey": "^1.2.4",
"ethereumjs-util": "^6.1.0",
"express": "^4.16.4",
"express-prom-bundle": "^4.2.1",
"logplease": "^1.2.15",
"per-env": "^1.0.2",
"pg": "^7.7.1",
"sequelize": "^5.0.0-beta.14",
"sequelize-cli": "^5.4.0",
"web3": "1.0.0-beta.34"
},
"devDependencies": {
"mocha": "^5.2.0",
"nodemon": "^1.18.7"
},
"scripts": {
"lint": "eslint . && npm run prettier:check",
"prettier": "prettier --write *.js \"src/**/*.js\"",
"prettier:check": "prettier -c *.js \"src/**/*.js\"",
"migrate": "sequelize db:migrate",
"start": "per-env",
"start:development": "nodemon src/app.js",
"start:production": "node src/app.js",
"test": "NODE_ENV=test mocha --timeout 10000 --exit"
},
"prettier": {
"semi": false,
"singleQuote": true
}
}
40 changes: 40 additions & 0 deletions infra/relayer/src/app.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
'use strict'

require('dotenv').config()
try {
require('envkey')
} catch (error) {
console.log('EnvKey not configured')
}

const bodyParser = require('body-parser')
const cors = require('cors')
const express = require('express')
const promBundle = require('express-prom-bundle')
const { relayTx } = require('./relayer')

// For Prometheus metrics collection.
const bundle = promBundle({
promClient: {
collectDefaultMetrics: {
timeout: 1000
}
}
})

const app = express()
app.use(express.json())
app.use(cors({ origin: true, credentials: true }))
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: true }))
app.use(bundle)

// Register the /relay route for relaying transactions.
app.post('/relay', relayTx)

const port = process.env.PORT || 5100
app.listen(port, () => {
console.log(`Relayer listening on port ${port}...`)
})

module.exports = app
7 changes: 7 additions & 0 deletions infra/relayer/src/logger.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
'use strict'

const Logger = require('logplease')

Logger.setLogLevel(process.env.LOG_LEVEL || 'INFO')

module.exports = Logger.create('relayer', { showTimestamp: false })
Loading

0 comments on commit b89a591

Please sign in to comment.