CI/CD: add deploy webhook endpoint for Gitea auto-deploy
This commit is contained in:
@@ -7,8 +7,6 @@ const rateLimit = require("@fastify/rate-limit");
|
||||
const { Pool } = require("pg");
|
||||
const Redis = require("ioredis");
|
||||
|
||||
const app = Fastify({ logger: true });
|
||||
|
||||
// Database pool
|
||||
const pool = new Pool({
|
||||
connectionString: process.env.DATABASE_URL || "postgresql://taskteam:TaskTeam2026!@10.10.10.10:5432/taskteam"
|
||||
@@ -18,50 +16,15 @@ const pool = new Pool({
|
||||
const redis = new Redis(process.env.REDIS_URL || "redis://:Redis2026!@10.10.10.10:6379");
|
||||
|
||||
redis.on("connect", () => {
|
||||
app.log.info("Redis connected");
|
||||
console.log("Redis connected");
|
||||
});
|
||||
redis.on("error", (err) => {
|
||||
app.log.error("Redis error: " + err.message);
|
||||
console.error("Redis error: " + err.message);
|
||||
});
|
||||
|
||||
// Plugins
|
||||
app.register(cors, { origin: true });
|
||||
app.register(rateLimit, {
|
||||
max: 100,
|
||||
timeWindow: "1 minute",
|
||||
keyGenerator: (req) => req.ip,
|
||||
errorResponseBuilder: () => ({ error: "Too many requests", statusCode: 429 })
|
||||
});
|
||||
app.register(jwt, { secret: process.env.JWT_SECRET || "taskteam-jwt-secret-2026" });
|
||||
|
||||
// Decorate with db and redis
|
||||
app.decorate("db", pool);
|
||||
app.decorate("redis", redis);
|
||||
|
||||
// Health check
|
||||
app.get("/health", async () => ({
|
||||
status: "ok",
|
||||
timestamp: new Date().toISOString(),
|
||||
pid: process.pid,
|
||||
redis: redis.status
|
||||
}));
|
||||
|
||||
// Register routes
|
||||
app.register(require("./routes/tasks"), { prefix: "/api/v1" });
|
||||
app.register(require("./routes/groups"), { prefix: "/api/v1" });
|
||||
app.register(require("./routes/auth"), { prefix: "/api/v1" });
|
||||
app.register(require("./routes/connectors"), { prefix: "/api/v1" });
|
||||
app.register(require("./routes/connectors/odoo"), { prefix: "/api/v1" });
|
||||
app.register(require("./routes/connectors/moodle"), { prefix: "/api/v1" });
|
||||
app.register(require("./routes/connectors/pohoda"), { prefix: "/api/v1" });
|
||||
app.register(require("./routes/chat"), { prefix: "/api/v1" });
|
||||
app.register(require("./routes/notifications"), { prefix: "/api/v1" });
|
||||
app.register(require("./routes/goals"), { prefix: "/api/v1" });
|
||||
app.register(require("./routes/system"), { prefix: "/api/v1" });
|
||||
|
||||
// Graceful shutdown
|
||||
const shutdown = async (signal) => {
|
||||
app.log.info(`Received ${signal}, shutting down gracefully...`);
|
||||
console.log(`Received ${signal}, shutting down gracefully...`);
|
||||
await redis.quit();
|
||||
await pool.end();
|
||||
process.exit(0);
|
||||
@@ -71,11 +34,49 @@ process.on("SIGTERM", () => shutdown("SIGTERM"));
|
||||
|
||||
// Start
|
||||
const start = async () => {
|
||||
const app = Fastify({ logger: true });
|
||||
|
||||
// Decorate with db and redis
|
||||
app.decorate("db", pool);
|
||||
app.decorate("redis", redis);
|
||||
|
||||
// Plugins (must await for Fastify 5 compatibility)
|
||||
await app.register(cors, { origin: true });
|
||||
await app.register(rateLimit, {
|
||||
max: 100,
|
||||
timeWindow: "1 minute",
|
||||
keyGenerator: (req) => req.ip,
|
||||
errorResponseBuilder: () => ({ error: "Too many requests", statusCode: 429 })
|
||||
});
|
||||
await app.register(jwt, { secret: process.env.JWT_SECRET || "taskteam-jwt-secret-2026" });
|
||||
|
||||
// Health check (excluded from rate limit)
|
||||
app.get("/health", { config: { rateLimit: false } }, async () => ({
|
||||
status: "ok",
|
||||
timestamp: new Date().toISOString(),
|
||||
pid: process.pid,
|
||||
redis: redis.status
|
||||
}));
|
||||
|
||||
// Register routes
|
||||
await app.register(require("./routes/tasks"), { prefix: "/api/v1" });
|
||||
await app.register(require("./routes/groups"), { prefix: "/api/v1" });
|
||||
await app.register(require("./routes/auth"), { prefix: "/api/v1" });
|
||||
await app.register(require("./routes/connectors"), { prefix: "/api/v1" });
|
||||
await app.register(require("./routes/connectors/odoo"), { prefix: "/api/v1" });
|
||||
await app.register(require("./routes/connectors/moodle"), { prefix: "/api/v1" });
|
||||
await app.register(require("./routes/connectors/pohoda"), { prefix: "/api/v1" });
|
||||
await app.register(require("./routes/chat"), { prefix: "/api/v1" });
|
||||
await app.register(require("./routes/notifications"), { prefix: "/api/v1" });
|
||||
await app.register(require("./routes/goals"), { prefix: "/api/v1" });
|
||||
await app.register(require("./routes/deploy"), { prefix: "/api/v1" });
|
||||
await app.register(require("./routes/system"), { prefix: "/api/v1" });
|
||||
|
||||
try {
|
||||
await app.listen({ port: process.env.PORT || 3000, host: "0.0.0.0" });
|
||||
console.log("Task Team API listening on port " + (process.env.PORT || 3000) + " (pid: " + process.pid + ")");
|
||||
} catch (err) {
|
||||
app.log.error(err);
|
||||
console.error(err);
|
||||
process.exit(1);
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user