Files
2026-07-13 13:34:48 +08:00

300 lines
8.7 KiB
Plaintext

# 0. constants
## 0.1. ports
READINESS_PORT = 8086
CHAT_INTEGRATION_PORT = 8089
ECHO_BOT_PORT = 8090
PUSHPIN_PUBLIC_INNER_PORT = 7999
PUSHPIN_PRIVATE_INNER_PORT = 5561
PUSHPIN_PUBLIC_PORT = 7001
PUSHPIN_PRIVATE_PORT = 6001
DYNAMO_DB_PORT = 8000
## 0.2. strings
AUTH_ENCRYPTION_KEY = "allo"
WORK_DIR = os.path.dirname(__file__)
BOTPRESS_HOME_DIR = "%s/.botpresshome.echo" % WORK_DIR
PUSHPIN_CONFIG_PATH="%s/pushpin.conf" % WORK_DIR
LOCAL_AWS_ACCESS_KEY_ID = "FOO"
LOCAL_AWS_SECRET_ACCESS_KEY = "BAR"
ECHO_BOT_PATH = "%s/bots/echo" % WORK_DIR
CHAT_INT_PATH = "%s/integrations/chat" % WORK_DIR
CONV_FID_STORE = struct(
table_name='chat-integration-conversation-fid-store',
index_name='chat-integration-conversation-id-store',
partition_key='bot_id',
sort_key='fid',
index_sort_key='id',
)
USER_FID_STORE = struct(
table_name='chat-integration-user-fid-store',
index_name='chat-integration-user-id-store',
partition_key='bot_id',
sort_key='fid',
index_sort_key='id',
)
## 0.3. utils
def encode_base64(content):
return str(local(
command=['base64'],
quiet=True,
echo_off=True,
stdin=content,
)).strip()
# 0.4. env
BP_HOME_ENV = struct(key='BP_BOTPRESS_HOME', value=BOTPRESS_HOME_DIR)
# 1. config
config.define_bool('skip-install')
config.define_bool('skip-build')
config.define_string('bp-domain')
config.define_string('bp-token')
config.define_string('bp-workspace-id')
cfg = config.parse()
config_skip_install = cfg.get('skip-install', False)
config_skip_build = cfg.get('skip-build', False)
config_bp_domain = cfg.get('bp-domain', None)
config_bp_token = cfg.get('bp-token', None)
config_bp_workspace_id = cfg.get('bp-workspace-id', None)
if not config_bp_domain:
fail("config 'bp-domain' is required")
if not config_bp_token:
fail("config 'bp-token' is required")
if not config_bp_workspace_id:
fail("config 'bp-workspace-id' is required")
CONFIG = struct(
skip_install=config_skip_install,
skip_build=config_skip_build,
bp_domain=config_bp_domain,
bp_token=config_bp_token,
bp_workspace_id=config_bp_workspace_id,
)
api_webhook_domain = "webhook.%s" % CONFIG.bp_domain
api_api_domain = "api.%s" % CONFIG.bp_domain
api_tunnel_domain = "tunnel.%s" % CONFIG.bp_domain
api_api_url = "https://%s" % api_api_domain
api_tunnel_url = "https://%s" % api_tunnel_domain
API = struct(
bp_webhook_domain = api_webhook_domain,
bp_api_domain = api_api_domain,
bp_tunnel_domain = api_tunnel_domain,
bp_api_url = api_api_url,
bp_tunnel_url = api_tunnel_url,
)
# 2. docker compose
dynamodb_resource = {
"image": "amazon/dynamodb-local",
"ports": ["%s:%s" % (DYNAMO_DB_PORT, DYNAMO_DB_PORT)],
"environment": {
"DYNAMODB_LOCAL_LOG": "DEBUG"
}
}
PUSHPIN_ROUTES = "*,proto=ws %s:443,ssl,insecure,host=%s,over_http\n* %s:443,ssl,insecure,host=%s" % (API.bp_webhook_domain, API.bp_webhook_domain, API.bp_webhook_domain, API.bp_webhook_domain)
PUSHPIN_CONFIG = "%s" % read_file(PUSHPIN_CONFIG_PATH, '')
pushpin_ressource = {
"image": "botpress/pushpin",
"environment": {
"PUSHPIN_ROUTES": PUSHPIN_ROUTES,
"PUSHPIN_CONFIG": PUSHPIN_CONFIG,
},
'ports': ['%s:%s' % (PUSHPIN_PUBLIC_PORT, PUSHPIN_PUBLIC_INNER_PORT), '%s:%s' % (PUSHPIN_PRIVATE_PORT, PUSHPIN_PRIVATE_INNER_PORT)],
'platform': 'linux/amd64',
}
docker_compose(encode_yaml({
'version': '3.5',
'services': {
'run-pushpin': pushpin_ressource,
'run-dynamodb': dynamodb_resource,
},
}))
dc_readiness = [
{ 'type': 'http', 'name': 'run-pushpin', 'url': 'http://localhost:%s' % PUSHPIN_PUBLIC_PORT },
{ 'type': 'dynamodb', 'name': 'run-dynamodb', 'uri': 'http://localhost:%s' % DYNAMO_DB_PORT },
]
# 3. ressources
## 3.1. utils
local_resource(
name='pnpm-install',
cmd='pnpm install' if not CONFIG.skip_install else 'echo skipped',
labels=['utils']
)
local_resource(
name='pnpm-build',
cmd='pnpm build' if not CONFIG.skip_build else 'echo skipped',
labels=['utils'],
resource_deps=['pnpm-install']
)
local_resource(
name='login-botpress',
cmd='pnpm bp login',
env={
BP_HOME_ENV.key: BP_HOME_ENV.value,
'BP_API_URL': API.bp_api_url,
'BP_TOKEN': CONFIG.bp_token,
'BP_WORKSPACE_ID': CONFIG.bp_workspace_id,
},
resource_deps=['pnpm-install', 'pnpm-build'],
labels=['utils'],
)
readiness_deps=[r['name'] for r in dc_readiness] + ['pnpm-install', 'pnpm-build']
local_resource(
name="readiness",
allow_parallel=True,
serve_cmd='pnpm ready',
serve_env={
'PORT': '%s' % READINESS_PORT,
'LOG_LEVEL': 'info',
'CONFIG': encode_json(dc_readiness),
'AWS_REGION': 'localhost',
'AWS_ACCESS_KEY_ID': LOCAL_AWS_ACCESS_KEY_ID,
'AWS_SECRET_ACCESS_KEY': LOCAL_AWS_SECRET_ACCESS_KEY,
},
labels=['utils'],
readiness_probe=probe(http_get=http_get_action(port=READINESS_PORT, path='/ready'), period_secs=2, failure_threshold=20),
resource_deps=readiness_deps,
)
# 3.2. scripts
local_resource(
name='create-conv-fid-store',
cmd='pnpm ts-node -T ./scripts/dynamodb-create-table.ts',
env={
'AWS_REGION': "localhost",
'AWS_ACCESS_KEY_ID': LOCAL_AWS_ACCESS_KEY_ID,
'AWS_SECRET_ACCESS_KEY': LOCAL_AWS_SECRET_ACCESS_KEY,
'endpoint': "http://localhost:%s" % DYNAMO_DB_PORT,
'table_name': CONV_FID_STORE.table_name,
'index_name': CONV_FID_STORE.index_name,
'partition_key': CONV_FID_STORE.partition_key,
'sort_key': CONV_FID_STORE.sort_key,
'index_sort_key': CONV_FID_STORE.index_sort_key,
},
labels=['scripts'],
resource_deps=['readiness'],
)
local_resource(
name='create-user-fid-store',
cmd='pnpm ts-node -T ./scripts/dynamodb-create-table.ts',
env={
'AWS_REGION': "localhost",
'AWS_ACCESS_KEY_ID': LOCAL_AWS_ACCESS_KEY_ID,
'AWS_SECRET_ACCESS_KEY': LOCAL_AWS_SECRET_ACCESS_KEY,
'endpoint': "http://localhost:%s" % DYNAMO_DB_PORT,
'table_name': USER_FID_STORE.table_name,
'index_name': USER_FID_STORE.index_name,
'partition_key': USER_FID_STORE.partition_key,
'sort_key': USER_FID_STORE.sort_key,
'index_sort_key': USER_FID_STORE.index_sort_key,
},
labels=['scripts'],
resource_deps=['readiness'],
)
## 3.3. run
dc_resource(name='run-pushpin', labels=['run'])
dc_resource(name='run-dynamodb', labels=['run'])
local_resource(
name='run-chat-integration',
serve_cmd=" ".join([
"pnpm -F @botpresshub/chat exec bp dev -v",
"--secrets SIGNAL_URL=http://localhost:%s" % PUSHPIN_PRIVATE_PORT,
"--secrets AUTH_ENCRYPTION_KEY=%s" % AUTH_ENCRYPTION_KEY,
'--secrets FID_STORE_CONFIG="%s"' % encode_base64(encode_json({
"strategy": "dynamo-db",
"endpoint": "http://localhost:%s" % DYNAMO_DB_PORT,
"region": "localhost",
"accessKeyId": LOCAL_AWS_ACCESS_KEY_ID,
"secretAccessKey": LOCAL_AWS_SECRET_ACCESS_KEY,
"conversationTable": {
"tableName": CONV_FID_STORE.table_name,
"indexName": CONV_FID_STORE.index_name,
"partitionKey": CONV_FID_STORE.partition_key,
"sortKey": CONV_FID_STORE.sort_key,
"indexSortKey": CONV_FID_STORE.index_sort_key,
},
"userTable": {
"tableName": USER_FID_STORE.table_name,
"indexName": USER_FID_STORE.index_name,
"partitionKey": USER_FID_STORE.partition_key,
"sortKey": USER_FID_STORE.sort_key,
"indexSortKey": USER_FID_STORE.index_sort_key,
}
}))
]),
serve_env={
BP_HOME_ENV.key: BP_HOME_ENV.value,
'BP_CONFIRM': 'true',
'BP_TUNNEL_URL': API.bp_tunnel_url,
'BP_PORT': str(CHAT_INTEGRATION_PORT),
},
resource_deps=['login-botpress', 'readiness', 'run-pushpin', 'create-conv-fid-store', 'create-user-fid-store'],
labels=['run'],
readiness_probe=probe(http_get=http_get_action(port=CHAT_INTEGRATION_PORT, path='/health'), period_secs=1, failure_threshold=10),
)
local_resource(
name='run-echo-bot',
cmd="pnpm -F echo exec bp add --use-dev -y -v",
serve_cmd="pnpm -F echo exec bp dev -y --tunnel-url %s --port %s" % (API.bp_tunnel_url, ECHO_BOT_PORT),
serve_env={
BP_HOME_ENV.key: BP_HOME_ENV.value,
},
resource_deps=['login-botpress', 'run-chat-integration'],
labels=['run'],
readiness_probe=probe(http_get=http_get_action(port=ECHO_BOT_PORT, path='/health'), period_secs=1, failure_threshold=10),
)
## 3.3. test
# TODO: find a way to make this work without bash specific syntax
local_resource(
name='test-chat-integration',
cmd=" ".join([
'wh_id=$(pnpm ts-node -T ./scripts/fetch-chat-wh.ts);',
'API_URL=http://localhost:%s/$wh_id' % PUSHPIN_PUBLIC_PORT,
'pnpm run -F @botpress/chat test:e2e'
]),
env={
BP_HOME_ENV.key: BP_HOME_ENV.value,
'BP_API_URL': API.bp_api_url,
'BP_TOKEN': CONFIG.bp_token,
'BP_WORKSPACE_ID': CONFIG.bp_workspace_id,
'ECHO_PATH': ECHO_BOT_PATH,
'CHAT_PATH': CHAT_INT_PATH,
'ENCRYPTION_KEY': AUTH_ENCRYPTION_KEY,
},
resource_deps=['run-chat-integration', 'run-echo-bot'],
labels=['test'],
)