fix(infra): update Dockerfile, setup.ts, and bootstrap admin invite for standalone repo
This commit is contained in:
parent
623e78a7b1
commit
40da6ecbe0
16
Dockerfile
16
Dockerfile
@ -15,14 +15,15 @@ WORKDIR /app
|
|||||||
ENV DENO_DIR=/deno-dir
|
ENV DENO_DIR=/deno-dir
|
||||||
|
|
||||||
# Layer cache: Pre-download dependencies (only invalidates if deps change)
|
# Layer cache: Pre-download dependencies (only invalidates if deps change)
|
||||||
COPY deno.json deno.lock* ./
|
COPY deno.json deno.lock* deps.ts ./
|
||||||
COPY auth-yes/deno.json ./auth-yes/
|
COPY server/deno.json ./server/
|
||||||
COPY auth-yes/deps.ts ./auth-yes/
|
COPY sdk/deno.json ./sdk/
|
||||||
RUN deno cache auth-yes/deps.ts
|
COPY ui/deno.json ./ui/
|
||||||
|
RUN deno cache deps.ts
|
||||||
|
|
||||||
# Source code layer
|
# Source code layer
|
||||||
COPY . .
|
COPY . .
|
||||||
RUN deno cache auth-yes/server/main.ts
|
RUN deno cache server/main.ts
|
||||||
|
|
||||||
# Stage 3: Runner
|
# Stage 3: Runner
|
||||||
FROM denoland/deno:debian-2.9.4
|
FROM denoland/deno:debian-2.9.4
|
||||||
@ -36,10 +37,9 @@ ENV DENO_DIR=/deno-dir
|
|||||||
# Copy the Rust library
|
# Copy the Rust library
|
||||||
COPY --from=rust-builder --chown=deno:deno /usr/src/app/spire_ffi/target/release/libspire_ffi.so /app/libspire_ffi.so
|
COPY --from=rust-builder --chown=deno:deno /usr/src/app/spire_ffi/target/release/libspire_ffi.so /app/libspire_ffi.so
|
||||||
|
|
||||||
COPY --from=deno-builder --chown=deno:deno /app/deno.json /app/deno.lock ./
|
COPY --from=deno-builder --chown=deno:deno /app ./
|
||||||
COPY --from=deno-builder --chown=deno:deno /app/auth-yes/ ./auth-yes/
|
|
||||||
|
|
||||||
EXPOSE 8000
|
EXPOSE 8000
|
||||||
|
|
||||||
# Added --allow-ffi for Deno.dlopen and --allow-read for dlopen path resolution
|
# Added --allow-ffi for Deno.dlopen and --allow-read for dlopen path resolution
|
||||||
CMD ["run", "--allow-net", "--allow-env", "--allow-ffi=./libspire_ffi.so", "--allow-read=.,/var/run/spire/agent.sock", "--unstable-ffi", "auth-yes/server/main.ts"]
|
CMD ["run", "--allow-net", "--allow-env", "--allow-ffi=./libspire_ffi.so", "--allow-read=.,/var/run/spire/agent.sock", "--unstable-ffi", "server/main.ts"]
|
||||||
|
|||||||
@ -78,7 +78,7 @@ export function generateDockerCompose(): string {
|
|||||||
services:
|
services:
|
||||||
auth-api:
|
auth-api:
|
||||||
image: \${REG}/library/auth-yes-api:latest
|
image: \${REG}/library/auth-yes-api:latest
|
||||||
env_file: stack.env
|
env_file: .env
|
||||||
labels:
|
labels:
|
||||||
- "traefik.enable=true"
|
- "traefik.enable=true"
|
||||||
- "traefik.docker.network=traefik-net"
|
- "traefik.docker.network=traefik-net"
|
||||||
@ -104,7 +104,7 @@ services:
|
|||||||
- POSTGRES_PASSWORD=\${POSTGRES_PASSWORD}
|
- POSTGRES_PASSWORD=\${POSTGRES_PASSWORD}
|
||||||
- POSTGRES_DB=\${POSTGRES_DB}
|
- POSTGRES_DB=\${POSTGRES_DB}
|
||||||
volumes:
|
volumes:
|
||||||
- auth-db-data:/var/lib/postgresql
|
- auth-db-data:/var/lib/postgresql/data
|
||||||
networks:
|
networks:
|
||||||
- default
|
- default
|
||||||
|
|
||||||
@ -180,7 +180,7 @@ export function generateProtobufCompilationCommands(): string[] {
|
|||||||
"generate",
|
"generate",
|
||||||
"server/auth.proto",
|
"server/auth.proto",
|
||||||
"--template",
|
"--template",
|
||||||
'{"version":"v1","plugins":[{"plugin":"buf.build/bufbuild/es:v1.10.0","out":"server/gen","opt":"target=ts,import_extension=.ts"},{"plugin":"buf.build/connectrpc/es:v1.4.0","out":"server/gen","opt":"target=ts,import_extension=.ts"}]}',
|
'{"version":"v1","plugins":[{"plugin":"buf.build/bufbuild/es:v1.10.0","out":"sdk/gen","opt":"target=ts,import_extension=.ts"},{"plugin":"buf.build/connectrpc/es:v1.4.0","out":"sdk/gen","opt":"target=ts,import_extension=.ts"}]}',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -208,14 +208,14 @@ export async function downloadWorkloadProto(): Promise<void> {
|
|||||||
throw new Error(`Failed to download workload.proto: ${res.statusText}`);
|
throw new Error(`Failed to download workload.proto: ${res.statusText}`);
|
||||||
}
|
}
|
||||||
const text = await res.text();
|
const text = await res.text();
|
||||||
await Deno.mkdir("../spire_ffi/proto", { recursive: true });
|
await Deno.mkdir("spire_ffi/proto", { recursive: true });
|
||||||
await Deno.writeTextFile("../spire_ffi/proto/workload.proto", text);
|
await Deno.writeTextFile("spire_ffi/proto/workload.proto", text);
|
||||||
console.log(colors.green("✓ workload.proto downloaded successfully."));
|
console.log(colors.green("✓ workload.proto downloaded successfully."));
|
||||||
}
|
}
|
||||||
|
|
||||||
export function generateBuildCommands(reg: string): string[] {
|
export function generateBuildCommands(reg: string): string[] {
|
||||||
return [
|
return [
|
||||||
`podman build -t ${reg}/library/auth-yes-api:latest -f Dockerfile ..`,
|
`podman build -t ${reg}/library/auth-yes-api:latest -f Dockerfile .`,
|
||||||
`podman push ${reg}/library/auth-yes-api:latest`,
|
`podman push ${reg}/library/auth-yes-api:latest`,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
29
server/db.ts
29
server/db.ts
@ -203,6 +203,35 @@ export async function initDb(): Promise<void> {
|
|||||||
ON CONFLICT (spiffe_id) DO NOTHING
|
ON CONFLICT (spiffe_id) DO NOTHING
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
// Seed initial bootstrap admin invite if no users exist in the database
|
||||||
|
try {
|
||||||
|
const userCount = await sql`SELECT count(*)::int as count FROM users`.then(
|
||||||
|
(res) => res[0]?.count || 0,
|
||||||
|
);
|
||||||
|
if (userCount === 0) {
|
||||||
|
const inviteCount = await sql`
|
||||||
|
SELECT count(*)::int as count FROM invites
|
||||||
|
WHERE role = 'admin' AND expires_at > NOW()
|
||||||
|
`.then((res) => res[0]?.count || 0);
|
||||||
|
|
||||||
|
if (inviteCount === 0) {
|
||||||
|
const bootstrapCode = Deno.env.get("BOOTSTRAP_INVITE_CODE") ||
|
||||||
|
"bootstrap-admin";
|
||||||
|
const expiresAt = new Date(Date.now() + 30 * 24 * 60 * 60 * 1000); // 30 days
|
||||||
|
await sql`
|
||||||
|
INSERT INTO invites (code, app_id, role, max_uses, uses_count, auto_activate, expires_at)
|
||||||
|
VALUES (${bootstrapCode}, NULL, 'admin', 1, 0, TRUE, ${expiresAt})
|
||||||
|
ON CONFLICT (code) DO NOTHING
|
||||||
|
`;
|
||||||
|
console.log(
|
||||||
|
`[Auth DB] Initial bootstrap admin invite code seeded: '${bootstrapCode}'`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.warn("[Auth DB] Bootstrap invite check skipped:", err);
|
||||||
|
}
|
||||||
|
|
||||||
console.log("[Auth DB] Central identity database schema initialized.");
|
console.log("[Auth DB] Central identity database schema initialized.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user