mirror of
https://github.com/nestriness/nestri.git
synced 2026-09-19 17:25:19 +03:00
feat: Sync to OSS repo
This commit is contained in:
130
alchemy.run.ts
Normal file
130
alchemy.run.ts
Normal file
@@ -0,0 +1,130 @@
|
||||
import * as Alchemy from 'alchemy';
|
||||
import { adopt } from 'alchemy/AdoptPolicy';
|
||||
import * as Cloudflare from 'alchemy/Cloudflare';
|
||||
import { Redacted } from 'effect';
|
||||
import * as Effect from 'effect/Effect';
|
||||
|
||||
const steamApiKey = Redacted.make(process.env.STEAM_API_KEY!);
|
||||
const sshAuthKey = process.env.SSH_AUTH_KEY || 'dev-ssh-auth-key-change-in-prod';
|
||||
const adminSharedSecret =
|
||||
process.env.ADMIN_SHARED_SECRET || 'dev-admin-shared-secret-change-in-prod';
|
||||
|
||||
const AuthStorage = Cloudflare.KV.Namespace('auth-storage');
|
||||
|
||||
const Database = Effect.gen(function* () {
|
||||
const { stage } = yield* Alchemy.Stack;
|
||||
const database = stage === 'production' ? 'defaultdb' : 'sandbox';
|
||||
return yield* Cloudflare.Hyperdrive.Connection('db', {
|
||||
origin: {
|
||||
scheme: 'postgres',
|
||||
host: 'public-nestri-pg-1-atdogthbymao.db.upclouddatabases.com',
|
||||
port: 11569,
|
||||
database,
|
||||
user: 'upadmin',
|
||||
password: Redacted.make(process.env.DATABASE_PASSWORD!)
|
||||
},
|
||||
dev: {
|
||||
scheme: 'postgres',
|
||||
host: 'localhost',
|
||||
port: 5432,
|
||||
database: 'nestri',
|
||||
user: 'postgres',
|
||||
password: Redacted.make('postgres')
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
export const Auth = Effect.gen(function* () {
|
||||
const { stage } = yield* Alchemy.Stack;
|
||||
const isPermanent = ['production', 'sandbox', 'dev'].includes(stage);
|
||||
return yield* Cloudflare.Worker('auth', {
|
||||
main: 'apps/auth/src/index.ts',
|
||||
compatibility: { flags: ['nodejs_compat'] },
|
||||
env: {
|
||||
AuthStorage,
|
||||
HYPERDRIVE: Database,
|
||||
STEAM_API_KEY: steamApiKey,
|
||||
SSH_AUTH_KEY: sshAuthKey
|
||||
},
|
||||
...(isPermanent ? { observability: { enabled: true } } : {})
|
||||
});
|
||||
});
|
||||
|
||||
export const Api = Effect.gen(function* () {
|
||||
const { stage } = yield* Alchemy.Stack;
|
||||
const isPermanent = ["production", "sandbox", "dev"].includes(stage);
|
||||
const prefix = stage === "production" ? "" : `${stage}.`;
|
||||
const authDomain = ["production", "sandbox"].includes(stage)
|
||||
? `${prefix}auth.nestri.io`
|
||||
: undefined;
|
||||
return yield* Cloudflare.Worker("api", {
|
||||
main: "apps/api/app/index.ts",
|
||||
compatibility: { flags: ["nodejs_compat"] },
|
||||
env: {
|
||||
AUTH: Auth,
|
||||
AUTH_ISSUER_URL: authDomain
|
||||
? `https://${authDomain}`
|
||||
: "http://localhost:1337",
|
||||
HYPERDRIVE: Database,
|
||||
STEAM_API_KEY: steamApiKey,
|
||||
ADMIN_SHARED_SECRET: adminSharedSecret,
|
||||
},
|
||||
...(isPermanent ? { observability: { enabled: true } } : {}),
|
||||
});
|
||||
});
|
||||
|
||||
export default Alchemy.Stack(
|
||||
'nestri',
|
||||
{
|
||||
providers: Cloudflare.providers(),
|
||||
state: Alchemy.localState()
|
||||
},
|
||||
Effect.gen(function* () {
|
||||
const { stage } = yield* Alchemy.Stack;
|
||||
|
||||
yield* Database;
|
||||
const auth = yield* Auth;
|
||||
const api = yield* Api;
|
||||
|
||||
if (stage === "production" || stage === "sandbox") {
|
||||
const zone = yield* Cloudflare.Zone.Zone("zone", {
|
||||
name: "nestri.io",
|
||||
}).pipe(adopt(true));
|
||||
|
||||
const prefix = stage === "production" ? "" : `${stage}.`;
|
||||
|
||||
yield* Cloudflare.DNS.Record("auth-dns", {
|
||||
zoneId: zone.zoneId,
|
||||
name: `${prefix}auth.nestri.io`,
|
||||
type: "AAAA",
|
||||
content: "100::",
|
||||
proxied: true,
|
||||
});
|
||||
|
||||
yield* Cloudflare.DNS.Record("api-dns", {
|
||||
zoneId: zone.zoneId,
|
||||
name: `${prefix}api.nestri.io`,
|
||||
type: "AAAA",
|
||||
content: "100::",
|
||||
proxied: true,
|
||||
});
|
||||
|
||||
yield* Cloudflare.Workers.WorkerRoute("auth-route", {
|
||||
zoneId: zone.zoneId,
|
||||
pattern: `${prefix}auth.nestri.io/*`,
|
||||
script: auth.workerName,
|
||||
});
|
||||
|
||||
yield* Cloudflare.Workers.WorkerRoute("api-route", {
|
||||
zoneId: zone.zoneId,
|
||||
pattern: `${prefix}api.nestri.io/*`,
|
||||
script: api.workerName,
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
authUrl: auth.url.as<string>(),
|
||||
apiUrl: api.url.as<string>()
|
||||
};
|
||||
})
|
||||
);
|
||||
Reference in New Issue
Block a user