Instalação Completa do AIConi 2025
Instalação Completa do AIConi 2025
/bin/bash
# Banner de abertura
show_banner() {
clear
echo -e "\${PURPLE}"
cat << 'EOF'
██╗ █████╗ ██████╗ ██████╗ ███╗ ██╗██╗ ██████╗ ██████╗ ██████╗ ███████╗
██║██╔══██╗██╔════╝██╔═══██╗████╗ ██║██║ ╚════██╗██╔═████╗╚════██╗██╔════╝
██║███████║██║ ██║ ██║██╔██╗ ██║██║ █████╔╝██║██╔██║ █████╔╝███████╗
██║██╔══██║██║ ██║ ██║██║╚██╗██║██║ ██╔═══╝ ████╔╝██║██╔═══╝ ╚════██║
██║██║ ██║╚██████╗╚██████╔╝██║ ╚████║██║ ███████╗╚██████╔╝███████╗███████║
╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═══╝╚═╝ ╚══════╝ ╚═════╝ ╚══════╝╚══════╝
# Verificar se é root
check_root() {
if [[ \$EUID -eq 0 ]]; then
log_error "❌ Não execute como root! Use um usuário normal com sudo."
exit 1
fi
log_success "✅ Verificação de usuário aprovada"
}
# Detectar sistema operacional
detect_system() {
log_info "🔍 Detectando sistema operacional..."
# Verificar se é Ubuntu/Debian
if [[ ! "\$OS" =~ Ubuntu|Debian ]]; then
log_warning "⚠️ Sistema não testado. Continuando mesmo assim..."
fi
}
# Verificar RAM
TOTAL_RAM=\$(free -m | awk 'NR==2{printf "%.0f", \$2}')
if [ \$TOTAL_RAM -lt 2048 ]; then
log_warning "⚠️ RAM baixa: \${TOTAL_RAM}MB (recomendado: 2GB+)"
else
log_success "✅ RAM suficiente: \${TOTAL_RAM}MB"
fi
# Atualizar sistema
update_system() {
log_info "🔄 Atualizando sistema..."
# Instalar [Link] 18
install_nodejs() {
log_info "🟢 Instalando [Link] 18..."
# Instalar [Link] 18
curl -fsSL [Link] | sudo -E bash -
sudo apt-get install -y nodejs
# Verificar instalação
NODE_VERSION=\$(node --version)
NPM_VERSION=\$(npm --version)
# Instalar MySQL
install_mysql() {
log_info "🐬 Instalando MySQL Server..."
# Configurar MySQL
sudo mysql -u root -piaconi2025 -e "ALTER USER 'root'@'localhost' IDENTIFIED
WITH mysql_native_password BY 'iaconi2025';"
sudo mysql -u root -piaconi2025 -e "CREATE DATABASE IF NOT EXISTS iaconi_2025
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
sudo mysql -u root -piaconi2025 -e "CREATE USER IF NOT EXISTS
'iaconi'@'localhost' IDENTIFIED BY 'iaconi2025';"
sudo mysql -u root -piaconi2025 -e "GRANT ALL PRIVILEGES ON iaconi_2025.* TO
'iaconi'@'localhost';"
sudo mysql -u root -piaconi2025 -e "FLUSH PRIVILEGES;"
# Instalar Redis
install_redis() {
log_info "🔴 Instalando Redis..."
# Configurar Redis
sudo sed -i 's/supervised no/supervised systemd/' /etc/redis/[Link]
# Instalar Nginx
install_nginx() {
log_info "🌐 Instalando Nginx..."
# Configurar firewall
sudo ufw allow 'Nginx Full'
sudo ufw allow 'OpenSSH'
# Configurar firewall
setup_firewall() {
log_info "🔥 Configurando firewall..."
# Configurar UFW
sudo ufw --force reset
sudo ufw default deny incoming
sudo ufw default allow outgoing
# Habilitar firewall
sudo ufw --force enable
# Configurar Fail2Ban
setup_fail2ban() {
log_info " Configurando Fail2Ban..."
# Diretórios principais
mkdir -p {backend,frontend,database,config,uploads,logs,scripts,docs}
# Subdiretórios backend
mkdir -p backend/{routes,models,middleware,services,controllers,utils}
# Subdiretórios frontend
mkdir -p frontend/{src,public,build}
mkdir -p frontend/src/{components,pages,hooks,utils,assets,styles,contexts}
mkdir -p frontend/src/components/{common,chat,admin,auth,dashboard}
mkdir -p frontend/src/pages/{auth,dashboard,chat,admin,settings}
# Diretórios de logs
mkdir -p logs/{app,nginx,mysql,system}
# Definir permissões
chmod 755 uploads/ -R
chmod 755 logs/ -R
echo
log_info "🧪 Testando conexão com AWS..."
# Testar conexão
if aws bedrock list-foundation-models --region \$AWS_REGION >/dev/null 2>&1;
then
log_success "✅ Conexão AWS Bedrock estabelecida"
else
log_warning "⚠️ Não foi possível conectar ao Bedrock. Continuando mesmo
assim..."
fi
# Database Configuration
DB_HOST=localhost
DB_USER=iaconi
DB_PASSWORD=iaconi2025
DB_NAME=iaconi_2025
# Redis Configuration
REDIS_HOST=localhost
REDIS_PORT=6379
# Security
JWT_SECRET=\$(openssl rand -hex 32)
ADMIN_PASSWORD=\$(openssl rand -base64 12)
# Application Settings
APP_NAME="AIConi 2025 Ultra"
APP_URL=[Link] -s [Link]):3000
UPLOAD_MAX_SIZE=50mb
MAX_TOKENS_PER_REQUEST=8192
# Backup Configuration
BACKUP_ENABLED=true
BACKUP_INTERVAL=24h
EOF
if [ -z "\$ADMIN_PASS" ]; then
ADMIN_PASS=\$(grep ADMIN_PASSWORD .env | cut -d'=' -f2)
log_info "Usando senha gerada automaticamente: \$ADMIN_PASS"
fi
# Função principal
main() {
show_banner
# Verificações iniciais
check_root
detect_system
check_system_resources
# Instalação de dependências
update_system
install_base_dependencies
install_nodejs
install_mysql
install_redis
install_nginx
install_certbot
install_docker
# Configuração de segurança
setup_firewall
setup_fail2ban
# Configuração do projeto
create_directory_structure
get_aws_credentials
configure_admin
echo
log_success "🎉 Instalação base concluída!"
log_info "📝 Execute './[Link]' para continuar com a instalação do sistema"
echo
## 🔐 Credenciais
- **Database User:** iaconi
- **Database Password:** iaconi2025
- **Database Name:** iaconi_2025
- **Admin Email:** \$ADMIN_EMAIL
- **Admin Password:** \$ADMIN_PASS
## 🌐 URLs de Acesso
- **Aplicação:** [Link] -s [Link]):3000
- **Painel Admin:** [Link] -s [Link]):3000/admin
## 📊 Próximos Passos
1. Execute: \`./[Link]\`
2. Aguarde a conclusão
3. Acesse a aplicação
4. Faça login com as credenciais admin
## 📞 Suporte
- Data da instalação: \$(date)
- Sistema: \$OS \$VERSION
- Usuário: \$(whoami)
EOF
# Executar instalação
main "\$@"
----------------------------
ACIMA DESTA LINHA O [Link]
ABAIXO DESSA LINHA O [Link]
------------------------
#!/bin/bash
set -e
# Cores
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m'
# Banner
show_system_banner() {
clear
echo -e "\$
{CYAN}═════════════════════════════════════════════════════════════════════════════
══\${NC}"
echo -e "\${YELLOW} 🚀 INSTALAÇÃO DO SISTEMA COMPLETO 🚀
\${NC}"
echo -e "\$
{CYAN}═════════════════════════════════════════════════════════════════════════════
══\${NC}"
echo
}
# [Link] otimizado
cat > backend/[Link] << 'EOF'
{
"name": "iaconi-2025-backend",
"version": "1.0.0",
"description": "AIConi 2025 Ultra - Complete AI Platform Backend",
"main": "[Link]",
"scripts": {
"start": "node [Link]",
"dev": "nodemon [Link]",
"test": "jest --coverage",
"build": "npm install --production",
"migrate": "node scripts/[Link]",
"seed": "node scripts/[Link]"
},
"dependencies": {
"express": "^4.18.2",
"[Link]": "^4.7.2",
"mysql2": "^3.6.0",
"redis": "^4.6.7",
"aws-sdk": "^2.1445.0",
"bcryptjs": "^2.4.3",
"jsonwebtoken": "^9.0.2",
"cors": "^2.8.5",
"helmet": "^7.0.0",
"dotenv": "^16.3.1",
"multer": "^1.4.5-lts.1",
"sharp": "^0.32.5",
"winston": "^3.10.0",
"rate-limiter-flexible": "^2.4.2",
"express-validator": "^7.0.1",
"compression": "^1.7.4",
"express-rate-limit": "^6.10.0",
"cookie-parser": "^1.4.6",
"express-session": "^1.17.3",
"connect-redis": "^7.1.0",
"nodemailer": "^6.9.4",
"moment": "^2.29.4",
"uuid": "^9.0.0",
"joi": "^17.9.2",
"archiver": "^5.3.1",
"cron": "^2.4.4"
},
"devDependencies": {
"nodemon": "^3.0.1",
"jest": "^29.6.2",
"supertest": "^6.3.3"
},
"engines": {
"node": ">=18.0.0",
"npm": ">=9.0.0"
}
}
EOF
// Initialize Express
const app = express();
const server = [Link](app);
// Redis client
const redisClient = [Link]({
host: [Link].REDIS_HOST || 'localhost',
port: [Link].REDIS_PORT || 6379
});
// Initialize services
const bedrockService = new BedrockService();
const databaseService = new DatabaseService(dbPool);
const authService = new AuthService(dbPool);
const imageService = new ImageService();
const backupService = new BackupService(dbPool);
// Rate limiting
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 100, // limit each IP to 100 requests per windowMs
message: 'Too many requests from this IP, please try again later.'
});
// Middleware
[Link](helmet({
contentSecurityPolicy: {
directives: {
defaultSrc: ["'self'"],
styleSrc: ["'self'", "'unsafe-inline'",
"[Link]
fontSrc: ["'self'", "[Link]
imgSrc: ["'self'", "data:", "https:"],
scriptSrc: ["'self'"],
connectSrc: ["'self'", "ws:", "wss:"]
}
}
}));
[Link](compression());
[Link](cors({
origin: [Link].NODE_ENV === 'production' ? [Link].APP_URL : '*',
credentials: true
}));
[Link](limiter);
[Link]([Link]({ limit: [Link].UPLOAD_MAX_SIZE || '50mb' }));
[Link]([Link]({ extended: true, limit: [Link].UPLOAD_MAX_SIZE ||
'50mb' }));
// Session configuration
const sessionMiddleware = session({
store: new RedisStore({ client: redisClient }),
secret: [Link].JWT_SECRET,
resave: false,
saveUninitialized: false,
cookie: {
secure: [Link].NODE_ENV === 'production',
httpOnly: true,
maxAge: 24 * 60 * 60 * 1000 // 24 hours
}
});
[Link](sessionMiddleware);
// Static files
[Link]('/uploads', [Link]([Link](__dirname, '../uploads')));
[Link]([Link]([Link](__dirname, '../frontend/build')));
// [Link] configuration
const io = socketIo(server, {
cors: {
origin: "*",
methods: ["GET", "POST"]
}
});
// Generate AI response
const response = await [Link](message, model);
// Send response
[Link]('receive_message', {
message: response,
model: model,
timestamp: new Date().toISOString(),
tokens: [Link] // Approximation
});
} catch (error) {
[Link]('Error processing message:', error);
[Link]('error', {
message: 'Erro ao processar mensagem. Tente novamente.',
code: 'MESSAGE_ERROR'
});
}
});
// Generate image
const imageResult = await [Link](prompt,
options);
// Save to database
await [Link]([Link], prompt,
[Link], options);
[Link]('image_generated', {
imageUrl: [Link],
prompt: prompt,
timestamp: new Date().toISOString(),
metadata: [Link]
});
} catch (error) {
[Link]('Error generating image:', error);
[Link]('error', {
message: 'Erro ao gerar imagem. Tente novamente.',
code: 'IMAGE_ERROR'
});
}
});
[Link]('code_executed', {
result: result,
timestamp: new Date().toISOString()
});
} else {
[Link]('error', {
message: 'Linguagem não suportada para execução.',
code: 'UNSUPPORTED_LANGUAGE'
});
}
} catch (error) {
[Link]('Error executing code:', error);
[Link]('error', {
message: 'Erro ao executar código.',
code: 'EXECUTION_ERROR'
});
}
});
[Link]('disconnect', () => {
[Link](`User disconnected: \${[Link]}`);
});
});
// API Routes
[Link]('/api/auth', require('./routes/auth'));
[Link]('/api/chat', require('./routes/chat'));
[Link]('/api/images', require('./routes/images'));
[Link]('/api/admin', require('./routes/admin'));
[Link]('/api/users', require('./routes/users'));
[Link]('/api/templates', require('./routes/templates'));
[Link]('/api/settings', require('./routes/settings'));
[Link]('/api/analytics', require('./routes/analytics'));
[Link]({
status: 'healthy',
timestamp: new Date().toISOString(),
services: {
database: 'connected',
redis: redisInfo === 'PONG' ? 'connected' : 'disconnected',
bedrock: [Link] > 0 ? 'connected' : 'limited',
uptime: [Link]()
},
version: '1.0.0'
});
} catch (error) {
[Link]('Health check failed:', error);
[Link](500).json({
status: 'unhealthy',
error: [Link],
timestamp: new Date().toISOString()
});
}
});
if ([Link]) {
return next(error);
}
[Link](500).json({
error: 'Internal server error',
message: [Link].NODE_ENV === 'development' ? [Link] :
'Something went wrong'
});
});
[Link]();
[Link]('Backup cron job scheduled');
}
// Graceful shutdown
[Link]('SIGTERM', () => {
[Link]('SIGTERM signal received, shutting down gracefully');
[Link](() => {
[Link]('HTTP server closed');
[Link](() => {
[Link]('Database pool closed');
[Link](0);
});
});
});
// Start server
const PORT = [Link] || 3000;
const HOST = [Link] || '[Link]';
class BedrockService {
constructor() {
[Link] = new [Link]({
region: [Link].AWS_REGION || 'us-east-1'
});
[Link] = [Link]({
level: 'info',
format: [Link](),
transports: [
new [Link]({ filename: '../logs/[Link]' })
]
});
const {
temperature = 0.7,
topP = 0.9,
systemPrompt = null,
conversationHistory = [],
maxTokens = [Link]
} = options;
const params = {
modelId: [Link],
contentType: 'application/json',
accept: 'application/json',
body: [Link]({
anthropic_version: 'bedrock-2023-05-31',
max_tokens: [Link](maxTokens, [Link]),
messages: messages,
temperature: temperature,
top_p: topP,
...(systemPrompt && { system: systemPrompt })
})
};
return {
text: aiResponse,
model: modelKey,
tokensUsed: [Link]?.output_tokens || 0,
responseTime: responseTime
};
}
} catch (error) {
[Link]('Bedrock generateResponse error:', error);
let params;
return {
url: imageUrl,
model: model,
prompt: prompt,
metadata: {
size: size,
style: style,
responseTime: responseTime,
seed: seed || 'auto'
}
};
}
} catch (error) {
[Link]('Image generation error:', error);
throw new Error('Erro ao gerar imagem');
}
}
if (styleEnhancements[style]) {
enhancedPrompt += styleEnhancements[style];
}
return {
modelId: '[Link]-image-generator-v1',
contentType: 'application/json',
accept: 'application/json',
body: [Link]({
taskType: 'TEXT_IMAGE',
textToImageParams: {
text: enhancedPrompt,
negativeText: negativePrompt
},
imageGenerationConfig: {
numberOfImages: 1,
height: height,
width: width,
cfgScale: quality === 'high' ? 10.0 : 8.0,
seed: seed || [Link]([Link]() * 1000000)
}
})
};
}
// Create thumbnail
await sharp(filepath)
.resize(300, 300, { fit: 'cover' })
.png({ quality: 80 })
.toFile([Link]('.png', '_thumb.png'));
return `/uploads/images/\${filename}`;
} catch (error) {
[Link]('Error saving image:', error);
throw new Error('Erro ao salvar imagem');
}
}
} catch (error) {
[Link]('Error listing models:', error);
// Return configured models even if API fails
return [Link]([Link]).map(key => ({
key: key,
name: [Link](/-/g, ' ').replace(/\b\w/g, l =>
[Link]()),
description: [Link][key].description,
type: [Link][key].type,
maxTokens: [Link][key].maxTokens,
available: true // Assume available
}));
}
}
[Link] = BedrockService;
EOF
# Função principal
main() {
show_system_banner
create_backend_system
create_bedrock_service
# create_all_services
# create_frontend_system
# create_database_schema
# install_dependencies
# configure_nginx
# setup_ssl
# configure_pm2
# run_tests
# final_setup
# Executar
main "\$@"
ACIMA DESTA LINHA O [Link]
ABAIXO DESSA LINHA O [Link]
------------------------
#!/bin/bash
set -e
# Cores
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m'
# Banner final
show_final_banner() {
clear
echo -e "\$
{CYAN}═════════════════════════════════════════════════════════════════════════════
══\${NC}"
echo -e "\${YELLOW} 🎨 FRONTEND & CONFIGURAÇÕES FINAIS 🎨
\${NC}"
echo -e "\$
{CYAN}═════════════════════════════════════════════════════════════════════════════
══\${NC}"
echo
}
# Database Service
cat > backend/services/[Link] << 'EOF'
// AIConi 2025 Ultra - Database Service
const mysql = require('mysql2/promise');
const winston = require('winston');
class DatabaseService {
constructor(pool) {
[Link] = pool;
[Link] = [Link]({
level: 'info',
format: [Link](),
transports: [
new [Link]({ filename: '../logs/[Link]' })
]
});
}
// Get user by ID
async getUserById(userId) {
try {
const [rows] = await [Link](
'SELECT id, email, name, plan, tokens_used, tokens_limit,
created_at, is_active FROM users WHERE id = ?',
[userId]
);
return rows[0];
} catch (error) {
[Link]('Error getting user:', error);
throw error;
}
}
// Get templates
async getTemplates(category = null) {
try {
let query = 'SELECT * FROM templates WHERE is_active = 1';
let params = [];
if (category) {
query += ' AND category = ?';
[Link](category);
}
// Save template
async saveTemplate(name, description, promptTemplate, category) {
try {
const [result] = await [Link](
`INSERT INTO templates (name, description, prompt_template,
category, created_at)
VALUES (?, ?, ?, ?, NOW())`,
[name, description, promptTemplate, category]
);
return [Link];
} catch (error) {
[Link]('Error saving template:', error);
throw error;
}
}
}
[Link] = DatabaseService;
EOF
# Auth Service
cat > backend/services/[Link] << 'EOF'
// AIConi 2025 Ultra - Authentication Service
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const winston = require('winston');
class AuthService {
constructor(pool) {
[Link] = pool;
[Link] = [Link]({
level: 'info',
format: [Link](),
transports: [
new [Link]({ filename: '../logs/[Link]' })
]
});
}
if (!token) {
return [Link](401).json({ error: 'Token de acesso requerido' });
}
try {
const user = [Link](token);
[Link] = user;
next();
} catch (error) {
return [Link](403).json({ error: 'Token inválido' });
}
}
if ([Link] > 0) {
throw new Error('Usuário já existe');
}
// Hash password
const hashedPassword = await [Link](password, 12);
// Create user
const [result] = await [Link](
`INSERT INTO users (email, password_hash, name, plan, created_at)
VALUES (?, ?, ?, 'free', NOW())`,
[email, hashedPassword, name]
);
return {
user: user[0],
token: [Link](user[0])
};
} catch (error) {
[Link]('Registration error:', error);
throw error;
}
}
// Login user
async login(email, password) {
try {
// Get user
const [users] = await [Link](
'SELECT id, email, name, plan, password_hash, is_active FROM users
WHERE email = ?',
[email]
);
if ([Link] === 0) {
throw new Error('Credenciais inválidas');
}
if (!user.is_active) {
throw new Error('Conta desativada');
}
// Verify password
const validPassword = await [Link](password,
user.password_hash);
if (!validPassword) {
throw new Error('Credenciais inválidas');
}
return {
user: user,
token: [Link](user)
};
} catch (error) {
[Link]('Login error:', error);
throw error;
}
}
// Change password
async changePassword(userId, currentPassword, newPassword) {
try {
// Get current password hash
const [users] = await [Link](
'SELECT password_hash FROM users WHERE id = ?',
[userId]
);
if ([Link] === 0) {
throw new Error('Usuário não encontrado');
}
// Update password
await [Link](
'UPDATE users SET password_hash = ? WHERE id = ?',
[hashedNewPassword, userId]
);
return true;
} catch (error) {
[Link]('Change password error:', error);
throw error;
}
}
}
[Link] = AuthService;
EOF
# Image Service
cat > backend/services/[Link] << 'EOF'
// AIConi 2025 Ultra - Image Service
const sharp = require('sharp');
const fs = require('fs');
const path = require('path');
const winston = require('winston');
class ImageService {
constructor() {
[Link] = [Link]({
level: 'info',
format: [Link](),
transports: [
new [Link]({ filename: '../logs/[Link]' })
]
});
ensureDirectories() {
const dirs = [[Link], [Link]];
[Link](dir => {
if () {
[Link](dir, { recursive: true });
}
});
}
[Link](filepath, htmlContent);
return `/uploads/previews/\${filename}`;
} catch (error) {
[Link]('Error creating code preview:', error);
throw new Error('Erro ao criar preview do código');
}
}
// Optimize image
async optimizeImage(inputPath, outputPath, options = {}) {
try {
const {
width = null,
height = null,
quality = 80,
format = 'png'
} = options;
if (width || height) {
sharp_instance = sharp_instance.resize(width, height, {
fit: 'inside',
withoutEnlargement: true
});
}
await sharp_instance.toFile(outputPath);
return outputPath;
} catch (error) {
[Link]('Error optimizing image:', error);
throw new Error('Erro ao otimizar imagem');
}
}
// Create thumbnail
async createThumbnail(imagePath, size = 300) {
try {
const ext = [Link](imagePath);
const basename = [Link](imagePath, ext);
const thumbnailPath = [Link](
[Link](imagePath),
`\${basename}_thumb\${ext}`
);
await sharp(imagePath)
.resize(size, size, { fit: 'cover' })
.png({ quality: 80 })
.toFile(thumbnailPath);
return thumbnailPath;
} catch (error) {
[Link]('Error creating thumbnail:', error);
throw new Error('Erro ao criar thumbnail');
}
}
return {
width: [Link],
height: [Link],
format: [Link],
size: [Link],
created: [Link]
};
} catch (error) {
[Link]('Error getting image metadata:', error);
throw new Error('Erro ao obter metadados da imagem');
}
}
}
[Link] = ImageService;
EOF
# Backup Service
cat > backend/services/[Link] << 'EOF'
// AIConi 2025 Ultra - Backup Service
const fs = require('fs');
const path = require('path');
const archiver = require('archiver');
const { exec } = require('child_process');
const winston = require('winston');
class BackupService {
constructor(pool) {
[Link] = pool;
[Link] = [Link]({
level: 'info',
format: [Link](),
transports: [
new [Link]({ filename: '../logs/[Link]' })
]
});
ensureBackupDirectory() {
if () {
[Link]([Link], { recursive: true });
}
}
// Backup database
await [Link](backupDir);
// Backup uploads
await [Link](backupDir);
// Backup configuration
await [Link](backupDir);
// Create archive
const archivePath = await [Link](backupDir, backupName);
return archivePath;
} catch (error) {
[Link]('Backup error:', error);
throw new Error('Erro ao criar backup');
}
}
// Backup database
async backupDatabase(backupDir) {
return new Promise((resolve, reject) => {
const dbBackupPath = [Link](backupDir, '[Link]');
const command = `mysqldump -u \${[Link].DB_USER} -p\$
{[Link].DB_PASSWORD} \${[Link].DB_NAME} > \${dbBackupPath}`;
if ([Link](uploadsSource)) {
await [Link](uploadsSource, uploadsBackup);
[Link]('Uploads backup completed');
}
}
[Link](file => {
const sourcePath = [Link](__dirname, file);
if ([Link](sourcePath)) {
const filename = [Link](sourcePath);
const destPath = [Link](configDir, filename);
[Link](sourcePath, destPath);
}
});
[Link]('close', () => {
[Link]('Archive created:', {
path: archivePath,
size: [Link]()
});
resolve(archivePath);
});
[Link](output);
[Link](sourceDir, false);
[Link]();
});
}
if ([Link]()) {
await [Link](srcPath, destPath);
} else {
[Link](srcPath, destPath);
}
}
}
// List backups
listBackups() {
try {
const files = [Link]([Link]);
return files
.filter(file => [Link]('.zip'))
.map(file => {
const filepath = [Link]([Link], file);
const stats = [Link](filepath);
return {
name: file,
size: [Link],
created: [Link],
path: filepath
};
})
.sort((a, b) => [Link] - [Link]);
} catch (error) {
[Link]('Error listing backups:', error);
return [];
}
}
[Link](backup => {
[Link]([Link]);
[Link]('Old backup deleted:', { name: [Link] });
});
return [Link];
} catch (error) {
[Link]('Error cleaning up backups:', error);
return 0;
}
}
}
[Link] = BackupService;
EOF
mkdir -p backend/routes
# Auth Routes
cat > backend/routes/[Link] << 'EOF'
// AIConi 2025 Ultra - Auth Routes
const express = require('express');
const { body, validationResult } = require('express-validator');
const AuthService = require('../services/auth');
const DatabaseService = require('../services/database');
const mysql = require('mysql2/promise');
// Register
[Link]('/register', [
body('email').isEmail().normalizeEmail(),
body('password').isLength({ min: 6 }),
body('name').notEmpty().trim()
], async (req, res) => {
try {
const errors = validationResult(req);
if (![Link]()) {
return [Link](400).json({ errors: [Link]() });
}
[Link](201).json({
success: true,
message: 'Usuário registrado com sucesso',
...result
});
} catch (error) {
[Link](400).json({
success: false,
error: [Link]
});
}
});
// Login
[Link]('/login', [
body('email').isEmail().normalizeEmail(),
body('password').notEmpty()
], async (req, res) => {
try {
const errors = validationResult(req);
if (![Link]()) {
return [Link](400).json({ errors: [Link]() });
}
// Set session
[Link] = [Link];
[Link] = [Link];
[Link]({
success: true,
message: 'Login realizado com sucesso',
...result
});
} catch (error) {
[Link](401).json({
success: false,
error: [Link]
});
}
});
// Logout
[Link]('/logout', (req, res) => {
[Link]((err) => {
if (err) {
return [Link](500).json({
success: false,
error: 'Erro ao fazer logout'
});
}
[Link]({
success: true,
message: 'Logout realizado com sucesso'
});
});
});
[Link]({
success: true,
user: user
});
} catch (error) {
[Link](500).json({
success: false,
error: [Link]
});
}
});
// Change password
[Link]('/change-password', [
[Link](authService),
body('currentPassword').notEmpty(),
body('newPassword').isLength({ min: 6 })
], async (req, res) => {
try {
const errors = validationResult(req);
if (![Link]()) {
return [Link](400).json({ errors: [Link]() });
}
const { currentPassword, newPassword } = [Link];
await [Link]([Link], currentPassword,
newPassword);
[Link]({
success: true,
message: 'Senha alterada com sucesso'
});
} catch (error) {
[Link](400).json({
success: false,
error: [Link]
});
}
});
[Link] = router;
EOF
# Chat Routes
cat > backend/routes/[Link] << 'EOF'
// AIConi 2025 Ultra - Chat Routes
const express = require('express');
const { body, validationResult } = require('express-validator');
const AuthService = require('../services/auth');
const DatabaseService = require('../services/database');
const mysql = require('mysql2/promise');
// Get conversations
[Link]('/conversations', [Link](authService), async
(req, res) => {
try {
const conversations = await
[Link]([Link]);
[Link]({
success: true,
conversations: conversations
});
} catch (error) {
[Link](500).json({
success: false,
error: [Link]
});
}
});
// Create conversation
[Link]('/conversations', [
[Link](authService),
body('title').optional().trim()
], async (req, res) => {
try {
const { title } = [Link];
const conversationId = await
[Link]([Link], title);
[Link](201).json({
success: true,
conversationId: conversationId,
message: 'Conversa criada com sucesso'
});
} catch (error) {
[Link](500).json({
success: false,
error: [Link]
});
}
});
[Link]({
success: true,
messages: messages
});
} catch (error) {
[Link](500).json({
success: false,
error: [Link]
});
}
});
// Export conversation
[Link]('/conversations/:id/export',
[Link](authService), async (req, res) => {
try {
const conversationId = [Link];
const messages = await
[Link](conversationId);
// Format for export
const exportData = {
conversationId: conversationId,
exportedAt: new Date().toISOString(),
messageCount: [Link],
messages: [Link](msg => ({
timestamp: msg.created_at,
user: msg.user_message,
assistant: msg.ai_response,
model: msg.model_used
}))
};
} catch (error) {
[Link](500).json({
success: false,
error: [Link]
});
}
});
[Link] = router;
EOF
# Images Routes
cat > backend/routes/[Link] << 'EOF'
// AIConi 2025 Ultra - Images Routes
const express = require('express');
const multer = require('multer');
const path = require('path');
const AuthService = require('../services/auth');
const DatabaseService = require('../services/database');
const ImageService = require('../services/image');
const mysql = require('mysql2/promise');
[Link]({
success: true,
images: images
});
} catch (error) {
[Link](500).json({
success: false,
error: [Link]
});
}
});
// Upload image
[Link]('/upload', [
[Link](authService),
[Link]('image')
], async (req, res) => {
try {
if (![Link]) {
return [Link](400).json({
success: false,
error: 'Nenhuma imagem enviada'
});
}
// Create thumbnail
await [Link]([Link]);
// Get metadata
const metadata = await [Link]([Link]);
[Link]({
success: true,
imageUrl: imageUrl,
metadata: metadata,
message: 'Imagem enviada com sucesso'
});
} catch (error) {
[Link](500).json({
success: false,
error: [Link]
});
}
});
[Link]({
success: true,
images: images,
pagination: {
page: page,
limit: limit,
total: total,
totalPages: totalPages,
hasNext: page < totalPages,
hasPrev: page > 1
}
});
} catch (error) {
[Link](500).json({
success: false,
error: [Link]
});
}
});
// Delete image
[Link]('/:id', [Link](authService), async (req,
res) => {
try {
const imageId = [Link];
if ([Link] === 0) {
return [Link](404).json({
success: false,
error: 'Imagem não encontrada'
});
}
[Link]({
success: true,
message: 'Imagem deletada com sucesso'
});
} catch (error) {
[Link](500).json({
success: false,
error: [Link]
});
}
});
[Link] = router;
EOF
# Templates Routes
cat > backend/routes/[Link] << 'EOF'
// AIConi 2025 Ultra - Templates Routes
const express = require('express');
const { body, validationResult } = require('express-validator');
const AuthService = require('../services/auth');
const DatabaseService = require('../services/database');
const mysql = require('mysql2/promise');
[Link]({
success: true,
templates: templates
});
} catch (error) {
[Link](500).json({
success: false,
error: [Link]
});
}
});
// Get template by ID
[Link]('/:id', async (req, res) => {
try {
const [templates] = await [Link](
'SELECT * FROM templates WHERE id = ? AND is_active = 1',
[[Link]]
);
if ([Link] === 0) {
return [Link](404).json({
success: false,
error: 'Template não encontrado'
});
}
[Link]({
success: true,
template: templates[0]
});
} catch (error) {
[Link](500).json({
success: false,
error: [Link]
});
}
});
[Link](201).json({
success: true,
templateId: templateId,
message: 'Template criado com sucesso'
});
} catch (error) {
[Link](500).json({
success: false,
error: [Link]
});
}
});
[Link]({
success: true,
categories: categories
});
} catch (error) {
[Link](500).json({
success: false,
error: [Link]
});
}
});
[Link] = router;
EOF
USE iaconi_2025;
-- Usage tracking
tokens_used INT DEFAULT 0,
tokens_limit INT DEFAULT 10000,
images_generated INT DEFAULT 0,
images_limit INT DEFAULT 50,
api_calls INT DEFAULT 0,
api_limit INT DEFAULT 1000,
-- Preferences
preferred_model VARCHAR(100) DEFAULT 'claude-3-5-haiku',
theme VARCHAR(20) DEFAULT 'light',
language VARCHAR(5) DEFAULT 'pt-BR',
-- Indexes
INDEX idx_email (email),
INDEX idx_plan (plan),
INDEX idx_active (is_active),
INDEX idx_created (created_at)
);
-- Conversations table
CREATE TABLE conversations (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
title VARCHAR(255) NOT NULL DEFAULT 'Nova Conversa',
description TEXT NULL,
-- Conversation settings
model_used VARCHAR(100) DEFAULT 'claude-3-5-haiku',
temperature DECIMAL(3,2) DEFAULT 0.7,
max_tokens INT DEFAULT 4096,
system_prompt TEXT NULL,
-- Metadata
message_count INT DEFAULT 0,
total_tokens INT DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-- Foreign keys
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
-- Indexes
INDEX idx_user (user_id),
INDEX idx_shared (is_shared),
INDEX idx_created (created_at),
INDEX idx_updated (updated_at)
);
-- Message content
user_message TEXT NOT NULL,
ai_response TEXT NOT NULL,
-- AI model information
model_used VARCHAR(100) NOT NULL,
tokens_used INT DEFAULT 0,
response_time INT DEFAULT 0, -- milliseconds
-- Processing details
temperature DECIMAL(3,2) DEFAULT 0.7,
top_p DECIMAL(3,2) DEFAULT 0.9,
finish_reason VARCHAR(50) NULL,
-- Status
is_deleted BOOLEAN DEFAULT FALSE,
-- Timestamps
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-- Foreign keys
FOREIGN KEY (conversation_id) REFERENCES conversations(id) ON DELETE CASCADE,
-- Indexes
INDEX idx_conversation (conversation_id),
INDEX idx_session (session_id),
INDEX idx_model (model_used),
INDEX idx_created (created_at),
INDEX idx_rating (user_rating)
);
-- Image details
prompt TEXT NOT NULL,
negative_prompt TEXT NULL,
image_url VARCHAR(500) NOT NULL,
thumbnail_url VARCHAR(500) NULL,
-- Generation parameters
model_used VARCHAR(100) DEFAULT 'titan-image',
style VARCHAR(50) NULL,
size VARCHAR(20) DEFAULT '1024x1024',
quality VARCHAR(20) DEFAULT 'standard',
seed INT NULL,
steps INT NULL,
guidance_scale DECIMAL(4,2) NULL,
-- File information
file_size INT NULL,
file_format VARCHAR(10) DEFAULT 'png',
-- Generation metadata
response_time INT DEFAULT 0,
generation_cost DECIMAL(10,4) DEFAULT 0.00,
-- Timestamps
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-- Foreign keys
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL,
-- Indexes
INDEX idx_user (user_id),
INDEX idx_session (session_id),
INDEX idx_model (model_used),
INDEX idx_public (is_public),
INDEX idx_created (created_at)
);
-- Categorization
category VARCHAR(100) NOT NULL,
subcategory VARCHAR(100) NULL,
tags JSON NULL,
-- Template configuration
suggested_model VARCHAR(100) NULL,
suggested_temperature DECIMAL(3,2) DEFAULT 0.7,
suggested_max_tokens INT DEFAULT 4096,
-- Metadata
created_by INT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-- Foreign keys
FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL,
-- Indexes
INDEX idx_category (category),
INDEX idx_active (is_active),
INDEX idx_featured (is_featured),
INDEX idx_usage (usage_count),
INDEX idx_rating (rating_average)
);
-- Foreign keys
FOREIGN KEY (template_id) REFERENCES templates(id) ON DELETE CASCADE,
-- Indexes
INDEX idx_template (template_id),
UNIQUE KEY uk_template_variable (template_id, variable_name)
);
-- Foreign keys
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (template_id) REFERENCES templates(id) ON DELETE CASCADE,
-- Indexes
INDEX idx_user (user_id),
INDEX idx_template (template_id),
UNIQUE KEY uk_user_template (user_id, template_id)
);
-- Indexes
INDEX idx_key (setting_key),
INDEX idx_category (category),
INDEX idx_public (is_public)
);
-- Foreign keys
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
-- Indexes
INDEX idx_user (user_id),
INDEX idx_token (session_token),
INDEX idx_expires (expires_at),
INDEX idx_active (is_active)
);
-- Request details
request_body_size INT DEFAULT 0,
response_body_size INT DEFAULT 0,
response_time INT DEFAULT 0,
status_code INT NOT NULL,
-- AI model usage
model_used VARCHAR(100) NULL,
tokens_consumed INT DEFAULT 0,
estimated_cost DECIMAL(10,6) DEFAULT 0.000000,
-- Client information
ip_address VARCHAR(45) NOT NULL,
user_agent TEXT NULL,
-- Error tracking
error_message TEXT NULL,
-- Timestamp
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-- Foreign keys
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL,
-- Indexes
INDEX idx_user (user_id),
INDEX idx_endpoint (endpoint),
INDEX idx_status (status_code),
INDEX idx_created (created_at),
INDEX idx_model (model_used)
);
-- System notifications
CREATE TABLE system_notifications (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
message TEXT NOT NULL,
type ENUM('info', 'success', 'warning', 'error') DEFAULT 'info',
-- Targeting
target_users ENUM('all', 'plan', 'specific') DEFAULT 'all',
target_plan ENUM('free', 'pro', 'enterprise') NULL,
target_user_ids JSON NULL,
-- Status
is_active BOOLEAN DEFAULT TRUE,
is_dismissible BOOLEAN DEFAULT TRUE,
-- Scheduling
starts_at TIMESTAMP NULL,
ends_at TIMESTAMP NULL,
-- Timestamps
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-- Indexes
INDEX idx_active (is_active),
INDEX idx_type (type),
INDEX idx_starts (starts_at),
INDEX idx_ends (ends_at)
);
-- Conversation sharing
CREATE TABLE conversation_shares (
id INT AUTO_INCREMENT PRIMARY KEY,
conversation_id INT NOT NULL,
share_token VARCHAR(100) UNIQUE NOT NULL,
shared_by INT NOT NULL,
-- Share settings
is_public BOOLEAN DEFAULT FALSE,
allow_comments BOOLEAN DEFAULT FALSE,
password_protected BOOLEAN DEFAULT FALSE,
share_password VARCHAR(255) NULL,
-- Access tracking
view_count INT DEFAULT 0,
last_viewed TIMESTAMP NULL,
-- Expiration
expires_at TIMESTAMP NULL,
-- Status
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-- Foreign keys
FOREIGN KEY (conversation_id) REFERENCES conversations(id) ON DELETE CASCADE,
FOREIGN KEY (shared_by) REFERENCES users(id) ON DELETE CASCADE,
-- Indexes
INDEX idx_conversation (conversation_id),
INDEX idx_token (share_token),
INDEX idx_public (is_public),
INDEX idx_active (is_active)
);
-- Foreign keys
FOREIGN KEY (message_id) REFERENCES messages(id) ON DELETE CASCADE,
-- Indexes
INDEX idx_message (message_id),
INDEX idx_type (file_type),
INDEX idx_processed (is_processed)
);
DELIMITER ;
UPDATE users
SET tokens_used = tokens_used + NEW.tokens_used
WHERE id = (SELECT user_id FROM conversations WHERE id = NEW.conversation_id);
END //
DELIMITER ;
# Executar schema
log_info "📊 Executando schema do banco..."
mysql -u iaconi -piaconi2025 iaconi_2025 < database/complete_schema.sql
# Carregar variáveis
source .env
create_all_backend_services
create_api_routes
create_database_schema
# Executar
main "\$@"
----------------------------
ACIMA DESTA LINHA O [Link]
ABAIXO DESSA LINHA O [Link]
------------------------
#!/bin/bash
set -e
# Cores
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
BOLD='\033[1m'
NC='\033[0m'
<style>
/* Critical CSS for loading screen */
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-
serif;
background: #0f172a;
color: #ffffff;
overflow: hidden;
}
#loading-screen {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100vh;
background: linear-gradient(135deg, #667eea 0%, #764ba2 50%, #f093fb 100%);
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
z-index: 9999;
transition: opacity 0.5s ease-out, visibility 0.5s ease-out;
}
#[Link] {
opacity: 0;
visibility: hidden;
}
.loading-content {
text-align: center;
max-width: 600px;
padding: 2rem;
}
.loading-logo {
font-size: 5rem;
margin-bottom: 1.5rem;
animation: pulse 2s infinite;
filter: drop-shadow(0 10px 20px rgba(0,0,0,0.3));
}
.loading-title {
font-size: 3rem;
font-weight: 800;
margin-bottom: 1rem;
background: linear-gradient(45deg, #ffffff, #e2e8f0);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
letter-spacing: -0.025em;
}
.loading-subtitle {
font-size: 1.25rem;
font-weight: 500;
margin-bottom: 3rem;
opacity: 0.9;
line-height: 1.6;
}
.loading-progress {
width: 300px;
height: 4px;
background: rgba(255,255,255,0.2);
border-radius: 2px;
overflow: hidden;
margin: 2rem auto;
}
.loading-progress-bar {
width: 0%;
height: 100%;
background: linear-gradient(90deg, #ffffff, #f1f5f9);
border-radius: 2px;
animation: loadingProgress 3s ease-out forwards;
}
.loading-spinner {
width: 60px;
height: 60px;
border: 4px solid rgba(255,255,255,0.3);
border-top: 4px solid #ffffff;
border-radius: 50%;
animation: spin 1s linear infinite;
margin: 2rem auto;
}
.loading-status {
font-size: 1rem;
opacity: 0.8;
margin-top: 1rem;
animation: statusFade 2s ease-in-out infinite;
}
@keyframes pulse {
0%, 100% { transform: scale(1); opacity: 1; }
50% { transform: scale(1.05); opacity: 0.8; }
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
@keyframes loadingProgress {
0% { width: 0%; }
33% { width: 30%; }
66% { width: 70%; }
100% { width: 100%; }
}
@keyframes statusFade {
0%, 100% { opacity: 0.8; }
50% { opacity: 1; }
}
#[Link] {
opacity: 1;
}
</style>
</head>
<body>
<noscript>
<div style="padding: 2rem; text-align: center; background: #fee2e2; color:
#991b1b; border-radius: 8px; margin: 2rem;">
<h2>JavaScript Necessário</h2>
<p>Você precisa habilitar JavaScript para executar o AIConi 2025 Ultra.</p>
</div>
</noscript>
<script>
// Loading screen management
const loadingSteps = [
'Conectando com servidores...',
'Carregando modelos de IA...',
'Preparando interface...',
'Configurando chat...',
'Inicializando gerador de imagens...',
'Finalizando...'
];
let currentStep = 0;
const loadingStatus = [Link]('loading-status');
[Link]('hidden');
[Link]('loaded');
setTimeout(() => {
[Link] = 'none';
[Link] = 'auto';
}, 500);
}, 3000);
});
# [Link] principal
mkdir -p frontend/src
cat > frontend/src/[Link] << 'EOF'
// AIConi 2025 Ultra - Main App Component
import React, { useState, useEffect } from 'react';
import { BrowserRouter as Router, Routes, Route, Navigate } from 'react-router-
dom';
import { Toaster } from 'react-hot-toast';
import { HelmetProvider } from 'react-helmet-async';
import styled, { ThemeProvider, createGlobalStyle } from 'styled-components';
// Context
import { AuthProvider, useAuth } from './contexts/AuthContext';
import { ChatProvider } from './contexts/ChatContext';
import { SettingsProvider } from './contexts/SettingsContext';
// Pages
import LoginPage from './pages/auth/LoginPage';
import RegisterPage from './pages/auth/RegisterPage';
import DashboardPage from './pages/dashboard/DashboardPage';
import ChatPage from './pages/chat/ChatPage';
import ImagesPage from './pages/images/ImagesPage';
import CodeEditorPage from './pages/code/CodeEditorPage';
import AdminPage from './pages/admin/AdminPage';
import SettingsPage from './pages/settings/SettingsPage';
// Components
import Sidebar from './components/common/Sidebar';
import Header from './components/common/Header';
import LoadingScreen from './components/common/LoadingScreen';
import ErrorBoundary from './components/common/ErrorBoundary';
// Themes
const lightTheme = {
colors: {
primary: '#667eea',
primaryDark: '#764ba2',
secondary: '#f093fb',
success: '#4facfe',
danger: '#fa709a',
warning: '#fee140',
background: '#ffffff',
backgroundAlt: '#f8fafc',
surface: '#ffffff',
surfaceAlt: '#f1f5f9',
text: '#0f172a',
textSecondary: '#64748b',
textMuted: '#94a3b8',
border: '#e2e8f0',
borderLight: '#f1f5f9'
},
gradients: {
primary: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',
secondary: 'linear-gradient(135deg, #f093fb 0%, #f5576c 100%)',
success: 'linear-gradient(135deg, #4facfe 0%, #00f2fe 100%)',
danger: 'linear-gradient(135deg, #fa709a 0%, #fee140 100%)'
},
shadows: {
sm: '0 1px 2px 0 rgba(0, 0, 0, 0.05)',
md: '0 4px 6px -1px rgba(0, 0, 0, 0.1)',
lg: '0 10px 15px -3px rgba(0, 0, 0, 0.1)',
xl: '0 20px 25px -5px rgba(0, 0, 0, 0.1)'
}
};
const darkTheme = {
...lightTheme,
colors: {
...[Link],
background: '#0f172a',
backgroundAlt: '#1e293b',
surface: '#1e293b',
surfaceAlt: '#334155',
text: '#ffffff',
textSecondary: '#cbd5e1',
textMuted: '#94a3b8',
border: '#334155',
borderLight: '#475569'
}
};
// Global Styles
const GlobalStyle = createGlobalStyle`
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-
serif;
background: \${props => [Link]};
color: \${props => [Link]};
font-feature-settings: 'cv02', 'cv03', 'cv04', 'cv11';
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
line-height: 1.6;
}
html {
scroll-behavior: smooth;
}
::-webkit-scrollbar {
width: 8px;
height: 8px;
}
::-webkit-scrollbar-track {
background: \${props => [Link]};
}
::-webkit-scrollbar-thumb {
background: \${props => [Link]};
border-radius: 4px;
}
::-webkit-scrollbar-thumb:hover {
background: \${props => [Link]};
}
.Toastify__toast-container {
font-family: 'Inter', sans-serif;
}
`;
// Styled Components
const AppContainer = [Link]`
display: flex;
height: 100vh;
overflow: hidden;
`;
if (loading) {
return <LoadingScreen />;
}
useEffect(() => {
// Load theme from localStorage
const savedTheme = [Link]('iaconi-theme');
if (savedTheme) {
setTheme(savedTheme);
} else {
// Auto-detect system theme
const prefersDark = [Link]('(prefers-color-scheme:
dark)').matches;
setTheme(prefersDark ? 'dark' : 'light');
}
}, []);
return (
<HelmetProvider>
<ThemeProvider theme={currentTheme}>
<GlobalStyle />
<ErrorBoundary>
<AuthProvider>
<SettingsProvider>
<ChatProvider>
<Router>
<AppContainer>
<Routes>
{/* Auth Routes */}
<Route path="/login" element={<LoginPage />} />
<Route path="/register" element={<RegisterPage />} />
# [Link]
cat > frontend/src/[Link] << 'EOF'
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
// Performance monitoring
if ([Link].NODE_ENV === 'production') {
// Web Vitals
import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
getCLS([Link]);
getFID([Link]);
getFCP([Link]);
getLCP([Link]);
getTTFB([Link]);
});
}
mkdir -p frontend/src/contexts
# Auth Context
cat > frontend/src/contexts/[Link] << 'EOF'
// AIConi 2025 Ultra - Auth Context
import React, { createContext, useContext, useState, useEffect } from 'react';
import axios from 'axios';
import toast from 'react-hot-toast';
setUser(user);
setToken(token);
[Link]('iaconi-token', token);
} catch (error) {
const message = [Link]?.data?.error || 'Erro no login';
[Link](message);
return { success: false, error: message };
}
};
setUser(user);
setToken(token);
[Link]('iaconi-token', token);
} catch (error) {
const message = [Link]?.data?.error || 'Erro no registro';
[Link](message);
return { success: false, error: message };
}
};
const value = {
user,
loading,
login,
register,
logout,
updateProfile,
isAuthenticated: !!user,
isAdmin: user?.plan === 'enterprise'
};
return (
<[Link] value={value}>
{children}
</[Link]>
);
};
EOF
# Chat Context
cat > frontend/src/contexts/[Link] << 'EOF'
// AIConi 2025 Ultra - Chat Context
import React, { createContext, useContext, useState, useCallback, useRef, useEffect
} from 'react';
import io from '[Link]-client';
import toast from 'react-hot-toast';
import axios from 'axios';
return () => {
if ([Link]) {
[Link]();
}
};
}, []);
[Link]('connect', () => {
[Link]('🔗 Socket connected');
setConnected(true);
setSocket(newSocket);
});
[Link]('disconnect', () => {
[Link]('❌ Socket disconnected');
setConnected(false);
});
const newMessage = {
id: [Link](),
type: 'assistant',
content: [Link],
model: [Link] || selectedModel,
timestamp: new Date([Link]),
tokens: [Link] || 0
};
const imageMessage = {
id: [Link](),
type: 'assistant',
content: ``,
imageUrl: [Link],
prompt: [Link],
timestamp: new Date([Link]),
metadata: [Link]
};
const codeMessage = {
id: [Link](),
type: 'assistant',
content: 'Código executado com sucesso!',
codeResult: [Link],
timestamp: new Date([Link])
};
[Link] = newSocket;
};
return newConversation;
} catch (error) {
[Link]('Error creating conversation:', error);
[Link]('Erro ao criar conversa');
}
};
// Load messages
const response = await [Link](`/api/chat/conversations/\$
{conversationId}/messages`);
const loadedMessages = [Link](msg => ({
id: [Link],
type: 'user',
content: msg.user_message,
timestamp: new Date(msg.created_at)
})).concat([Link](msg => ({
id: [Link] + '_response',
type: 'assistant',
content: msg.ai_response,
model: msg.model_used,
timestamp: new Date(msg.created_at),
tokens: msg.tokens_used
})));
const userMessage = {
id: [Link](),
type: 'user',
content: [Link](),
timestamp: new Date()
};
// Send to server
[Link]('send_message', {
message: [Link](),
model: selectedModel,
conversationId: currentConversation?.id || null,
...options
});
scrollToBottom();
}, [socket, selectedModel, currentConversation]);
const userMessage = {
id: [Link](),
type: 'user',
content: `🎨 Gerar imagem: \${[Link]()}`,
timestamp: new Date()
};
[Link]('generate_image', {
prompt: [Link](),
options: {
style: 'realistic',
size: '1024x1024',
quality: 'high',
...options
}
});
scrollToBottom();
}, [socket]);
const userMessage = {
id: [Link](),
type: 'user',
content: `💻 Executar código \${language}:\n\`\`\`\${language}\n\${code}\n\`\
`\``,
timestamp: new Date()
};
[Link]('execute_code', {
code: [Link](),
language
});
scrollToBottom();
}, [socket]);
const value = {
// Connection state
connected,
socket,
// Conversations
conversations,
currentConversation,
setCurrentConversation,
createConversation,
loadConversation,
loadConversations,
// Messages
messages,
setMessages,
clearMessages,
messagesEndRef,
// AI interaction
sendMessage,
generateImage,
executeCode,
isTyping,
// Models
selectedModel,
setSelectedModel,
availableModels,
// Utilities
scrollToBottom
};
return (
<[Link] value={value}>
{children}
</[Link]>
);
};
EOF
# Settings Context
cat > frontend/src/contexts/[Link] << 'EOF'
// AIConi 2025 Ultra - Settings Context
import React, { createContext, useContext, useState, useEffect } from 'react';
import axios from 'axios';
useEffect(() => {
loadSettings();
}, []);
// Save to localStorage
[Link]('iaconi-settings', [Link](newSettings));
return newSettings;
});
};
// Save to localStorage
[Link]('iaconi-settings', [Link](updatedSettings));
return updatedSettings;
});
};
const value = {
settings,
loading,
updateSetting,
updateSettings,
resetSettings
};
return (
<[Link] value={value}>
{children}
</[Link]>
);
};
EOF
cd frontend
# Instalar dependências
npm install
# Build de produção
npm run build
cd ..
# Nginx configuration
sudo tee /etc/nginx/sites-available/iaconi-2025 << EOF > /dev/null
# AIConi 2025 Ultra - Nginx Configuration
server {
listen 80;
listen [::]:80;
server_name \$SERVER_IP localhost [Link];
# Security headers
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Content-Security-Policy "default-src 'self' http: https: data: blob:
'unsafe-inline'" always;
# Gzip compression
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_proxied expired no-cache no-store private auth;
gzip_types
application/atom+xml
application/geo+json
application/javascript
application/x-javascript
application/json
application/ld+json
application/manifest+json
application/rdf+xml
application/rss+xml
application/xhtml+xml
application/xml
font/eot
font/otf
font/ttf
image/svg+xml
text/css
text/javascript
text/plain
text/xml;
# Rate limiting
limit_req_zone \\$binary_remote_addr zone=api:10m rate=30r/m;
limit_req_zone \\$binary_remote_addr zone=upload:10m rate=10r/m;
location ~* \.(jpg|jpeg|png|gif|ico|svg|webp)\$ {
expires 90d;
add_header Cache-Control "public, immutable";
}
}
# Logs
access_log /var/log/nginx/[Link] combined;
error_log /var/log/nginx/[Link] warn;
# Error pages
error_page 404 /[Link];
error_page 500 502 503 504 /[Link];
location = /[Link] {
root /usr/share/nginx/html;
}
}
location /health {
access_log off;
return 200 "healthy\\n";
add_header Content-Type text/plain;
}
}
EOF
read -p "Você tem um domínio apontando para este servidor? (y/n): " HAS_DOMAIN
# Get certificate
sudo certbot --nginx -d \$DOMAIN --email \$EMAIL --agree-tos --non-
interactive --redirect
// Process management
autorestart: true,
watch: false,
max_memory_restart: '1G',
restart_delay: 4000,
kill_timeout: 5000,
// Health monitoring
min_uptime: '10s',
max_restarts: 5,
// Clustering
instance_var: 'INSTANCE_ID',
// [Link] options
node_args: '--max_old_space_size=1024 --optimize-for-size'
}
],
deploy: {
production: {
user: [Link],
host: 'localhost',
ref: 'origin/main',
repo: '[Link]
path: [Link](),
'post-deploy': 'npm install && npm run build && pm2 reload
[Link] --env production'
}
}
};
EOF
# Start application
pm2 start [Link] --env production
# Test database
if mysql -u iaconi -piaconi2025 -e "USE iaconi_2025; SELECT 1;" &>/dev/null;
then
log_success "✅ Banco de dados: OK"
else
log_error "❌ Banco de dados: FALHA"
fi
# Test Redis
if redis-cli ping | grep -q PONG; then
log_success "✅ Redis: OK"
else
log_error "❌ Redis: FALHA"
fi
# Test Nginx
if curl -f [Link] &>/dev/null; then
log_success "✅ Nginx: OK"
else
log_error "❌ Nginx: FALHA"
fi
mkdir -p scripts
# Script de status
cat > scripts/[Link] << 'EOF'
#!/bin/bash
echo "🚀 AIConi 2025 Ultra - Status do Sistema"
echo "==========================================="
echo
# Script de backup
cat > scripts/[Link] << 'EOF'
#!/bin/bash
echo "💾 Iniciando backup do AIConi 2025 Ultra..."
BACKUP_DIR="backups/manual_\$(date +%Y%m%d_%H%M%S)"
mkdir -p "\$BACKUP_DIR"
# Backup database
echo "📊 Backup do banco de dados..."
mysqldump -u iaconi -piaconi2025 iaconi_2025 > "\$BACKUP_DIR/[Link]"
# Backup uploads
echo "📁 Backup dos uploads..."
cp -r uploads "\$BACKUP_DIR/"
# Backup config
echo "⚙️ Backup das configurações..."
cp .env "\$BACKUP_DIR/"
cp [Link] "\$BACKUP_DIR/"
# Create archive
echo "📦 Criando arquivo..."
tar -czf "\$BACKUP_DIR.[Link]" "\$BACKUP_DIR"
rm -rf "\$BACKUP_DIR"
# Script de atualização
cat > scripts/[Link] << 'EOF'
#!/bin/bash
echo "🔄 Atualizando AIConi 2025 Ultra..."
# Parar aplicação
pm2 stop iaconi-2025
# Reiniciar aplicação
pm2 restart iaconi-2025
# Script de logs
cat > scripts/[Link] << 'EOF'
#!/bin/bash
echo "📋 Logs do AIConi 2025 Ultra"
echo "============================="
echo
# Dar permissões
chmod +x scripts/*.sh
log_success "✅ Scripts utilitários criados"
}
# Carregar variáveis
if [[ -f .env ]]; then
source .env
fi
## 📋 Informações do Sistema
## 🌍 URLs de Acesso
## 🔐 Credenciais Padrão
- **Email:** \${ADMIN_EMAIL:-admin@[Link]}
- **Senha:** \${ADMIN_PASSWORD:-admin123}
## Comandos Úteis
### Backup
\`\`\`bash
./scripts/[Link]
\`\`\`
### Nginx
\`\`\`bash
sudo systemctl status nginx # Status do Nginx
sudo systemctl reload nginx # Recarregar configuração
sudo nginx -t # Testar configuração
\`\`\`
## 📊 Monitoramento
## 🔧 Resolução de Problemas
## 🚀 Recursos Disponíveis
### Chat IA
- ✅ Claude 3.5 Haiku (Ultra Rápido)
- ✅ Claude 3.5 Sonnet v2 (Código)
- ✅ Claude 3.5 Sonnet (Análises)
- ✅ Claude 3 Sonnet (Equilibrado)
## 📞 Suporte
---
# Verificações iniciais
if [[ ! -f .env ]]; then
log_error "❌ Execute os scripts anteriores primeiro!"
exit 1
fi
# Carregar configurações
source .env
# Frontend completo
create_complete_frontend
create_react_contexts
install_and_build_frontend
# Configurações de servidor
configure_nginx_complete
setup_ssl_certificate
setup_pm2_optimized
# Testes e utilitários
run_system_tests
create_utility_scripts
final_setup
echo -e "\$
{CYAN}═════════════════════════════════════════════════════════════════════════════
══\${NC}"
echo -e "\${YELLOW}\${BOLD} 🚀 IACONI 2025 ULTRA ESTÁ PRONTO!
🚀 \${NC}"
echo -e "\$
{CYAN}═════════════════════════════════════════════════════════════════════════════
══\${NC}"
echo
# Executar
main "\$@"