- Remove problematic .env files that override Docker environment variables - Add automatic database initialization script (init-database.js) - Create admin@oliver.agency user automatically with admin123 password - Auto-run database migrations and seeding on first startup - Update setup scripts to display admin credentials - Add comprehensive Docker deployment README - Make deployment truly plug-and-play: git clone → cd docker → ./simple-setup.sh 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
130 lines
No EOL
4.2 KiB
JavaScript
130 lines
No EOL
4.2 KiB
JavaScript
const express = require('express');
|
|
const cors = require('cors');
|
|
const helmet = require('helmet');
|
|
const morgan = require('morgan');
|
|
require('dotenv').config();
|
|
|
|
const { testConnection } = require('./config/database');
|
|
const { generalLimiter } = require('./middleware/rateLimiter');
|
|
const errorHandler = require('./middleware/errorHandler');
|
|
const authRouter = require('./routes/auth');
|
|
const chatRouter = require('./routes/chat');
|
|
const assistantsRouter = require('./routes/assistants');
|
|
const usersRouter = require('./routes/users');
|
|
const analyticsRouter = require('./routes/analytics');
|
|
const vectorStoresRouter = require('./routes/vectorStores');
|
|
const filesRouter = require('./routes/files');
|
|
|
|
const app = express();
|
|
const PORT = process.env.PORT || 3000;
|
|
|
|
// Security middleware
|
|
app.use(helmet());
|
|
|
|
// CORS middleware - permissive for development
|
|
app.use(cors({
|
|
origin: process.env.NODE_ENV === 'development' ? true : ['http://localhost:8080', 'https://ai-sandbox.oliver.solutions'],
|
|
credentials: true
|
|
}));
|
|
|
|
// Request logging
|
|
app.use(morgan('combined'));
|
|
|
|
// Body parsing middleware
|
|
app.use(express.json({ limit: '10mb' }));
|
|
app.use(express.urlencoded({ extended: true, limit: '10mb' }));
|
|
|
|
// Rate limiting
|
|
app.use(generalLimiter);
|
|
|
|
// Health check endpoint
|
|
app.get('/health', (req, res) => {
|
|
res.json({
|
|
status: 'ok',
|
|
timestamp: new Date().toISOString(),
|
|
environment: process.env.NODE_ENV,
|
|
version: '1.0.0',
|
|
service: 'Ideas Generator 2025 Backend'
|
|
});
|
|
});
|
|
|
|
// API routes
|
|
app.use('/api/auth', authRouter);
|
|
app.use('/api/chat', chatRouter);
|
|
app.use('/api/assistants', assistantsRouter);
|
|
app.use('/api/users', usersRouter);
|
|
app.use('/api/analytics', analyticsRouter);
|
|
app.use('/api/vector-stores', vectorStoresRouter);
|
|
app.use('/api/files', filesRouter);
|
|
|
|
// API info endpoint
|
|
app.get('/api', (req, res) => {
|
|
res.json({
|
|
message: 'Ideas Generator 2025 API',
|
|
version: '1.0.0',
|
|
status: 'Active',
|
|
endpoints: {
|
|
health: '/health',
|
|
api: '/api',
|
|
auth: '/api/auth',
|
|
chat: '/api/chat/completions',
|
|
assistants: '/api/assistants',
|
|
conversations: '/api/chat/conversations/:id/messages'
|
|
}
|
|
});
|
|
});
|
|
|
|
// Error handling middleware
|
|
app.use(errorHandler);
|
|
|
|
// 404 handler
|
|
app.use((req, res) => {
|
|
res.status(404).json({
|
|
error: 'Not Found',
|
|
message: `Route ${req.originalUrl} not found`,
|
|
availableRoutes: ['/health', '/api']
|
|
});
|
|
});
|
|
|
|
// Start server
|
|
app.listen(PORT, async () => {
|
|
console.log(`🚀 Ideas Gen 2025 Server running on port ${PORT}`);
|
|
console.log(`🏥 Health check: http://localhost:${PORT}/health`);
|
|
console.log(`🔧 API endpoint: http://localhost:${PORT}/api`);
|
|
console.log(`💬 Chat endpoint: http://localhost:${PORT}/api/chat/completions`);
|
|
console.log(`🤖 Assistants endpoint: http://localhost:${PORT}/api/assistants`);
|
|
console.log(`📊 Environment: ${process.env.NODE_ENV}`);
|
|
console.log(`📁 Database: ${process.env.DATABASE_NAME || 'Not configured'}`);
|
|
|
|
// Test database connection
|
|
await testConnection();
|
|
|
|
// Auto-initialize database in Docker environment
|
|
if (process.env.NODE_ENV === 'production' && process.env.DATABASE_HOST) {
|
|
try {
|
|
console.log('🔧 Auto-initializing database for Docker deployment...');
|
|
const initDatabase = require('./scripts/init-database');
|
|
await initDatabase();
|
|
} catch (error) {
|
|
console.warn('⚠️ Database auto-initialization failed:', error.message);
|
|
}
|
|
}
|
|
|
|
// Log important environment status
|
|
if (!process.env.OPENAI_API_KEY || process.env.OPENAI_API_KEY.includes('your-actual')) {
|
|
console.warn('⚠️ WARNING: OpenAI API key not configured! Update .env file.');
|
|
} else {
|
|
console.log('✅ OpenAI API key configured');
|
|
}
|
|
});
|
|
|
|
// Graceful shutdown
|
|
process.on('SIGINT', () => {
|
|
console.log('\n🛑 Received SIGINT. Graceful shutdown...');
|
|
process.exit(0);
|
|
});
|
|
|
|
process.on('SIGTERM', () => {
|
|
console.log('\n🛑 Received SIGTERM. Graceful shutdown...');
|
|
process.exit(0);
|
|
}); |