index.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import * as awsx from '@pulumi/awsx'
  2. import * as eks from '@pulumi/eks'
  3. import * as docker from '@pulumi/docker'
  4. import * as pulumi from '@pulumi/pulumi'
  5. import { configMapFromFile } from './configMap'
  6. import * as k8s from '@pulumi/kubernetes'
  7. import { IndexerServiceDeployment } from './indexerDeployment'
  8. import { ProcessorServiceDeployment } from './processorDeployment'
  9. import { CaddyServiceDeployment } from 'pulumi-common'
  10. require('dotenv').config()
  11. const config = new pulumi.Config()
  12. const awsConfig = new pulumi.Config('aws')
  13. const isMinikube = config.getBoolean('isMinikube')
  14. const externalIndexerUrl = config.get('externalIndexerUrl')
  15. const appsImage = config.get('appsImage') || `joystream/apps:latest`
  16. const skipProcessor = config.getBoolean('skipProcessor')
  17. const useLocalRepo = config.getBoolean('useLocalRepo') || false
  18. export let kubeconfig: pulumi.Output<any>
  19. export let joystreamAppsImage: pulumi.Output<string>
  20. let provider: k8s.Provider
  21. if (skipProcessor && externalIndexerUrl) {
  22. pulumi.log.error('Need to deploy atleast one component, Indexer or Processor')
  23. throw new Error(`Please check the config settings for skipProcessor and externalIndexerUrl`)
  24. }
  25. if (isMinikube) {
  26. provider = new k8s.Provider('local', {})
  27. if (useLocalRepo) {
  28. // Use already existing image in minikube environment
  29. joystreamAppsImage = pulumi.interpolate`${appsImage}`
  30. } else {
  31. // Access image from docker hub
  32. joystreamAppsImage = new docker.RemoteImage('apps', {
  33. name: appsImage!,
  34. }).repoDigest
  35. }
  36. } else {
  37. // Create a VPC for our cluster.
  38. const vpc = new awsx.ec2.Vpc('query-node-vpc', { numberOfAvailabilityZones: 2, numberOfNatGateways: 1 })
  39. // Create an EKS cluster with the default configuration.
  40. const cluster = new eks.Cluster('eksctl-query-node', {
  41. vpcId: vpc.id,
  42. subnetIds: vpc.publicSubnetIds,
  43. desiredCapacity: 3,
  44. maxSize: 3,
  45. instanceType: 't2.large',
  46. providerCredentialOpts: {
  47. profileName: awsConfig.get('profile'),
  48. },
  49. })
  50. provider = cluster.provider
  51. // Export the cluster's kubeconfig.
  52. kubeconfig = cluster.kubeconfig
  53. // Create a repository
  54. const repo = new awsx.ecr.Repository('joystream/apps')
  55. // Build an image from an existing local/docker hub image and push to ECR
  56. joystreamAppsImage = repo.buildAndPushImage({
  57. context: './docker_dummy',
  58. dockerfile: './docker_dummy/Dockerfile',
  59. args: { SOURCE_IMAGE: appsImage! },
  60. })
  61. }
  62. const resourceOptions = { provider: provider }
  63. const name = 'query-node'
  64. // Create a Kubernetes Namespace
  65. const ns = new k8s.core.v1.Namespace(name, {}, resourceOptions)
  66. // Export the Namespace name
  67. export const namespaceName = ns.metadata.name
  68. const defsConfig = new configMapFromFile(
  69. 'defs-config',
  70. {
  71. filePath: '../../../types/augment/all/defs.json',
  72. namespaceName: namespaceName,
  73. },
  74. resourceOptions
  75. ).configName
  76. if (!externalIndexerUrl) {
  77. const indexer = new IndexerServiceDeployment(
  78. 'indexer',
  79. { namespaceName, storage: 10, defsConfig, joystreamAppsImage },
  80. resourceOptions
  81. )
  82. }
  83. if (!skipProcessor) {
  84. const processor = new ProcessorServiceDeployment(
  85. 'processor',
  86. { namespaceName, storage: 10, defsConfig, joystreamAppsImage, externalIndexerUrl },
  87. resourceOptions
  88. )
  89. }
  90. const caddyEndpoints = [
  91. `/indexer* {
  92. uri strip_prefix /indexer
  93. reverse_proxy indexer:4000
  94. }`,
  95. `/server* {
  96. uri strip_prefix /server
  97. reverse_proxy graphql-server:8081
  98. }`,
  99. ]
  100. const lbReady = config.get('isLoadBalancerReady') === 'true'
  101. export let endpoint1: pulumi.Output<string>
  102. export let endpoint2: pulumi.Output<string>
  103. if (!isMinikube) {
  104. const caddy = new CaddyServiceDeployment(
  105. 'caddy-proxy',
  106. { lbReady, namespaceName: namespaceName, isMinikube, caddyEndpoints },
  107. resourceOptions
  108. )
  109. endpoint1 = pulumi.interpolate`${caddy.primaryEndpoint}`
  110. endpoint2 = pulumi.interpolate`${caddy.secondaryEndpoint}`
  111. }