First Commit
This commit is contained in:
480
CHATWOOT_CONFIG_TROUBLESHOOTING.md
Normal file
480
CHATWOOT_CONFIG_TROUBLESHOOTING.md
Normal file
@@ -0,0 +1,480 @@
|
||||
# Chatwoot Configuration & Troubleshooting Guide
|
||||
|
||||
## Common Environment Variables (.env)
|
||||
|
||||
Edit with: `sudo nano /home/chatwoot/chatwoot/.env`
|
||||
|
||||
### Core Configuration
|
||||
```
|
||||
RAILS_ENV=production # Always use production for live
|
||||
SECRET_KEY_BASE=your-secret-key # Generated during install
|
||||
FRONTEND_URL=https://yourdomain.com # Where Chatwoot is accessed from
|
||||
```
|
||||
|
||||
### Database Configuration
|
||||
```
|
||||
POSTGRES_HOST=localhost
|
||||
POSTGRES_PORT=5432
|
||||
POSTGRES_USERNAME=chatwoot
|
||||
POSTGRES_PASSWORD=your_secure_password # IMPORTANT: Change this!
|
||||
POSTGRES_DATABASE=chatwoot_production
|
||||
```
|
||||
|
||||
### Redis Configuration
|
||||
```
|
||||
REDIS_URL=redis://localhost:6379/0
|
||||
```
|
||||
|
||||
### Account Signup
|
||||
```
|
||||
ENABLE_ACCOUNT_SIGNUP=false # true to allow new signups
|
||||
```
|
||||
|
||||
### Email Configuration (Choose One)
|
||||
|
||||
**SMTP:**
|
||||
```
|
||||
SMTP_HOST=smtp.gmail.com
|
||||
SMTP_PORT=587
|
||||
SMTP_USERNAME=your-email@gmail.com
|
||||
SMTP_PASSWORD=your-app-password
|
||||
SMTP_AUTHENTICATION=plain
|
||||
SMTP_ENABLE_STARTTLS_AUTO=true
|
||||
```
|
||||
|
||||
**Mailgun:**
|
||||
```
|
||||
MAILGUN_SMTP_ENABLED=true
|
||||
MAILGUN_SMTP_DOMAIN=your-domain.mailgun.org
|
||||
MAILGUN_SMTP_LOGIN=postmaster@your-domain.mailgun.org
|
||||
MAILGUN_SMTP_PASSWORD=your-mailgun-key
|
||||
```
|
||||
|
||||
### Integrations
|
||||
|
||||
**Facebook:**
|
||||
```
|
||||
FACEBOOK_CHANNEL_ENABLED=true
|
||||
FACEBOOK_APP_ID=your-app-id
|
||||
FACEBOOK_APP_SECRET=your-app-secret
|
||||
```
|
||||
|
||||
**WhatsApp:**
|
||||
```
|
||||
WHATSAPP_CHANNEL_ENABLED=true
|
||||
WHATSAPP_API_KEY=your-api-key
|
||||
```
|
||||
|
||||
**Google Analytics:**
|
||||
```
|
||||
GOOGLE_ANALYTICS_ID=UA-XXXXXXXX-X
|
||||
```
|
||||
|
||||
### Security
|
||||
```
|
||||
ENABLE_ACCOUNT_SIGNUP=false
|
||||
CORS_ORIGINS=https://yourdomain.com
|
||||
```
|
||||
|
||||
## Nginx Configuration Examples
|
||||
|
||||
### Basic HTTP (Port 3000)
|
||||
```nginx
|
||||
server {
|
||||
listen 80;
|
||||
server_name _;
|
||||
|
||||
location / {
|
||||
proxy_pass http://127.0.0.1:3000;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
underscores_in_headers on;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### HTTPS with Let's Encrypt
|
||||
```nginx
|
||||
# Redirect HTTP to HTTPS
|
||||
server {
|
||||
listen 80;
|
||||
server_name yourdomain.com;
|
||||
return 301 https://$server_name$request_uri;
|
||||
}
|
||||
|
||||
# HTTPS Server
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
server_name yourdomain.com;
|
||||
|
||||
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
|
||||
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
|
||||
ssl_protocols TLSv1.2 TLSv1.3;
|
||||
ssl_ciphers HIGH:!aNULL:!MD5;
|
||||
ssl_prefer_server_ciphers on;
|
||||
|
||||
# Security headers
|
||||
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
|
||||
add_header X-Content-Type-Options "nosniff" always;
|
||||
add_header X-Frame-Options "SAMEORIGIN" always;
|
||||
|
||||
location / {
|
||||
proxy_pass http://127.0.0.1:3000;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto https;
|
||||
proxy_buffering off;
|
||||
underscores_in_headers on;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Troubleshooting Guide
|
||||
|
||||
### Issue: Chatwoot Won't Start
|
||||
|
||||
**Check Service Status:**
|
||||
```bash
|
||||
systemctl status chatwoot-web.target
|
||||
systemctl status chatwoot-worker.target
|
||||
```
|
||||
|
||||
**View Detailed Logs:**
|
||||
```bash
|
||||
journalctl -u chatwoot-web.1.service -n 100
|
||||
journalctl -u chatwoot-worker.1.service -n 100
|
||||
```
|
||||
|
||||
**Common Causes:**
|
||||
1. Database connection error - verify PostgreSQL is running
|
||||
2. Redis unavailable - check Redis service
|
||||
3. Asset compilation failed - recompile assets
|
||||
4. Port already in use - check port 3000
|
||||
|
||||
**Solutions:**
|
||||
```bash
|
||||
# Restart PostgreSQL
|
||||
sudo systemctl restart postgresql
|
||||
|
||||
# Restart Redis
|
||||
sudo systemctl restart redis-server
|
||||
|
||||
# Recompile assets
|
||||
cd /home/chatwoot/chatwoot
|
||||
bundle exec rake assets:precompile RAILS_ENV=production NODE_OPTIONS="--max-old-space-size=4096 --openssl-legacy-provider"
|
||||
|
||||
# Clear Rails cache
|
||||
cd /home/chatwoot/chatwoot
|
||||
bundle exec rake cache:clear RAILS_ENV=production
|
||||
```
|
||||
|
||||
### Issue: High Memory Usage
|
||||
|
||||
**Check Memory:**
|
||||
```bash
|
||||
free -h
|
||||
top -b -n 1 | head -20
|
||||
```
|
||||
|
||||
**Solutions:**
|
||||
1. Increase swap space:
|
||||
```bash
|
||||
sudo fallocate -l 8G /swapfile
|
||||
sudo chmod 600 /swapfile
|
||||
sudo mkswap /swapfile
|
||||
sudo swapon /swapfile
|
||||
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
|
||||
```
|
||||
|
||||
2. Optimize Sidekiq workers in `.env`:
|
||||
```
|
||||
SIDEKIQ_CONCURRENCY=5
|
||||
SIDEKIQ_MEMORY_KILLER_MAX_SIZE=800
|
||||
```
|
||||
|
||||
3. Reduce Rails threads:
|
||||
```
|
||||
WEB_CONCURRENCY=2
|
||||
MAX_THREADS=4
|
||||
```
|
||||
|
||||
### Issue: Slow Performance
|
||||
|
||||
**Check System Resources:**
|
||||
```bash
|
||||
# CPU usage
|
||||
top
|
||||
# Disk I/O
|
||||
iostat -x 1 5
|
||||
# Network connections
|
||||
netstat -an | grep ESTABLISHED
|
||||
```
|
||||
|
||||
**Optimization Steps:**
|
||||
|
||||
1. **Database Optimization:**
|
||||
```bash
|
||||
# Connect to PostgreSQL
|
||||
sudo -u postgres psql chatwoot_production
|
||||
|
||||
# Analyze database
|
||||
ANALYZE;
|
||||
```
|
||||
|
||||
2. **Redis Optimization:**
|
||||
```bash
|
||||
# Check Redis memory
|
||||
redis-cli info memory
|
||||
# Clear Redis cache
|
||||
redis-cli flushall
|
||||
```
|
||||
|
||||
3. **Nginx Optimization:**
|
||||
```nginx
|
||||
# Add to http block in nginx.conf
|
||||
client_max_body_size 20M;
|
||||
gzip on;
|
||||
gzip_types text/plain text/css text/javascript application/json application/javascript;
|
||||
```
|
||||
|
||||
4. **Scale Sidekiq Workers:**
|
||||
Edit `/etc/systemd/system/chatwoot-worker.1.service`:
|
||||
```ini
|
||||
Environment="SIDEKIQ_CONCURRENCY=10"
|
||||
ExecStart=/bin/bash -lc 'exec bundle exec sidekiq -c 10 -e $RAILS_ENV'
|
||||
```
|
||||
|
||||
### Issue: SSL Certificate Not Renewing
|
||||
|
||||
**Check Certificate Expiry:**
|
||||
```bash
|
||||
sudo certbot certificates
|
||||
```
|
||||
|
||||
**Manual Renewal:**
|
||||
```bash
|
||||
sudo certbot renew --nginx
|
||||
```
|
||||
|
||||
**Auto-Renewal Check:**
|
||||
```bash
|
||||
sudo systemctl status certbot.timer
|
||||
sudo systemctl enable certbot.timer
|
||||
```
|
||||
|
||||
### Issue: Database Corruption
|
||||
|
||||
**Check Database Health:**
|
||||
```bash
|
||||
sudo -u postgres psql chatwoot_production -c "PRAGMA integrity_check;"
|
||||
```
|
||||
|
||||
**Restore from Backup:**
|
||||
```bash
|
||||
sudo -u postgres dropdb chatwoot_production
|
||||
sudo -u postgres createdb chatwoot_production -O chatwoot
|
||||
sudo -u postgres pg_restore -d chatwoot_production /path/to/backup.sql
|
||||
```
|
||||
|
||||
### Issue: Email Not Sending
|
||||
|
||||
**Check SMTP Configuration:**
|
||||
```bash
|
||||
cd /home/chatwoot/chatwoot
|
||||
sudo -u chatwoot bundle exec rails console production
|
||||
```
|
||||
|
||||
**Test Email:**
|
||||
```ruby
|
||||
ActionMailer::Base.mail(
|
||||
from: 'test@example.com',
|
||||
to: 'admin@example.com',
|
||||
subject: 'Test Email',
|
||||
body: 'This is a test email'
|
||||
).deliver_now
|
||||
```
|
||||
|
||||
### Issue: Agents Can't Login
|
||||
|
||||
**Check Agent Access:**
|
||||
```bash
|
||||
cd /home/chatwoot/chatwoot
|
||||
sudo -u chatwoot bundle exec rails console production
|
||||
|
||||
# Check user
|
||||
User.find_by(email: 'agent@example.com')
|
||||
|
||||
# Reset password
|
||||
user = User.find_by(email: 'agent@example.com')
|
||||
user.update(password: 'newpassword123')
|
||||
```
|
||||
|
||||
### Issue: Database Migrations Failed
|
||||
|
||||
**Run Migrations Manually:**
|
||||
```bash
|
||||
cd /home/chatwoot/chatwoot
|
||||
sudo -u chatwoot bundle exec rake db:migrate RAILS_ENV=production
|
||||
```
|
||||
|
||||
**Rollback Migration:**
|
||||
```bash
|
||||
cd /home/chatwoot/chatwoot
|
||||
sudo -u chatwoot bundle exec rake db:rollback STEP=1 RAILS_ENV=production
|
||||
```
|
||||
|
||||
## Maintenance Tasks
|
||||
|
||||
### Regular Backups
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# Daily backup script
|
||||
|
||||
BACKUP_DIR="/backups/chatwoot"
|
||||
DATE=$(date +%Y-%m-%d)
|
||||
|
||||
mkdir -p $BACKUP_DIR
|
||||
|
||||
# Database backup
|
||||
sudo -u postgres pg_dump -Fc chatwoot_production > $BACKUP_DIR/db_$DATE.sql
|
||||
|
||||
# Application backup
|
||||
tar -czf $BACKUP_DIR/app_$DATE.tar.gz \
|
||||
-C /home/chatwoot chatwoot \
|
||||
--exclude='*.log' \
|
||||
--exclude='tmp/*' \
|
||||
--exclude='public/packs/*'
|
||||
|
||||
# Keep only last 30 days
|
||||
find $BACKUP_DIR -name "*.sql" -mtime +30 -delete
|
||||
find $BACKUP_DIR -name "*.tar.gz" -mtime +30 -delete
|
||||
```
|
||||
|
||||
### Monitor Disk Space
|
||||
```bash
|
||||
# Check disk usage
|
||||
df -h
|
||||
|
||||
# Find large files
|
||||
du -sh /home/chatwoot/chatwoot/*
|
||||
|
||||
# Clean logs
|
||||
journalctl --vacuum-time=30d
|
||||
rm -f /var/log/chatwoot/*.log.*
|
||||
```
|
||||
|
||||
### Monitor Services
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# Service monitoring script
|
||||
|
||||
# Check services
|
||||
systemctl is-active chatwoot-web.target || systemctl restart chatwoot-web.target
|
||||
systemctl is-active chatwoot-worker.target || systemctl restart chatwoot-worker.target
|
||||
systemctl is-active postgresql || systemctl restart postgresql
|
||||
systemctl is-active redis-server || systemctl restart redis-server
|
||||
systemctl is-active nginx || systemctl restart nginx
|
||||
```
|
||||
|
||||
### Update Chatwoot
|
||||
```bash
|
||||
cd /home/chatwoot/chatwoot
|
||||
|
||||
# If cwctl is available
|
||||
cwctl --upgrade
|
||||
|
||||
# Or manual update
|
||||
git fetch origin
|
||||
git checkout v3.x.x # Replace with version
|
||||
bundle install
|
||||
bundle exec rake db:migrate RAILS_ENV=production
|
||||
bundle exec rake assets:precompile RAILS_ENV=production NODE_OPTIONS="--max-old-space-size=4096 --openssl-legacy-provider"
|
||||
systemctl restart chatwoot-web.target chatwoot-worker.target
|
||||
```
|
||||
|
||||
## Performance Monitoring
|
||||
|
||||
### Check Active Connections
|
||||
```bash
|
||||
# Database connections
|
||||
sudo -u postgres psql -c "SELECT count(*) FROM pg_stat_activity;"
|
||||
|
||||
# Redis connections
|
||||
redis-cli CLIENT LIST
|
||||
```
|
||||
|
||||
### Monitor CPU and Memory
|
||||
```bash
|
||||
# Real-time monitoring
|
||||
watch -n 1 'top -b -n 1 | head -20'
|
||||
|
||||
# Systemd resource limits
|
||||
systemctl status chatwoot-web.target --full
|
||||
```
|
||||
|
||||
## Security Hardening
|
||||
|
||||
### UFW Firewall Setup
|
||||
```bash
|
||||
sudo ufw enable
|
||||
sudo ufw allow 22/tcp
|
||||
sudo ufw allow 80/tcp
|
||||
sudo ufw allow 443/tcp
|
||||
sudo ufw default deny incoming
|
||||
sudo ufw default allow outgoing
|
||||
```
|
||||
|
||||
### Nginx Security Headers
|
||||
```nginx
|
||||
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 "no-referrer-when-downgrade" always;
|
||||
add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;
|
||||
```
|
||||
|
||||
### SSH Hardening
|
||||
```bash
|
||||
# Edit /etc/ssh/sshd_config
|
||||
PermitRootLogin no
|
||||
PasswordAuthentication no
|
||||
PubkeyAuthentication yes
|
||||
X11Forwarding no
|
||||
|
||||
# Restart SSH
|
||||
sudo systemctl restart ssh
|
||||
```
|
||||
|
||||
## Useful Commands Quick Reference
|
||||
|
||||
```bash
|
||||
# View real-time logs
|
||||
journalctl -f -u chatwoot-web.1.service
|
||||
|
||||
# Restart all services
|
||||
systemctl restart chatwoot-web.target chatwoot-worker.target
|
||||
|
||||
# Access Rails console
|
||||
cd /home/chatwoot/chatwoot && sudo -u chatwoot bundle exec rails console production
|
||||
|
||||
# Check Chatwoot version
|
||||
cd /home/chatwoot/chatwoot && git describe --tags
|
||||
|
||||
# Database status
|
||||
sudo -u postgres psql -d chatwoot_production -c "\dt"
|
||||
|
||||
# Redis info
|
||||
redis-cli INFO
|
||||
|
||||
# Check port usage
|
||||
sudo netstat -tlnp | grep 3000
|
||||
```
|
||||
282
CHATWOOT_SETUP_GUIDE.md
Normal file
282
CHATWOOT_SETUP_GUIDE.md
Normal file
@@ -0,0 +1,282 @@
|
||||
# Chatwoot Installation Guide for Ubuntu
|
||||
|
||||
## Overview
|
||||
This guide covers installing Chatwoot (an open-source customer engagement platform) on Ubuntu 20.04, 22.04, or 24.04 LTS using an automated installation script.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
**System Requirements:**
|
||||
- Ubuntu 20.04 LTS, 22.04 LTS, or 24.04 LTS
|
||||
- Minimum 4 cores (8 cores recommended for production)
|
||||
- Minimum 4GB RAM (8GB or more for production)
|
||||
- At least 20GB free disk space
|
||||
- Root or sudo access
|
||||
- (Optional) A domain name for SSL configuration
|
||||
|
||||
**Open Required Ports:**
|
||||
- Port 80 (HTTP)
|
||||
- Port 443 (HTTPS, if using SSL)
|
||||
- Port 3000 (if accessing directly without reverse proxy)
|
||||
|
||||
## Quick Start
|
||||
|
||||
### 1. Download the Installation Script
|
||||
```bash
|
||||
wget https://example.com/chatwoot_install.sh
|
||||
chmod +x chatwoot_install.sh
|
||||
```
|
||||
|
||||
Or clone from GitHub:
|
||||
```bash
|
||||
git clone https://github.com/chatwoot/chatwoot.git
|
||||
cd chatwoot/deployment
|
||||
sudo bash setup_20.04.sh
|
||||
```
|
||||
|
||||
### 2. Run the Installation Script
|
||||
```bash
|
||||
sudo bash chatwoot_install.sh
|
||||
```
|
||||
|
||||
This will:
|
||||
- Update system packages
|
||||
- Install all dependencies (Ruby, Node.js, PostgreSQL, Redis, Nginx)
|
||||
- Create the chatwoot user
|
||||
- Clone the Chatwoot repository
|
||||
- Setup PostgreSQL database
|
||||
- Install Ruby gems
|
||||
- Compile assets
|
||||
- Configure systemd services
|
||||
- Setup Nginx as a reverse proxy
|
||||
- Start all services
|
||||
|
||||
The installation typically takes 30-60 minutes.
|
||||
|
||||
### 3. Access Chatwoot
|
||||
After installation completes, access Chatwoot at:
|
||||
```
|
||||
http://your-server-ip:3000
|
||||
```
|
||||
|
||||
## Configuration with Domain and SSL
|
||||
|
||||
### Using the Installation Script
|
||||
If you have a domain name and an A record pointing to your server:
|
||||
|
||||
```bash
|
||||
sudo bash chatwoot_install.sh --ssl --domain yourdomain.com --email admin@yourdomain.com
|
||||
```
|
||||
|
||||
This will:
|
||||
- Configure Nginx for your domain
|
||||
- Generate SSL certificates using Let's Encrypt
|
||||
- Enable automatic HTTPS
|
||||
- Access Chatwoot at `https://yourdomain.com`
|
||||
|
||||
### Manual SSL Configuration
|
||||
If you prefer manual setup:
|
||||
|
||||
```bash
|
||||
sudo certbot certonly --nginx -d yourdomain.com
|
||||
```
|
||||
|
||||
Then restart Nginx:
|
||||
```bash
|
||||
sudo systemctl restart nginx
|
||||
```
|
||||
|
||||
## Post-Installation Setup
|
||||
|
||||
### 1. Edit Environment Variables
|
||||
The `.env` file controls Chatwoot configuration. Update it with your specific settings:
|
||||
|
||||
```bash
|
||||
sudo nano /home/chatwoot/chatwoot/.env
|
||||
```
|
||||
|
||||
Key variables:
|
||||
- `RAILS_ENV=production` - Environment mode
|
||||
- `POSTGRES_HOST=localhost` - Database host
|
||||
- `POSTGRES_USERNAME=chatwoot` - Database user
|
||||
- `POSTGRES_PASSWORD=` - Database password (change this!)
|
||||
- `REDIS_URL=redis://localhost:6379` - Redis connection
|
||||
- `ENABLE_ACCOUNT_SIGNUP=true/false` - Allow new user registration
|
||||
- `MAILGUN_SMTP_ENABLED=true/false` - Email configuration
|
||||
- `FACEBOOK_CHANNEL_ENABLED=true/false` - Channel integrations
|
||||
|
||||
### 2. Run Database Migrations
|
||||
```bash
|
||||
cd /home/chatwoot/chatwoot
|
||||
bundle exec rake db:migrate RAILS_ENV=production
|
||||
```
|
||||
|
||||
### 3. Create Admin User
|
||||
```bash
|
||||
cd /home/chatwoot/chatwoot
|
||||
bundle exec rake chatwoot:create_account[account_name]
|
||||
bundle exec rake chatwoot:create_user[email@example.com,admin_name,Admin,password]
|
||||
```
|
||||
|
||||
Alternatively, use the web interface to create the first admin user after accessing Chatwoot.
|
||||
|
||||
### 4. Configure Integrations
|
||||
Log in to the Chatwoot dashboard and configure:
|
||||
- Email accounts
|
||||
- Social media channels (Facebook, WhatsApp, Instagram)
|
||||
- Live chat widget
|
||||
- Custom API keys
|
||||
|
||||
## Service Management
|
||||
|
||||
### Check Service Status
|
||||
```bash
|
||||
systemctl status chatwoot-web.target
|
||||
systemctl status chatwoot-worker.target
|
||||
```
|
||||
|
||||
### View Logs
|
||||
```bash
|
||||
# Web service logs
|
||||
journalctl -u chatwoot-web.1.service -f
|
||||
|
||||
# Worker service logs
|
||||
journalctl -u chatwoot-worker.1.service -f
|
||||
|
||||
# Installation logs
|
||||
tail -f /var/log/chatwoot-setup.log
|
||||
```
|
||||
|
||||
### Restart Services
|
||||
```bash
|
||||
systemctl restart chatwoot-web.target
|
||||
systemctl restart chatwoot-worker.target
|
||||
```
|
||||
|
||||
### Stop Services
|
||||
```bash
|
||||
systemctl stop chatwoot-web.target
|
||||
systemctl stop chatwoot-worker.target
|
||||
```
|
||||
|
||||
## Upgrading Chatwoot
|
||||
|
||||
### Using cwctl (Recommended)
|
||||
```bash
|
||||
cwctl --upgrade
|
||||
```
|
||||
|
||||
### Manual Upgrade
|
||||
```bash
|
||||
cd /home/chatwoot/chatwoot
|
||||
git fetch origin
|
||||
git checkout v3.x.x # Replace with desired version
|
||||
bundle install
|
||||
rake db:migrate RAILS_ENV=production
|
||||
rake assets:precompile RAILS_ENV=production
|
||||
systemctl restart chatwoot-web.target chatwoot-worker.target
|
||||
```
|
||||
|
||||
## Backup and Restore
|
||||
|
||||
### Create Database Backup
|
||||
```bash
|
||||
sudo -u postgres pg_dump -Fc chatwoot_production > chatwoot_backup.sql
|
||||
```
|
||||
|
||||
### Restore Database
|
||||
```bash
|
||||
sudo -u postgres pg_restore -d chatwoot_production chatwoot_backup.sql
|
||||
```
|
||||
|
||||
### Backup Application Files
|
||||
```bash
|
||||
tar -czf chatwoot_app_backup.tar.gz /home/chatwoot/chatwoot
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Service Won't Start
|
||||
Check logs for errors:
|
||||
```bash
|
||||
journalctl -u chatwoot-web.1.service -n 50
|
||||
```
|
||||
|
||||
### Asset Compilation Issues
|
||||
Clear compiled assets and recompile:
|
||||
```bash
|
||||
cd /home/chatwoot/chatwoot
|
||||
rm -rf public/packs/*
|
||||
bundle exec rake assets:precompile RAILS_ENV=production NODE_OPTIONS="--max-old-space-size=4096 --openssl-legacy-provider"
|
||||
```
|
||||
|
||||
### Database Connection Issues
|
||||
Verify PostgreSQL is running:
|
||||
```bash
|
||||
systemctl status postgresql
|
||||
```
|
||||
|
||||
Check database credentials in `.env` file match PostgreSQL configuration.
|
||||
|
||||
### Out of Memory During Installation
|
||||
Increase swap space:
|
||||
```bash
|
||||
sudo fallocate -l 4G /swapfile
|
||||
sudo chmod 600 /swapfile
|
||||
sudo mkswap /swapfile
|
||||
sudo swapon /swapfile
|
||||
```
|
||||
|
||||
## Security Recommendations
|
||||
|
||||
1. **Change Default Passwords**
|
||||
- Update PostgreSQL password
|
||||
- Update Redis password
|
||||
- Create strong admin credentials
|
||||
|
||||
2. **Enable SSL/HTTPS**
|
||||
- Always use HTTPS in production
|
||||
- Use valid SSL certificates
|
||||
- Implement HTTP to HTTPS redirects
|
||||
|
||||
3. **Configure Firewall**
|
||||
```bash
|
||||
sudo ufw enable
|
||||
sudo ufw allow 22/tcp
|
||||
sudo ufw allow 80/tcp
|
||||
sudo ufw allow 443/tcp
|
||||
```
|
||||
|
||||
4. **Regular Updates**
|
||||
- Keep Ubuntu packages updated: `sudo apt update && sudo apt upgrade`
|
||||
- Keep Chatwoot updated to latest stable version
|
||||
- Monitor security advisories
|
||||
|
||||
5. **Database Security**
|
||||
- Use strong PostgreSQL passwords
|
||||
- Restrict database access to localhost
|
||||
- Regular backups with secure storage
|
||||
|
||||
## Additional Resources
|
||||
|
||||
- **Official Documentation:** https://www.chatwoot.com/docs/self-hosted
|
||||
- **Community Forum:** https://www.chatwoot.com/community
|
||||
- **GitHub Repository:** https://github.com/chatwoot/chatwoot
|
||||
- **API Documentation:** https://docs.chatwoot.com/api/inbox
|
||||
|
||||
## Getting Help
|
||||
|
||||
If you encounter issues:
|
||||
|
||||
1. Check the installation logs: `/var/log/chatwoot-setup.log`
|
||||
2. Review service logs: `journalctl -u chatwoot-* -f`
|
||||
3. Visit the Chatwoot community forum
|
||||
4. Check GitHub issues: https://github.com/chatwoot/chatwoot/issues
|
||||
5. Consult the official documentation
|
||||
|
||||
## Support the Project
|
||||
|
||||
Chatwoot is open-source and maintained by the community. Consider:
|
||||
- Starring the GitHub repository
|
||||
- Contributing code or translations
|
||||
- Supporting the project financially
|
||||
- Reporting issues and bugs
|
||||
15
README.MD
Normal file
15
README.MD
Normal file
@@ -0,0 +1,15 @@
|
||||
Summary
|
||||
I've created a complete Chatwoot installation package with four files:
|
||||
Installation Scripts:
|
||||
|
||||
chatwoot_install.sh - Full-featured script with detailed setup, logs, and modular functions. Best for custom installations.
|
||||
chatwoot_quick_install.sh - Simplified version using the official Chatwoot installer. Best for quick deployment.
|
||||
|
||||
Documentation:
|
||||
3. CHATWOOT_SETUP_GUIDE.md - Complete setup instructions covering prerequisites, installation, configuration, service management, upgrades, backups, and troubleshooting basics.
|
||||
4. CHATWOOT_CONFIG_TROUBLESHOOTING.md - Advanced reference with environment variables, Nginx configs, detailed troubleshooting, maintenance tasks, and performance optimization.
|
||||
Quick Start:
|
||||
bashsudo bash chatwoot_quick_install.sh
|
||||
# or for more control
|
||||
sudo bash chatwoot_install.sh --ssl --domain yourdomain.com --email admin@yourdomain.com
|
||||
The scripts support Ubuntu 20.04, 22.04, and 24.04 LTS, handle PostgreSQL/Redis setup, Nginx configuration, SSL with Let's Encrypt, and systemd service management.
|
||||
472
chatwoot_install.sh
Normal file
472
chatwoot_install.sh
Normal file
@@ -0,0 +1,472 @@
|
||||
#!/bin/bash
|
||||
|
||||
################################################################################
|
||||
# Chatwoot Installation Script for Ubuntu
|
||||
# Supports: Ubuntu 20.04 LTS, 22.04 LTS, 24.04 LTS
|
||||
# Description: Automated installation of Chatwoot on Ubuntu
|
||||
# Usage: sudo bash chatwoot_install.sh
|
||||
################################################################################
|
||||
|
||||
set -eu -o pipefail
|
||||
|
||||
# Color codes for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Variables
|
||||
CHATWOOT_USER="chatwoot"
|
||||
CHATWOOT_HOME="/home/chatwoot"
|
||||
CHATWOOT_APP_PATH="${CHATWOOT_HOME}/chatwoot"
|
||||
RAILS_ENV="production"
|
||||
RAILS_LOG_DIR="/var/log/chatwoot"
|
||||
LOG_FILE="/var/log/chatwoot-setup.log"
|
||||
|
||||
# Check if running as root
|
||||
if [ "$EUID" -ne 0 ]; then
|
||||
echo -e "${RED}This script must be run as root (use: sudo bash chatwoot_install.sh)${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Functions
|
||||
log_info() {
|
||||
echo -e "${BLUE}[INFO]${NC} $1" | tee -a "$LOG_FILE"
|
||||
}
|
||||
|
||||
log_success() {
|
||||
echo -e "${GREEN}[SUCCESS]${NC} $1" | tee -a "$LOG_FILE"
|
||||
}
|
||||
|
||||
log_error() {
|
||||
echo -e "${RED}[ERROR]${NC} $1" | tee -a "$LOG_FILE"
|
||||
}
|
||||
|
||||
log_warning() {
|
||||
echo -e "${YELLOW}[WARNING]${NC} $1" | tee -a "$LOG_FILE"
|
||||
}
|
||||
|
||||
# Initialize log file
|
||||
mkdir -p "$(dirname "$LOG_FILE")"
|
||||
touch "$LOG_FILE"
|
||||
log_info "Starting Chatwoot installation script"
|
||||
|
||||
# Function to check command existence
|
||||
command_exists() {
|
||||
command -v "$1" >/dev/null 2>&1
|
||||
}
|
||||
|
||||
# Function to detect Ubuntu version
|
||||
detect_ubuntu_version() {
|
||||
if [ -f /etc/os-release ]; then
|
||||
. /etc/os-release
|
||||
UBUNTU_VERSION="$VERSION_ID"
|
||||
UBUNTU_CODENAME="$VERSION_CODENAME"
|
||||
log_info "Detected Ubuntu version: $UBUNTU_VERSION ($UBUNTU_CODENAME)"
|
||||
else
|
||||
log_error "Unable to detect Ubuntu version"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to update system
|
||||
update_system() {
|
||||
log_info "Updating system packages..."
|
||||
apt-get update -qq
|
||||
apt-get upgrade -y -qq
|
||||
log_success "System packages updated"
|
||||
}
|
||||
|
||||
# Function to install dependencies
|
||||
install_dependencies() {
|
||||
log_info "Installing system dependencies..."
|
||||
|
||||
local packages=(
|
||||
"curl"
|
||||
"wget"
|
||||
"git"
|
||||
"build-essential"
|
||||
"libssl-dev"
|
||||
"libreadline-dev"
|
||||
"zlib1g-dev"
|
||||
"libsqlite3-dev"
|
||||
"libxml2-dev"
|
||||
"libxslt1-dev"
|
||||
"libcurl4-openssl-dev"
|
||||
"postgresql"
|
||||
"postgresql-contrib"
|
||||
"redis-server"
|
||||
"nginx"
|
||||
"certbot"
|
||||
"python3-certbot-nginx"
|
||||
"nodejs"
|
||||
"npm"
|
||||
)
|
||||
|
||||
for package in "${packages[@]}"; do
|
||||
if ! dpkg -l | grep -q "^ii $package"; then
|
||||
log_info "Installing $package..."
|
||||
apt-get install -y -qq "$package" || log_warning "Failed to install $package"
|
||||
fi
|
||||
done
|
||||
|
||||
log_success "Dependencies installed"
|
||||
}
|
||||
|
||||
# Function to setup Ruby
|
||||
setup_ruby() {
|
||||
log_info "Setting up Ruby environment..."
|
||||
|
||||
# Install RVM
|
||||
if ! command_exists rvm; then
|
||||
log_info "Installing RVM..."
|
||||
gpg2 --keyserver hkp://keyserver.ubuntu.com --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB 2>/dev/null || true
|
||||
curl -sSL https://get.rvm.io | bash -s stable >/dev/null 2>&1
|
||||
source /etc/profile.d/rvm.sh
|
||||
fi
|
||||
|
||||
# Install Ruby
|
||||
log_info "Installing Ruby 3.2..."
|
||||
source /etc/profile.d/rvm.sh
|
||||
rvm install ruby-3.2.0 >/dev/null 2>&1 || log_warning "Ruby installation may have issues"
|
||||
rvm use ruby-3.2.0 --default >/dev/null 2>&1
|
||||
|
||||
# Install Bundler
|
||||
gem install bundler --quiet
|
||||
|
||||
log_success "Ruby environment setup complete"
|
||||
}
|
||||
|
||||
# Function to create chatwoot user and directories
|
||||
setup_chatwoot_user() {
|
||||
log_info "Setting up Chatwoot user and directories..."
|
||||
|
||||
if ! id "$CHATWOOT_USER" &>/dev/null; then
|
||||
useradd -m -s /bin/bash -d "$CHATWOOT_HOME" "$CHATWOOT_USER"
|
||||
log_info "Created chatwoot user"
|
||||
fi
|
||||
|
||||
# Create necessary directories
|
||||
mkdir -p "$RAILS_LOG_DIR"
|
||||
chown -R "$CHATWOOT_USER:$CHATWOOT_USER" "$RAILS_LOG_DIR"
|
||||
chmod 755 "$RAILS_LOG_DIR"
|
||||
|
||||
log_success "Chatwoot user and directories created"
|
||||
}
|
||||
|
||||
# Function to setup PostgreSQL
|
||||
setup_postgresql() {
|
||||
log_info "Setting up PostgreSQL database..."
|
||||
|
||||
# Generate secure password
|
||||
local db_password=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 20; echo '')
|
||||
|
||||
# Start PostgreSQL
|
||||
systemctl start postgresql
|
||||
systemctl enable postgresql
|
||||
|
||||
# Create database and user
|
||||
sudo -u postgres psql <<EOF
|
||||
DROP DATABASE IF EXISTS chatwoot_production;
|
||||
DROP USER IF EXISTS chatwoot;
|
||||
CREATE USER chatwoot WITH PASSWORD '$db_password';
|
||||
CREATE DATABASE chatwoot_production OWNER chatwoot;
|
||||
GRANT ALL PRIVILEGES ON DATABASE chatwoot_production TO chatwoot;
|
||||
EOF
|
||||
|
||||
log_success "PostgreSQL database created"
|
||||
log_info "Database password: $db_password (save this for environment configuration)"
|
||||
}
|
||||
|
||||
# Function to setup Redis
|
||||
setup_redis() {
|
||||
log_info "Setting up Redis..."
|
||||
|
||||
systemctl start redis-server
|
||||
systemctl enable redis-server
|
||||
|
||||
log_success "Redis started and enabled"
|
||||
}
|
||||
|
||||
# Function to clone and setup Chatwoot
|
||||
setup_chatwoot() {
|
||||
log_info "Cloning Chatwoot repository..."
|
||||
|
||||
if [ ! -d "$CHATWOOT_APP_PATH" ]; then
|
||||
sudo -u "$CHATWOOT_USER" git clone https://github.com/chatwoot/chatwoot.git "$CHATWOOT_APP_PATH" 2>&1 | tee -a "$LOG_FILE"
|
||||
else
|
||||
log_warning "Chatwoot directory already exists"
|
||||
fi
|
||||
|
||||
cd "$CHATWOOT_APP_PATH"
|
||||
|
||||
# Checkout latest stable version
|
||||
log_info "Checking out latest release..."
|
||||
sudo -u "$CHATWOOT_USER" git fetch --tags 2>&1 | tee -a "$LOG_FILE"
|
||||
|
||||
# Setup environment file
|
||||
log_info "Setting up environment configuration..."
|
||||
if [ ! -f "$CHATWOOT_APP_PATH/.env" ]; then
|
||||
sudo -u "$CHATWOOT_USER" cp "$CHATWOOT_APP_PATH/.env.example" "$CHATWOOT_APP_PATH/.env"
|
||||
fi
|
||||
|
||||
# Update .env file with database credentials
|
||||
sudo -u "$CHATWOOT_USER" sed -i 's|POSTGRES_HOST=localhost|POSTGRES_HOST=localhost|g' "$CHATWOOT_APP_PATH/.env"
|
||||
sudo -u "$CHATWOOT_USER" sed -i 's|POSTGRES_USERNAME=postgres|POSTGRES_USERNAME=chatwoot|g' "$CHATWOOT_APP_PATH/.env"
|
||||
sudo -u "$CHATWOOT_USER" sed -i 's|POSTGRES_PASSWORD=|POSTGRES_PASSWORD=YOUR_DB_PASSWORD|g' "$CHATWOOT_APP_PATH/.env"
|
||||
|
||||
log_success "Chatwoot repository cloned and configured"
|
||||
}
|
||||
|
||||
# Function to install Ruby gems
|
||||
install_gems() {
|
||||
log_info "Installing Ruby gems (this may take a while)..."
|
||||
|
||||
cd "$CHATWOOT_APP_PATH"
|
||||
source /etc/profile.d/rvm.sh
|
||||
|
||||
sudo -u "$CHATWOOT_USER" bash -c "cd $CHATWOOT_APP_PATH && rvm use ruby-3.2.0 && bundle install --quiet" 2>&1 | tee -a "$LOG_FILE"
|
||||
|
||||
log_success "Ruby gems installed"
|
||||
}
|
||||
|
||||
# Function to compile assets
|
||||
compile_assets() {
|
||||
log_info "Compiling assets (this may take a while)..."
|
||||
|
||||
cd "$CHATWOOT_APP_PATH"
|
||||
source /etc/profile.d/rvm.sh
|
||||
|
||||
sudo -u "$CHATWOOT_USER" bash -c "cd $CHATWOOT_APP_PATH && rvm use ruby-3.2.0 && rake assets:precompile RAILS_ENV=production NODE_OPTIONS='--max-old-space-size=4096 --openssl-legacy-provider'" 2>&1 | tee -a "$LOG_FILE"
|
||||
|
||||
log_success "Assets compiled successfully"
|
||||
}
|
||||
|
||||
# Function to setup systemd services
|
||||
setup_systemd_services() {
|
||||
log_info "Setting up systemd services..."
|
||||
|
||||
# Copy service files
|
||||
cp "$CHATWOOT_APP_PATH/deployment/chatwoot-web.1.service" /etc/systemd/system/
|
||||
cp "$CHATWOOT_APP_PATH/deployment/chatwoot-web.target" /etc/systemd/system/
|
||||
cp "$CHATWOOT_APP_PATH/deployment/chatwoot-worker.1.service" /etc/systemd/system/
|
||||
cp "$CHATWOOT_APP_PATH/deployment/chatwoot-worker.target" /etc/systemd/system/
|
||||
|
||||
# Update service files for correct user and paths
|
||||
sed -i "s|User=chatwoot|User=$CHATWOOT_USER|g" /etc/systemd/system/chatwoot-web.1.service
|
||||
sed -i "s|User=chatwoot|User=$CHATWOOT_USER|g" /etc/systemd/system/chatwoot-worker.1.service
|
||||
sed -i "s|WorkingDirectory=/home/chatwoot/chatwoot|WorkingDirectory=$CHATWOOT_APP_PATH|g" /etc/systemd/system/chatwoot-web.1.service
|
||||
sed -i "s|WorkingDirectory=/home/chatwoot/chatwoot|WorkingDirectory=$CHATWOOT_APP_PATH|g" /etc/systemd/system/chatwoot-worker.1.service
|
||||
|
||||
systemctl daemon-reload
|
||||
systemctl enable chatwoot-web.target
|
||||
systemctl enable chatwoot-worker.target
|
||||
|
||||
log_success "Systemd services configured"
|
||||
}
|
||||
|
||||
# Function to start services
|
||||
start_services() {
|
||||
log_info "Starting Chatwoot services..."
|
||||
|
||||
systemctl start chatwoot-web.target
|
||||
systemctl start chatwoot-worker.target
|
||||
|
||||
# Wait for services to start
|
||||
sleep 5
|
||||
|
||||
if systemctl is-active --quiet chatwoot-web.target && systemctl is-active --quiet chatwoot-worker.target; then
|
||||
log_success "Chatwoot services started successfully"
|
||||
else
|
||||
log_error "Failed to start Chatwoot services"
|
||||
log_info "Check logs: journalctl -u chatwoot-web.target -f"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to setup Nginx
|
||||
setup_nginx() {
|
||||
log_info "Configuring Nginx as reverse proxy..."
|
||||
|
||||
# Create Nginx configuration
|
||||
cat > /etc/nginx/sites-available/chatwoot <<'EOF'
|
||||
server {
|
||||
listen 80;
|
||||
server_name _;
|
||||
|
||||
# Point upstream to Chatwoot App Server
|
||||
set $upstream 127.0.0.1:3000;
|
||||
|
||||
# Nginx strips out underscore in headers by default
|
||||
# Chatwoot relies on underscore in headers for API
|
||||
underscores_in_headers on;
|
||||
|
||||
location / {
|
||||
proxy_pass http://$upstream;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "Upgrade";
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_read_timeout 90;
|
||||
proxy_buffering off;
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
# Enable site
|
||||
ln -sf /etc/nginx/sites-available/chatwoot /etc/nginx/sites-enabled/chatwoot
|
||||
rm -f /etc/nginx/sites-enabled/default
|
||||
|
||||
# Test and reload Nginx
|
||||
if nginx -t >/dev/null 2>&1; then
|
||||
systemctl restart nginx
|
||||
log_success "Nginx configured and restarted"
|
||||
else
|
||||
log_error "Nginx configuration error"
|
||||
nginx -t
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to setup SSL with Let's Encrypt
|
||||
setup_ssl() {
|
||||
local domain="$1"
|
||||
local email="$2"
|
||||
|
||||
log_info "Setting up SSL certificate for $domain..."
|
||||
|
||||
certbot certonly --nginx -d "$domain" -m "$email" --agree-tos --non-interactive 2>&1 | tee -a "$LOG_FILE"
|
||||
|
||||
# Update Nginx configuration for HTTPS
|
||||
cat > /etc/nginx/sites-available/chatwoot <<EOF
|
||||
server {
|
||||
listen 80;
|
||||
server_name $domain;
|
||||
return 301 https://\$server_name\$request_uri;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
server_name $domain;
|
||||
|
||||
ssl_certificate /etc/letsencrypt/live/$domain/fullchain.pem;
|
||||
ssl_certificate_key /etc/letsencrypt/live/$domain/privkey.pem;
|
||||
ssl_protocols TLSv1.2 TLSv1.3;
|
||||
ssl_ciphers HIGH:!aNULL:!MD5;
|
||||
ssl_prefer_server_ciphers on;
|
||||
|
||||
set \$upstream 127.0.0.1:3000;
|
||||
underscores_in_headers on;
|
||||
|
||||
location / {
|
||||
proxy_pass http://\$upstream;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade \$http_upgrade;
|
||||
proxy_set_header Connection "Upgrade";
|
||||
proxy_set_header Host \$host;
|
||||
proxy_set_header X-Real-IP \$remote_addr;
|
||||
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto \$scheme;
|
||||
proxy_read_timeout 90;
|
||||
proxy_buffering off;
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
if nginx -t >/dev/null 2>&1; then
|
||||
systemctl restart nginx
|
||||
log_success "SSL certificate installed and Nginx configured"
|
||||
else
|
||||
log_error "Nginx configuration error"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Main installation flow
|
||||
main() {
|
||||
log_info "====== Chatwoot Installation Started ======"
|
||||
|
||||
# Detect Ubuntu version
|
||||
detect_ubuntu_version
|
||||
|
||||
# Check requirements
|
||||
if ! command_exists curl; then
|
||||
log_info "Installing curl first..."
|
||||
apt-get update -qq && apt-get install -y -qq curl
|
||||
fi
|
||||
|
||||
# Installation steps
|
||||
update_system
|
||||
install_dependencies
|
||||
setup_chatwoot_user
|
||||
setup_postgresql
|
||||
setup_redis
|
||||
setup_ruby
|
||||
setup_chatwoot
|
||||
install_gems
|
||||
compile_assets
|
||||
setup_systemd_services
|
||||
start_services
|
||||
setup_nginx
|
||||
|
||||
# Summary
|
||||
log_success "====== Chatwoot Installation Complete ======"
|
||||
echo ""
|
||||
echo -e "${GREEN}Chatwoot installation completed successfully!${NC}"
|
||||
echo ""
|
||||
echo "Access your Chatwoot instance at:"
|
||||
echo -e "${BLUE} http://$(hostname -I | awk '{print $1}'):3000${NC}"
|
||||
echo ""
|
||||
echo "To configure domain and SSL, run:"
|
||||
echo -e "${BLUE} sudo bash chatwoot_install.sh --ssl --domain yourdomain.com --email your@email.com${NC}"
|
||||
echo ""
|
||||
echo "Important next steps:"
|
||||
echo "1. Update .env file with correct database password"
|
||||
echo "2. Run database migrations: cd $CHATWOOT_APP_PATH && bundle exec rake db:migrate RAILS_ENV=production"
|
||||
echo "3. Create admin user and complete initial setup via web interface"
|
||||
echo ""
|
||||
echo "For logs, check: journalctl -u chatwoot-web.target -f"
|
||||
echo ""
|
||||
}
|
||||
|
||||
# Parse command line arguments
|
||||
CONFIGURE_SSL=false
|
||||
DOMAIN=""
|
||||
EMAIL=""
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
--ssl)
|
||||
CONFIGURE_SSL=true
|
||||
shift
|
||||
;;
|
||||
--domain)
|
||||
DOMAIN="$2"
|
||||
shift 2
|
||||
;;
|
||||
--email)
|
||||
EMAIL="$2"
|
||||
shift 2
|
||||
;;
|
||||
*)
|
||||
echo "Unknown option: $1"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Run main installation
|
||||
main
|
||||
|
||||
# Setup SSL if requested
|
||||
if [ "$CONFIGURE_SSL" = true ]; then
|
||||
if [ -z "$DOMAIN" ] || [ -z "$EMAIL" ]; then
|
||||
log_error "Domain and email are required for SSL setup"
|
||||
exit 1
|
||||
fi
|
||||
setup_ssl "$DOMAIN" "$EMAIL"
|
||||
fi
|
||||
146
chatwoot_quick_install.sh
Normal file
146
chatwoot_quick_install.sh
Normal file
@@ -0,0 +1,146 @@
|
||||
#!/bin/bash
|
||||
|
||||
################################################################################
|
||||
# Chatwoot Quick Installation Script
|
||||
# Supports: Ubuntu 20.04, 22.04, 24.04 LTS
|
||||
# Simple method using official Chatwoot installation script
|
||||
# Usage: sudo bash chatwoot_quick_install.sh
|
||||
################################################################################
|
||||
|
||||
set -e
|
||||
|
||||
# Colors
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
NC='\033[0m'
|
||||
|
||||
# Check if running as root
|
||||
if [ "$EUID" -ne 0 ]; then
|
||||
echo -e "${RED}Error: This script must be run as root${NC}"
|
||||
echo "Run: sudo bash chatwoot_quick_install.sh"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo -e "${GREEN}╔════════════════════════════════════════════╗${NC}"
|
||||
echo -e "${GREEN}║ Chatwoot Installation - Ubuntu 20.04+ ║${NC}"
|
||||
echo -e "${GREEN}╚════════════════════════════════════════════╝${NC}"
|
||||
echo ""
|
||||
|
||||
# Check Ubuntu version
|
||||
if [ ! -f /etc/os-release ]; then
|
||||
echo -e "${RED}Error: Cannot detect Ubuntu version${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
. /etc/os-release
|
||||
echo -e "${GREEN}[✓]${NC} Ubuntu $VERSION_ID detected"
|
||||
|
||||
# Validate Ubuntu version
|
||||
case $VERSION_ID in
|
||||
20.04|22.04|24.04)
|
||||
echo -e "${GREEN}[✓]${NC} Supported Ubuntu version"
|
||||
;;
|
||||
*)
|
||||
echo -e "${YELLOW}[!]${NC} Ubuntu $VERSION_ID is not officially supported"
|
||||
echo " Supported versions: 20.04, 22.04, 24.04"
|
||||
read -p "Continue anyway? (y/n) " -n 1 -r
|
||||
echo
|
||||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
echo ""
|
||||
read -p "Install Postgres and Redis? (yes/no): " install_postgres_redis
|
||||
install_postgres_redis=${install_postgres_redis:-yes}
|
||||
|
||||
echo ""
|
||||
read -p "Configure domain and SSL? (yes/no): " configure_domain
|
||||
configure_domain=${configure_domain:-no}
|
||||
|
||||
domain=""
|
||||
email=""
|
||||
|
||||
if [ "$configure_domain" = "yes" ]; then
|
||||
echo ""
|
||||
echo "Make sure you have created an A record for your domain"
|
||||
read -p "Enter your domain (e.g., chatwoot.example.com): " domain
|
||||
read -p "Enter email for Let's Encrypt: " email
|
||||
|
||||
if [ -z "$domain" ] || [ -z "$email" ]; then
|
||||
echo -e "${RED}Error: Domain and email are required for SSL${NC}"
|
||||
configure_domain="no"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo -e "${YELLOW}Starting installation...${NC}"
|
||||
echo ""
|
||||
|
||||
# Update system
|
||||
echo -e "${GREEN}[1/6]${NC} Updating system..."
|
||||
apt-get update -qq
|
||||
apt-get upgrade -y -qq
|
||||
|
||||
# Download official Chatwoot installation script
|
||||
echo -e "${GREEN}[2/6]${NC} Downloading Chatwoot installation script..."
|
||||
cd /tmp
|
||||
wget -q https://raw.githubusercontent.com/chatwoot/chatwoot/develop/deployment/setup_20.04.sh -O chatwoot_setup.sh
|
||||
chmod +x chatwoot_setup.sh
|
||||
|
||||
# Run installation
|
||||
echo -e "${GREEN}[3/6]${NC} Running Chatwoot installation..."
|
||||
echo ""
|
||||
|
||||
# Prepare script arguments
|
||||
install_args="--install"
|
||||
|
||||
if [ "$install_postgres_redis" != "yes" ]; then
|
||||
install_args="$install_args --web-only"
|
||||
fi
|
||||
|
||||
# Run the official script with automatic answers
|
||||
bash ./chatwoot_setup.sh $install_args <<EOF
|
||||
$install_postgres_redis
|
||||
$configure_domain
|
||||
$domain
|
||||
$email
|
||||
EOF
|
||||
|
||||
echo ""
|
||||
echo -e "${GREEN}[4/6]${NC} Installation completed"
|
||||
|
||||
# Display access information
|
||||
echo ""
|
||||
echo -e "${GREEN}╔════════════════════════════════════════════╗${NC}"
|
||||
echo -e "${GREEN}║ Installation Successful! ║${NC}"
|
||||
echo -e "${GREEN}╚════════════════════════════════════════════╝${NC}"
|
||||
echo ""
|
||||
|
||||
if [ "$configure_domain" = "yes" ]; then
|
||||
echo "Access Chatwoot at:"
|
||||
echo -e "${YELLOW} https://${domain}${NC}"
|
||||
else
|
||||
echo "Access Chatwoot at:"
|
||||
echo -e "${YELLOW} http://$(hostname -I | awk '{print $1}'):3000${NC}"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "Next steps:"
|
||||
echo "1. Open Chatwoot in your browser"
|
||||
echo "2. Create your first admin account"
|
||||
echo "3. Configure email and communication channels"
|
||||
echo "4. Customize agent names and account details"
|
||||
echo ""
|
||||
|
||||
echo "Useful commands:"
|
||||
echo " View logs: journalctl -u chatwoot-web.1.service -f"
|
||||
echo " Restart services: systemctl restart chatwoot-web.target"
|
||||
echo " Check status: systemctl status chatwoot-web.target"
|
||||
echo " Upgrade Chatwoot: cwctl --upgrade"
|
||||
echo ""
|
||||
|
||||
echo -e "${GREEN}[✓]${NC} Installation log: /var/log/chatwoot-setup.log"
|
||||
echo ""
|
||||
472
install_chatwoot.sh
Normal file
472
install_chatwoot.sh
Normal file
@@ -0,0 +1,472 @@
|
||||
#!/bin/bash
|
||||
|
||||
################################################################################
|
||||
# Chatwoot Installation Script for Ubuntu
|
||||
# Supports: Ubuntu 20.04 LTS, 22.04 LTS, 24.04 LTS
|
||||
# Description: Automated installation of Chatwoot on Ubuntu
|
||||
# Usage: sudo bash chatwoot_install.sh
|
||||
################################################################################
|
||||
|
||||
set -eu -o pipefail
|
||||
|
||||
# Color codes for output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Variables
|
||||
CHATWOOT_USER="chatwoot"
|
||||
CHATWOOT_HOME="/home/chatwoot"
|
||||
CHATWOOT_APP_PATH="${CHATWOOT_HOME}/chatwoot"
|
||||
RAILS_ENV="production"
|
||||
RAILS_LOG_DIR="/var/log/chatwoot"
|
||||
LOG_FILE="/var/log/chatwoot-setup.log"
|
||||
|
||||
# Check if running as root
|
||||
if [ "$EUID" -ne 0 ]; then
|
||||
echo -e "${RED}This script must be run as root (use: sudo bash chatwoot_install.sh)${NC}"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Functions
|
||||
log_info() {
|
||||
echo -e "${BLUE}[INFO]${NC} $1" | tee -a "$LOG_FILE"
|
||||
}
|
||||
|
||||
log_success() {
|
||||
echo -e "${GREEN}[SUCCESS]${NC} $1" | tee -a "$LOG_FILE"
|
||||
}
|
||||
|
||||
log_error() {
|
||||
echo -e "${RED}[ERROR]${NC} $1" | tee -a "$LOG_FILE"
|
||||
}
|
||||
|
||||
log_warning() {
|
||||
echo -e "${YELLOW}[WARNING]${NC} $1" | tee -a "$LOG_FILE"
|
||||
}
|
||||
|
||||
# Initialize log file
|
||||
mkdir -p "$(dirname "$LOG_FILE")"
|
||||
touch "$LOG_FILE"
|
||||
log_info "Starting Chatwoot installation script"
|
||||
|
||||
# Function to check command existence
|
||||
command_exists() {
|
||||
command -v "$1" >/dev/null 2>&1
|
||||
}
|
||||
|
||||
# Function to detect Ubuntu version
|
||||
detect_ubuntu_version() {
|
||||
if [ -f /etc/os-release ]; then
|
||||
. /etc/os-release
|
||||
UBUNTU_VERSION="$VERSION_ID"
|
||||
UBUNTU_CODENAME="$VERSION_CODENAME"
|
||||
log_info "Detected Ubuntu version: $UBUNTU_VERSION ($UBUNTU_CODENAME)"
|
||||
else
|
||||
log_error "Unable to detect Ubuntu version"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to update system
|
||||
update_system() {
|
||||
log_info "Updating system packages..."
|
||||
apt-get update -qq
|
||||
apt-get upgrade -y -qq
|
||||
log_success "System packages updated"
|
||||
}
|
||||
|
||||
# Function to install dependencies
|
||||
install_dependencies() {
|
||||
log_info "Installing system dependencies..."
|
||||
|
||||
local packages=(
|
||||
"curl"
|
||||
"wget"
|
||||
"git"
|
||||
"build-essential"
|
||||
"libssl-dev"
|
||||
"libreadline-dev"
|
||||
"zlib1g-dev"
|
||||
"libsqlite3-dev"
|
||||
"libxml2-dev"
|
||||
"libxslt1-dev"
|
||||
"libcurl4-openssl-dev"
|
||||
"postgresql"
|
||||
"postgresql-contrib"
|
||||
"redis-server"
|
||||
"nginx"
|
||||
"certbot"
|
||||
"python3-certbot-nginx"
|
||||
"nodejs"
|
||||
"npm"
|
||||
)
|
||||
|
||||
for package in "${packages[@]}"; do
|
||||
if ! dpkg -l | grep -q "^ii $package"; then
|
||||
log_info "Installing $package..."
|
||||
apt-get install -y -qq "$package" || log_warning "Failed to install $package"
|
||||
fi
|
||||
done
|
||||
|
||||
log_success "Dependencies installed"
|
||||
}
|
||||
|
||||
# Function to setup Ruby
|
||||
setup_ruby() {
|
||||
log_info "Setting up Ruby environment..."
|
||||
|
||||
# Install RVM
|
||||
if ! command_exists rvm; then
|
||||
log_info "Installing RVM..."
|
||||
gpg2 --keyserver hkp://keyserver.ubuntu.com --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB 2>/dev/null || true
|
||||
curl -sSL https://get.rvm.io | bash -s stable >/dev/null 2>&1
|
||||
source /etc/profile.d/rvm.sh
|
||||
fi
|
||||
|
||||
# Install Ruby
|
||||
log_info "Installing Ruby 3.2..."
|
||||
source /etc/profile.d/rvm.sh
|
||||
rvm install ruby-3.2.0 >/dev/null 2>&1 || log_warning "Ruby installation may have issues"
|
||||
rvm use ruby-3.2.0 --default >/dev/null 2>&1
|
||||
|
||||
# Install Bundler
|
||||
gem install bundler --quiet
|
||||
|
||||
log_success "Ruby environment setup complete"
|
||||
}
|
||||
|
||||
# Function to create chatwoot user and directories
|
||||
setup_chatwoot_user() {
|
||||
log_info "Setting up Chatwoot user and directories..."
|
||||
|
||||
if ! id "$CHATWOOT_USER" &>/dev/null; then
|
||||
useradd -m -s /bin/bash -d "$CHATWOOT_HOME" "$CHATWOOT_USER"
|
||||
log_info "Created chatwoot user"
|
||||
fi
|
||||
|
||||
# Create necessary directories
|
||||
mkdir -p "$RAILS_LOG_DIR"
|
||||
chown -R "$CHATWOOT_USER:$CHATWOOT_USER" "$RAILS_LOG_DIR"
|
||||
chmod 755 "$RAILS_LOG_DIR"
|
||||
|
||||
log_success "Chatwoot user and directories created"
|
||||
}
|
||||
|
||||
# Function to setup PostgreSQL
|
||||
setup_postgresql() {
|
||||
log_info "Setting up PostgreSQL database..."
|
||||
|
||||
# Generate secure password
|
||||
local db_password=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 20; echo '')
|
||||
|
||||
# Start PostgreSQL
|
||||
systemctl start postgresql
|
||||
systemctl enable postgresql
|
||||
|
||||
# Create database and user
|
||||
sudo -u postgres psql <<EOF
|
||||
DROP DATABASE IF EXISTS chatwoot_production;
|
||||
DROP USER IF EXISTS chatwoot;
|
||||
CREATE USER chatwoot WITH PASSWORD '$db_password';
|
||||
CREATE DATABASE chatwoot_production OWNER chatwoot;
|
||||
GRANT ALL PRIVILEGES ON DATABASE chatwoot_production TO chatwoot;
|
||||
EOF
|
||||
|
||||
log_success "PostgreSQL database created"
|
||||
log_info "Database password: $db_password (save this for environment configuration)"
|
||||
}
|
||||
|
||||
# Function to setup Redis
|
||||
setup_redis() {
|
||||
log_info "Setting up Redis..."
|
||||
|
||||
systemctl start redis-server
|
||||
systemctl enable redis-server
|
||||
|
||||
log_success "Redis started and enabled"
|
||||
}
|
||||
|
||||
# Function to clone and setup Chatwoot
|
||||
setup_chatwoot() {
|
||||
log_info "Cloning Chatwoot repository..."
|
||||
|
||||
if [ ! -d "$CHATWOOT_APP_PATH" ]; then
|
||||
sudo -u "$CHATWOOT_USER" git clone https://github.com/chatwoot/chatwoot.git "$CHATWOOT_APP_PATH" 2>&1 | tee -a "$LOG_FILE"
|
||||
else
|
||||
log_warning "Chatwoot directory already exists"
|
||||
fi
|
||||
|
||||
cd "$CHATWOOT_APP_PATH"
|
||||
|
||||
# Checkout latest stable version
|
||||
log_info "Checking out latest release..."
|
||||
sudo -u "$CHATWOOT_USER" git fetch --tags 2>&1 | tee -a "$LOG_FILE"
|
||||
|
||||
# Setup environment file
|
||||
log_info "Setting up environment configuration..."
|
||||
if [ ! -f "$CHATWOOT_APP_PATH/.env" ]; then
|
||||
sudo -u "$CHATWOOT_USER" cp "$CHATWOOT_APP_PATH/.env.example" "$CHATWOOT_APP_PATH/.env"
|
||||
fi
|
||||
|
||||
# Update .env file with database credentials
|
||||
sudo -u "$CHATWOOT_USER" sed -i 's|POSTGRES_HOST=localhost|POSTGRES_HOST=localhost|g' "$CHATWOOT_APP_PATH/.env"
|
||||
sudo -u "$CHATWOOT_USER" sed -i 's|POSTGRES_USERNAME=postgres|POSTGRES_USERNAME=chatwoot|g' "$CHATWOOT_APP_PATH/.env"
|
||||
sudo -u "$CHATWOOT_USER" sed -i 's|POSTGRES_PASSWORD=|POSTGRES_PASSWORD=YOUR_DB_PASSWORD|g' "$CHATWOOT_APP_PATH/.env"
|
||||
|
||||
log_success "Chatwoot repository cloned and configured"
|
||||
}
|
||||
|
||||
# Function to install Ruby gems
|
||||
install_gems() {
|
||||
log_info "Installing Ruby gems (this may take a while)..."
|
||||
|
||||
cd "$CHATWOOT_APP_PATH"
|
||||
source /etc/profile.d/rvm.sh
|
||||
|
||||
sudo -u "$CHATWOOT_USER" bash -c "cd $CHATWOOT_APP_PATH && rvm use ruby-3.2.0 && bundle install --quiet" 2>&1 | tee -a "$LOG_FILE"
|
||||
|
||||
log_success "Ruby gems installed"
|
||||
}
|
||||
|
||||
# Function to compile assets
|
||||
compile_assets() {
|
||||
log_info "Compiling assets (this may take a while)..."
|
||||
|
||||
cd "$CHATWOOT_APP_PATH"
|
||||
source /etc/profile.d/rvm.sh
|
||||
|
||||
sudo -u "$CHATWOOT_USER" bash -c "cd $CHATWOOT_APP_PATH && rvm use ruby-3.2.0 && rake assets:precompile RAILS_ENV=production NODE_OPTIONS='--max-old-space-size=4096 --openssl-legacy-provider'" 2>&1 | tee -a "$LOG_FILE"
|
||||
|
||||
log_success "Assets compiled successfully"
|
||||
}
|
||||
|
||||
# Function to setup systemd services
|
||||
setup_systemd_services() {
|
||||
log_info "Setting up systemd services..."
|
||||
|
||||
# Copy service files
|
||||
cp "$CHATWOOT_APP_PATH/deployment/chatwoot-web.1.service" /etc/systemd/system/
|
||||
cp "$CHATWOOT_APP_PATH/deployment/chatwoot-web.target" /etc/systemd/system/
|
||||
cp "$CHATWOOT_APP_PATH/deployment/chatwoot-worker.1.service" /etc/systemd/system/
|
||||
cp "$CHATWOOT_APP_PATH/deployment/chatwoot-worker.target" /etc/systemd/system/
|
||||
|
||||
# Update service files for correct user and paths
|
||||
sed -i "s|User=chatwoot|User=$CHATWOOT_USER|g" /etc/systemd/system/chatwoot-web.1.service
|
||||
sed -i "s|User=chatwoot|User=$CHATWOOT_USER|g" /etc/systemd/system/chatwoot-worker.1.service
|
||||
sed -i "s|WorkingDirectory=/home/chatwoot/chatwoot|WorkingDirectory=$CHATWOOT_APP_PATH|g" /etc/systemd/system/chatwoot-web.1.service
|
||||
sed -i "s|WorkingDirectory=/home/chatwoot/chatwoot|WorkingDirectory=$CHATWOOT_APP_PATH|g" /etc/systemd/system/chatwoot-worker.1.service
|
||||
|
||||
systemctl daemon-reload
|
||||
systemctl enable chatwoot-web.target
|
||||
systemctl enable chatwoot-worker.target
|
||||
|
||||
log_success "Systemd services configured"
|
||||
}
|
||||
|
||||
# Function to start services
|
||||
start_services() {
|
||||
log_info "Starting Chatwoot services..."
|
||||
|
||||
systemctl start chatwoot-web.target
|
||||
systemctl start chatwoot-worker.target
|
||||
|
||||
# Wait for services to start
|
||||
sleep 5
|
||||
|
||||
if systemctl is-active --quiet chatwoot-web.target && systemctl is-active --quiet chatwoot-worker.target; then
|
||||
log_success "Chatwoot services started successfully"
|
||||
else
|
||||
log_error "Failed to start Chatwoot services"
|
||||
log_info "Check logs: journalctl -u chatwoot-web.target -f"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to setup Nginx
|
||||
setup_nginx() {
|
||||
log_info "Configuring Nginx as reverse proxy..."
|
||||
|
||||
# Create Nginx configuration
|
||||
cat > /etc/nginx/sites-available/chatwoot <<'EOF'
|
||||
server {
|
||||
listen 80;
|
||||
server_name _;
|
||||
|
||||
# Point upstream to Chatwoot App Server
|
||||
set $upstream 127.0.0.1:3000;
|
||||
|
||||
# Nginx strips out underscore in headers by default
|
||||
# Chatwoot relies on underscore in headers for API
|
||||
underscores_in_headers on;
|
||||
|
||||
location / {
|
||||
proxy_pass http://$upstream;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "Upgrade";
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_read_timeout 90;
|
||||
proxy_buffering off;
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
# Enable site
|
||||
ln -sf /etc/nginx/sites-available/chatwoot /etc/nginx/sites-enabled/chatwoot
|
||||
rm -f /etc/nginx/sites-enabled/default
|
||||
|
||||
# Test and reload Nginx
|
||||
if nginx -t >/dev/null 2>&1; then
|
||||
systemctl restart nginx
|
||||
log_success "Nginx configured and restarted"
|
||||
else
|
||||
log_error "Nginx configuration error"
|
||||
nginx -t
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to setup SSL with Let's Encrypt
|
||||
setup_ssl() {
|
||||
local domain="$1"
|
||||
local email="$2"
|
||||
|
||||
log_info "Setting up SSL certificate for $domain..."
|
||||
|
||||
certbot certonly --nginx -d "$domain" -m "$email" --agree-tos --non-interactive 2>&1 | tee -a "$LOG_FILE"
|
||||
|
||||
# Update Nginx configuration for HTTPS
|
||||
cat > /etc/nginx/sites-available/chatwoot <<EOF
|
||||
server {
|
||||
listen 80;
|
||||
server_name $domain;
|
||||
return 301 https://\$server_name\$request_uri;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
server_name $domain;
|
||||
|
||||
ssl_certificate /etc/letsencrypt/live/$domain/fullchain.pem;
|
||||
ssl_certificate_key /etc/letsencrypt/live/$domain/privkey.pem;
|
||||
ssl_protocols TLSv1.2 TLSv1.3;
|
||||
ssl_ciphers HIGH:!aNULL:!MD5;
|
||||
ssl_prefer_server_ciphers on;
|
||||
|
||||
set \$upstream 127.0.0.1:3000;
|
||||
underscores_in_headers on;
|
||||
|
||||
location / {
|
||||
proxy_pass http://\$upstream;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade \$http_upgrade;
|
||||
proxy_set_header Connection "Upgrade";
|
||||
proxy_set_header Host \$host;
|
||||
proxy_set_header X-Real-IP \$remote_addr;
|
||||
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto \$scheme;
|
||||
proxy_read_timeout 90;
|
||||
proxy_buffering off;
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
if nginx -t >/dev/null 2>&1; then
|
||||
systemctl restart nginx
|
||||
log_success "SSL certificate installed and Nginx configured"
|
||||
else
|
||||
log_error "Nginx configuration error"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Main installation flow
|
||||
main() {
|
||||
log_info "====== Chatwoot Installation Started ======"
|
||||
|
||||
# Detect Ubuntu version
|
||||
detect_ubuntu_version
|
||||
|
||||
# Check requirements
|
||||
if ! command_exists curl; then
|
||||
log_info "Installing curl first..."
|
||||
apt-get update -qq && apt-get install -y -qq curl
|
||||
fi
|
||||
|
||||
# Installation steps
|
||||
update_system
|
||||
install_dependencies
|
||||
setup_chatwoot_user
|
||||
setup_postgresql
|
||||
setup_redis
|
||||
setup_ruby
|
||||
setup_chatwoot
|
||||
install_gems
|
||||
compile_assets
|
||||
setup_systemd_services
|
||||
start_services
|
||||
setup_nginx
|
||||
|
||||
# Summary
|
||||
log_success "====== Chatwoot Installation Complete ======"
|
||||
echo ""
|
||||
echo -e "${GREEN}Chatwoot installation completed successfully!${NC}"
|
||||
echo ""
|
||||
echo "Access your Chatwoot instance at:"
|
||||
echo -e "${BLUE} http://$(hostname -I | awk '{print $1}'):3000${NC}"
|
||||
echo ""
|
||||
echo "To configure domain and SSL, run:"
|
||||
echo -e "${BLUE} sudo bash chatwoot_install.sh --ssl --domain yourdomain.com --email your@email.com${NC}"
|
||||
echo ""
|
||||
echo "Important next steps:"
|
||||
echo "1. Update .env file with correct database password"
|
||||
echo "2. Run database migrations: cd $CHATWOOT_APP_PATH && bundle exec rake db:migrate RAILS_ENV=production"
|
||||
echo "3. Create admin user and complete initial setup via web interface"
|
||||
echo ""
|
||||
echo "For logs, check: journalctl -u chatwoot-web.target -f"
|
||||
echo ""
|
||||
}
|
||||
|
||||
# Parse command line arguments
|
||||
CONFIGURE_SSL=false
|
||||
DOMAIN=""
|
||||
EMAIL=""
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
--ssl)
|
||||
CONFIGURE_SSL=true
|
||||
shift
|
||||
;;
|
||||
--domain)
|
||||
DOMAIN="$2"
|
||||
shift 2
|
||||
;;
|
||||
--email)
|
||||
EMAIL="$2"
|
||||
shift 2
|
||||
;;
|
||||
*)
|
||||
echo "Unknown option: $1"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Run main installation
|
||||
main
|
||||
|
||||
# Setup SSL if requested
|
||||
if [ "$CONFIGURE_SSL" = true ]; then
|
||||
if [ -z "$DOMAIN" ] || [ -z "$EMAIL" ]; then
|
||||
log_error "Domain and email are required for SSL setup"
|
||||
exit 1
|
||||
fi
|
||||
setup_ssl "$DOMAIN" "$EMAIL"
|
||||
fi
|
||||
Reference in New Issue
Block a user