MOre on env parsing for k8s

This commit is contained in:
Jackson Harper
2024-01-15 18:36:35 +08:00
parent f3f9f1a210
commit d31d309bc0
4 changed files with 36 additions and 4 deletions

View File

@ -1,6 +1,6 @@
import { getEnv } from './util'
export const env = getEnv()
export const env = getEnv(process.env)
export function homePageURL(): string {
return env.client.url

View File

@ -0,0 +1,28 @@
import { BackendEnv, getEnv } from './util'
import { SecretManagerServiceClient } from '@google-cloud/secret-manager'
// When running on GCP we want to use secrets manager instead
// of environment variables for storing secrets. This means
// after startup we need to query secret manager, and
// pull in those secrets.
// To opt into this feature you need to set the `GCP_SECRETS_NAME`
// environment variable to the secrets name for example:
// `omnivore-project/secrets/my-secrets/latest`
//
export const loadEnvFromGCPSecrets = async (): Promise<
BackendEnv | undefined
> => {
if (process.env.GCP_SECRETS_NAME && process.env.GCP_PROJECT_ID) {
const client = new SecretManagerServiceClient()
const [version] = await client.accessSecretVersion({
name: `projects/${process.env.GCP_PROJECT_ID}/secrets/${process.env.GCP_SECRETS_NAME}/versions/latest`,
})
if (!version || !version.payload || !version.payload.data) {
throw new Error(`no data for secret: ${process.env.GCP_SECRETS_NAME}`)
}
let data = Buffer.from(version.payload.data.toString(), 'base64')
const result: any = JSON.parse(data.toString())
return getEnv(result)
}
return undefined
}

View File

@ -18,7 +18,7 @@ export const QUEUE_NAME = 'omnivore-backend-queue'
const main = async () => {
console.log('[queue-processor]: starting queue processor')
let env = (await loadEnvFromGCPSecrets()) ?? getEnv()
let env = (await loadEnvFromGCPSecrets()) ?? getEnv(process.env)
const app: Express = express()
const port = process.env.PORT || 3002

View File

@ -205,11 +205,15 @@ const envParser =
)
}
export function getEnv(): BackendEnv {
interface Dict<T> {
[key: string]: T | undefined
}
export function getEnv(from: Dict<string>): BackendEnv {
// Dotenv parses env file merging into proces.env which is then read into custom struct here.
dotenv.config()
const parse = envParser(process.env)
const parse = envParser(from)
const pg = {
host: parse('PG_HOST'),
port: parseInt(parse('PG_PORT'), 10),