|
|
|
@ -0,0 +1,637 @@ |
|
|
|
# Build & Deployment |
|
|
|
|
|
|
|
This guide covers building Adminator for production and deploying it to various hosting platforms. |
|
|
|
|
|
|
|
## Table of Contents |
|
|
|
|
|
|
|
- Production Build |
|
|
|
- Build Commands |
|
|
|
- Build Output |
|
|
|
- Build Optimization |
|
|
|
- Deployment Options |
|
|
|
- Static Hosting Platforms |
|
|
|
- Server Deployment |
|
|
|
- Environment Configuration |
|
|
|
- Pre-Deployment Checklist |
|
|
|
- Post-Deployment Verification |
|
|
|
- Troubleshooting |
|
|
|
- Next Steps |
|
|
|
|
|
|
|
## Production Build |
|
|
|
|
|
|
|
Before deploying, you need to create an optimized production build. |
|
|
|
|
|
|
|
### Quick Build |
|
|
|
|
|
|
|
```bash |
|
|
|
npm run build |
|
|
|
``` |
|
|
|
|
|
|
|
This creates an optimized, minified production build in the `dist/` directory. |
|
|
|
|
|
|
|
## Build Commands |
|
|
|
|
|
|
|
### Standard Production Build |
|
|
|
|
|
|
|
```bash |
|
|
|
npm run build |
|
|
|
``` |
|
|
|
|
|
|
|
**Features:** |
|
|
|
- Minified JavaScript and CSS |
|
|
|
- Optimized assets |
|
|
|
- Source maps disabled |
|
|
|
- Production environment variables |
|
|
|
- Compressed bundle sizes |
|
|
|
|
|
|
|
### Minified Build |
|
|
|
|
|
|
|
```bash |
|
|
|
npm run release:minified |
|
|
|
``` |
|
|
|
|
|
|
|
**Use case:** Maximum optimization for production deployment |
|
|
|
|
|
|
|
**Features:** |
|
|
|
- Aggressive minification |
|
|
|
- Tree shaking |
|
|
|
- Dead code elimination |
|
|
|
- Smallest possible bundle size |
|
|
|
|
|
|
|
### Unminified Build |
|
|
|
|
|
|
|
```bash |
|
|
|
npm run release:unminified |
|
|
|
``` |
|
|
|
|
|
|
|
**Use case:** Debugging production issues |
|
|
|
|
|
|
|
**Features:** |
|
|
|
- Readable code |
|
|
|
- No minification |
|
|
|
- Easier to debug |
|
|
|
- Larger file sizes |
|
|
|
|
|
|
|
### Clean Build |
|
|
|
|
|
|
|
```bash |
|
|
|
# Clean and rebuild |
|
|
|
npm run clean |
|
|
|
npm run build |
|
|
|
``` |
|
|
|
|
|
|
|
Removes the `dist/` directory before building to ensure a fresh build. |
|
|
|
|
|
|
|
## Build Output |
|
|
|
|
|
|
|
After running the build command, the `dist/` directory contains: |
|
|
|
|
|
|
|
``` |
|
|
|
dist/ |
|
|
|
├── index.html # Main dashboard page |
|
|
|
├── 404.html # Error pages |
|
|
|
├── 500.html |
|
|
|
├── signin.html # Authentication pages |
|
|
|
├── signup.html |
|
|
|
├── email.html # Application pages |
|
|
|
├── compose.html |
|
|
|
├── chat.html |
|
|
|
├── calendar.html |
|
|
|
├── charts.html |
|
|
|
├── forms.html |
|
|
|
├── buttons.html |
|
|
|
├── ui.html |
|
|
|
├── basic-table.html |
|
|
|
├── datatable.html |
|
|
|
├── google-maps.html |
|
|
|
├── vector-maps.html |
|
|
|
├── blank.html |
|
|
|
└── assets/ |
|
|
|
├── bundle.[hash].js # Compiled JavaScript |
|
|
|
├── styles.[hash].css # Compiled CSS |
|
|
|
└── static/ # Images, fonts, etc. |
|
|
|
├── fonts/ |
|
|
|
└── images/ |
|
|
|
``` |
|
|
|
|
|
|
|
### File Hashing |
|
|
|
|
|
|
|
Production builds include content hashes in filenames (e.g., `bundle.a1b2c3d4.js`) for: |
|
|
|
- Cache busting |
|
|
|
- Long-term caching |
|
|
|
- Version control |
|
|
|
|
|
|
|
## Build Optimization |
|
|
|
|
|
|
|
### Automatic Optimizations |
|
|
|
|
|
|
|
The build process automatically applies: |
|
|
|
|
|
|
|
1. **JavaScript Optimization** |
|
|
|
- Minification with Terser |
|
|
|
- Tree shaking (removes unused code) |
|
|
|
- Code splitting |
|
|
|
- ES6+ transpilation to ES5 |
|
|
|
|
|
|
|
2. **CSS Optimization** |
|
|
|
- Minification with CSS Minimizer |
|
|
|
- Autoprefixer for browser compatibility |
|
|
|
- Unused CSS removal |
|
|
|
- Critical CSS inlining (optional) |
|
|
|
|
|
|
|
3. **Asset Optimization** |
|
|
|
- Image compression |
|
|
|
- Font subsetting |
|
|
|
- SVG optimization |
|
|
|
- Asset hashing |
|
|
|
|
|
|
|
4. **Bundle Optimization** |
|
|
|
- Gzip compression ready |
|
|
|
- Brotli compression ready |
|
|
|
- Chunk splitting |
|
|
|
- Lazy loading support |
|
|
|
|
|
|
|
### Bundle Size Analysis |
|
|
|
|
|
|
|
To analyze your bundle size: |
|
|
|
|
|
|
|
```bash |
|
|
|
# Install webpack-bundle-analyzer |
|
|
|
npm install --save-dev webpack-bundle-analyzer |
|
|
|
|
|
|
|
# Add to webpack config and rebuild |
|
|
|
npm run build |
|
|
|
``` |
|
|
|
|
|
|
|
## Deployment Options |
|
|
|
|
|
|
|
Adminator can be deployed to various platforms: |
|
|
|
|
|
|
|
### 1. Static Hosting (Recommended) |
|
|
|
- Netlify |
|
|
|
- Vercel |
|
|
|
- GitHub Pages |
|
|
|
- Cloudflare Pages |
|
|
|
- AWS S3 + CloudFront |
|
|
|
- Azure Static Web Apps |
|
|
|
|
|
|
|
### 2. Traditional Hosting |
|
|
|
- Apache |
|
|
|
- Nginx |
|
|
|
- IIS |
|
|
|
- Any web server |
|
|
|
|
|
|
|
### 3. Cloud Platforms |
|
|
|
- AWS (S3, EC2, Amplify) |
|
|
|
- Google Cloud Platform |
|
|
|
- Microsoft Azure |
|
|
|
- DigitalOcean |
|
|
|
|
|
|
|
## Static Hosting Platforms |
|
|
|
|
|
|
|
### Netlify |
|
|
|
|
|
|
|
**1. Install Netlify CLI:** |
|
|
|
```bash |
|
|
|
npm install -g netlify-cli |
|
|
|
``` |
|
|
|
|
|
|
|
**2. Build your project:** |
|
|
|
```bash |
|
|
|
npm run build |
|
|
|
``` |
|
|
|
|
|
|
|
**3. Deploy:** |
|
|
|
```bash |
|
|
|
netlify deploy --prod --dir=dist |
|
|
|
``` |
|
|
|
|
|
|
|
**Or use Netlify's drag-and-drop:** |
|
|
|
1. Go to [netlify.com](https://netlify.com) |
|
|
|
2. Drag the `dist/` folder to deploy |
|
|
|
3. Done! |
|
|
|
|
|
|
|
**netlify.toml configuration:** |
|
|
|
```toml |
|
|
|
[build] |
|
|
|
command = "npm run build" |
|
|
|
publish = "dist" |
|
|
|
|
|
|
|
[[redirects]] |
|
|
|
from = "/*" |
|
|
|
to = "/index.html" |
|
|
|
status = 200 |
|
|
|
``` |
|
|
|
|
|
|
|
### Vercel |
|
|
|
|
|
|
|
**1. Install Vercel CLI:** |
|
|
|
```bash |
|
|
|
npm install -g vercel |
|
|
|
``` |
|
|
|
|
|
|
|
**2. Deploy:** |
|
|
|
```bash |
|
|
|
vercel --prod |
|
|
|
``` |
|
|
|
|
|
|
|
**vercel.json configuration:** |
|
|
|
```json |
|
|
|
{ |
|
|
|
"buildCommand": "npm run build", |
|
|
|
"outputDirectory": "dist", |
|
|
|
"rewrites": [ |
|
|
|
{ "source": "/(.*)", "destination": "/" } |
|
|
|
] |
|
|
|
} |
|
|
|
``` |
|
|
|
|
|
|
|
### GitHub Pages |
|
|
|
|
|
|
|
**1. Install gh-pages:** |
|
|
|
```bash |
|
|
|
npm install --save-dev gh-pages |
|
|
|
``` |
|
|
|
|
|
|
|
**2. Add deploy script to package.json:** |
|
|
|
```json |
|
|
|
{ |
|
|
|
"scripts": { |
|
|
|
"deploy": "npm run build && gh-pages -d dist" |
|
|
|
} |
|
|
|
} |
|
|
|
``` |
|
|
|
|
|
|
|
**3. Deploy:** |
|
|
|
```bash |
|
|
|
npm run deploy |
|
|
|
``` |
|
|
|
|
|
|
|
**4. Configure GitHub Pages:** |
|
|
|
- Go to repository Settings → Pages |
|
|
|
- Select `gh-pages` branch |
|
|
|
- Save |
|
|
|
|
|
|
|
### Cloudflare Pages |
|
|
|
|
|
|
|
**1. Connect your repository:** |
|
|
|
- Go to [pages.cloudflare.com](https://pages.cloudflare.com) |
|
|
|
- Connect your GitHub/GitLab repository |
|
|
|
|
|
|
|
**2. Configure build settings:** |
|
|
|
- Build command: `npm run build` |
|
|
|
- Build output directory: `dist` |
|
|
|
- Root directory: `/` |
|
|
|
|
|
|
|
**3. Deploy:** |
|
|
|
- Push to your repository |
|
|
|
- Cloudflare automatically builds and deploys |
|
|
|
|
|
|
|
### AWS S3 + CloudFront |
|
|
|
|
|
|
|
**1. Build your project:** |
|
|
|
```bash |
|
|
|
npm run build |
|
|
|
``` |
|
|
|
|
|
|
|
**2. Install AWS CLI:** |
|
|
|
```bash |
|
|
|
# Follow AWS CLI installation guide |
|
|
|
aws configure |
|
|
|
``` |
|
|
|
|
|
|
|
**3. Create S3 bucket and upload:** |
|
|
|
```bash |
|
|
|
# Create bucket |
|
|
|
aws s3 mb s3://your-bucket-name |
|
|
|
|
|
|
|
# Upload files |
|
|
|
aws s3 sync dist/ s3://your-bucket-name --delete |
|
|
|
|
|
|
|
# Enable static website hosting |
|
|
|
aws s3 website s3://your-bucket-name --index-document index.html --error-document 404.html |
|
|
|
``` |
|
|
|
|
|
|
|
**4. Set up CloudFront (optional but recommended):** |
|
|
|
- Create CloudFront distribution |
|
|
|
- Point to S3 bucket |
|
|
|
- Configure caching rules |
|
|
|
- Add custom domain (optional) |
|
|
|
|
|
|
|
## Server Deployment |
|
|
|
|
|
|
|
### Apache |
|
|
|
|
|
|
|
**1. Build your project:** |
|
|
|
```bash |
|
|
|
npm run build |
|
|
|
``` |
|
|
|
|
|
|
|
**2. Copy files to web root:** |
|
|
|
```bash |
|
|
|
cp -r dist/* /var/www/html/ |
|
|
|
``` |
|
|
|
|
|
|
|
**3. Configure .htaccess:** |
|
|
|
```apache |
|
|
|
# .htaccess in dist/ |
|
|
|
<IfModule mod_rewrite.c> |
|
|
|
RewriteEngine On |
|
|
|
RewriteBase / |
|
|
|
RewriteRule ^index\.html$ - [L] |
|
|
|
RewriteCond %{REQUEST_FILENAME} !-f |
|
|
|
RewriteCond %{REQUEST_FILENAME} !-d |
|
|
|
RewriteRule . /index.html [L] |
|
|
|
</IfModule> |
|
|
|
|
|
|
|
# Enable Gzip compression |
|
|
|
<IfModule mod_deflate.c> |
|
|
|
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript |
|
|
|
</IfModule> |
|
|
|
|
|
|
|
# Browser caching |
|
|
|
<IfModule mod_expires.c> |
|
|
|
ExpiresActive On |
|
|
|
ExpiresByType image/jpg "access plus 1 year" |
|
|
|
ExpiresByType image/jpeg "access plus 1 year" |
|
|
|
ExpiresByType image/gif "access plus 1 year" |
|
|
|
ExpiresByType image/png "access plus 1 year" |
|
|
|
ExpiresByType text/css "access plus 1 month" |
|
|
|
ExpiresByType application/javascript "access plus 1 month" |
|
|
|
</IfModule> |
|
|
|
``` |
|
|
|
|
|
|
|
### Nginx |
|
|
|
|
|
|
|
**1. Build your project:** |
|
|
|
```bash |
|
|
|
npm run build |
|
|
|
``` |
|
|
|
|
|
|
|
**2. Copy files to web root:** |
|
|
|
```bash |
|
|
|
cp -r dist/* /usr/share/nginx/html/ |
|
|
|
``` |
|
|
|
|
|
|
|
**3. Configure nginx.conf:** |
|
|
|
```nginx |
|
|
|
server { |
|
|
|
listen 80; |
|
|
|
server_name your-domain.com; |
|
|
|
root /usr/share/nginx/html; |
|
|
|
index index.html; |
|
|
|
|
|
|
|
# Gzip compression |
|
|
|
gzip on; |
|
|
|
gzip_types text/plain text/css application/json application/javascript text/xml application/xml text/javascript; |
|
|
|
gzip_min_length 1000; |
|
|
|
|
|
|
|
# Browser caching |
|
|
|
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { |
|
|
|
expires 1y; |
|
|
|
add_header Cache-Control "public, immutable"; |
|
|
|
} |
|
|
|
|
|
|
|
# SPA fallback |
|
|
|
location / { |
|
|
|
try_files $uri $uri/ /index.html; |
|
|
|
} |
|
|
|
|
|
|
|
# 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; |
|
|
|
} |
|
|
|
``` |
|
|
|
|
|
|
|
**4. Restart Nginx:** |
|
|
|
```bash |
|
|
|
sudo systemctl restart nginx |
|
|
|
``` |
|
|
|
|
|
|
|
## Environment Configuration |
|
|
|
|
|
|
|
### Environment Variables |
|
|
|
|
|
|
|
Create environment-specific configurations: |
|
|
|
|
|
|
|
**Development (.env.development):** |
|
|
|
```env |
|
|
|
NODE_ENV=development |
|
|
|
API_URL=http://localhost:3000 |
|
|
|
DEBUG=true |
|
|
|
``` |
|
|
|
|
|
|
|
**Production (.env.production):** |
|
|
|
```env |
|
|
|
NODE_ENV=production |
|
|
|
API_URL=https://api.yourdomain.com |
|
|
|
DEBUG=false |
|
|
|
``` |
|
|
|
|
|
|
|
### Using Environment Variables |
|
|
|
|
|
|
|
In your JavaScript: |
|
|
|
```javascript |
|
|
|
const apiUrl = process.env.API_URL || 'http://localhost:3000'; |
|
|
|
const isProduction = process.env.NODE_ENV === 'production'; |
|
|
|
``` |
|
|
|
|
|
|
|
## Pre-Deployment Checklist |
|
|
|
|
|
|
|
Before deploying to production, verify: |
|
|
|
|
|
|
|
### Code Quality |
|
|
|
- [ ] All linting errors fixed (`npm run lint`) |
|
|
|
- [ ] No console.log statements in production code |
|
|
|
- [ ] All TODO/FIXME comments addressed |
|
|
|
- [ ] Code reviewed and tested |
|
|
|
|
|
|
|
### Build |
|
|
|
- [ ] Production build succeeds (`npm run build`) |
|
|
|
- [ ] No build warnings or errors |
|
|
|
- [ ] Bundle sizes are acceptable |
|
|
|
- [ ] All assets are included |
|
|
|
|
|
|
|
### Testing |
|
|
|
- [ ] All pages load correctly |
|
|
|
- [ ] Navigation works properly |
|
|
|
- [ ] Forms submit correctly |
|
|
|
- [ ] Charts and visualizations display |
|
|
|
- [ ] Dark mode toggle works |
|
|
|
- [ ] Responsive design tested on mobile |
|
|
|
|
|
|
|
### Performance |
|
|
|
- [ ] Images optimized |
|
|
|
- [ ] Lazy loading implemented where needed |
|
|
|
- [ ] Bundle size optimized |
|
|
|
- [ ] Caching configured |
|
|
|
|
|
|
|
### Security |
|
|
|
- [ ] No sensitive data in code |
|
|
|
- [ ] API keys in environment variables |
|
|
|
- [ ] HTTPS configured |
|
|
|
- [ ] Security headers set |
|
|
|
- [ ] CORS configured properly |
|
|
|
|
|
|
|
### SEO (if applicable) |
|
|
|
- [ ] Meta tags added |
|
|
|
- [ ] Page titles set |
|
|
|
- [ ] Alt text for images |
|
|
|
- [ ] Sitemap generated |
|
|
|
- [ ] robots.txt configured |
|
|
|
|
|
|
|
### Browser Compatibility |
|
|
|
- [ ] Tested in Chrome/Edge |
|
|
|
- [ ] Tested in Firefox |
|
|
|
- [ ] Tested in Safari |
|
|
|
- [ ] Tested on mobile devices |
|
|
|
|
|
|
|
## Post-Deployment Verification |
|
|
|
|
|
|
|
After deployment, verify: |
|
|
|
|
|
|
|
1. **Site Accessibility** |
|
|
|
- Visit your deployed URL |
|
|
|
- Check all pages load |
|
|
|
- Test navigation |
|
|
|
|
|
|
|
2. **Functionality** |
|
|
|
- Test interactive features |
|
|
|
- Verify forms work |
|
|
|
- Check API connections |
|
|
|
|
|
|
|
3. **Performance** |
|
|
|
- Run Lighthouse audit |
|
|
|
- Check page load times |
|
|
|
- Verify asset loading |
|
|
|
|
|
|
|
4. **Mobile Responsiveness** |
|
|
|
- Test on actual devices |
|
|
|
- Check responsive breakpoints |
|
|
|
- Verify touch interactions |
|
|
|
|
|
|
|
5. **Console Errors** |
|
|
|
- Open browser DevTools |
|
|
|
- Check for JavaScript errors |
|
|
|
- Verify no 404s for assets |
|
|
|
|
|
|
|
## Troubleshooting |
|
|
|
|
|
|
|
### Build Fails |
|
|
|
|
|
|
|
```bash |
|
|
|
# Clear cache and rebuild |
|
|
|
npm run clean |
|
|
|
rm -rf node_modules package-lock.json |
|
|
|
npm install |
|
|
|
npm run build |
|
|
|
``` |
|
|
|
|
|
|
|
### Assets Not Loading |
|
|
|
|
|
|
|
- Check file paths are relative |
|
|
|
- Verify assets are in `dist/` folder |
|
|
|
- Check server configuration |
|
|
|
- Verify CORS settings |
|
|
|
|
|
|
|
### Blank Page After Deployment |
|
|
|
|
|
|
|
- Check browser console for errors |
|
|
|
- Verify all files uploaded |
|
|
|
- Check base URL configuration |
|
|
|
- Verify server routing for SPA |
|
|
|
|
|
|
|
### Styles Not Applied |
|
|
|
|
|
|
|
- Check CSS file is loaded |
|
|
|
- Verify CSS file path |
|
|
|
- Check for CSS conflicts |
|
|
|
- Clear browser cache |
|
|
|
|
|
|
|
### 404 Errors |
|
|
|
|
|
|
|
- Configure server for SPA routing |
|
|
|
- Add `.htaccess` or nginx config |
|
|
|
- Verify all HTML files uploaded |
|
|
|
|
|
|
|
## Performance Optimization |
|
|
|
|
|
|
|
### Enable Compression |
|
|
|
|
|
|
|
Most hosting platforms enable Gzip/Brotli automatically. Verify: |
|
|
|
|
|
|
|
```bash |
|
|
|
# Check if Gzip is enabled |
|
|
|
curl -H "Accept-Encoding: gzip" -I https://your-domain.com |
|
|
|
``` |
|
|
|
|
|
|
|
### CDN Configuration |
|
|
|
|
|
|
|
Use a CDN for faster global delivery: |
|
|
|
- Cloudflare |
|
|
|
- AWS CloudFront |
|
|
|
- Fastly |
|
|
|
- KeyCDN |
|
|
|
|
|
|
|
### Caching Strategy |
|
|
|
|
|
|
|
Set appropriate cache headers: |
|
|
|
- HTML: No cache or short cache |
|
|
|
- CSS/JS: Long cache (1 year) with hashing |
|
|
|
- Images: Long cache (1 year) |
|
|
|
- Fonts: Long cache (1 year) |
|
|
|
|
|
|
|
## Continuous Deployment |
|
|
|
|
|
|
|
### GitHub Actions |
|
|
|
|
|
|
|
Create `.github/workflows/deploy.yml`: |
|
|
|
|
|
|
|
```yaml |
|
|
|
name: Deploy to Production |
|
|
|
|
|
|
|
on: |
|
|
|
push: |
|
|
|
branches: [ main ] |
|
|
|
|
|
|
|
jobs: |
|
|
|
build-and-deploy: |
|
|
|
runs-on: ubuntu-latest |
|
|
|
|
|
|
|
steps: |
|
|
|
- uses: actions/checkout@v2 |
|
|
|
|
|
|
|
- name: Setup Node.js |
|
|
|
uses: actions/setup-node@v2 |
|
|
|
with: |
|
|
|
node-version: '18' |
|
|
|
|
|
|
|
- name: Install dependencies |
|
|
|
run: npm ci |
|
|
|
|
|
|
|
- name: Build |
|
|
|
run: npm run build |
|
|
|
|
|
|
|
- name: Deploy to Netlify |
|
|
|
uses: netlify/actions/cli@master |
|
|
|
env: |
|
|
|
NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} |
|
|
|
NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }} |
|
|
|
with: |
|
|
|
args: deploy --prod --dir=dist |
|
|
|
``` |
|
|
|
|
|
|
|
## Next Steps |
|
|
|
|
|
|
|
Congratulations on deploying Adminator! 🎉 |
|
|
|
|
|
|
|
Continue learning: |
|
|
|
|
|
|
|
1. **[Theme System](../customization/theme-system.md)** - Customize colors and themes |
|
|
|
2. **[API Reference](../api/theme-api.md)** - JavaScript API documentation |
|
|
|
3. **[Examples](../examples/theme-integration.md)** - Integration examples |
|
|
|
|
|
|
|
--- |
|
|
|
|
|
|
|
**Need Help?** Check the [main README](../../README.md) or [open an issue](https://github.com/puikinsh/Adminator-admin-dashboard/issues). |