index.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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 skipProcessor = config.getBoolean('skipProcessor')
  16. export let kubeconfig: pulumi.Output<any>
  17. export let joystreamAppsImage: pulumi.Output<string>
  18. let provider: k8s.Provider
  19. if (skipProcessor && externalIndexerUrl) {
  20. pulumi.log.error('Need to deploy atleast one component, Indexer or Processor')
  21. throw new Error(`Please check the config settings for skipProcessor and externalIndexerUrl`)
  22. }
  23. if (isMinikube) {
  24. provider = new k8s.Provider('local', {})
  25. // Create image from local app
  26. joystreamAppsImage = new docker.Image('joystream/apps', {
  27. build: {
  28. context: '../../../',
  29. dockerfile: '../../../apps.Dockerfile',
  30. },
  31. imageName: 'joystream/apps:latest',
  32. skipPush: true,
  33. }).baseImageName
  34. // Uncomment the below line if you want to use a pre built image
  35. // joystreamAppsImage = pulumi.interpolate`joystream/apps`
  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. joystreamAppsImage = repo.buildAndPushImage({
  56. dockerfile: '../../../apps.Dockerfile',
  57. context: '../../../',
  58. })
  59. // Uncomment the below line if you want to use a pre built image
  60. // joystreamAppsImage = pulumi.interpolate`joystream/apps`
  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. let appLabels = { appClass: name }
  69. const defsConfig = new configMapFromFile(
  70. 'defs-config',
  71. {
  72. filePath: '../../../types/augment/all/defs.json',
  73. namespaceName: namespaceName,
  74. },
  75. resourceOptions
  76. ).configName
  77. if (!externalIndexerUrl) {
  78. const indexer = new IndexerServiceDeployment(
  79. 'indexer',
  80. { namespaceName, storage: 10, defsConfig, joystreamAppsImage },
  81. resourceOptions
  82. )
  83. }
  84. if (!skipProcessor) {
  85. const processor = new ProcessorServiceDeployment(
  86. 'processor',
  87. { namespaceName, storage: 10, defsConfig, joystreamAppsImage, externalIndexerUrl },
  88. resourceOptions
  89. )
  90. }
  91. const caddyEndpoints = [
  92. `/indexer* {
  93. uri strip_prefix /indexer
  94. reverse_proxy indexer:4000
  95. }`,
  96. `/server* {
  97. uri strip_prefix /server
  98. reverse_proxy graphql-server:8081
  99. }`,
  100. ]
  101. const lbReady = config.get('isLoadBalancerReady') === 'true'
  102. export let endpoint1: pulumi.Output<string>
  103. export let endpoint2: pulumi.Output<string>
  104. if (!isMinikube) {
  105. const caddy = new CaddyServiceDeployment(
  106. 'caddy-proxy',
  107. { lbReady, namespaceName: namespaceName, isMinikube, caddyEndpoints },
  108. resourceOptions
  109. )
  110. endpoint1 = pulumi.interpolate`${caddy.primaryEndpoint}`
  111. endpoint2 = pulumi.interpolate`${caddy.secondaryEndpoint}`
  112. }