diff --git a/.env.dev b/.env.dev index 04206fb..8677de0 100644 --- a/.env.dev +++ b/.env.dev @@ -17,9 +17,10 @@ REDIS_PASSWORD=dev_redis_pass ADMIN_USERNAME=admin ADMIN_EMAIL=admin@localhost -# Email Configuration (Mailhog for development) -SMTP_HOST=mailhog -SMTP_PORT=1025 +# Email Configuration (Disabled for development) +# To enable email, configure a real SMTP server +SMTP_HOST= +SMTP_PORT= SMTP_SECURE=false SMTP_USER= SMTP_PASS= diff --git a/backend/scripts/show-admin-credentials.js b/backend/scripts/show-admin-credentials.js new file mode 100644 index 0000000..fde8423 --- /dev/null +++ b/backend/scripts/show-admin-credentials.js @@ -0,0 +1,66 @@ +#!/usr/bin/env node + +/** + * Show or reset admin credentials + */ + +const bcrypt = require('bcrypt'); +const { db } = require('../src/database/db'); +const { generateReadablePassword } = require('../src/utils/passwordGenerator'); + +async function showAdminCredentials(resetPassword = false) { + try { + // Get admin user + const admin = await db('admin_users') + .where('username', 'admin') + .first(); + + if (!admin) { + console.error('āŒ No admin user found in database'); + process.exit(1); + } + + console.log('\n========================================'); + console.log('PicPeak Admin Credentials'); + console.log('========================================'); + console.log(`Username: ${admin.username}`); + console.log(`Email: ${admin.email}`); + + if (resetPassword) { + // Generate new password + const newPassword = generateReadablePassword(); + const passwordHash = await bcrypt.hash(newPassword, 12); + + // Update password + await db('admin_users') + .where('id', admin.id) + .update({ + password_hash: passwordHash, + updated_at: new Date() + }); + + console.log(`Password: ${newPassword} (NEWLY RESET)`); + console.log('\nāš ļø IMPORTANT: Please save this password securely!'); + } else { + console.log('Password: [hidden - use --reset flag to generate new password]'); + } + + console.log('\nLogin URL: http://localhost:3001/admin'); + console.log('========================================\n'); + + } catch (error) { + console.error('Error:', error.message); + process.exit(1); + } finally { + await db.destroy(); + } +} + +// Check for reset flag +const resetPassword = process.argv.includes('--reset'); + +if (resetPassword) { + console.log('šŸ”„ Resetting admin password...'); +} + +showAdminCredentials(resetPassword); \ No newline at end of file diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 8732b90..5f034bd 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -35,6 +35,7 @@ services: - ./data:/app/data - ./logs:/app/logs - ./backup:/backup + - ./storage:/app/storage ports: - "3001:3001" depends_on: @@ -106,12 +107,11 @@ services: - ./frontend:/app - /app/node_modules ports: - - "3000:3000" - command: npm run dev + - "3000:3005" depends_on: - backend healthcheck: - test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:80"] + test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:3005"] interval: 30s timeout: 10s retries: 3 diff --git a/frontend/Dockerfile.dev b/frontend/Dockerfile.dev index 59c443f..4dfb1b8 100644 --- a/frontend/Dockerfile.dev +++ b/frontend/Dockerfile.dev @@ -1,5 +1,5 @@ # Dockerfile.dev - Development configuration for frontend -FROM node:18-alpine +FROM node:20-alpine WORKDIR /app