feat: scaffold NestJS API skeleton with health check

This commit is contained in:
Claude 2026-07-20 22:26:33 +02:00
parent 407312e9a2
commit ce5cf134ae
10 changed files with 121 additions and 0 deletions

9
.env.example Normal file
View file

@ -0,0 +1,9 @@
PORT=3000
# Supabase (CEO-OS project, Coolify)
DATABASE_URL=postgresql://postgres:CHANGE_ME@supabase-db:5432/postgres
SUPABASE_URL=http://supabasekong-to6mg3yxqit4ac9nl0otnvav.152.53.112.35.sslip.io:8000
SUPABASE_SERVICE_ROLE_KEY=
# Redis (ceo-os-redis, Coolify)
REDIS_URL=redis://default:CHANGE_ME@ceo-os-redis:6379/0

4
.gitignore vendored Normal file
View file

@ -0,0 +1,4 @@
node_modules/
dist/
.env
*.log

15
Dockerfile Normal file
View file

@ -0,0 +1,15 @@
FROM node:22-alpine AS build
WORKDIR /app
COPY package.json ./
RUN npm install
COPY . .
RUN npm run build
FROM node:22-alpine
WORKDIR /app
ENV NODE_ENV=production
COPY --from=build /app/node_modules ./node_modules
COPY --from=build /app/dist ./dist
COPY package.json ./
EXPOSE 3000
CMD ["node", "dist/main"]

View file

@ -1,2 +1,13 @@
# ceo-api
NestJS API pentru CEO-OS. Se conecteaza la Supabase (Postgres/Auth) si Redis, deployat prin Coolify pe proiectul CEO-OS.
## Dezvoltare
```bash
npm install
cp .env.example .env
npm run start:dev
```
`GET /health` returneaza statusul serviciului.

5
nest-cli.json Normal file
View file

@ -0,0 +1,5 @@
{
"$schema": "https://json.schemastore.org/nest-cli",
"collection": "@nestjs/schematics",
"sourceRoot": "src"
}

27
package.json Normal file
View file

@ -0,0 +1,27 @@
{
"name": "ceo-api",
"version": "0.1.0",
"description": "CEO-OS API (NestJS)",
"private": true,
"license": "UNLICENSED",
"scripts": {
"build": "nest build",
"start": "node dist/main",
"start:dev": "nest start --watch",
"lint": "eslint \"src/**/*.ts\"",
"test": "jest"
},
"dependencies": {
"@nestjs/common": "^11.0.0",
"@nestjs/config": "^4.0.0",
"@nestjs/core": "^11.0.0",
"@nestjs/platform-express": "^11.0.0",
"reflect-metadata": "^0.2.2",
"rxjs": "^7.8.1"
},
"devDependencies": {
"@nestjs/cli": "^11.0.0",
"@types/node": "^22.0.0",
"typescript": "^5.6.0"
}
}

9
src/app.module.ts Normal file
View file

@ -0,0 +1,9 @@
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { HealthController } from './health/health.controller';
@Module({
imports: [ConfigModule.forRoot({ isGlobal: true })],
controllers: [HealthController],
})
export class AppModule {}

View file

@ -0,0 +1,9 @@
import { Controller, Get } from '@nestjs/common';
@Controller('health')
export class HealthController {
@Get()
check() {
return { status: 'ok', service: 'ceo-api', timestamp: new Date().toISOString() };
}
}

12
src/main.ts Normal file
View file

@ -0,0 +1,12 @@
import 'reflect-metadata';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.enableCors();
const port = process.env.PORT ?? 3000;
await app.listen(port);
}
bootstrap();

20
tsconfig.json Normal file
View file

@ -0,0 +1,20 @@
{
"compilerOptions": {
"module": "commonjs",
"target": "ES2022",
"moduleResolution": "node",
"declaration": false,
"removeComments": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"sourceMap": true,
"outDir": "./dist",
"baseUrl": "./",
"incremental": true,
"skipLibCheck": true,
"strict": true,
"strictNullChecks": true,
"noImplicitAny": true,
"esModuleInterop": true
}
}