Features:
- Health endpoint now returns git_commit SHA and version
- Auto-detects git commit during Docker build
- Falls back to 'unknown' if git info unavailable
- Allows AI agents to verify deployed version
Changes:
1. server.js: Add git_commit and version to /health response
2. Dockerfile: Add git installation and commit detection
3. Dockerfile: Accept GIT_COMMIT and APP_VERSION build args
4. docker-compose.yml: Pass build args and env vars for versioning
5. README.md: Document version tracking in health endpoint
Example response:
{
"status": "healthy",
"postgres": "connected",
"redis": "connected",
"timestamp": "2026-02-14T10:30:00.000Z",
"git_commit": "eb6b6e0a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q",
"version": "1.0.0"
}
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
80 lines
2.0 KiB
JavaScript
80 lines
2.0 KiB
JavaScript
const express = require('express');
|
|
const { Pool } = require('pg');
|
|
const redis = require('redis');
|
|
const path = require('path');
|
|
|
|
const app = express();
|
|
const PORT = process.env.PORT || 3000;
|
|
|
|
// PostgreSQL connection
|
|
const pool = new Pool({
|
|
host: process.env.POSTGRES_HOST || 'postgres',
|
|
port: process.env.POSTGRES_PORT || 5432,
|
|
user: process.env.POSTGRES_USER || 'postgres',
|
|
password: process.env.POSTGRES_PASSWORD || 'postgres',
|
|
database: process.env.POSTGRES_DB || 'template_db'
|
|
});
|
|
|
|
// Redis connection
|
|
const redisClient = redis.createClient({
|
|
socket: {
|
|
host: process.env.REDIS_HOST || 'redis',
|
|
port: process.env.REDIS_PORT || 6379
|
|
}
|
|
});
|
|
|
|
// Connect to Redis
|
|
redisClient.connect().catch(console.error);
|
|
|
|
// Test database connections
|
|
pool.query('SELECT NOW()', (err, res) => {
|
|
if (err) {
|
|
console.error('PostgreSQL connection error:', err);
|
|
} else {
|
|
console.log('PostgreSQL connected successfully at:', res.rows[0].now);
|
|
}
|
|
});
|
|
|
|
redisClient.on('connect', () => {
|
|
console.log('Redis connected successfully');
|
|
});
|
|
|
|
redisClient.on('error', (err) => {
|
|
console.error('Redis connection error:', err);
|
|
});
|
|
|
|
// Serve static files
|
|
app.use(express.static('public'));
|
|
|
|
// Health check endpoint
|
|
app.get('/health', async (req, res) => {
|
|
try {
|
|
const pgResult = await pool.query('SELECT NOW()');
|
|
await redisClient.ping();
|
|
res.json({
|
|
status: 'healthy',
|
|
postgres: 'connected',
|
|
redis: 'connected',
|
|
timestamp: pgResult.rows[0].now,
|
|
git_commit: process.env.GIT_COMMIT || 'unknown',
|
|
version: process.env.APP_VERSION || '1.0.0'
|
|
});
|
|
} catch (error) {
|
|
res.status(500).json({
|
|
status: 'unhealthy',
|
|
error: error.message,
|
|
git_commit: process.env.GIT_COMMIT || 'unknown',
|
|
version: process.env.APP_VERSION || '1.0.0'
|
|
});
|
|
}
|
|
});
|
|
|
|
// Main route
|
|
app.get('/', (req, res) => {
|
|
res.sendFile(path.join(__dirname, 'public', 'index.html'));
|
|
});
|
|
|
|
app.listen(PORT, '0.0.0.0', () => {
|
|
console.log(`Server running on port ${PORT}`);
|
|
});
|