index.ts 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. import * as awsx from '@pulumi/awsx'
  2. import * as eks from '@pulumi/eks'
  3. // import * as k8s from '@pulumi/kubernetes'
  4. import * as docker from '@pulumi/docker'
  5. import * as pulumi from '@pulumi/pulumi'
  6. import * as k8sjs from './k8sjs'
  7. import * as k8s from '@pulumi/kubernetes'
  8. import * as fs from 'fs'
  9. require('dotenv').config()
  10. // const awsConfig = new pulumi.Config('aws')
  11. // // Create a VPC for our cluster.
  12. // const vpc = new awsx.ec2.Vpc('vpc', { numberOfAvailabilityZones: 2 })
  13. // // Create an EKS cluster with the default configuration.
  14. // const cluster = new eks.Cluster('eksctl-my-cluster', {
  15. // vpcId: vpc.id,
  16. // subnetIds: vpc.publicSubnetIds,
  17. // instanceType: 't2.large',
  18. // providerCredentialOpts: {
  19. // profileName: awsConfig.get('profile'),
  20. // },
  21. // })
  22. // // Export the cluster's kubeconfig.
  23. // export const kubeconfig = cluster.kubeconfig
  24. // // Create a repository
  25. // const repo = new awsx.ecr.Repository('joystream/apps')
  26. // export const joystreamAppsImage = repo.buildAndPushImage({
  27. // dockerfile: '../../../apps.Dockerfile',
  28. // context: '../../../',
  29. // })
  30. // Create image from local app
  31. export const joystreamAppsImage = new docker.Image('joystream/apps', {
  32. build: {
  33. context: '../../../',
  34. dockerfile: '../../../apps.Dockerfile',
  35. },
  36. imageName: 'joystream/apps:latest',
  37. skipPush: true,
  38. }).baseImageName
  39. // export const joystreamAppsImage = 'joystream/apps'
  40. const name = 'query-node'
  41. // Create a Kubernetes Namespace
  42. // const ns = new k8s.core.v1.Namespace(name, {}, { provider: cluster.provider })
  43. const ns = new k8s.core.v1.Namespace(name, {})
  44. // Export the Namespace name
  45. export const namespaceName = ns.metadata.name
  46. const appLabels = { appClass: name }
  47. const defsConfig = new k8s.core.v1.ConfigMap(name, {
  48. metadata: { namespace: namespaceName, labels: appLabels },
  49. data: { 'fileData': fs.readFileSync('../../../types/augment/all/defs.json').toString() },
  50. })
  51. const defsConfigName = defsConfig.metadata.apply((m) => m.name)
  52. // Create a Deployment
  53. const databaseLabels = { app: 'postgres-db' }
  54. const databaseDeployment = new k8s.apps.v1.Deployment('postgres-db', {
  55. metadata: {
  56. namespace: namespaceName,
  57. labels: databaseLabels,
  58. },
  59. spec: {
  60. selector: { matchLabels: databaseLabels },
  61. template: {
  62. metadata: { labels: databaseLabels },
  63. spec: {
  64. containers: [
  65. {
  66. name: 'postgres-db',
  67. image: 'postgres:12',
  68. env: [
  69. { name: 'POSTGRES_USER', value: process.env.DB_USER! },
  70. { name: 'POSTGRES_PASSWORD', value: process.env.DB_PASS! },
  71. { name: 'POSTGRES_DB', value: process.env.INDEXER_DB_NAME! },
  72. ],
  73. ports: [{ containerPort: 5432 }],
  74. },
  75. ],
  76. },
  77. },
  78. },
  79. })
  80. const databaseService = new k8s.core.v1.Service('postgres-db', {
  81. metadata: {
  82. namespace: namespaceName,
  83. labels: databaseDeployment.metadata.labels,
  84. name: 'postgres-db',
  85. },
  86. spec: {
  87. ports: [{ port: 5432 }],
  88. selector: databaseDeployment.spec.template.metadata.labels,
  89. },
  90. })
  91. // Create an example Job.
  92. const exampleJob = new k8s.batch.v1.Job(
  93. 'db-migration',
  94. {
  95. metadata: {
  96. namespace: namespaceName,
  97. },
  98. spec: {
  99. backoffLimit: 0,
  100. template: {
  101. spec: {
  102. containers: [
  103. {
  104. name: 'db-migration',
  105. image: joystreamAppsImage,
  106. imagePullPolicy: 'IfNotPresent',
  107. resources: { requests: { cpu: '100m', memory: '100Mi' } },
  108. env: [
  109. {
  110. name: 'WARTHOG_DB_HOST',
  111. value: 'postgres-db',
  112. },
  113. {
  114. name: 'DB_HOST',
  115. value: 'postgres-db',
  116. },
  117. { name: 'DB_NAME', value: process.env.DB_NAME! },
  118. { name: 'DB_PASS', value: process.env.DB_PASS! },
  119. ],
  120. command: ['/bin/sh', '-c'],
  121. args: ['yarn workspace query-node-root db:prepare; yarn workspace query-node-root db:migrate'],
  122. },
  123. ],
  124. restartPolicy: 'Never',
  125. },
  126. },
  127. },
  128. },
  129. { dependsOn: databaseService }
  130. // { provider: provider }
  131. )
  132. const deployment = new k8s.apps.v1.Deployment(
  133. name,
  134. {
  135. metadata: {
  136. namespace: namespaceName,
  137. labels: appLabels,
  138. },
  139. spec: {
  140. replicas: 1,
  141. selector: { matchLabels: appLabels },
  142. template: {
  143. metadata: {
  144. labels: appLabels,
  145. },
  146. spec: {
  147. containers: [
  148. {
  149. name: 'redis',
  150. image: 'redis:6.0-alpine',
  151. ports: [{ containerPort: 6379 }],
  152. },
  153. {
  154. name: 'indexer',
  155. image: 'joystream/hydra-indexer:2.1.0-beta.9',
  156. env: [
  157. // ...envCopy,
  158. { name: 'DB_HOST', value: 'postgres-db' },
  159. { name: 'DB_NAME', value: process.env.INDEXER_DB_NAME! },
  160. { name: 'DB_PASS', value: process.env.DB_PASS! },
  161. { name: 'INDEXER_WORKERS', value: '5' },
  162. { name: 'REDIS_URI', value: 'redis://localhost:6379/0' },
  163. { name: 'DEBUG', value: 'index-builder:*' },
  164. { name: 'WS_PROVIDER_ENDPOINT_URI', value: process.env.WS_PROVIDER_ENDPOINT_URI! },
  165. { name: 'TYPES_JSON', value: 'types.json' },
  166. { name: 'PGUSER', value: process.env.DB_USER! },
  167. { name: 'BLOCK_HEIGHT', value: process.env.BLOCK_HEIGHT! },
  168. ],
  169. volumeMounts: [
  170. {
  171. mountPath: '/home/hydra/packages/hydra-indexer/types.json',
  172. name: 'indexer-volume',
  173. subPath: 'fileData',
  174. },
  175. ],
  176. command: ['/bin/sh', '-c'],
  177. args: ['yarn db:bootstrap && yarn start:prod'],
  178. },
  179. {
  180. name: 'hydra-indexer-gateway',
  181. image: 'joystream/hydra-indexer-gateway:2.1.0-beta.5',
  182. env: [
  183. { name: 'WARTHOG_STARTER_DB_DATABASE', value: process.env.INDEXER_DB_NAME! },
  184. { name: 'WARTHOG_STARTER_DB_HOST', value: 'postgres-db' },
  185. { name: 'WARTHOG_STARTER_DB_PASSWORD', value: process.env.DB_PASS! },
  186. { name: 'WARTHOG_STARTER_DB_PORT', value: process.env.DB_PORT! },
  187. { name: 'WARTHOG_STARTER_DB_USERNAME', value: process.env.DB_USER! },
  188. { name: 'WARTHOG_STARTER_REDIS_URI', value: 'redis://localhost:6379/0' },
  189. { name: 'WARTHOG_APP_PORT', value: process.env.WARTHOG_APP_PORT! },
  190. { name: 'PORT', value: process.env.WARTHOG_APP_PORT! },
  191. { name: 'DEBUG', value: '*' },
  192. ],
  193. ports: [{ containerPort: 4002 }],
  194. },
  195. {
  196. name: 'processor',
  197. image: joystreamAppsImage,
  198. imagePullPolicy: 'IfNotPresent',
  199. env: [
  200. {
  201. name: 'INDEXER_ENDPOINT_URL',
  202. value: `http://localhost:${process.env.WARTHOG_APP_PORT}/graphql`,
  203. },
  204. { name: 'TYPEORM_HOST', value: 'postgres-db' },
  205. { name: 'TYPEORM_DATABASE', value: process.env.DB_NAME! },
  206. { name: 'DEBUG', value: 'index-builder:*' },
  207. { name: 'PROCESSOR_POLL_INTERVAL', value: '1000' },
  208. ],
  209. volumeMounts: [
  210. {
  211. mountPath: '/joystream/query-node/mappings/lib/generated/types/typedefs.json',
  212. name: 'processor-volume',
  213. subPath: 'fileData',
  214. },
  215. ],
  216. args: ['workspace', 'query-node-root', 'processor:start'],
  217. },
  218. {
  219. name: 'graphql-server',
  220. image: joystreamAppsImage,
  221. imagePullPolicy: 'IfNotPresent',
  222. env: [
  223. { name: 'DB_HOST', value: 'postgres-db' },
  224. { name: 'DB_PASS', value: process.env.DB_PASS! },
  225. { name: 'DB_USER', value: process.env.DB_USER! },
  226. { name: 'DB_PORT', value: process.env.DB_PORT! },
  227. { name: 'DB_NAME', value: process.env.DB_NAME! },
  228. { name: 'GRAPHQL_SERVER_HOST', value: process.env.GRAPHQL_SERVER_HOST! },
  229. { name: 'GRAPHQL_SERVER_PORT', value: process.env.GRAPHQL_SERVER_PORT! },
  230. ],
  231. ports: [{ name: 'graph-ql-port', containerPort: Number(process.env.GRAPHQL_SERVER_PORT!) }],
  232. args: ['workspace', 'query-node-root', 'query-node:start:prod'],
  233. },
  234. ],
  235. volumes: [
  236. {
  237. name: 'processor-volume',
  238. configMap: {
  239. name: defsConfigName,
  240. },
  241. },
  242. {
  243. name: 'indexer-volume',
  244. configMap: {
  245. name: defsConfigName,
  246. },
  247. },
  248. ],
  249. },
  250. },
  251. },
  252. },
  253. { dependsOn: exampleJob }
  254. // {
  255. // provider: cluster.provider,
  256. // }
  257. )
  258. // Export the Deployment name
  259. export const deploymentName = deployment.metadata.name
  260. // Create a LoadBalancer Service for the NGINX Deployment
  261. const service = new k8s.core.v1.Service(
  262. name,
  263. {
  264. metadata: {
  265. labels: appLabels,
  266. namespace: namespaceName,
  267. },
  268. spec: {
  269. type: 'NodePort',
  270. ports: [
  271. { name: 'port-1', port: 8081, targetPort: 'graph-ql-port' },
  272. { name: 'port-2', port: 4000, targetPort: 4002 },
  273. ],
  274. selector: appLabels,
  275. },
  276. }
  277. // {
  278. // provider: cluster.provider,
  279. // }
  280. )
  281. // Export the Service name and public LoadBalancer Endpoint
  282. export const serviceName = service.metadata.name
  283. // When "done", this will print the public IP.
  284. export let serviceHostname: pulumi.Output<string>
  285. serviceHostname = service.status.loadBalancer.ingress[0].hostname