create-deployment-package.js 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. #!/usr/bin/env node
  2. import fs from 'fs-extra';
  3. import path from 'path';
  4. import { fileURLToPath } from 'url';
  5. import archiver from 'archiver';
  6. const __filename = fileURLToPath(import.meta.url);
  7. const __dirname = path.dirname(__filename);
  8. const deploymentDir = path.join(__dirname, 'deployment-package');
  9. const archivePath = path.join(__dirname, 'gooneral-wheelchair-deployment.zip');
  10. console.log('🚀 Creating deployment package...\n');
  11. async function createDeploymentPackage() {
  12. try {
  13. // Clean up previous package
  14. await fs.remove(deploymentDir);
  15. await fs.remove(archivePath);
  16. // Create deployment directory
  17. await fs.ensureDir(deploymentDir);
  18. console.log('📁 Copying files...');
  19. // Copy built frontend
  20. if (await fs.pathExists(path.join(__dirname, 'dist'))) {
  21. await fs.copy(path.join(__dirname, 'dist'), path.join(deploymentDir, 'dist'));
  22. console.log('✅ Frontend build copied');
  23. } else {
  24. console.log('⚠️ Frontend not built - run "npm run build" first');
  25. }
  26. // Copy backend files
  27. const backendFiles = [
  28. 'server.js',
  29. 'start-production.js',
  30. 'package.json',
  31. 'auth.js',
  32. 'themes.js',
  33. '.env.production'
  34. ];
  35. const backendDir = path.join(deploymentDir, 'backend');
  36. await fs.ensureDir(backendDir);
  37. for (const file of backendFiles) {
  38. const srcPath = path.join(__dirname, 'backend', file);
  39. const destPath = path.join(backendDir, file);
  40. if (await fs.pathExists(srcPath)) {
  41. await fs.copy(srcPath, destPath);
  42. console.log(`✅ ${file} copied`);
  43. } else {
  44. console.log(`⚠️ ${file} not found`);
  45. }
  46. }
  47. // Copy public directory
  48. if (await fs.pathExists(path.join(__dirname, 'public'))) {
  49. await fs.copy(path.join(__dirname, 'public'), path.join(deploymentDir, 'public'));
  50. console.log('✅ Public directory copied');
  51. }
  52. // Copy configuration files
  53. const configFiles = [
  54. 'Caddyfile',
  55. 'DEPLOYMENT.md'
  56. ];
  57. for (const file of configFiles) {
  58. const srcPath = path.join(__dirname, file);
  59. const destPath = path.join(deploymentDir, file);
  60. if (await fs.pathExists(srcPath)) {
  61. await fs.copy(srcPath, destPath);
  62. console.log(`✅ ${file} copied`);
  63. }
  64. }
  65. // Create systemd service file
  66. const systemdService = `[Unit]
  67. Description=Gooneral Wheelchair CMS Backend
  68. After=network.target
  69. [Service]
  70. Type=simple
  71. User=gooneral
  72. WorkingDirectory=/opt/gooneral-wheelchair/backend
  73. Environment=NODE_ENV=production
  74. ExecStart=/usr/bin/node start-production.js
  75. Restart=always
  76. RestartSec=10
  77. StandardOutput=syslog
  78. StandardError=syslog
  79. SyslogIdentifier=gooneral-wheelchair
  80. [Install]
  81. WantedBy=multi-user.target
  82. `;
  83. await fs.writeFile(path.join(deploymentDir, 'gooneral-wheelchair.service'), systemdService);
  84. console.log('✅ Systemd service file created');
  85. // Create deployment script
  86. const deployScript = `#!/bin/bash
  87. # Gooneral Wheelchair Deployment Script
  88. echo "🚀 Deploying Gooneral Wheelchair CMS..."
  89. # Check if running as root
  90. if [[ $EUID -eq 0 ]]; then
  91. echo "❌ This script should not be run as root"
  92. exit 1
  93. fi
  94. # Create application directory
  95. sudo mkdir -p /opt/gooneral-wheelchair
  96. sudo chown $USER:$USER /opt/gooneral-wheelchair
  97. # Copy files
  98. echo "📁 Copying application files..."
  99. cp -r dist /opt/gooneral-wheelchair/
  100. cp -r backend /opt/gooneral-wheelchair/
  101. cp -r public /opt/gooneral-wheelchair/
  102. cp Caddyfile /opt/gooneral-wheelchair/
  103. # Install backend dependencies
  104. echo "📦 Installing backend dependencies..."
  105. cd /opt/gooneral-wheelchair/backend
  106. npm install --production
  107. # Create directories
  108. mkdir -p sessions
  109. mkdir -p ../public/posts
  110. # Set up systemd service
  111. echo "⚙️ Setting up systemd service..."
  112. sudo cp ../gooneral-wheelchair.service /etc/systemd/system/
  113. sudo systemctl daemon-reload
  114. echo "✅ Deployment complete!"
  115. echo ""
  116. echo "Next steps:"
  117. echo "1. Edit /opt/gooneral-wheelchair/backend/.env.production"
  118. echo "2. Update Caddyfile with your domain"
  119. echo "3. Create admin user (see DEPLOYMENT.md)"
  120. echo "4. Start services:"
  121. echo " sudo systemctl enable gooneral-wheelchair"
  122. echo " sudo systemctl start gooneral-wheelchair"
  123. echo " sudo systemctl reload caddy"
  124. `;
  125. await fs.writeFile(path.join(deploymentDir, 'deploy.sh'), deployScript);
  126. await fs.chmod(path.join(deploymentDir, 'deploy.sh'), '755');
  127. console.log('✅ Deployment script created');
  128. console.log('\n📦 Creating ZIP archive...');
  129. // Create ZIP archive
  130. const output = fs.createWriteStream(archivePath);
  131. const archive = archiver('zip', { zlib: { level: 9 } });
  132. archive.pipe(output);
  133. archive.directory(deploymentDir, 'gooneral-wheelchair');
  134. await archive.finalize();
  135. await new Promise((resolve, reject) => {
  136. output.on('close', resolve);
  137. archive.on('error', reject);
  138. });
  139. console.log(`✅ Deployment package created: ${path.basename(archivePath)}`);
  140. console.log(`📊 Archive size: ${(archive.pointer() / 1024 / 1024).toFixed(2)} MB`);
  141. // Clean up temporary directory
  142. await fs.remove(deploymentDir);
  143. console.log('\n🎉 Ready for deployment!');
  144. console.log('\nNext steps:');
  145. console.log('1. Upload gooneral-wheelchair-deployment.zip to your server');
  146. console.log('2. Extract: unzip gooneral-wheelchair-deployment.zip');
  147. console.log('3. Run: cd gooneral-wheelchair && ./deploy.sh');
  148. console.log('4. Follow the instructions in DEPLOYMENT.md');
  149. } catch (error) {
  150. console.error('❌ Error creating deployment package:', error);
  151. process.exit(1);
  152. }
  153. }
  154. createDeploymentPackage();