// sst.config.ts
export default $config({
app(input) {
return {
name: 'my-app',
removal: input?.stage === 'production' ? 'retain' : 'remove',
home: 'aws',
};
},
async run() {
const vpc = new sst.aws.Vpc('vpc', {az: 2, nat: 'ec2'});
const cluster = new sst.aws.Cluster('cluster', {vpc});
const replicationBucket = new sst.aws.Bucket('replication-bucket');
// Replication Manager
const replicationManager = new sst.aws.Service('replication-manager', {
cluster,
cpu: '2 vCPU',
memory: '8 GB',
image: 'my-zero-image',
environment: {
ZERO_UPSTREAM_DB: process.env.ZERO_UPSTREAM_DB!,
ZERO_NUM_SYNC_WORKERS: '0',
ZERO_LITESTREAM_BACKUP_URL: $interpolate`s3://${replicationBucket.name}/backup`,
ZERO_MUTATE_URL: process.env.ZERO_MUTATE_URL!,
ZERO_QUERY_URL: process.env.ZERO_QUERY_URL!,
},
loadBalancer: {
public: false,
ports: [{listen: '80/http', forward: '4849/http'}],
},
});
// View Syncers
const viewSyncer = new sst.aws.Service('view-syncer', {
cluster,
cpu: '8 vCPU',
memory: '16 GB',
image: 'my-zero-image',
environment: {
ZERO_UPSTREAM_DB: process.env.ZERO_UPSTREAM_DB!,
ZERO_CVR_DB: process.env.ZERO_CVR_DB!,
ZERO_CHANGE_STREAMER_URI: replicationManager.url,
ZERO_MUTATE_URL: process.env.ZERO_MUTATE_URL!,
ZERO_QUERY_URL: process.env.ZERO_QUERY_URL!,
ZERO_UPSTREAM_MAX_CONNS: '15',
ZERO_CVR_MAX_CONNS: '160',
},
loadBalancer: {
public: true,
domain: {name: 'sync.example.com'},
ports: [
{listen: '443/https', forward: '4848/http'},
],
},
transform: {
target: {
stickiness: {
enabled: true,
type: 'lb_cookie',
cookieDuration: 120,
},
},
autoScalingTarget: {
minCapacity: 2,
maxCapacity: 10,
},
},
});
},
});