remove developer docs files
This commit is contained in:
@@ -1,588 +0,0 @@
|
||||
---
|
||||
title: Local Development Setup
|
||||
description: Set up Chatwoot for local development on your machine
|
||||
sidebarTitle: Local Development
|
||||
---
|
||||
|
||||
# Local Development Setup
|
||||
|
||||
This guide will help you set up Chatwoot for local development on your machine. Follow these steps to get a complete development environment running.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
Before setting up Chatwoot locally, ensure you have the following installed:
|
||||
|
||||
### Required Software
|
||||
|
||||
<CardGroup cols={2}>
|
||||
<Card title="Ruby" icon="gem">
|
||||
Ruby 3.3.3 (managed with rbenv or RVM)
|
||||
</Card>
|
||||
<Card title="Node.js" icon="node-js">
|
||||
Node.js 20+ with pnpm package manager
|
||||
</Card>
|
||||
<Card title="PostgreSQL" icon="database">
|
||||
PostgreSQL 13+ for the database
|
||||
</Card>
|
||||
<Card title="Redis" icon="redis">
|
||||
Redis 6+ for caching and background jobs
|
||||
</Card>
|
||||
</CardGroup>
|
||||
|
||||
### System Dependencies
|
||||
|
||||
<Tabs>
|
||||
<Tab title="macOS">
|
||||
```bash
|
||||
# Install Homebrew if not already installed
|
||||
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
||||
|
||||
# Install dependencies
|
||||
brew install postgresql@15 redis imagemagick git
|
||||
|
||||
# Install rbenv for Ruby version management
|
||||
brew install rbenv ruby-build
|
||||
|
||||
# Install Node.js and pnpm
|
||||
brew install node
|
||||
npm install -g pnpm
|
||||
|
||||
# Start services
|
||||
brew services start postgresql@15
|
||||
brew services start redis
|
||||
```
|
||||
</Tab>
|
||||
|
||||
<Tab title="Ubuntu/Debian">
|
||||
```bash
|
||||
# Update package list
|
||||
sudo apt update
|
||||
|
||||
# Install dependencies
|
||||
sudo apt install -y curl git build-essential libssl-dev libreadline-dev \
|
||||
zlib1g-dev libpq-dev imagemagick libmagickwand-dev libffi-dev \
|
||||
postgresql postgresql-contrib redis-server
|
||||
|
||||
# Install rbenv
|
||||
curl -fsSL https://github.com/rbenv/rbenv-installer/raw/HEAD/bin/rbenv-installer | bash
|
||||
|
||||
# Install Node.js (using NodeSource)
|
||||
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
|
||||
sudo apt install -y nodejs
|
||||
|
||||
# Install pnpm
|
||||
npm install -g pnpm
|
||||
|
||||
# Start services
|
||||
sudo systemctl start postgresql
|
||||
sudo systemctl start redis-server
|
||||
sudo systemctl enable postgresql
|
||||
sudo systemctl enable redis-server
|
||||
```
|
||||
</Tab>
|
||||
|
||||
<Tab title="CentOS/RHEL">
|
||||
```bash
|
||||
# Install EPEL repository
|
||||
sudo yum install -y epel-release
|
||||
|
||||
# Install dependencies
|
||||
sudo yum groupinstall -y "Development Tools"
|
||||
sudo yum install -y curl git openssl-devel readline-devel zlib-devel \
|
||||
postgresql-devel ImageMagick-devel libffi-devel postgresql-server \
|
||||
postgresql-contrib redis
|
||||
|
||||
# Initialize PostgreSQL
|
||||
sudo postgresql-setup initdb
|
||||
|
||||
# Install rbenv
|
||||
curl -fsSL https://github.com/rbenv/rbenv-installer/raw/HEAD/bin/rbenv-installer | bash
|
||||
|
||||
# Install Node.js
|
||||
curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash -
|
||||
sudo yum install -y nodejs
|
||||
|
||||
# Install pnpm
|
||||
npm install -g pnpm
|
||||
|
||||
# Start services
|
||||
sudo systemctl start postgresql
|
||||
sudo systemctl start redis
|
||||
sudo systemctl enable postgresql
|
||||
sudo systemctl enable redis
|
||||
```
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
## Ruby Setup
|
||||
|
||||
### Install Ruby with rbenv
|
||||
|
||||
```bash
|
||||
# Add rbenv to your shell profile
|
||||
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
|
||||
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
|
||||
source ~/.bashrc
|
||||
|
||||
# Install Ruby 3.3.3
|
||||
rbenv install 3.3.3
|
||||
rbenv global 3.3.3
|
||||
|
||||
# Verify installation
|
||||
ruby --version
|
||||
# Should output: ruby 3.3.3
|
||||
|
||||
# Install bundler
|
||||
gem install bundler
|
||||
```
|
||||
|
||||
### Alternative: Using RVM
|
||||
|
||||
```bash
|
||||
# Install RVM
|
||||
curl -sSL https://get.rvm.io | bash -s stable
|
||||
source ~/.rvm/scripts/rvm
|
||||
|
||||
# Install Ruby 3.3.3
|
||||
rvm install 3.3.3
|
||||
rvm use 3.3.3 --default
|
||||
|
||||
# Verify installation
|
||||
ruby --version
|
||||
gem install bundler
|
||||
```
|
||||
|
||||
## Database Setup
|
||||
|
||||
### PostgreSQL Configuration
|
||||
|
||||
```bash
|
||||
# Create PostgreSQL user (macOS with Homebrew)
|
||||
createuser -s chatwoot
|
||||
|
||||
# Create PostgreSQL user (Linux)
|
||||
sudo -u postgres createuser -s chatwoot
|
||||
|
||||
# Set password for the user
|
||||
sudo -u postgres psql
|
||||
postgres=# ALTER USER chatwoot PASSWORD 'password';
|
||||
postgres=# \q
|
||||
|
||||
# Create databases
|
||||
createdb chatwoot_development
|
||||
createdb chatwoot_test
|
||||
```
|
||||
|
||||
### PostgreSQL Authentication Setup
|
||||
|
||||
Edit PostgreSQL configuration to allow local connections:
|
||||
|
||||
```bash
|
||||
# Find pg_hba.conf location
|
||||
sudo -u postgres psql -c "SHOW hba_file;"
|
||||
|
||||
# Edit the file (example path)
|
||||
sudo nano /etc/postgresql/15/main/pg_hba.conf
|
||||
|
||||
# Add or modify these lines:
|
||||
local all chatwoot md5
|
||||
host all chatwoot 127.0.0.1/32 md5
|
||||
host all chatwoot ::1/128 md5
|
||||
|
||||
# Restart PostgreSQL
|
||||
sudo systemctl restart postgresql
|
||||
```
|
||||
|
||||
## Project Setup
|
||||
|
||||
### Clone the Repository
|
||||
|
||||
```bash
|
||||
# Fork the repository on GitHub first, then clone your fork
|
||||
git clone https://github.com/YOUR_USERNAME/chatwoot.git
|
||||
cd chatwoot
|
||||
|
||||
# Add upstream remote
|
||||
git remote add upstream https://github.com/chatwoot/chatwoot.git
|
||||
|
||||
# Verify remotes
|
||||
git remote -v
|
||||
```
|
||||
|
||||
### Install Dependencies
|
||||
|
||||
```bash
|
||||
# Install Ruby dependencies
|
||||
bundle install
|
||||
|
||||
# Install Node.js dependencies
|
||||
pnpm install
|
||||
|
||||
# Install Playwright for E2E tests (optional)
|
||||
pnpm exec playwright install
|
||||
```
|
||||
|
||||
### Environment Configuration
|
||||
|
||||
```bash
|
||||
# Copy environment file
|
||||
cp .env.example .env
|
||||
|
||||
# Edit the environment file
|
||||
nano .env
|
||||
```
|
||||
|
||||
Update the `.env` file with your local configuration:
|
||||
|
||||
```bash
|
||||
# Database configuration
|
||||
DATABASE_URL=postgresql://chatwoot:password@localhost:5432/chatwoot_development
|
||||
REDIS_URL=redis://localhost:6379/0
|
||||
|
||||
# Application settings
|
||||
FRONTEND_URL=http://localhost:3000
|
||||
FORCE_SSL=false
|
||||
RAILS_ENV=development
|
||||
NODE_ENV=development
|
||||
|
||||
# Email configuration (for development)
|
||||
MAILER_SENDER_EMAIL=dev@chatwoot.local
|
||||
SMTP_ADDRESS=localhost
|
||||
SMTP_PORT=1025
|
||||
|
||||
# File storage (local)
|
||||
ACTIVE_STORAGE_SERVICE=local
|
||||
|
||||
# Development features
|
||||
ENABLE_DEVELOPMENT_FEATURES=true
|
||||
LOG_LEVEL=debug
|
||||
```
|
||||
|
||||
### Database Initialization
|
||||
|
||||
```bash
|
||||
# Create and migrate the database
|
||||
bundle exec rails db:create
|
||||
bundle exec rails db:migrate
|
||||
|
||||
# Seed the database with sample data
|
||||
bundle exec rails db:seed
|
||||
|
||||
# Prepare the test database
|
||||
RAILS_ENV=test bundle exec rails db:create
|
||||
RAILS_ENV=test bundle exec rails db:migrate
|
||||
```
|
||||
|
||||
## Running the Application
|
||||
|
||||
### Start Development Servers
|
||||
|
||||
You'll need to run multiple processes for full development:
|
||||
|
||||
#### Option 1: Using Foreman (Recommended)
|
||||
|
||||
```bash
|
||||
# Install foreman
|
||||
gem install foreman
|
||||
|
||||
# Start all services
|
||||
foreman start -f Procfile.dev
|
||||
```
|
||||
|
||||
#### Option 2: Manual Process Management
|
||||
|
||||
Open multiple terminal windows/tabs:
|
||||
|
||||
```bash
|
||||
# Terminal 1: Rails server
|
||||
bundle exec rails server -p 3000
|
||||
|
||||
# Terminal 2: Webpack dev server
|
||||
pnpm run dev
|
||||
|
||||
# Terminal 3: Sidekiq worker
|
||||
bundle exec sidekiq
|
||||
|
||||
# Terminal 4: MailHog (for email testing)
|
||||
mailhog
|
||||
```
|
||||
|
||||
### Access the Application
|
||||
|
||||
Once all services are running:
|
||||
|
||||
- **Web Application**: http://localhost:3000
|
||||
- **API Documentation**: http://localhost:3000/swagger
|
||||
- **Sidekiq Web UI**: http://localhost:3000/sidekiq
|
||||
- **MailHog (Email)**: http://localhost:8025
|
||||
|
||||
### Default Login Credentials
|
||||
|
||||
After seeding the database, you can log in with:
|
||||
|
||||
- **Email**: john@acme.inc
|
||||
- **Password**: Password1!
|
||||
|
||||
## Development Tools
|
||||
|
||||
### Code Quality Tools
|
||||
|
||||
```bash
|
||||
# Install development gems
|
||||
bundle install --with development test
|
||||
|
||||
# Run RuboCop (Ruby linter)
|
||||
bundle exec rubocop
|
||||
|
||||
# Run RuboCop with auto-fix
|
||||
bundle exec rubocop -a
|
||||
|
||||
# Run ESLint (JavaScript linter)
|
||||
pnpm run lint
|
||||
|
||||
# Run ESLint with auto-fix
|
||||
pnpm run lint:fix
|
||||
|
||||
# Run Prettier (code formatter)
|
||||
pnpm run format
|
||||
```
|
||||
|
||||
### Testing
|
||||
|
||||
```bash
|
||||
# Run Ruby tests
|
||||
bundle exec rspec
|
||||
|
||||
# Run specific test file
|
||||
bundle exec rspec spec/models/user_spec.rb
|
||||
|
||||
# Run JavaScript tests
|
||||
pnpm run test
|
||||
|
||||
# Run E2E tests
|
||||
pnpm run test:e2e
|
||||
|
||||
# Run tests with coverage
|
||||
COVERAGE=true bundle exec rspec
|
||||
```
|
||||
|
||||
### Database Operations
|
||||
|
||||
```bash
|
||||
# Reset database
|
||||
bundle exec rails db:drop db:create db:migrate db:seed
|
||||
|
||||
# Generate migration
|
||||
bundle exec rails generate migration AddColumnToTable column:type
|
||||
|
||||
# Run migrations
|
||||
bundle exec rails db:migrate
|
||||
|
||||
# Rollback migration
|
||||
bundle exec rails db:rollback
|
||||
|
||||
# Check migration status
|
||||
bundle exec rails db:migrate:status
|
||||
```
|
||||
|
||||
## IDE and Editor Setup
|
||||
|
||||
### VS Code Configuration
|
||||
|
||||
Create `.vscode/settings.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
"ruby.intellisense": "rubyLocate",
|
||||
"ruby.codeCompletion": "rcodetools",
|
||||
"ruby.format": "rubocop",
|
||||
"editor.formatOnSave": true,
|
||||
"editor.rulers": [120],
|
||||
"files.trimTrailingWhitespace": true,
|
||||
"files.insertFinalNewline": true,
|
||||
"eslint.autoFixOnSave": true,
|
||||
"prettier.requireConfig": true
|
||||
}
|
||||
```
|
||||
|
||||
### Recommended VS Code Extensions
|
||||
|
||||
```json
|
||||
{
|
||||
"recommendations": [
|
||||
"rebornix.ruby",
|
||||
"wingrunr21.vscode-ruby",
|
||||
"bradlc.vscode-tailwindcss",
|
||||
"esbenp.prettier-vscode",
|
||||
"dbaeumer.vscode-eslint",
|
||||
"ms-vscode.vscode-typescript-next",
|
||||
"bradlc.vscode-tailwindcss"
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### RubyMine Configuration
|
||||
|
||||
1. Open the project in RubyMine
|
||||
2. Configure Ruby SDK: File → Project Structure → SDKs
|
||||
3. Set up database connection in Database tool window
|
||||
4. Configure code style: File → Settings → Editor → Code Style
|
||||
|
||||
## Debugging
|
||||
|
||||
### Rails Debugging
|
||||
|
||||
```ruby
|
||||
# Add to your code for debugging
|
||||
binding.pry
|
||||
|
||||
# Or use the built-in debugger
|
||||
debugger
|
||||
```
|
||||
|
||||
### JavaScript Debugging
|
||||
|
||||
```javascript
|
||||
// Add to your code
|
||||
console.log('Debug info:', variable);
|
||||
debugger;
|
||||
```
|
||||
|
||||
### Database Debugging
|
||||
|
||||
```bash
|
||||
# Rails console
|
||||
bundle exec rails console
|
||||
|
||||
# Database console
|
||||
bundle exec rails dbconsole
|
||||
|
||||
# Check database queries in logs
|
||||
tail -f log/development.log | grep SQL
|
||||
```
|
||||
|
||||
## Common Issues and Solutions
|
||||
|
||||
### Bundle Install Issues
|
||||
|
||||
<Accordion title="pg gem installation fails">
|
||||
```bash
|
||||
# macOS
|
||||
brew install postgresql
|
||||
bundle config build.pg --with-pg-config=/usr/local/bin/pg_config
|
||||
|
||||
# Ubuntu/Debian
|
||||
sudo apt-get install libpq-dev
|
||||
bundle install
|
||||
```
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="ImageMagick issues">
|
||||
```bash
|
||||
# macOS
|
||||
brew install imagemagick pkg-config
|
||||
|
||||
# Ubuntu/Debian
|
||||
sudo apt-get install libmagickwand-dev
|
||||
|
||||
# Then reinstall the gem
|
||||
bundle pristine rmagick
|
||||
```
|
||||
</Accordion>
|
||||
|
||||
### Node.js Issues
|
||||
|
||||
<Accordion title="pnpm install fails">
|
||||
```bash
|
||||
# Clear cache and reinstall
|
||||
pnpm store prune
|
||||
rm -rf node_modules
|
||||
pnpm install
|
||||
```
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Webpack compilation errors">
|
||||
```bash
|
||||
# Clear webpack cache
|
||||
rm -rf tmp/cache/webpacker
|
||||
pnpm run dev
|
||||
```
|
||||
</Accordion>
|
||||
|
||||
### Database Issues
|
||||
|
||||
<Accordion title="Database connection refused">
|
||||
```bash
|
||||
# Check if PostgreSQL is running
|
||||
sudo systemctl status postgresql
|
||||
|
||||
# Start PostgreSQL if not running
|
||||
sudo systemctl start postgresql
|
||||
|
||||
# Check connection
|
||||
psql -U chatwoot -d chatwoot_development -h localhost
|
||||
```
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Permission denied for database">
|
||||
```bash
|
||||
# Reset PostgreSQL user password
|
||||
sudo -u postgres psql
|
||||
postgres=# ALTER USER chatwoot PASSWORD 'password';
|
||||
postgres=# \q
|
||||
```
|
||||
</Accordion>
|
||||
|
||||
## Performance Optimization
|
||||
|
||||
### Development Performance Tips
|
||||
|
||||
```bash
|
||||
# Use spring for faster Rails commands
|
||||
bundle exec spring binstub --all
|
||||
|
||||
# Use bootsnap for faster boot times (already included)
|
||||
# Ensure tmp/cache directory exists
|
||||
mkdir -p tmp/cache
|
||||
|
||||
# Use parallel testing
|
||||
bundle exec rspec --parallel
|
||||
|
||||
# Optimize database queries
|
||||
# Add to config/environments/development.rb
|
||||
config.active_record.verbose_query_logs = true
|
||||
```
|
||||
|
||||
### Memory Usage Optimization
|
||||
|
||||
```bash
|
||||
# Monitor memory usage
|
||||
ps aux | grep ruby
|
||||
ps aux | grep node
|
||||
|
||||
# Use jemalloc for better memory management
|
||||
export MALLOC_ARENA_MAX=2
|
||||
bundle exec rails server
|
||||
```
|
||||
|
||||
## Next Steps
|
||||
|
||||
Once you have your development environment set up:
|
||||
|
||||
1. **Read the Contributing Guidelines**: Check out the [contributing guide](../introduction) for code standards and workflow
|
||||
2. **Explore the Codebase**: Familiarize yourself with the project structure
|
||||
3. **Pick an Issue**: Look for "good first issue" labels on GitHub
|
||||
4. **Join the Community**: Connect with other contributors on Discord or GitHub Discussions
|
||||
|
||||
## Getting Help
|
||||
|
||||
If you encounter issues during setup:
|
||||
|
||||
- **GitHub Issues**: Search existing issues or create a new one
|
||||
- **Discord Community**: Join the Chatwoot Discord server
|
||||
- **Documentation**: Check the official documentation
|
||||
- **Stack Overflow**: Search for Chatwoot-related questions
|
||||
|
||||
---
|
||||
|
||||
You're now ready to start contributing to Chatwoot! The development environment should be fully functional and ready for coding.
|
||||
@@ -1,322 +0,0 @@
|
||||
---
|
||||
title: Contributing to Chatwoot
|
||||
description: Complete guide to contributing to Chatwoot - from setting up your development environment to submitting pull requests.
|
||||
sidebarTitle: Introduction
|
||||
---
|
||||
|
||||
Thank you for your interest in contributing to Chatwoot! This guide will help you get started with contributing to our open-source customer support platform. Whether you're fixing bugs, adding features, or improving documentation, your contributions are valuable to the community.
|
||||
|
||||
## Why Contribute to Chatwoot?
|
||||
|
||||
Contributing to Chatwoot offers many benefits:
|
||||
|
||||
- **Learn and Grow**: Work with modern technologies like Ruby on Rails, Vue.js, and PostgreSQL
|
||||
- **Make an Impact**: Help thousands of businesses improve their customer support
|
||||
- **Build Your Portfolio**: Showcase your contributions to a popular open-source project
|
||||
- **Join the Community**: Connect with developers and users from around the world
|
||||
- **Give Back**: Support the open-source ecosystem
|
||||
|
||||
## Ways to Contribute
|
||||
|
||||
There are many ways to contribute to Chatwoot:
|
||||
|
||||
### 🐛 Bug Reports and Fixes
|
||||
- Report bugs you encounter
|
||||
- Fix existing bugs in the codebase
|
||||
- Improve error handling and edge cases
|
||||
|
||||
### ✨ Feature Development
|
||||
- Implement new features
|
||||
- Enhance existing functionality
|
||||
- Improve user experience
|
||||
|
||||
### 📚 Documentation
|
||||
- Improve existing documentation
|
||||
- Write new guides and tutorials
|
||||
- Translate documentation to other languages
|
||||
|
||||
### 🧪 Testing
|
||||
- Write unit and integration tests
|
||||
- Perform manual testing
|
||||
- Improve test coverage
|
||||
|
||||
### 🎨 Design and UX
|
||||
- Improve user interface design
|
||||
- Enhance user experience
|
||||
- Create mockups and prototypes
|
||||
|
||||
### 🌍 Localization
|
||||
- Translate Chatwoot to new languages
|
||||
- Improve existing translations
|
||||
- Help with internationalization
|
||||
|
||||
## Getting Started
|
||||
|
||||
### Prerequisites
|
||||
|
||||
Before you start contributing, make sure you have:
|
||||
|
||||
- **Git**: Version control system
|
||||
- **GitHub Account**: For submitting pull requests
|
||||
- **Development Environment**: See our environment setup guides
|
||||
- **Basic Knowledge**: Familiarity with Ruby, JavaScript, or the technology you want to work with
|
||||
|
||||
### Development Workflow
|
||||
|
||||
Our development workflow follows these steps:
|
||||
|
||||
1. **Find an Issue**: Look for issues tagged with "Good first issue" or create a new one
|
||||
2. **Fork the Repository**: Create your own copy of the Chatwoot repository
|
||||
3. **Create a Branch**: Make a feature branch for your changes
|
||||
4. **Make Changes**: Implement your fix or feature
|
||||
5. **Test Your Changes**: Ensure everything works correctly
|
||||
6. **Submit a Pull Request**: Open a PR with a clear description
|
||||
7. **Code Review**: Collaborate with maintainers to refine your changes
|
||||
8. **Merge**: Your contribution becomes part of Chatwoot!
|
||||
|
||||
## Before You Start
|
||||
|
||||
### 1. Check Existing Issues
|
||||
|
||||
Before starting work, check if someone else is already working on the same issue:
|
||||
|
||||
- Browse [open issues](https://github.com/chatwoot/chatwoot/issues)
|
||||
- Look for issues labeled "Good first issue" for beginners
|
||||
- Check if there's an existing pull request for the same feature
|
||||
|
||||
### 2. Create or Comment on an Issue
|
||||
|
||||
- **For new features**: Create an issue to discuss the feature before implementing
|
||||
- **For existing issues**: Comment that you'd like to work on it
|
||||
- **Wait for assignment**: This helps avoid duplicate work
|
||||
|
||||
### 3. Understand the Codebase
|
||||
|
||||
Familiarize yourself with:
|
||||
- **Architecture**: How Chatwoot is structured
|
||||
- **Coding Standards**: Our style guides and conventions
|
||||
- **Testing Practices**: How we write and run tests
|
||||
|
||||
## Pull Request Guidelines
|
||||
|
||||
### Branch Naming
|
||||
|
||||
Use descriptive branch names that follow our conventions:
|
||||
|
||||
```bash
|
||||
# Feature branches
|
||||
feature/issue-id-short-description
|
||||
feature/235-contact-panel
|
||||
|
||||
# Bug fix branches
|
||||
fix/issue-id-short-description
|
||||
fix/123-email-validation
|
||||
|
||||
# Chore branches
|
||||
chore/update-dependencies
|
||||
chore/improve-documentation
|
||||
```
|
||||
|
||||
### Commit Messages
|
||||
|
||||
Write clear, descriptive commit messages:
|
||||
|
||||
```bash
|
||||
# Good commit messages
|
||||
feat: Add contact search functionality (#235)
|
||||
fix: Resolve email validation issue (#123)
|
||||
docs: Update installation guide
|
||||
test: Add unit tests for contact model
|
||||
|
||||
# Avoid
|
||||
Update stuff
|
||||
Fix bug
|
||||
WIP
|
||||
```
|
||||
|
||||
### Pull Request Template
|
||||
|
||||
When creating a pull request, include:
|
||||
|
||||
**Description:**
|
||||
- Clear description of what the PR does
|
||||
- Link to related issues
|
||||
- Screenshots for UI changes
|
||||
|
||||
**Testing:**
|
||||
- How you tested the changes
|
||||
- Test cases covered
|
||||
- Any manual testing performed
|
||||
|
||||
**Checklist:**
|
||||
- [ ] Code follows style guidelines
|
||||
- [ ] Self-review completed
|
||||
- [ ] Tests added/updated
|
||||
- [ ] Documentation updated
|
||||
- [ ] No breaking changes (or clearly documented)
|
||||
|
||||
### Example Pull Request
|
||||
|
||||
```markdown
|
||||
## Description
|
||||
Adds a new contact search feature that allows agents to quickly find contacts by name, email, or phone number.
|
||||
|
||||
Fixes #235
|
||||
|
||||
## Changes Made
|
||||
- Added search input to contact panel
|
||||
- Implemented backend search API
|
||||
- Added debounced search functionality
|
||||
- Updated contact list component
|
||||
|
||||
## Testing
|
||||
- Added unit tests for search API
|
||||
- Tested search with various input types
|
||||
- Verified performance with large contact lists
|
||||
- Manual testing on different browsers
|
||||
|
||||
## Screenshots
|
||||
[Include screenshots of the new feature]
|
||||
|
||||
## Checklist
|
||||
- [x] Code follows style guidelines
|
||||
- [x] Self-review completed
|
||||
- [x] Tests added
|
||||
- [x] Documentation updated
|
||||
- [x] No breaking changes
|
||||
```
|
||||
|
||||
## Code Standards
|
||||
|
||||
### Ruby/Rails Standards
|
||||
|
||||
- Follow [Ruby Style Guide](https://rubystyle.guide/)
|
||||
- Use [RuboCop](https://github.com/rubocop/rubocop) for linting
|
||||
- Write descriptive method and variable names
|
||||
- Add comments for complex logic
|
||||
- Follow Rails conventions
|
||||
|
||||
### JavaScript/Vue.js Standards
|
||||
|
||||
- Follow [JavaScript Standard Style](https://standardjs.com/)
|
||||
- Use [ESLint](https://eslint.org/) for linting
|
||||
- Write modular, reusable components
|
||||
- Use meaningful component and variable names
|
||||
- Follow Vue.js best practices
|
||||
|
||||
### Testing Standards
|
||||
|
||||
- Write tests for new features
|
||||
- Maintain or improve test coverage
|
||||
- Use descriptive test names
|
||||
- Test both happy path and edge cases
|
||||
- Mock external dependencies
|
||||
|
||||
## Development Environment
|
||||
|
||||
Choose your preferred development environment:
|
||||
|
||||
<CardGroup cols={2}>
|
||||
<Card title="macOS Setup" icon="apple" href="/contributing/environment-setup/macos">
|
||||
Set up development environment on macOS
|
||||
</Card>
|
||||
<Card title="Ubuntu Setup" icon="ubuntu" href="/contributing/environment-setup/ubuntu">
|
||||
Set up development environment on Ubuntu Linux
|
||||
</Card>
|
||||
<Card title="Windows Setup" icon="windows" href="/contributing/environment-setup/windows">
|
||||
Set up development environment on Windows
|
||||
</Card>
|
||||
<Card title="Docker Setup" icon="docker" href="/contributing/environment-setup/docker">
|
||||
Use Docker for consistent development environment
|
||||
</Card>
|
||||
</CardGroup>
|
||||
|
||||
## Issue Labels
|
||||
|
||||
Understanding our issue labels helps you find the right issues to work on:
|
||||
|
||||
| Label | Description |
|
||||
|-------|-------------|
|
||||
| `good first issue` | Perfect for new contributors |
|
||||
| `help wanted` | Community help needed |
|
||||
| `bug` | Something isn't working |
|
||||
| `enhancement` | New feature or improvement |
|
||||
| `documentation` | Documentation improvements |
|
||||
| `question` | Further information requested |
|
||||
| `wontfix` | This will not be worked on |
|
||||
| `duplicate` | This issue already exists |
|
||||
|
||||
## Community Guidelines
|
||||
|
||||
### Be Respectful
|
||||
|
||||
- Treat everyone with respect and kindness
|
||||
- Be patient with new contributors
|
||||
- Provide constructive feedback
|
||||
- Help others learn and grow
|
||||
|
||||
### Communication
|
||||
|
||||
- Use clear, concise language
|
||||
- Ask questions when unsure
|
||||
- Share knowledge and resources
|
||||
- Be responsive to feedback
|
||||
|
||||
### Collaboration
|
||||
|
||||
- Work together towards common goals
|
||||
- Share credit for collaborative work
|
||||
- Help review others' contributions
|
||||
- Mentor new contributors
|
||||
|
||||
## Getting Help
|
||||
|
||||
If you need help while contributing:
|
||||
|
||||
### Documentation
|
||||
- Read our comprehensive guides
|
||||
- Check the API documentation
|
||||
- Review existing code examples
|
||||
|
||||
### Community Support
|
||||
- **Discord**: [Join our community chat](https://discord.gg/cJXdrwS)
|
||||
- **GitHub Discussions**: [Ask questions and share ideas](https://github.com/chatwoot/chatwoot/discussions)
|
||||
- **Issues**: Create an issue for bugs or feature requests
|
||||
|
||||
### Maintainer Support
|
||||
- Tag maintainers in issues or PRs when needed
|
||||
- Be patient - maintainers are volunteers
|
||||
- Provide detailed information when asking for help
|
||||
|
||||
## Recognition
|
||||
|
||||
We value all contributions and recognize contributors in several ways:
|
||||
|
||||
- **Contributors Page**: Listed on our website and README
|
||||
- **Release Notes**: Mentioned in release announcements
|
||||
- **Social Media**: Highlighted on our social channels
|
||||
- **Swag**: Occasional contributor swag for significant contributions
|
||||
|
||||
## Code of Conduct
|
||||
|
||||
All contributors must follow our [Code of Conduct](https://github.com/chatwoot/chatwoot/blob/develop/CODE_OF_CONDUCT.md). We are committed to providing a welcoming and inclusive environment for everyone.
|
||||
|
||||
## Next Steps
|
||||
|
||||
Ready to start contributing? Here's what to do next:
|
||||
|
||||
1. **Set up your development environment** using one of our setup guides
|
||||
2. **Find a good first issue** to work on
|
||||
3. **Fork the repository** and create a feature branch
|
||||
4. **Make your changes** following our guidelines
|
||||
5. **Submit a pull request** with a clear description
|
||||
|
||||
---
|
||||
|
||||
<Note>
|
||||
Remember, contributing to open source is a learning process. Don't be afraid to ask questions, make mistakes, and learn from the community. Every contribution, no matter how small, makes a difference!
|
||||
</Note>
|
||||
|
||||
<Tip>
|
||||
Start small with documentation improvements or bug fixes to get familiar with the codebase and contribution process before tackling larger features.
|
||||
</Tip>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,658 +0,0 @@
|
||||
---
|
||||
title: Environment Variables for Development
|
||||
description: Complete guide to environment variables for Chatwoot development and testing
|
||||
sidebarTitle: Environment Variables
|
||||
---
|
||||
|
||||
# Environment Variables for Development
|
||||
|
||||
This guide covers environment variables specifically for development and testing environments. For production environment variables, see the [Self-hosted Environment Variables](../../self-hosted/configuration/environment-variables) guide.
|
||||
|
||||
## Development Environment Setup
|
||||
|
||||
### Basic Development Configuration
|
||||
|
||||
Create your `.env` file from the example:
|
||||
|
||||
```bash
|
||||
cp .env.example .env
|
||||
```
|
||||
|
||||
### Essential Development Variables
|
||||
|
||||
```bash
|
||||
# Rails Environment
|
||||
RAILS_ENV=development
|
||||
NODE_ENV=development
|
||||
|
||||
# Application Configuration
|
||||
FRONTEND_URL=http://localhost:3000
|
||||
FORCE_SSL=false
|
||||
SECRET_KEY_BASE=your-secret-key-here
|
||||
|
||||
# Database Configuration
|
||||
DATABASE_URL=postgresql://chatwoot:password@localhost:5432/chatwoot_development
|
||||
REDIS_URL=redis://localhost:6379/0
|
||||
|
||||
# Development Features
|
||||
ENABLE_DEVELOPMENT_FEATURES=true
|
||||
RAILS_LOG_LEVEL=debug
|
||||
LOG_LEVEL=debug
|
||||
```
|
||||
|
||||
## Database Configuration
|
||||
|
||||
### PostgreSQL Settings
|
||||
|
||||
```bash
|
||||
# Primary database connection
|
||||
DATABASE_URL=postgresql://username:password@localhost:5432/chatwoot_development
|
||||
|
||||
# Alternative format (individual variables)
|
||||
DB_HOST=localhost
|
||||
DB_PORT=5432
|
||||
DB_USERNAME=chatwoot
|
||||
DB_PASSWORD=password
|
||||
DB_NAME=chatwoot_development
|
||||
|
||||
# Test database
|
||||
TEST_DATABASE_URL=postgresql://username:password@localhost:5432/chatwoot_test
|
||||
```
|
||||
|
||||
### Redis Configuration
|
||||
|
||||
```bash
|
||||
# Redis connection for development
|
||||
REDIS_URL=redis://localhost:6379/0
|
||||
|
||||
# Redis with authentication
|
||||
REDIS_URL=redis://:password@localhost:6379/0
|
||||
|
||||
# Redis Sentinel (for advanced setups)
|
||||
REDIS_SENTINELS=localhost:26379
|
||||
REDIS_SENTINEL_MASTER_NAME=mymaster
|
||||
|
||||
# Sidekiq Redis (can be separate)
|
||||
SIDEKIQ_REDIS_URL=redis://localhost:6379/1
|
||||
```
|
||||
|
||||
## Email Configuration for Development
|
||||
|
||||
### Local Email Testing
|
||||
|
||||
```bash
|
||||
# MailHog configuration (recommended for development)
|
||||
MAILER_SENDER_EMAIL=dev@chatwoot.local
|
||||
SMTP_ADDRESS=localhost
|
||||
SMTP_PORT=1025
|
||||
SMTP_DOMAIN=chatwoot.local
|
||||
SMTP_ENABLE_STARTTLS_AUTO=false
|
||||
SMTP_TLS=false
|
||||
|
||||
# Alternative: Letter Opener (emails open in browser)
|
||||
LETTER_OPENER=true
|
||||
```
|
||||
|
||||
### Gmail SMTP (for testing real emails)
|
||||
|
||||
```bash
|
||||
MAILER_SENDER_EMAIL=your-email@gmail.com
|
||||
SMTP_ADDRESS=smtp.gmail.com
|
||||
SMTP_PORT=587
|
||||
SMTP_USERNAME=your-email@gmail.com
|
||||
SMTP_PASSWORD=your-app-password
|
||||
SMTP_DOMAIN=gmail.com
|
||||
SMTP_ENABLE_STARTTLS_AUTO=true
|
||||
SMTP_TLS=true
|
||||
```
|
||||
|
||||
### Mailtrap (for testing)
|
||||
|
||||
```bash
|
||||
MAILER_SENDER_EMAIL=dev@chatwoot.local
|
||||
SMTP_ADDRESS=smtp.mailtrap.io
|
||||
SMTP_PORT=2525
|
||||
SMTP_USERNAME=your-mailtrap-username
|
||||
SMTP_PASSWORD=your-mailtrap-password
|
||||
SMTP_DOMAIN=chatwoot.local
|
||||
```
|
||||
|
||||
## File Storage Configuration
|
||||
|
||||
### Local Storage (Default for Development)
|
||||
|
||||
```bash
|
||||
ACTIVE_STORAGE_SERVICE=local
|
||||
```
|
||||
|
||||
### AWS S3 for Development
|
||||
|
||||
```bash
|
||||
ACTIVE_STORAGE_SERVICE=amazon
|
||||
AWS_ACCESS_KEY_ID=your-access-key
|
||||
AWS_SECRET_ACCESS_KEY=your-secret-key
|
||||
AWS_REGION=us-east-1
|
||||
AWS_BUCKET_NAME=chatwoot-dev-bucket
|
||||
```
|
||||
|
||||
### Google Cloud Storage
|
||||
|
||||
```bash
|
||||
ACTIVE_STORAGE_SERVICE=google
|
||||
GCS_PROJECT_ID=your-project-id
|
||||
GCS_CREDENTIALS=path/to/credentials.json
|
||||
GCS_BUCKET=chatwoot-dev-bucket
|
||||
```
|
||||
|
||||
## Development Features
|
||||
|
||||
### Debug and Logging
|
||||
|
||||
```bash
|
||||
# Enable development features
|
||||
ENABLE_DEVELOPMENT_FEATURES=true
|
||||
|
||||
# Logging levels
|
||||
RAILS_LOG_LEVEL=debug
|
||||
LOG_LEVEL=debug
|
||||
SIDEKIQ_LOG_LEVEL=debug
|
||||
|
||||
# SQL query logging
|
||||
ACTIVE_RECORD_VERBOSE_QUERY_LOGS=true
|
||||
|
||||
# Bullet gem for N+1 query detection
|
||||
BULLET_ENABLED=true
|
||||
```
|
||||
|
||||
### Performance Monitoring
|
||||
|
||||
```bash
|
||||
# Enable query analysis
|
||||
QUERY_ANALYSIS=true
|
||||
|
||||
# Memory profiling
|
||||
MEMORY_PROFILER=true
|
||||
|
||||
# Rack Mini Profiler
|
||||
RACK_MINI_PROFILER=true
|
||||
|
||||
# Benchmark mode
|
||||
BENCHMARK_MODE=true
|
||||
```
|
||||
|
||||
### Code Quality Tools
|
||||
|
||||
```bash
|
||||
# RuboCop configuration
|
||||
RUBOCOP_PARALLEL=true
|
||||
|
||||
# Coverage reporting
|
||||
COVERAGE=true
|
||||
SIMPLECOV_FORMATTER=html
|
||||
|
||||
# Test environment
|
||||
RSPEC_RETRY_COUNT=3
|
||||
PARALLEL_TEST_PROCESSORS=4
|
||||
```
|
||||
|
||||
## Testing Environment Variables
|
||||
|
||||
### Test Database Configuration
|
||||
|
||||
```bash
|
||||
# Test environment
|
||||
RAILS_ENV=test
|
||||
|
||||
# Test database
|
||||
TEST_DATABASE_URL=postgresql://username:password@localhost:5432/chatwoot_test
|
||||
|
||||
# Test Redis
|
||||
TEST_REDIS_URL=redis://localhost:6379/15
|
||||
|
||||
# Disable external services in tests
|
||||
DISABLE_EXTERNAL_HTTP=true
|
||||
MOCK_EXTERNAL_SERVICES=true
|
||||
```
|
||||
|
||||
### Test-Specific Settings
|
||||
|
||||
```bash
|
||||
# Faster tests
|
||||
RAILS_ENV=test
|
||||
DISABLE_SPRING=true
|
||||
PARALLEL_WORKERS=4
|
||||
|
||||
# Test coverage
|
||||
COVERAGE=true
|
||||
COVERAGE_REPORTS=true
|
||||
|
||||
# Selenium/Capybara configuration
|
||||
SELENIUM_REMOTE_URL=http://localhost:4444/wd/hub
|
||||
CAPYBARA_SERVER_PORT=3001
|
||||
HEADLESS_CHROME=true
|
||||
|
||||
# Factory Bot settings
|
||||
FACTORY_BOT_ALLOW_CLASS_LOOKUP=false
|
||||
```
|
||||
|
||||
## Integration Testing
|
||||
|
||||
### External Service Mocking
|
||||
|
||||
```bash
|
||||
# Mock external APIs
|
||||
MOCK_FACEBOOK_API=true
|
||||
MOCK_TWITTER_API=true
|
||||
MOCK_WHATSAPP_API=true
|
||||
MOCK_TELEGRAM_API=true
|
||||
|
||||
# Webhook testing
|
||||
WEBHOOK_TEST_URL=http://localhost:3000/webhooks/test
|
||||
NGROK_TUNNEL_URL=https://your-tunnel.ngrok.io
|
||||
```
|
||||
|
||||
### API Testing
|
||||
|
||||
```bash
|
||||
# API testing configuration
|
||||
API_TEST_TOKEN=test-token-123
|
||||
API_TEST_ACCOUNT_ID=1
|
||||
API_TEST_USER_ID=1
|
||||
|
||||
# Rate limiting (disabled for tests)
|
||||
RATE_LIMITING_ENABLED=false
|
||||
```
|
||||
|
||||
## Development Tools
|
||||
|
||||
### Code Analysis
|
||||
|
||||
```bash
|
||||
# Brakeman security scanner
|
||||
BRAKEMAN_ENABLED=true
|
||||
|
||||
# Bundle audit
|
||||
BUNDLE_AUDIT_ENABLED=true
|
||||
|
||||
# Reek code smell detector
|
||||
REEK_ENABLED=true
|
||||
|
||||
# Rails Best Practices
|
||||
RAILS_BEST_PRACTICES_ENABLED=true
|
||||
```
|
||||
|
||||
### Development Servers
|
||||
|
||||
```bash
|
||||
# Webpack dev server
|
||||
WEBPACK_DEV_SERVER_HOST=localhost
|
||||
WEBPACK_DEV_SERVER_PORT=3035
|
||||
|
||||
# Hot module replacement
|
||||
HMR_ENABLED=true
|
||||
|
||||
# Live reload
|
||||
LIVE_RELOAD=true
|
||||
```
|
||||
|
||||
## Third-Party Integrations (Development)
|
||||
|
||||
### Social Media (Test Credentials)
|
||||
|
||||
```bash
|
||||
# Facebook (use test app credentials)
|
||||
FB_APP_ID=your-test-app-id
|
||||
FB_APP_SECRET=your-test-app-secret
|
||||
FB_VERIFY_TOKEN=test-verify-token
|
||||
|
||||
# Twitter (use test credentials)
|
||||
TWITTER_APP_ID=your-test-app-id
|
||||
TWITTER_CONSUMER_KEY=your-test-consumer-key
|
||||
TWITTER_CONSUMER_SECRET=your-test-consumer-secret
|
||||
|
||||
# WhatsApp (use test credentials)
|
||||
WHATSAPP_VERIFY_TOKEN=test-verify-token
|
||||
```
|
||||
|
||||
### Push Notifications (Development)
|
||||
|
||||
```bash
|
||||
# FCM (use development project)
|
||||
FCM_SERVER_KEY=your-dev-server-key
|
||||
FCM_PROJECT_ID=your-dev-project-id
|
||||
|
||||
# Vapid keys for web push
|
||||
VAPID_PUBLIC_KEY=your-dev-public-key
|
||||
VAPID_PRIVATE_KEY=your-dev-private-key
|
||||
```
|
||||
|
||||
## Security Settings for Development
|
||||
|
||||
### Authentication
|
||||
|
||||
```bash
|
||||
# JWT settings
|
||||
JWT_SECRET_KEY=your-dev-jwt-secret
|
||||
JWT_EXPIRY=24h
|
||||
|
||||
# Session configuration
|
||||
SESSION_TIMEOUT=1440
|
||||
SECURE_COOKIES=false
|
||||
|
||||
# CORS settings (permissive for development)
|
||||
CORS_ORIGINS=http://localhost:3000,http://localhost:3001
|
||||
```
|
||||
|
||||
### Development Security
|
||||
|
||||
```bash
|
||||
# Disable security features for development
|
||||
FORCE_SSL=false
|
||||
SECURE_HEADERS=false
|
||||
CSP_ENABLED=false
|
||||
|
||||
# Allow insecure connections
|
||||
ALLOW_HTTP=true
|
||||
SKIP_SSL_VERIFICATION=true
|
||||
```
|
||||
|
||||
## Environment-Specific Configurations
|
||||
|
||||
### Development Environment
|
||||
|
||||
```bash
|
||||
# .env.development
|
||||
RAILS_ENV=development
|
||||
NODE_ENV=development
|
||||
CACHE_CLASSES=false
|
||||
EAGER_LOAD=false
|
||||
CONSIDER_ALL_REQUESTS_LOCAL=true
|
||||
ACTION_CONTROLLER_PERFORM_CACHING=false
|
||||
```
|
||||
|
||||
### Test Environment
|
||||
|
||||
```bash
|
||||
# .env.test
|
||||
RAILS_ENV=test
|
||||
NODE_ENV=test
|
||||
CACHE_CLASSES=true
|
||||
EAGER_LOAD=false
|
||||
PUBLIC_FILE_SERVER_ENABLED=true
|
||||
SHOW_EXCEPTIONS=false
|
||||
```
|
||||
|
||||
### Staging Environment
|
||||
|
||||
```bash
|
||||
# .env.staging
|
||||
RAILS_ENV=staging
|
||||
NODE_ENV=production
|
||||
FORCE_SSL=true
|
||||
LOG_LEVEL=info
|
||||
RAILS_SERVE_STATIC_FILES=true
|
||||
```
|
||||
|
||||
## Docker Development
|
||||
|
||||
### Docker Compose Variables
|
||||
|
||||
```bash
|
||||
# Docker-specific configuration
|
||||
POSTGRES_HOST=postgres
|
||||
POSTGRES_PORT=5432
|
||||
POSTGRES_USER=postgres
|
||||
POSTGRES_PASSWORD=postgres
|
||||
POSTGRES_DB=chatwoot
|
||||
|
||||
REDIS_HOST=redis
|
||||
REDIS_PORT=6379
|
||||
|
||||
# Rails configuration for Docker
|
||||
RAILS_ENV=development
|
||||
RAILS_MAX_THREADS=5
|
||||
WEB_CONCURRENCY=2
|
||||
```
|
||||
|
||||
### Development with Docker
|
||||
|
||||
```bash
|
||||
# Use Docker services
|
||||
DATABASE_URL=postgresql://postgres:postgres@postgres:5432/chatwoot_development
|
||||
REDIS_URL=redis://redis:6379/0
|
||||
|
||||
# File permissions (for volume mounts)
|
||||
DOCKER_USER_ID=1000
|
||||
DOCKER_GROUP_ID=1000
|
||||
```
|
||||
|
||||
## IDE and Editor Configuration
|
||||
|
||||
### VS Code Settings
|
||||
|
||||
```bash
|
||||
# Ruby LSP configuration
|
||||
RUBY_LSP_ENABLED=true
|
||||
RUBY_LSP_EXPERIMENTAL_FEATURES=true
|
||||
|
||||
# Solargraph configuration
|
||||
SOLARGRAPH_ENABLED=true
|
||||
```
|
||||
|
||||
### RubyMine Settings
|
||||
|
||||
```bash
|
||||
# RubyMine-specific settings
|
||||
RUBYMINE_PROJECT_ROOT=/path/to/chatwoot
|
||||
RUBYMINE_RUBY_VERSION=3.3.3
|
||||
```
|
||||
|
||||
## Performance and Monitoring
|
||||
|
||||
### Development Monitoring
|
||||
|
||||
```bash
|
||||
# New Relic (development license)
|
||||
NEW_RELIC_LICENSE_KEY=your-dev-license-key
|
||||
NEW_RELIC_APP_NAME=Chatwoot Development
|
||||
|
||||
# Sentry (development DSN)
|
||||
SENTRY_DSN=your-dev-sentry-dsn
|
||||
SENTRY_ENVIRONMENT=development
|
||||
|
||||
# DataDog (development)
|
||||
DD_API_KEY=your-dev-datadog-key
|
||||
DD_ENV=development
|
||||
```
|
||||
|
||||
### Memory and Performance
|
||||
|
||||
```bash
|
||||
# Memory settings
|
||||
RUBY_GC_HEAP_INIT_SLOTS=10000
|
||||
RUBY_GC_HEAP_FREE_SLOTS=10000
|
||||
RUBY_GC_HEAP_GROWTH_FACTOR=1.1
|
||||
|
||||
# Puma configuration
|
||||
PUMA_WORKERS=1
|
||||
PUMA_THREADS=5
|
||||
PUMA_PRELOAD_APP=false
|
||||
```
|
||||
|
||||
## Common Development Scenarios
|
||||
|
||||
### API Development
|
||||
|
||||
```bash
|
||||
# API-specific settings
|
||||
API_RATE_LIMIT=1000
|
||||
API_RATE_LIMIT_WINDOW=3600
|
||||
API_PAGINATION_LIMIT=100
|
||||
|
||||
# CORS for API development
|
||||
API_CORS_ORIGINS=http://localhost:3001,http://localhost:8080
|
||||
```
|
||||
|
||||
### Widget Development
|
||||
|
||||
```bash
|
||||
# Widget development
|
||||
WIDGET_BASE_URL=http://localhost:3000
|
||||
WIDGET_API_URL=http://localhost:3000/api/v1
|
||||
WIDGET_WS_URL=ws://localhost:3000/cable
|
||||
```
|
||||
|
||||
### Mobile App Development
|
||||
|
||||
```bash
|
||||
# Mobile API endpoints
|
||||
MOBILE_API_URL=http://localhost:3000/api/v1
|
||||
MOBILE_WS_URL=ws://localhost:3000/cable
|
||||
|
||||
# Push notification testing
|
||||
MOBILE_PUSH_ENABLED=true
|
||||
```
|
||||
|
||||
## Troubleshooting Environment Issues
|
||||
|
||||
### Common Environment Problems
|
||||
|
||||
<Accordion title="Database connection issues">
|
||||
**Problem**: `ActiveRecord::ConnectionNotEstablished`
|
||||
|
||||
**Check these variables**:
|
||||
```bash
|
||||
DATABASE_URL=postgresql://username:password@localhost:5432/chatwoot_development
|
||||
DB_HOST=localhost
|
||||
DB_PORT=5432
|
||||
```
|
||||
|
||||
**Verify connection**:
|
||||
```bash
|
||||
psql $DATABASE_URL -c "SELECT 1;"
|
||||
```
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Redis connection issues">
|
||||
**Problem**: `Redis::CannotConnectError`
|
||||
|
||||
**Check these variables**:
|
||||
```bash
|
||||
REDIS_URL=redis://localhost:6379/0
|
||||
```
|
||||
|
||||
**Verify connection**:
|
||||
```bash
|
||||
redis-cli -u $REDIS_URL ping
|
||||
```
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Email delivery issues">
|
||||
**Problem**: Emails not being sent in development
|
||||
|
||||
**Check these variables**:
|
||||
```bash
|
||||
MAILER_SENDER_EMAIL=dev@chatwoot.local
|
||||
SMTP_ADDRESS=localhost
|
||||
SMTP_PORT=1025
|
||||
```
|
||||
|
||||
**For MailHog**:
|
||||
```bash
|
||||
# Start MailHog
|
||||
mailhog
|
||||
|
||||
# Check web interface at http://localhost:8025
|
||||
```
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Asset compilation issues">
|
||||
**Problem**: `Webpacker::Manifest::MissingEntryError`
|
||||
|
||||
**Check these variables**:
|
||||
```bash
|
||||
NODE_ENV=development
|
||||
RAILS_ENV=development
|
||||
```
|
||||
|
||||
**Recompile assets**:
|
||||
```bash
|
||||
pnpm run dev
|
||||
# or
|
||||
bundle exec rails assets:precompile
|
||||
```
|
||||
</Accordion>
|
||||
|
||||
### Environment Validation
|
||||
|
||||
Create a script to validate your environment:
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# validate_env.sh
|
||||
|
||||
echo "Validating development environment..."
|
||||
|
||||
# Check required variables
|
||||
required_vars=(
|
||||
"RAILS_ENV"
|
||||
"DATABASE_URL"
|
||||
"REDIS_URL"
|
||||
"SECRET_KEY_BASE"
|
||||
"FRONTEND_URL"
|
||||
)
|
||||
|
||||
for var in "${required_vars[@]}"; do
|
||||
if [ -z "${!var}" ]; then
|
||||
echo "❌ Missing required variable: $var"
|
||||
else
|
||||
echo "✅ $var is set"
|
||||
fi
|
||||
done
|
||||
|
||||
# Test database connection
|
||||
if bundle exec rails runner "ActiveRecord::Base.connection.execute('SELECT 1')" > /dev/null 2>&1; then
|
||||
echo "✅ Database connection successful"
|
||||
else
|
||||
echo "❌ Database connection failed"
|
||||
fi
|
||||
|
||||
# Test Redis connection
|
||||
if bundle exec rails runner "Redis.new.ping" > /dev/null 2>&1; then
|
||||
echo "✅ Redis connection successful"
|
||||
else
|
||||
echo "❌ Redis connection failed"
|
||||
fi
|
||||
|
||||
echo "Environment validation complete!"
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
### Environment File Management
|
||||
|
||||
1. **Never commit `.env` files** to version control
|
||||
2. **Use `.env.example`** as a template for required variables
|
||||
3. **Document all variables** with comments
|
||||
4. **Use different `.env` files** for different environments
|
||||
5. **Validate environment** before starting development
|
||||
|
||||
### Security Considerations
|
||||
|
||||
1. **Use weak credentials** only in development
|
||||
2. **Never use production credentials** in development
|
||||
3. **Rotate test API keys** regularly
|
||||
4. **Use local services** when possible
|
||||
5. **Mock external services** in tests
|
||||
|
||||
### Performance Tips
|
||||
|
||||
1. **Use local Redis** for faster development
|
||||
2. **Enable query caching** in development
|
||||
3. **Use parallel testing** for faster test runs
|
||||
4. **Profile memory usage** regularly
|
||||
5. **Monitor database queries** for N+1 issues
|
||||
|
||||
---
|
||||
|
||||
This guide covers the essential environment variables for Chatwoot development. For production deployment, refer to the [Self-hosted Environment Variables](../../self-hosted/configuration/environment-variables) guide.
|
||||
@@ -1,589 +0,0 @@
|
||||
---
|
||||
title: Project Setup Guide
|
||||
description: Complete guide to setting up Chatwoot for development and contribution
|
||||
sidebarTitle: Setup Guide
|
||||
---
|
||||
|
||||
# Project Setup Guide
|
||||
|
||||
This comprehensive guide will walk you through setting up Chatwoot for development, from initial repository setup to running your first successful build.
|
||||
|
||||
## Prerequisites Check
|
||||
|
||||
Before starting, ensure you have completed the [Local Development Setup](../environment-setup/local-development) guide and have all required dependencies installed.
|
||||
|
||||
### Quick Prerequisites Verification
|
||||
|
||||
```bash
|
||||
# Check Ruby version (should be 3.3.3)
|
||||
ruby --version
|
||||
|
||||
# Check Node.js version (should be 20+)
|
||||
node --version
|
||||
|
||||
# Check PostgreSQL
|
||||
psql --version
|
||||
|
||||
# Check Redis
|
||||
redis-cli --version
|
||||
|
||||
# Check Git
|
||||
git --version
|
||||
```
|
||||
|
||||
## Repository Setup
|
||||
|
||||
### 1. Fork and Clone
|
||||
|
||||
```bash
|
||||
# Fork the repository on GitHub first
|
||||
# Then clone your fork
|
||||
git clone https://github.com/YOUR_USERNAME/chatwoot.git
|
||||
cd chatwoot
|
||||
|
||||
# Add upstream remote for syncing
|
||||
git remote add upstream https://github.com/chatwoot/chatwoot.git
|
||||
|
||||
# Verify remotes
|
||||
git remote -v
|
||||
# Should show:
|
||||
# origin https://github.com/YOUR_USERNAME/chatwoot.git (fetch)
|
||||
# origin https://github.com/YOUR_USERNAME/chatwoot.git (push)
|
||||
# upstream https://github.com/chatwoot/chatwoot.git (fetch)
|
||||
# upstream https://github.com/chatwoot/chatwoot.git (push)
|
||||
```
|
||||
|
||||
### 2. Branch Strategy
|
||||
|
||||
```bash
|
||||
# Create a development branch
|
||||
git checkout -b develop
|
||||
|
||||
# For feature work, create feature branches
|
||||
git checkout -b feature/your-feature-name
|
||||
|
||||
# Keep your fork synced
|
||||
git fetch upstream
|
||||
git checkout develop
|
||||
git merge upstream/develop
|
||||
git push origin develop
|
||||
```
|
||||
|
||||
## Environment Configuration
|
||||
|
||||
### 1. Environment File Setup
|
||||
|
||||
```bash
|
||||
# Copy the example environment file
|
||||
cp .env.example .env
|
||||
|
||||
# Open the file for editing
|
||||
nano .env
|
||||
```
|
||||
|
||||
### 2. Basic Configuration
|
||||
|
||||
Update your `.env` file with the following essential settings:
|
||||
|
||||
```bash
|
||||
# Rails Environment
|
||||
RAILS_ENV=development
|
||||
NODE_ENV=development
|
||||
|
||||
# Application URLs
|
||||
FRONTEND_URL=http://localhost:3000
|
||||
FORCE_SSL=false
|
||||
|
||||
# Database Configuration
|
||||
DATABASE_URL=postgresql://chatwoot:password@localhost:5432/chatwoot_development
|
||||
REDIS_URL=redis://localhost:6379/0
|
||||
|
||||
# Email Configuration (for development)
|
||||
MAILER_SENDER_EMAIL=dev@chatwoot.local
|
||||
SMTP_ADDRESS=localhost
|
||||
SMTP_PORT=1025
|
||||
|
||||
# File Storage
|
||||
ACTIVE_STORAGE_SERVICE=local
|
||||
|
||||
# Development Features
|
||||
ENABLE_DEVELOPMENT_FEATURES=true
|
||||
LOG_LEVEL=debug
|
||||
RAILS_LOG_LEVEL=debug
|
||||
|
||||
# Disable SSL in development
|
||||
SMTP_ENABLE_STARTTLS_AUTO=false
|
||||
SMTP_TLS=false
|
||||
```
|
||||
|
||||
### 3. Generate Secret Keys
|
||||
|
||||
```bash
|
||||
# Generate secret key base
|
||||
bundle exec rails secret
|
||||
|
||||
# Add to your .env file
|
||||
echo "SECRET_KEY_BASE=your-generated-secret" >> .env
|
||||
```
|
||||
|
||||
## Database Setup
|
||||
|
||||
### 1. Database Creation
|
||||
|
||||
```bash
|
||||
# Create development and test databases
|
||||
bundle exec rails db:create
|
||||
|
||||
# Expected output:
|
||||
# Created database 'chatwoot_development'
|
||||
# Created database 'chatwoot_test'
|
||||
```
|
||||
|
||||
### 2. Database Migration
|
||||
|
||||
```bash
|
||||
# Run database migrations
|
||||
bundle exec rails db:migrate
|
||||
|
||||
# Check migration status
|
||||
bundle exec rails db:migrate:status
|
||||
```
|
||||
|
||||
### 3. Database Seeding
|
||||
|
||||
```bash
|
||||
# Seed the database with sample data
|
||||
bundle exec rails db:seed
|
||||
|
||||
# This creates:
|
||||
# - Sample account
|
||||
# - Admin user
|
||||
# - Sample conversations
|
||||
# - Test data for development
|
||||
```
|
||||
|
||||
### 4. Test Database Setup
|
||||
|
||||
```bash
|
||||
# Prepare test database
|
||||
RAILS_ENV=test bundle exec rails db:create
|
||||
RAILS_ENV=test bundle exec rails db:migrate
|
||||
```
|
||||
|
||||
## Dependency Installation
|
||||
|
||||
### 1. Ruby Dependencies
|
||||
|
||||
```bash
|
||||
# Install Ruby gems
|
||||
bundle install
|
||||
|
||||
# If you encounter issues, try:
|
||||
bundle install --retry=3
|
||||
|
||||
# For development and test gems
|
||||
bundle install --with development test
|
||||
```
|
||||
|
||||
### 2. Node.js Dependencies
|
||||
|
||||
```bash
|
||||
# Install Node.js packages
|
||||
pnpm install
|
||||
|
||||
# If pnpm is not available, install it first:
|
||||
npm install -g pnpm
|
||||
|
||||
# Clear cache if needed
|
||||
pnpm store prune
|
||||
```
|
||||
|
||||
### 3. Additional Tools
|
||||
|
||||
```bash
|
||||
# Install Foreman for process management
|
||||
gem install foreman
|
||||
|
||||
# Install MailHog for email testing (optional)
|
||||
# macOS
|
||||
brew install mailhog
|
||||
|
||||
# Ubuntu/Debian
|
||||
sudo apt-get install mailhog
|
||||
|
||||
# Or download binary from GitHub releases
|
||||
```
|
||||
|
||||
## Application Startup
|
||||
|
||||
### 1. Using Foreman (Recommended)
|
||||
|
||||
```bash
|
||||
# Start all services with Foreman
|
||||
foreman start -f Procfile.dev
|
||||
|
||||
# This starts:
|
||||
# - Rails server (port 3000)
|
||||
# - Webpack dev server
|
||||
# - Sidekiq worker
|
||||
```
|
||||
|
||||
### 2. Manual Startup
|
||||
|
||||
If you prefer to run services separately:
|
||||
|
||||
```bash
|
||||
# Terminal 1: Rails server
|
||||
bundle exec rails server -p 3000
|
||||
|
||||
# Terminal 2: Webpack dev server
|
||||
pnpm run dev
|
||||
|
||||
# Terminal 3: Sidekiq worker
|
||||
bundle exec sidekiq
|
||||
|
||||
# Terminal 4: MailHog (optional)
|
||||
mailhog
|
||||
```
|
||||
|
||||
### 3. Verify Installation
|
||||
|
||||
Once all services are running, verify your setup:
|
||||
|
||||
- **Web Application**: http://localhost:3000
|
||||
- **API Health Check**: http://localhost:3000/api
|
||||
- **Sidekiq Web UI**: http://localhost:3000/sidekiq
|
||||
- **MailHog**: http://localhost:8025 (if running)
|
||||
|
||||
## Initial Login
|
||||
|
||||
### Default Credentials
|
||||
|
||||
After seeding the database, you can log in with:
|
||||
|
||||
```
|
||||
Email: john@acme.inc
|
||||
Password: Password1!
|
||||
```
|
||||
|
||||
### Creating Additional Users
|
||||
|
||||
```bash
|
||||
# Access Rails console
|
||||
bundle exec rails console
|
||||
|
||||
# Create a new user
|
||||
user = User.create!(
|
||||
name: "Your Name",
|
||||
email: "your.email@example.com",
|
||||
password: "Password123!",
|
||||
password_confirmation: "Password123!"
|
||||
)
|
||||
|
||||
# Make user an administrator
|
||||
user.account_users.first.update!(role: 'administrator')
|
||||
```
|
||||
|
||||
## Development Workflow
|
||||
|
||||
### 1. Code Quality Setup
|
||||
|
||||
```bash
|
||||
# Install pre-commit hooks (optional but recommended)
|
||||
# Create .git/hooks/pre-commit
|
||||
cat > .git/hooks/pre-commit << 'EOF'
|
||||
#!/bin/sh
|
||||
# Run RuboCop
|
||||
bundle exec rubocop --parallel
|
||||
|
||||
# Run ESLint
|
||||
pnpm run lint
|
||||
|
||||
# Run tests
|
||||
bundle exec rspec --fail-fast
|
||||
EOF
|
||||
|
||||
chmod +x .git/hooks/pre-commit
|
||||
```
|
||||
|
||||
### 2. Running Tests
|
||||
|
||||
```bash
|
||||
# Run Ruby tests
|
||||
bundle exec rspec
|
||||
|
||||
# Run specific test file
|
||||
bundle exec rspec spec/models/user_spec.rb
|
||||
|
||||
# Run JavaScript tests
|
||||
pnpm run test
|
||||
|
||||
# Run E2E tests (requires Playwright)
|
||||
pnpm exec playwright install
|
||||
pnpm run test:e2e
|
||||
|
||||
# Run tests with coverage
|
||||
COVERAGE=true bundle exec rspec
|
||||
```
|
||||
|
||||
### 3. Code Linting and Formatting
|
||||
|
||||
```bash
|
||||
# Ruby linting with RuboCop
|
||||
bundle exec rubocop
|
||||
|
||||
# Auto-fix Ruby issues
|
||||
bundle exec rubocop -a
|
||||
|
||||
# JavaScript linting
|
||||
pnpm run lint
|
||||
|
||||
# Auto-fix JavaScript issues
|
||||
pnpm run lint:fix
|
||||
|
||||
# Format code with Prettier
|
||||
pnpm run format
|
||||
```
|
||||
|
||||
## IDE Configuration
|
||||
|
||||
### VS Code Setup
|
||||
|
||||
Create `.vscode/settings.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
"ruby.intellisense": "rubyLocate",
|
||||
"ruby.codeCompletion": "rcodetools",
|
||||
"ruby.format": "rubocop",
|
||||
"editor.formatOnSave": true,
|
||||
"editor.rulers": [120],
|
||||
"files.trimTrailingWhitespace": true,
|
||||
"files.insertFinalNewline": true,
|
||||
"eslint.autoFixOnSave": true,
|
||||
"prettier.requireConfig": true,
|
||||
"ruby.rubocop.executePath": "./bin/",
|
||||
"ruby.rubocop.onSave": true
|
||||
}
|
||||
```
|
||||
|
||||
Create `.vscode/extensions.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
"recommendations": [
|
||||
"rebornix.ruby",
|
||||
"wingrunr21.vscode-ruby",
|
||||
"bradlc.vscode-tailwindcss",
|
||||
"esbenp.prettier-vscode",
|
||||
"dbaeumer.vscode-eslint",
|
||||
"ms-vscode.vscode-typescript-next",
|
||||
"shopify.ruby-lsp"
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### RubyMine Setup
|
||||
|
||||
1. **Open Project**: File → Open → Select chatwoot directory
|
||||
2. **Configure Ruby SDK**: File → Project Structure → SDKs → Add Ruby SDK
|
||||
3. **Database Connection**: Database tool window → Add PostgreSQL connection
|
||||
4. **Code Style**: File → Settings → Editor → Code Style → Import scheme
|
||||
|
||||
## Debugging Setup
|
||||
|
||||
### Rails Debugging
|
||||
|
||||
Add to your code for debugging:
|
||||
|
||||
```ruby
|
||||
# Using Pry (recommended)
|
||||
binding.pry
|
||||
|
||||
# Using built-in debugger
|
||||
debugger
|
||||
|
||||
# Using byebug
|
||||
byebug
|
||||
```
|
||||
|
||||
### JavaScript Debugging
|
||||
|
||||
```javascript
|
||||
// Browser debugging
|
||||
console.log('Debug info:', variable);
|
||||
debugger;
|
||||
|
||||
// Node.js debugging
|
||||
console.log('Debug info:', variable);
|
||||
```
|
||||
|
||||
### Database Debugging
|
||||
|
||||
```bash
|
||||
# Rails console
|
||||
bundle exec rails console
|
||||
|
||||
# Database console
|
||||
bundle exec rails dbconsole
|
||||
|
||||
# Check queries in development log
|
||||
tail -f log/development.log | grep -E "(SELECT|INSERT|UPDATE|DELETE)"
|
||||
```
|
||||
|
||||
## Performance Optimization
|
||||
|
||||
### Development Performance
|
||||
|
||||
```bash
|
||||
# Use Spring for faster Rails commands
|
||||
bundle exec spring binstub --all
|
||||
|
||||
# Precompile assets for faster loading
|
||||
bundle exec rails assets:precompile
|
||||
|
||||
# Use parallel testing
|
||||
bundle exec rspec --parallel
|
||||
|
||||
# Monitor memory usage
|
||||
ps aux | grep -E "(ruby|node)" | head -10
|
||||
```
|
||||
|
||||
### Database Performance
|
||||
|
||||
```ruby
|
||||
# Add to config/environments/development.rb for query analysis
|
||||
config.active_record.verbose_query_logs = true
|
||||
|
||||
# Enable query plan logging
|
||||
config.active_record.dump_schema_after_migration = false
|
||||
```
|
||||
|
||||
## Troubleshooting Setup Issues
|
||||
|
||||
### Common Setup Problems
|
||||
|
||||
<Accordion title="Bundle install fails">
|
||||
**Error**: `An error occurred while installing pg`
|
||||
|
||||
**Solution**:
|
||||
```bash
|
||||
# macOS
|
||||
brew install postgresql
|
||||
bundle config build.pg --with-pg-config=/usr/local/bin/pg_config
|
||||
|
||||
# Ubuntu/Debian
|
||||
sudo apt-get install libpq-dev
|
||||
bundle install
|
||||
```
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Database connection refused">
|
||||
**Error**: `could not connect to server: Connection refused`
|
||||
|
||||
**Solution**:
|
||||
```bash
|
||||
# Check if PostgreSQL is running
|
||||
sudo systemctl status postgresql
|
||||
|
||||
# Start PostgreSQL
|
||||
sudo systemctl start postgresql
|
||||
|
||||
# macOS with Homebrew
|
||||
brew services start postgresql
|
||||
```
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Redis connection refused">
|
||||
**Error**: `Redis::CannotConnectError`
|
||||
|
||||
**Solution**:
|
||||
```bash
|
||||
# Check if Redis is running
|
||||
redis-cli ping
|
||||
|
||||
# Start Redis
|
||||
sudo systemctl start redis
|
||||
|
||||
# macOS with Homebrew
|
||||
brew services start redis
|
||||
```
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Webpack compilation fails">
|
||||
**Error**: `Module not found` or compilation errors
|
||||
|
||||
**Solution**:
|
||||
```bash
|
||||
# Clear webpack cache
|
||||
rm -rf tmp/cache/webpacker
|
||||
|
||||
# Reinstall node modules
|
||||
rm -rf node_modules
|
||||
pnpm install
|
||||
|
||||
# Restart webpack dev server
|
||||
pnpm run dev
|
||||
```
|
||||
</Accordion>
|
||||
|
||||
### Verification Commands
|
||||
|
||||
```bash
|
||||
# Check all services are running
|
||||
ps aux | grep -E "(rails|sidekiq|webpack|mailhog)"
|
||||
|
||||
# Test database connection
|
||||
bundle exec rails runner "puts ActiveRecord::Base.connection.execute('SELECT 1').first"
|
||||
|
||||
# Test Redis connection
|
||||
bundle exec rails runner "puts Redis.new.ping"
|
||||
|
||||
# Check application health
|
||||
curl http://localhost:3000/api
|
||||
```
|
||||
|
||||
## Next Steps
|
||||
|
||||
After successful setup:
|
||||
|
||||
1. **Explore the Codebase**: Familiarize yourself with the project structure
|
||||
2. **Read Contributing Guidelines**: Review code standards and workflow
|
||||
3. **Pick Your First Issue**: Look for "good first issue" labels
|
||||
4. **Join the Community**: Connect with other contributors
|
||||
|
||||
### Useful Development Commands
|
||||
|
||||
```bash
|
||||
# Generate new migration
|
||||
bundle exec rails generate migration AddColumnToTable column:type
|
||||
|
||||
# Generate new model
|
||||
bundle exec rails generate model ModelName attribute:type
|
||||
|
||||
# Generate new controller
|
||||
bundle exec rails generate controller ControllerName
|
||||
|
||||
# Run specific migration
|
||||
bundle exec rails db:migrate:up VERSION=20231201000000
|
||||
|
||||
# Rollback migration
|
||||
bundle exec rails db:rollback STEP=1
|
||||
|
||||
# Reset database (careful!)
|
||||
bundle exec rails db:drop db:create db:migrate db:seed
|
||||
```
|
||||
|
||||
## Getting Help
|
||||
|
||||
If you encounter issues during setup:
|
||||
|
||||
- **Check Common Errors**: See [Common Errors](./common-errors) guide
|
||||
- **Environment Variables**: Review [Environment Variables](./environment-variables) guide
|
||||
- **GitHub Issues**: Search existing issues or create a new one
|
||||
- **Discord Community**: Join the Chatwoot Discord server
|
||||
- **Documentation**: Check the official documentation
|
||||
|
||||
---
|
||||
|
||||
You're now ready to start developing with Chatwoot! Your development environment should be fully functional and ready for contribution.
|
||||
@@ -30,64 +30,11 @@
|
||||
"navigation": {
|
||||
"groups": [
|
||||
{
|
||||
"group": "Getting Started",
|
||||
"group": "API Reference",
|
||||
"pages": [
|
||||
"introduction"
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "Self-Hosted Installation",
|
||||
"pages": [
|
||||
"self-hosted/introduction",
|
||||
"self-hosted/architecture",
|
||||
{
|
||||
"group": "Deployment",
|
||||
"pages": [
|
||||
"self-hosted/deployment/linux-vm",
|
||||
"self-hosted/deployment/docker",
|
||||
"self-hosted/deployment/kubernetes",
|
||||
"self-hosted/deployment/chatwoot-ctl"
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "Cloud Providers",
|
||||
"pages": [
|
||||
"self-hosted/cloud/aws",
|
||||
"self-hosted/cloud/azure",
|
||||
"self-hosted/cloud/digitalocean",
|
||||
"self-hosted/cloud/gcp",
|
||||
"self-hosted/cloud/heroku"
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "Configuration",
|
||||
"pages": [
|
||||
"self-hosted/configuration/environment-variables"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "Contributing Guide",
|
||||
"pages": [
|
||||
"contributing/introduction",
|
||||
{
|
||||
"group": "Project Setup",
|
||||
"pages": [
|
||||
"contributing/project-setup/setup-guide",
|
||||
"contributing/project-setup/environment-variables",
|
||||
"contributing/project-setup/common-errors"
|
||||
]
|
||||
},
|
||||
"contributing/testing",
|
||||
"contributing/guidelines",
|
||||
"contributing/code-of-conduct"
|
||||
]
|
||||
},
|
||||
{
|
||||
"group": "API Reference",
|
||||
"pages": []
|
||||
},
|
||||
{
|
||||
"group": "Application API",
|
||||
"description": "APIs for managing application aspects of Chatwoot",
|
||||
|
||||
@@ -1,342 +0,0 @@
|
||||
---
|
||||
title: Chatwoot Architecture
|
||||
description: Understanding Chatwoot's system architecture, components, and how they work together.
|
||||
sidebarTitle: Architecture
|
||||
---
|
||||
|
||||
Understanding Chatwoot's architecture is crucial for successful deployment, scaling, and maintenance. This guide explains the core components and how they interact.
|
||||
|
||||
## High-Level Architecture
|
||||
|
||||
Chatwoot follows a modern, scalable web application architecture with clear separation of concerns:
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "Client Layer"
|
||||
A[Web Dashboard]
|
||||
B[Mobile Apps]
|
||||
C[Website Widget]
|
||||
D[API Clients]
|
||||
end
|
||||
|
||||
subgraph "Load Balancer"
|
||||
E[Nginx/ALB]
|
||||
end
|
||||
|
||||
subgraph "Application Layer"
|
||||
F[Rails Web Server]
|
||||
G[Sidekiq Workers]
|
||||
H[WebSocket Server]
|
||||
end
|
||||
|
||||
subgraph "Data Layer"
|
||||
I[PostgreSQL]
|
||||
J[Redis]
|
||||
K[File Storage]
|
||||
end
|
||||
|
||||
subgraph "External Services"
|
||||
L[SMTP Server]
|
||||
M[Third-party APIs]
|
||||
N[CDN]
|
||||
end
|
||||
|
||||
A --> E
|
||||
B --> E
|
||||
C --> E
|
||||
D --> E
|
||||
E --> F
|
||||
E --> H
|
||||
F --> G
|
||||
F --> I
|
||||
F --> J
|
||||
G --> I
|
||||
G --> J
|
||||
F --> K
|
||||
F --> L
|
||||
F --> M
|
||||
K --> N
|
||||
```
|
||||
|
||||
## Core Components
|
||||
|
||||
### 1. Web Application (Rails)
|
||||
|
||||
The main application server built with Ruby on Rails handles:
|
||||
|
||||
- **HTTP API endpoints** for all client interactions
|
||||
- **Authentication and authorization** for users and agents
|
||||
- **Business logic** for conversations, contacts, and workflows
|
||||
- **Real-time features** via ActionCable WebSockets
|
||||
- **File uploads and processing**
|
||||
|
||||
**Key characteristics:**
|
||||
- Stateless design for horizontal scaling
|
||||
- RESTful API architecture
|
||||
- WebSocket support for real-time updates
|
||||
- Multi-tenant architecture support
|
||||
|
||||
### 2. Background Workers (Sidekiq)
|
||||
|
||||
Sidekiq handles asynchronous processing:
|
||||
|
||||
- **Email notifications** and delivery
|
||||
- **Webhook processing** for integrations
|
||||
- **File processing** and optimization
|
||||
- **Report generation** and analytics
|
||||
- **Third-party API calls** (Facebook, WhatsApp, etc.)
|
||||
|
||||
**Key characteristics:**
|
||||
- Redis-backed job queue
|
||||
- Retry mechanisms for failed jobs
|
||||
- Horizontal scaling support
|
||||
- Job prioritization and scheduling
|
||||
|
||||
### 3. Database (PostgreSQL)
|
||||
|
||||
PostgreSQL stores all application data:
|
||||
|
||||
- **User accounts and authentication**
|
||||
- **Conversations and messages**
|
||||
- **Contact information and profiles**
|
||||
- **Configuration and settings**
|
||||
- **Analytics and reporting data**
|
||||
|
||||
**Key characteristics:**
|
||||
- ACID compliance for data integrity
|
||||
- JSON support for flexible schemas
|
||||
- Full-text search capabilities
|
||||
- Horizontal scaling with read replicas
|
||||
|
||||
### 4. Cache and Session Store (Redis)
|
||||
|
||||
Redis provides high-performance caching and session management:
|
||||
|
||||
- **Session storage** for user authentication
|
||||
- **Cache layer** for frequently accessed data
|
||||
- **Job queue** for background processing
|
||||
- **Real-time data** for WebSocket connections
|
||||
- **Rate limiting** and throttling
|
||||
|
||||
**Key characteristics:**
|
||||
- In-memory performance
|
||||
- Persistence options available
|
||||
- Pub/Sub for real-time features
|
||||
- Clustering support for high availability
|
||||
|
||||
### 5. File Storage
|
||||
|
||||
Chatwoot supports multiple storage backends:
|
||||
|
||||
- **Local filesystem** (development/small deployments)
|
||||
- **AWS S3** (recommended for production)
|
||||
- **Google Cloud Storage**
|
||||
- **Azure Blob Storage**
|
||||
- **MinIO** (self-hosted S3-compatible)
|
||||
|
||||
**Stored content:**
|
||||
- User avatars and profile images
|
||||
- Message attachments and files
|
||||
- Email templates and assets
|
||||
- Exported reports and backups
|
||||
|
||||
### 6. Reverse Proxy (Nginx)
|
||||
|
||||
Nginx serves as the front-end proxy:
|
||||
|
||||
- **SSL termination** and certificate management
|
||||
- **Static file serving** for assets
|
||||
- **Load balancing** across application instances
|
||||
- **Request routing** and filtering
|
||||
- **Compression** and caching headers
|
||||
|
||||
## Data Flow
|
||||
|
||||
### 1. Incoming Messages
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant C as Customer
|
||||
participant W as Widget/Channel
|
||||
participant N as Nginx
|
||||
participant R as Rails App
|
||||
participant D as Database
|
||||
participant Q as Redis Queue
|
||||
participant S as Sidekiq
|
||||
participant A as Agent Dashboard
|
||||
|
||||
C->>W: Sends message
|
||||
W->>N: HTTP/WebSocket request
|
||||
N->>R: Forward request
|
||||
R->>D: Store message
|
||||
R->>Q: Queue notification job
|
||||
R->>A: Real-time update (WebSocket)
|
||||
Q->>S: Process notification
|
||||
S->>D: Update delivery status
|
||||
```
|
||||
|
||||
### 2. Agent Responses
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant A as Agent
|
||||
participant D as Dashboard
|
||||
participant R as Rails App
|
||||
participant DB as Database
|
||||
participant Q as Redis Queue
|
||||
participant S as Sidekiq
|
||||
participant C as Customer
|
||||
|
||||
A->>D: Types response
|
||||
D->>R: Send message API
|
||||
R->>DB: Store message
|
||||
R->>Q: Queue delivery job
|
||||
R->>D: Real-time update
|
||||
Q->>S: Process delivery
|
||||
S->>C: Deliver via channel
|
||||
S->>DB: Update status
|
||||
```
|
||||
|
||||
## Scaling Considerations
|
||||
|
||||
### Horizontal Scaling
|
||||
|
||||
Chatwoot is designed for horizontal scaling:
|
||||
|
||||
**Web Servers:**
|
||||
- Stateless design allows multiple instances
|
||||
- Load balancer distributes traffic
|
||||
- Session data stored in Redis
|
||||
|
||||
**Background Workers:**
|
||||
- Multiple Sidekiq processes can run
|
||||
- Jobs distributed across workers
|
||||
- Queue-based processing prevents overload
|
||||
|
||||
**Database:**
|
||||
- Read replicas for query scaling
|
||||
- Connection pooling for efficiency
|
||||
- Partitioning for large datasets
|
||||
|
||||
### Vertical Scaling
|
||||
|
||||
For smaller deployments, vertical scaling is often sufficient:
|
||||
|
||||
**CPU:** Background processing and real-time features
|
||||
**Memory:** Caching and session storage
|
||||
**Storage:** Database and file storage growth
|
||||
**Network:** WebSocket connections and API traffic
|
||||
|
||||
## Security Architecture
|
||||
|
||||
### Authentication Flow
|
||||
|
||||
```mermaid
|
||||
graph LR
|
||||
A[User Login] --> B[Rails Auth]
|
||||
B --> C[JWT Token]
|
||||
C --> D[API Requests]
|
||||
D --> E[Token Validation]
|
||||
E --> F[Authorized Access]
|
||||
```
|
||||
|
||||
### Data Protection
|
||||
|
||||
- **Encryption at rest** for sensitive data
|
||||
- **TLS encryption** for data in transit
|
||||
- **Input validation** and sanitization
|
||||
- **SQL injection** protection via ORM
|
||||
- **XSS protection** with content security policies
|
||||
|
||||
### Access Control
|
||||
|
||||
- **Role-based permissions** (Admin, Agent, etc.)
|
||||
- **Account-level isolation** in multi-tenant setup
|
||||
- **API rate limiting** to prevent abuse
|
||||
- **Audit logging** for compliance
|
||||
|
||||
## Monitoring and Observability
|
||||
|
||||
### Application Metrics
|
||||
|
||||
- **Response times** and throughput
|
||||
- **Error rates** and exceptions
|
||||
- **Background job** processing times
|
||||
- **WebSocket connection** counts
|
||||
|
||||
### Infrastructure Metrics
|
||||
|
||||
- **CPU and memory** utilization
|
||||
- **Database performance** and connections
|
||||
- **Redis memory** usage and hit rates
|
||||
- **Storage usage** and I/O patterns
|
||||
|
||||
### Logging Strategy
|
||||
|
||||
- **Structured logging** with JSON format
|
||||
- **Centralized collection** (ELK, Fluentd)
|
||||
- **Log levels** for different environments
|
||||
- **Sensitive data** filtering
|
||||
|
||||
## Deployment Patterns
|
||||
|
||||
### Single Server
|
||||
|
||||
Suitable for small teams and development:
|
||||
- All components on one server
|
||||
- SQLite or PostgreSQL database
|
||||
- Local file storage
|
||||
- Simple backup strategy
|
||||
|
||||
### Multi-Server
|
||||
|
||||
For production environments:
|
||||
- Separate database server
|
||||
- Dedicated Redis instance
|
||||
- Load-balanced web servers
|
||||
- Shared file storage (S3/NFS)
|
||||
|
||||
### Containerized
|
||||
|
||||
Using Docker and orchestration:
|
||||
- Container images for each component
|
||||
- Kubernetes or Docker Swarm
|
||||
- Service discovery and networking
|
||||
- Rolling updates and health checks
|
||||
|
||||
### Cloud-Native
|
||||
|
||||
Leveraging cloud services:
|
||||
- Managed databases (RDS, Cloud SQL)
|
||||
- Managed Redis (ElastiCache, MemoryStore)
|
||||
- Object storage (S3, GCS)
|
||||
- Load balancers and CDN
|
||||
|
||||
## Performance Optimization
|
||||
|
||||
### Database Optimization
|
||||
|
||||
- **Indexing strategy** for common queries
|
||||
- **Connection pooling** to reduce overhead
|
||||
- **Query optimization** and monitoring
|
||||
- **Read replicas** for scaling reads
|
||||
|
||||
### Caching Strategy
|
||||
|
||||
- **Application-level caching** for expensive operations
|
||||
- **HTTP caching** for static assets
|
||||
- **Database query caching** with Redis
|
||||
- **CDN caching** for global distribution
|
||||
|
||||
### Background Processing
|
||||
|
||||
- **Job prioritization** for critical tasks
|
||||
- **Batch processing** for bulk operations
|
||||
- **Queue monitoring** and alerting
|
||||
- **Resource allocation** per job type
|
||||
|
||||
---
|
||||
|
||||
<Note>
|
||||
Understanding this architecture helps you make informed decisions about deployment, scaling, and maintenance of your Chatwoot instance.
|
||||
</Note>
|
||||
@@ -1,501 +0,0 @@
|
||||
---
|
||||
title: AWS Deployment
|
||||
description: Deploy Chatwoot on Amazon Web Services with manual installation or marketplace AMI
|
||||
sidebarTitle: AWS
|
||||
---
|
||||
|
||||
# AWS Deployment Guide
|
||||
|
||||
Deploy Chatwoot on Amazon Web Services (AWS) using either manual installation or the AWS Marketplace AMI for a scalable, production-ready setup.
|
||||
|
||||
## Deployment Options
|
||||
|
||||
<CardGroup cols={2}>
|
||||
<Card title="Manual Installation" icon="code" href="#manual-installation">
|
||||
Full control over the deployment with custom architecture
|
||||
</Card>
|
||||
<Card title="AWS Marketplace AMI" icon="aws" href="#aws-marketplace-ami">
|
||||
Quick deployment using pre-configured AMI
|
||||
</Card>
|
||||
</CardGroup>
|
||||
|
||||
## Manual Installation
|
||||
|
||||
### Architecture Overview
|
||||
|
||||
This guide follows a standard 3-tier architecture on AWS for high availability:
|
||||
|
||||
```
|
||||
Internet Gateway
|
||||
|
|
||||
Application Load Balancer (Public Subnets)
|
||||
|
|
||||
Chatwoot Instances (Private Subnets)
|
||||
|
|
||||
RDS PostgreSQL + ElastiCache Redis (Private Subnets)
|
||||
```
|
||||
|
||||
### Prerequisites
|
||||
|
||||
- AWS account with appropriate permissions
|
||||
- Domain name for your Chatwoot installation
|
||||
- Basic knowledge of AWS services (VPC, EC2, RDS, etc.)
|
||||
|
||||
### Step 1: Network Setup
|
||||
|
||||
#### Create VPC
|
||||
|
||||
1. Navigate to the VPC console in your chosen AWS region
|
||||
2. Create a new VPC:
|
||||
- **Name**: `chatwoot-vpc`
|
||||
- **CIDR block**: `10.0.0.0/16`
|
||||
- Leave other options as default
|
||||
|
||||
#### Create Subnets
|
||||
|
||||
Create subnets across two availability zones:
|
||||
|
||||
| Name | Type | AZ | CIDR Block |
|
||||
|------|------|----|-----------|
|
||||
| chatwoot-public-1 | Public | us-east-1a | 10.0.0.0/24 |
|
||||
| chatwoot-public-2 | Public | us-east-1b | 10.0.1.0/24 |
|
||||
| chatwoot-private-1 | Private | us-east-1a | 10.0.2.0/24 |
|
||||
| chatwoot-private-2 | Private | us-east-1b | 10.0.3.0/24 |
|
||||
|
||||
<Note>
|
||||
Enable "Auto-assign public IPv4 address" for public subnets under Actions > Subnet Settings.
|
||||
</Note>
|
||||
|
||||
#### Internet Gateway
|
||||
|
||||
1. Create Internet Gateway named `chatwoot-igw`
|
||||
2. Attach it to `chatwoot-vpc`
|
||||
|
||||
#### NAT Gateways
|
||||
|
||||
Create NAT gateways in each public subnet:
|
||||
|
||||
1. **chatwoot-nat-1** in `chatwoot-public-1`
|
||||
2. **chatwoot-nat-2** in `chatwoot-public-2`
|
||||
|
||||
Allocate Elastic IPs for each NAT gateway.
|
||||
|
||||
#### Route Tables
|
||||
|
||||
**Public Route Table** (`chatwoot-public-rt`):
|
||||
- Route: `0.0.0.0/0` → `chatwoot-igw`
|
||||
- Associate with public subnets
|
||||
|
||||
**Private Route Tables**:
|
||||
- `chatwoot-private-a`: Route `0.0.0.0/0` → `chatwoot-nat-1`
|
||||
- `chatwoot-private-b`: Route `0.0.0.0/0` → `chatwoot-nat-2`
|
||||
|
||||
### Step 2: Application Load Balancer
|
||||
|
||||
1. Navigate to EC2 > Load Balancers
|
||||
2. Create Application Load Balancer:
|
||||
- **Name**: `chatwoot-loadbalancer`
|
||||
- **Scheme**: Internet-facing
|
||||
- **IP address type**: IPv4
|
||||
- **VPC**: `chatwoot-vpc`
|
||||
- **Subnets**: Select both public subnets
|
||||
|
||||
#### Security Group for ALB
|
||||
|
||||
Create `chatwoot-loadbalancer-sg` with rules:
|
||||
- HTTP (80) from `0.0.0.0/0`
|
||||
- HTTPS (443) from `0.0.0.0/0`
|
||||
- TCP (3000) from `0.0.0.0/0` (for health checks)
|
||||
|
||||
#### Target Group
|
||||
|
||||
Create `chatwoot-tg` target group:
|
||||
- **Target type**: Instances
|
||||
- **Protocol**: HTTP
|
||||
- **Port**: 3000
|
||||
- **Health check path**: `/api`
|
||||
|
||||
### Step 3: Database Setup (RDS)
|
||||
|
||||
#### RDS Security Group
|
||||
|
||||
Create `chatwoot-rds-sg`:
|
||||
- PostgreSQL (5432) from `chatwoot-loadbalancer-sg`
|
||||
|
||||
#### RDS Subnet Group
|
||||
|
||||
Create `chatwoot-rds-group`:
|
||||
- **VPC**: `chatwoot-vpc`
|
||||
- **Subnets**: Both private subnets
|
||||
|
||||
#### Create RDS Instance
|
||||
|
||||
1. Navigate to RDS > Databases
|
||||
2. Create database:
|
||||
- **Engine**: PostgreSQL
|
||||
- **Template**: Production
|
||||
- **DB instance identifier**: `chatwoot-db`
|
||||
- **Master username**: `chatwoot`
|
||||
- **Master password**: Generate secure password
|
||||
- **DB instance class**: `db.t3.medium` (minimum)
|
||||
- **Storage**: 100 GB GP2 (minimum)
|
||||
- **Multi-AZ**: Yes
|
||||
- **VPC**: `chatwoot-vpc`
|
||||
- **Subnet group**: `chatwoot-rds-group`
|
||||
- **Security group**: `chatwoot-rds-sg`
|
||||
|
||||
<Warning>
|
||||
Note down the RDS endpoint, username, and password for later configuration.
|
||||
</Warning>
|
||||
|
||||
### Step 4: Redis Setup (ElastiCache)
|
||||
|
||||
#### ElastiCache Security Group
|
||||
|
||||
Create `chatwoot-redis-sg`:
|
||||
- Redis (6379) from `chatwoot-loadbalancer-sg`
|
||||
|
||||
#### ElastiCache Subnet Group
|
||||
|
||||
Create `chatwoot-redis-group`:
|
||||
- **VPC**: `chatwoot-vpc`
|
||||
- **Subnets**: Both private subnets
|
||||
|
||||
#### Create Redis Cluster
|
||||
|
||||
1. Navigate to ElastiCache > Redis clusters
|
||||
2. Create cluster:
|
||||
- **Name**: `chatwoot-redis`
|
||||
- **Engine version**: 7.0+
|
||||
- **Node type**: `cache.t3.micro` (minimum)
|
||||
- **Multi-AZ**: Yes
|
||||
- **Subnet group**: `chatwoot-redis-group`
|
||||
- **Security group**: `chatwoot-redis-sg`
|
||||
|
||||
### Step 5: Bastion Host
|
||||
|
||||
Create bastion servers for secure access to private instances:
|
||||
|
||||
1. Launch EC2 instance:
|
||||
- **AMI**: Ubuntu 20.04 LTS
|
||||
- **Instance type**: `t3.micro`
|
||||
- **VPC**: `chatwoot-vpc`
|
||||
- **Subnet**: `chatwoot-public-1`
|
||||
- **Auto-assign public IP**: Yes
|
||||
- **Security group**: Create `chatwoot-bastion-sg` (SSH from your IP)
|
||||
|
||||
### Step 6: Chatwoot Application Servers
|
||||
|
||||
#### Launch Chatwoot Instance
|
||||
|
||||
1. Launch EC2 instance:
|
||||
- **AMI**: Ubuntu 20.04 LTS
|
||||
- **Instance type**: `c5.xlarge` (minimum for production)
|
||||
- **VPC**: `chatwoot-vpc`
|
||||
- **Subnet**: `chatwoot-private-1`
|
||||
- **Auto-assign public IP**: No
|
||||
- **Storage**: 60 GB GP2
|
||||
- **Security group**: `chatwoot-loadbalancer-sg`
|
||||
|
||||
#### Install Chatwoot
|
||||
|
||||
1. SSH to bastion host, then to Chatwoot instance
|
||||
2. Switch to root user and download installation script:
|
||||
|
||||
```bash
|
||||
sudo su -
|
||||
wget https://get.chatwoot.app/linux/install.sh
|
||||
chmod +x install.sh
|
||||
./install.sh --install
|
||||
```
|
||||
|
||||
#### Configure Chatwoot
|
||||
|
||||
1. Switch to chatwoot user and edit environment:
|
||||
|
||||
```bash
|
||||
sudo -i -u chatwoot
|
||||
cd chatwoot
|
||||
nano .env
|
||||
```
|
||||
|
||||
2. Update database and Redis configuration:
|
||||
|
||||
```bash
|
||||
# Database
|
||||
DATABASE_URL="postgresql://chatwoot:password@your-rds-endpoint:5432/chatwoot_production"
|
||||
|
||||
# Redis
|
||||
REDIS_URL="redis://your-elasticache-endpoint:6379/0"
|
||||
|
||||
# Frontend URL
|
||||
FRONTEND_URL="https://chatwoot.yourdomain.com"
|
||||
|
||||
# Force SSL
|
||||
FORCE_SSL=true
|
||||
|
||||
# Email configuration (example with SES)
|
||||
MAILER_SENDER_EMAIL="noreply@yourdomain.com"
|
||||
SMTP_ADDRESS="email-smtp.us-east-1.amazonaws.com"
|
||||
SMTP_PORT=587
|
||||
SMTP_USERNAME="your-ses-username"
|
||||
SMTP_PASSWORD="your-ses-password"
|
||||
SMTP_AUTHENTICATION="plain"
|
||||
SMTP_ENABLE_STARTTLS_AUTO=true
|
||||
|
||||
# Storage (S3)
|
||||
ACTIVE_STORAGE_SERVICE="amazon"
|
||||
S3_BUCKET_NAME="your-chatwoot-bucket"
|
||||
AWS_ACCESS_KEY_ID="your-access-key"
|
||||
AWS_SECRET_ACCESS_KEY="your-secret-key"
|
||||
AWS_REGION="us-east-1"
|
||||
```
|
||||
|
||||
3. Run database preparation:
|
||||
|
||||
```bash
|
||||
RAILS_ENV=production bundle exec rake db:chatwoot_prepare
|
||||
```
|
||||
|
||||
4. Restart services:
|
||||
|
||||
```bash
|
||||
sudo cwctl --restart
|
||||
```
|
||||
|
||||
### Step 7: SSL Certificate (ACM)
|
||||
|
||||
1. Navigate to Certificate Manager
|
||||
2. Request public certificate for your domain
|
||||
3. Validate domain ownership
|
||||
4. Attach certificate to ALB HTTPS listener
|
||||
|
||||
### Step 8: Auto Scaling
|
||||
|
||||
#### Create AMI
|
||||
|
||||
1. Stop the Chatwoot instance
|
||||
2. Create AMI named `chatwoot-base-ami`
|
||||
3. Terminate the original instance
|
||||
|
||||
#### Launch Template
|
||||
|
||||
Create launch template with:
|
||||
- **AMI**: `chatwoot-base-ami`
|
||||
- **Instance type**: `c5.xlarge`
|
||||
- **Security group**: `chatwoot-loadbalancer-sg`
|
||||
- **User data** (optional):
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
sudo cwctl --restart
|
||||
```
|
||||
|
||||
#### Auto Scaling Group
|
||||
|
||||
Create ASG with:
|
||||
- **Launch template**: Use created template
|
||||
- **VPC**: `chatwoot-vpc`
|
||||
- **Subnets**: Both private subnets
|
||||
- **Target group**: `chatwoot-tg`
|
||||
- **Desired capacity**: 2
|
||||
- **Minimum**: 2
|
||||
- **Maximum**: 4
|
||||
|
||||
#### Scaling Policies
|
||||
|
||||
Create scaling policies based on:
|
||||
- CPU utilization (scale out at 70%, scale in at 30%)
|
||||
- Memory utilization
|
||||
- Request count per target
|
||||
|
||||
## AWS Marketplace AMI
|
||||
|
||||
### Quick Deployment
|
||||
|
||||
1. Navigate to AWS Marketplace
|
||||
2. Search for "Chatwoot"
|
||||
3. Subscribe to Chatwoot AMI
|
||||
4. Launch instance with recommended settings:
|
||||
- **Instance type**: `t3.medium` or larger
|
||||
- **Storage**: 20 GB minimum
|
||||
- **Security group**: Allow HTTP, HTTPS, and SSH
|
||||
|
||||
### Post-Launch Configuration
|
||||
|
||||
1. SSH to the instance
|
||||
2. Complete initial setup:
|
||||
|
||||
```bash
|
||||
sudo /opt/chatwoot/setup.sh
|
||||
```
|
||||
|
||||
3. Configure domain and SSL:
|
||||
|
||||
```bash
|
||||
sudo /opt/chatwoot/configure-domain.sh yourdomain.com
|
||||
```
|
||||
|
||||
## Production Optimizations
|
||||
|
||||
### Performance Tuning
|
||||
|
||||
```bash
|
||||
# Optimize Rails configuration
|
||||
export RAILS_MAX_THREADS=20
|
||||
export WEB_CONCURRENCY=4
|
||||
export SIDEKIQ_CONCURRENCY=25
|
||||
|
||||
# Database connection pooling
|
||||
export DATABASE_POOL_SIZE=25
|
||||
```
|
||||
|
||||
### Monitoring Setup
|
||||
|
||||
#### CloudWatch Metrics
|
||||
|
||||
Enable detailed monitoring for:
|
||||
- EC2 instances
|
||||
- RDS database
|
||||
- ElastiCache cluster
|
||||
- Application Load Balancer
|
||||
|
||||
#### Custom Metrics
|
||||
|
||||
```bash
|
||||
# Install CloudWatch agent
|
||||
wget https://s3.amazonaws.com/amazoncloudwatch-agent/amazon_linux/amd64/latest/amazon-cloudwatch-agent.rpm
|
||||
sudo rpm -U ./amazon-cloudwatch-agent.rpm
|
||||
|
||||
# Configure custom metrics
|
||||
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
|
||||
```
|
||||
|
||||
### Backup Strategy
|
||||
|
||||
#### RDS Automated Backups
|
||||
|
||||
- Enable automated backups with 7-day retention
|
||||
- Configure backup window during low-traffic hours
|
||||
- Enable point-in-time recovery
|
||||
|
||||
#### Application Data Backup
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# Backup script for application data
|
||||
DATE=$(date +%Y%m%d_%H%M%S)
|
||||
|
||||
# Database backup
|
||||
pg_dump $DATABASE_URL | gzip > "s3://your-backup-bucket/db/chatwoot_$DATE.sql.gz"
|
||||
|
||||
# File uploads backup (if using local storage)
|
||||
aws s3 sync /home/chatwoot/chatwoot/storage s3://your-backup-bucket/storage/
|
||||
```
|
||||
|
||||
### Security Hardening
|
||||
|
||||
#### IAM Roles
|
||||
|
||||
Create IAM roles with minimal permissions:
|
||||
|
||||
```json
|
||||
{
|
||||
"Version": "2012-10-17",
|
||||
"Statement": [
|
||||
{
|
||||
"Effect": "Allow",
|
||||
"Action": [
|
||||
"s3:GetObject",
|
||||
"s3:PutObject",
|
||||
"s3:DeleteObject"
|
||||
],
|
||||
"Resource": "arn:aws:s3:::your-chatwoot-bucket/*"
|
||||
},
|
||||
{
|
||||
"Effect": "Allow",
|
||||
"Action": [
|
||||
"ses:SendEmail",
|
||||
"ses:SendRawEmail"
|
||||
],
|
||||
"Resource": "*"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
#### Security Groups
|
||||
|
||||
Implement least-privilege access:
|
||||
- ALB: Only HTTP/HTTPS from internet
|
||||
- App servers: Only from ALB and bastion
|
||||
- Database: Only from app servers
|
||||
- Redis: Only from app servers
|
||||
|
||||
## Cost Optimization
|
||||
|
||||
### Reserved Instances
|
||||
|
||||
Purchase Reserved Instances for:
|
||||
- RDS database instances
|
||||
- ElastiCache clusters
|
||||
- Predictable EC2 workloads
|
||||
|
||||
### Spot Instances
|
||||
|
||||
Use Spot Instances for:
|
||||
- Development environments
|
||||
- Non-critical worker processes
|
||||
- Batch processing tasks
|
||||
|
||||
### Storage Optimization
|
||||
|
||||
- Use GP3 volumes for better price/performance
|
||||
- Implement S3 lifecycle policies for old backups
|
||||
- Use S3 Intelligent Tiering for file storage
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
<Accordion title="Application not accessible">
|
||||
Check:
|
||||
- Security group rules
|
||||
- Target group health
|
||||
- Route table configuration
|
||||
- DNS resolution
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Database connection errors">
|
||||
Verify:
|
||||
- RDS security group allows connections
|
||||
- Database credentials in .env file
|
||||
- Network connectivity from app servers
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="High memory usage">
|
||||
Solutions:
|
||||
- Increase instance size
|
||||
- Optimize Sidekiq concurrency
|
||||
- Enable swap memory
|
||||
- Monitor for memory leaks
|
||||
</Accordion>
|
||||
|
||||
### Monitoring Commands
|
||||
|
||||
```bash
|
||||
# Check application health
|
||||
curl -I http://localhost:3000/api
|
||||
|
||||
# Monitor system resources
|
||||
htop
|
||||
iostat -x 1
|
||||
free -h
|
||||
|
||||
# Check service status
|
||||
sudo systemctl status chatwoot.target
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
This AWS deployment guide provides a comprehensive approach to hosting Chatwoot on AWS infrastructure. Choose the deployment method that best fits your requirements and scale as needed.
|
||||
@@ -1,663 +0,0 @@
|
||||
---
|
||||
title: Azure Deployment
|
||||
description: Deploy Chatwoot on Microsoft Azure with various deployment options
|
||||
sidebarTitle: Azure
|
||||
---
|
||||
|
||||
# Azure Deployment Guide
|
||||
|
||||
Deploy Chatwoot on Microsoft Azure using various deployment options including Virtual Machines, Container Instances, or App Service for a scalable, production-ready setup.
|
||||
|
||||
## Deployment Options
|
||||
|
||||
<CardGroup cols={3}>
|
||||
<Card title="Virtual Machines" icon="server" href="#virtual-machines">
|
||||
Full control with custom VM deployment
|
||||
</Card>
|
||||
<Card title="Container Instances" icon="docker" href="#container-instances">
|
||||
Serverless container deployment
|
||||
</Card>
|
||||
<Card title="App Service" icon="cloud" href="#app-service">
|
||||
Platform-as-a-Service deployment
|
||||
</Card>
|
||||
</CardGroup>
|
||||
|
||||
## Virtual Machines Deployment
|
||||
|
||||
### Architecture Overview
|
||||
|
||||
```
|
||||
Azure Load Balancer
|
||||
|
|
||||
Virtual Machines (Availability Set)
|
||||
|
|
||||
Azure Database for PostgreSQL + Azure Cache for Redis
|
||||
```
|
||||
|
||||
### Prerequisites
|
||||
|
||||
- Azure subscription with appropriate permissions
|
||||
- Azure CLI installed and configured
|
||||
- Domain name for your Chatwoot installation
|
||||
|
||||
### Step 1: Resource Group and Network
|
||||
|
||||
#### Create Resource Group
|
||||
|
||||
```bash
|
||||
# Create resource group
|
||||
az group create \
|
||||
--name chatwoot-rg \
|
||||
--location eastus
|
||||
```
|
||||
|
||||
#### Create Virtual Network
|
||||
|
||||
```bash
|
||||
# Create virtual network
|
||||
az network vnet create \
|
||||
--resource-group chatwoot-rg \
|
||||
--name chatwoot-vnet \
|
||||
--address-prefix 10.0.0.0/16 \
|
||||
--subnet-name chatwoot-subnet \
|
||||
--subnet-prefix 10.0.1.0/24
|
||||
```
|
||||
|
||||
#### Create Network Security Group
|
||||
|
||||
```bash
|
||||
# Create NSG
|
||||
az network nsg create \
|
||||
--resource-group chatwoot-rg \
|
||||
--name chatwoot-nsg
|
||||
|
||||
# Add rules
|
||||
az network nsg rule create \
|
||||
--resource-group chatwoot-rg \
|
||||
--nsg-name chatwoot-nsg \
|
||||
--name AllowHTTP \
|
||||
--protocol tcp \
|
||||
--priority 1000 \
|
||||
--destination-port-range 80
|
||||
|
||||
az network nsg rule create \
|
||||
--resource-group chatwoot-rg \
|
||||
--nsg-name chatwoot-nsg \
|
||||
--name AllowHTTPS \
|
||||
--protocol tcp \
|
||||
--priority 1001 \
|
||||
--destination-port-range 443
|
||||
|
||||
az network nsg rule create \
|
||||
--resource-group chatwoot-rg \
|
||||
--nsg-name chatwoot-nsg \
|
||||
--name AllowSSH \
|
||||
--protocol tcp \
|
||||
--priority 1002 \
|
||||
--destination-port-range 22 \
|
||||
--source-address-prefix "YOUR_IP_ADDRESS"
|
||||
```
|
||||
|
||||
### Step 2: Database Setup
|
||||
|
||||
#### Create PostgreSQL Server
|
||||
|
||||
```bash
|
||||
# Create PostgreSQL server
|
||||
az postgres server create \
|
||||
--resource-group chatwoot-rg \
|
||||
--name chatwoot-postgres \
|
||||
--location eastus \
|
||||
--admin-user chatwoot \
|
||||
--admin-password "YourSecurePassword123!" \
|
||||
--sku-name GP_Gen5_2 \
|
||||
--version 13
|
||||
|
||||
# Create database
|
||||
az postgres db create \
|
||||
--resource-group chatwoot-rg \
|
||||
--server-name chatwoot-postgres \
|
||||
--name chatwoot_production
|
||||
|
||||
# Configure firewall
|
||||
az postgres server firewall-rule create \
|
||||
--resource-group chatwoot-rg \
|
||||
--server chatwoot-postgres \
|
||||
--name AllowAzureServices \
|
||||
--start-ip-address 0.0.0.0 \
|
||||
--end-ip-address 0.0.0.0
|
||||
```
|
||||
|
||||
#### Create Redis Cache
|
||||
|
||||
```bash
|
||||
# Create Redis cache
|
||||
az redis create \
|
||||
--resource-group chatwoot-rg \
|
||||
--name chatwoot-redis \
|
||||
--location eastus \
|
||||
--sku Basic \
|
||||
--vm-size c0
|
||||
```
|
||||
|
||||
### Step 3: Storage Account
|
||||
|
||||
```bash
|
||||
# Create storage account
|
||||
az storage account create \
|
||||
--resource-group chatwoot-rg \
|
||||
--name chatwootstorage \
|
||||
--location eastus \
|
||||
--sku Standard_LRS
|
||||
|
||||
# Create container for file uploads
|
||||
az storage container create \
|
||||
--account-name chatwootstorage \
|
||||
--name uploads \
|
||||
--public-access blob
|
||||
```
|
||||
|
||||
### Step 4: Virtual Machine
|
||||
|
||||
#### Create Availability Set
|
||||
|
||||
```bash
|
||||
# Create availability set
|
||||
az vm availability-set create \
|
||||
--resource-group chatwoot-rg \
|
||||
--name chatwoot-avset \
|
||||
--platform-fault-domain-count 2 \
|
||||
--platform-update-domain-count 2
|
||||
```
|
||||
|
||||
#### Create Virtual Machine
|
||||
|
||||
```bash
|
||||
# Create VM
|
||||
az vm create \
|
||||
--resource-group chatwoot-rg \
|
||||
--name chatwoot-vm \
|
||||
--image UbuntuLTS \
|
||||
--size Standard_D2s_v3 \
|
||||
--availability-set chatwoot-avset \
|
||||
--vnet-name chatwoot-vnet \
|
||||
--subnet chatwoot-subnet \
|
||||
--nsg chatwoot-nsg \
|
||||
--admin-username azureuser \
|
||||
--generate-ssh-keys \
|
||||
--custom-data cloud-init.txt
|
||||
```
|
||||
|
||||
#### Cloud-Init Configuration
|
||||
|
||||
Create `cloud-init.txt`:
|
||||
|
||||
```yaml
|
||||
#cloud-config
|
||||
package_upgrade: true
|
||||
packages:
|
||||
- curl
|
||||
- wget
|
||||
- git
|
||||
|
||||
runcmd:
|
||||
- wget https://get.chatwoot.app/linux/install.sh
|
||||
- chmod +x install.sh
|
||||
- ./install.sh --install
|
||||
```
|
||||
|
||||
### Step 5: Load Balancer
|
||||
|
||||
```bash
|
||||
# Create public IP
|
||||
az network public-ip create \
|
||||
--resource-group chatwoot-rg \
|
||||
--name chatwoot-lb-ip \
|
||||
--sku Standard
|
||||
|
||||
# Create load balancer
|
||||
az network lb create \
|
||||
--resource-group chatwoot-rg \
|
||||
--name chatwoot-lb \
|
||||
--public-ip-address chatwoot-lb-ip \
|
||||
--frontend-ip-name chatwoot-frontend \
|
||||
--backend-pool-name chatwoot-backend
|
||||
|
||||
# Create health probe
|
||||
az network lb probe create \
|
||||
--resource-group chatwoot-rg \
|
||||
--lb-name chatwoot-lb \
|
||||
--name chatwoot-health \
|
||||
--protocol http \
|
||||
--port 3000 \
|
||||
--path /api
|
||||
|
||||
# Create load balancing rule
|
||||
az network lb rule create \
|
||||
--resource-group chatwoot-rg \
|
||||
--lb-name chatwoot-lb \
|
||||
--name chatwoot-rule \
|
||||
--protocol tcp \
|
||||
--frontend-port 80 \
|
||||
--backend-port 3000 \
|
||||
--frontend-ip-name chatwoot-frontend \
|
||||
--backend-pool-name chatwoot-backend \
|
||||
--probe-name chatwoot-health
|
||||
```
|
||||
|
||||
### Step 6: Configuration
|
||||
|
||||
SSH to the VM and configure Chatwoot:
|
||||
|
||||
```bash
|
||||
# SSH to VM
|
||||
ssh azureuser@<VM_PUBLIC_IP>
|
||||
|
||||
# Switch to chatwoot user
|
||||
sudo -i -u chatwoot
|
||||
cd chatwoot
|
||||
|
||||
# Edit environment variables
|
||||
nano .env
|
||||
```
|
||||
|
||||
Update `.env` with Azure services:
|
||||
|
||||
```bash
|
||||
# Database
|
||||
DATABASE_URL="postgresql://chatwoot:YourSecurePassword123!@chatwoot-postgres.postgres.database.azure.com:5432/chatwoot_production"
|
||||
|
||||
# Redis
|
||||
REDIS_URL="redis://:PRIMARY_ACCESS_KEY@chatwoot-redis.redis.cache.windows.net:6380/0?ssl=true"
|
||||
|
||||
# Storage (Azure Blob)
|
||||
ACTIVE_STORAGE_SERVICE="azure"
|
||||
AZURE_STORAGE_ACCOUNT_NAME="chatwootstorage"
|
||||
AZURE_STORAGE_ACCESS_KEY="your-access-key"
|
||||
AZURE_STORAGE_CONTAINER="uploads"
|
||||
|
||||
# Frontend URL
|
||||
FRONTEND_URL="https://chatwoot.yourdomain.com"
|
||||
FORCE_SSL=true
|
||||
```
|
||||
|
||||
## Container Instances Deployment
|
||||
|
||||
### Docker Compose for Azure
|
||||
|
||||
Create `docker-compose.azure.yml`:
|
||||
|
||||
```yaml
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
chatwoot-web:
|
||||
image: chatwoot/chatwoot:latest
|
||||
environment:
|
||||
- RAILS_ENV=production
|
||||
- DATABASE_URL=postgresql://chatwoot:password@postgres:5432/chatwoot_production
|
||||
- REDIS_URL=redis://redis:6379/0
|
||||
- FRONTEND_URL=https://chatwoot.yourdomain.com
|
||||
- FORCE_SSL=true
|
||||
ports:
|
||||
- "3000:3000"
|
||||
depends_on:
|
||||
- postgres
|
||||
- redis
|
||||
|
||||
chatwoot-worker:
|
||||
image: chatwoot/chatwoot:latest
|
||||
environment:
|
||||
- RAILS_ENV=production
|
||||
- DATABASE_URL=postgresql://chatwoot:password@postgres:5432/chatwoot_production
|
||||
- REDIS_URL=redis://redis:6379/0
|
||||
command: bundle exec sidekiq -C config/sidekiq.yml
|
||||
depends_on:
|
||||
- postgres
|
||||
- redis
|
||||
|
||||
postgres:
|
||||
image: postgres:13
|
||||
environment:
|
||||
- POSTGRES_DB=chatwoot_production
|
||||
- POSTGRES_USER=chatwoot
|
||||
- POSTGRES_PASSWORD=password
|
||||
volumes:
|
||||
- postgres_data:/var/lib/postgresql/data
|
||||
|
||||
redis:
|
||||
image: redis:7-alpine
|
||||
volumes:
|
||||
- redis_data:/data
|
||||
|
||||
volumes:
|
||||
postgres_data:
|
||||
redis_data:
|
||||
```
|
||||
|
||||
### Deploy with Azure Container Instances
|
||||
|
||||
```bash
|
||||
# Create container group
|
||||
az container create \
|
||||
--resource-group chatwoot-rg \
|
||||
--file docker-compose.azure.yml \
|
||||
--dns-name-label chatwoot-app \
|
||||
--ports 3000
|
||||
```
|
||||
|
||||
## App Service Deployment
|
||||
|
||||
### Create App Service Plan
|
||||
|
||||
```bash
|
||||
# Create App Service plan
|
||||
az appservice plan create \
|
||||
--resource-group chatwoot-rg \
|
||||
--name chatwoot-plan \
|
||||
--sku P1V2 \
|
||||
--is-linux
|
||||
|
||||
# Create web app
|
||||
az webapp create \
|
||||
--resource-group chatwoot-rg \
|
||||
--plan chatwoot-plan \
|
||||
--name chatwoot-app \
|
||||
--deployment-container-image-name chatwoot/chatwoot:latest
|
||||
```
|
||||
|
||||
### Configure App Settings
|
||||
|
||||
```bash
|
||||
# Set environment variables
|
||||
az webapp config appsettings set \
|
||||
--resource-group chatwoot-rg \
|
||||
--name chatwoot-app \
|
||||
--settings \
|
||||
RAILS_ENV=production \
|
||||
DATABASE_URL="postgresql://chatwoot:password@chatwoot-postgres.postgres.database.azure.com:5432/chatwoot_production" \
|
||||
REDIS_URL="redis://:key@chatwoot-redis.redis.cache.windows.net:6380/0?ssl=true" \
|
||||
FRONTEND_URL="https://chatwoot-app.azurewebsites.net" \
|
||||
FORCE_SSL=true
|
||||
```
|
||||
|
||||
## Monitoring and Logging
|
||||
|
||||
### Application Insights
|
||||
|
||||
```bash
|
||||
# Create Application Insights
|
||||
az monitor app-insights component create \
|
||||
--resource-group chatwoot-rg \
|
||||
--app chatwoot-insights \
|
||||
--location eastus \
|
||||
--kind web
|
||||
|
||||
# Get instrumentation key
|
||||
az monitor app-insights component show \
|
||||
--resource-group chatwoot-rg \
|
||||
--app chatwoot-insights \
|
||||
--query instrumentationKey
|
||||
```
|
||||
|
||||
### Log Analytics Workspace
|
||||
|
||||
```bash
|
||||
# Create Log Analytics workspace
|
||||
az monitor log-analytics workspace create \
|
||||
--resource-group chatwoot-rg \
|
||||
--workspace-name chatwoot-logs \
|
||||
--location eastus
|
||||
```
|
||||
|
||||
## Security Configuration
|
||||
|
||||
### Key Vault for Secrets
|
||||
|
||||
```bash
|
||||
# Create Key Vault
|
||||
az keyvault create \
|
||||
--resource-group chatwoot-rg \
|
||||
--name chatwoot-vault \
|
||||
--location eastus
|
||||
|
||||
# Store secrets
|
||||
az keyvault secret set \
|
||||
--vault-name chatwoot-vault \
|
||||
--name database-password \
|
||||
--value "YourSecurePassword123!"
|
||||
|
||||
az keyvault secret set \
|
||||
--vault-name chatwoot-vault \
|
||||
--name redis-key \
|
||||
--value "your-redis-access-key"
|
||||
```
|
||||
|
||||
### Managed Identity
|
||||
|
||||
```bash
|
||||
# Enable managed identity for VM
|
||||
az vm identity assign \
|
||||
--resource-group chatwoot-rg \
|
||||
--name chatwoot-vm
|
||||
|
||||
# Grant access to Key Vault
|
||||
az keyvault set-policy \
|
||||
--name chatwoot-vault \
|
||||
--object-id <MANAGED_IDENTITY_PRINCIPAL_ID> \
|
||||
--secret-permissions get list
|
||||
```
|
||||
|
||||
## Backup and Disaster Recovery
|
||||
|
||||
### Database Backup
|
||||
|
||||
```bash
|
||||
# Enable automated backup for PostgreSQL
|
||||
az postgres server configuration set \
|
||||
--resource-group chatwoot-rg \
|
||||
--server-name chatwoot-postgres \
|
||||
--name backup_retention_days \
|
||||
--value 7
|
||||
|
||||
# Create manual backup
|
||||
az postgres server backup create \
|
||||
--resource-group chatwoot-rg \
|
||||
--server-name chatwoot-postgres \
|
||||
--backup-name manual-backup-$(date +%Y%m%d)
|
||||
```
|
||||
|
||||
### VM Backup
|
||||
|
||||
```bash
|
||||
# Create Recovery Services vault
|
||||
az backup vault create \
|
||||
--resource-group chatwoot-rg \
|
||||
--name chatwoot-vault \
|
||||
--location eastus
|
||||
|
||||
# Enable backup for VM
|
||||
az backup protection enable-for-vm \
|
||||
--resource-group chatwoot-rg \
|
||||
--vault-name chatwoot-vault \
|
||||
--vm chatwoot-vm \
|
||||
--policy-name DefaultPolicy
|
||||
```
|
||||
|
||||
## Scaling and Performance
|
||||
|
||||
### VM Scale Sets
|
||||
|
||||
```bash
|
||||
# Create VM scale set
|
||||
az vmss create \
|
||||
--resource-group chatwoot-rg \
|
||||
--name chatwoot-vmss \
|
||||
--image UbuntuLTS \
|
||||
--vm-sku Standard_D2s_v3 \
|
||||
--instance-count 2 \
|
||||
--vnet-name chatwoot-vnet \
|
||||
--subnet chatwoot-subnet \
|
||||
--lb chatwoot-lb \
|
||||
--backend-pool-name chatwoot-backend \
|
||||
--custom-data cloud-init.txt
|
||||
|
||||
# Configure autoscaling
|
||||
az monitor autoscale create \
|
||||
--resource-group chatwoot-rg \
|
||||
--resource chatwoot-vmss \
|
||||
--resource-type Microsoft.Compute/virtualMachineScaleSets \
|
||||
--name chatwoot-autoscale \
|
||||
--min-count 2 \
|
||||
--max-count 5 \
|
||||
--count 2
|
||||
|
||||
# Add scale-out rule
|
||||
az monitor autoscale rule create \
|
||||
--resource-group chatwoot-rg \
|
||||
--autoscale-name chatwoot-autoscale \
|
||||
--condition "Percentage CPU > 70 avg 5m" \
|
||||
--scale out 1
|
||||
|
||||
# Add scale-in rule
|
||||
az monitor autoscale rule create \
|
||||
--resource-group chatwoot-rg \
|
||||
--autoscale-name chatwoot-autoscale \
|
||||
--condition "Percentage CPU < 30 avg 5m" \
|
||||
--scale in 1
|
||||
```
|
||||
|
||||
## SSL Certificate
|
||||
|
||||
### App Service Certificate
|
||||
|
||||
```bash
|
||||
# Create App Service certificate
|
||||
az webapp config ssl upload \
|
||||
--resource-group chatwoot-rg \
|
||||
--name chatwoot-app \
|
||||
--certificate-file certificate.pfx \
|
||||
--certificate-password "certificate-password"
|
||||
|
||||
# Bind certificate to domain
|
||||
az webapp config ssl bind \
|
||||
--resource-group chatwoot-rg \
|
||||
--name chatwoot-app \
|
||||
--certificate-thumbprint <THUMBPRINT> \
|
||||
--ssl-type SNI
|
||||
```
|
||||
|
||||
### Let's Encrypt with VM
|
||||
|
||||
```bash
|
||||
# Install Certbot on VM
|
||||
sudo apt update
|
||||
sudo apt install certbot python3-certbot-nginx
|
||||
|
||||
# Obtain certificate
|
||||
sudo certbot --nginx -d chatwoot.yourdomain.com
|
||||
|
||||
# Auto-renewal
|
||||
sudo crontab -e
|
||||
# Add: 0 12 * * * /usr/bin/certbot renew --quiet
|
||||
```
|
||||
|
||||
## Cost Optimization
|
||||
|
||||
### Reserved Instances
|
||||
|
||||
```bash
|
||||
# Purchase reserved capacity for VMs
|
||||
az reservations reservation-order purchase \
|
||||
--reservation-order-id <ORDER_ID> \
|
||||
--sku Standard_D2s_v3 \
|
||||
--location eastus \
|
||||
--quantity 2 \
|
||||
--term P1Y
|
||||
```
|
||||
|
||||
### Azure Advisor
|
||||
|
||||
```bash
|
||||
# Get cost recommendations
|
||||
az advisor recommendation list \
|
||||
--category Cost \
|
||||
--resource-group chatwoot-rg
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
<Accordion title="Database connection timeout">
|
||||
Check:
|
||||
- PostgreSQL firewall rules
|
||||
- Network security group rules
|
||||
- Connection string format
|
||||
- SSL requirements for Azure Database
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Redis connection issues">
|
||||
Verify:
|
||||
- Redis access keys
|
||||
- SSL configuration (required for Azure Cache)
|
||||
- Network connectivity
|
||||
- Port 6380 (SSL) vs 6379 (non-SSL)
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Storage upload failures">
|
||||
Solutions:
|
||||
- Verify storage account access keys
|
||||
- Check container permissions
|
||||
- Ensure CORS settings if needed
|
||||
- Validate Azure Storage configuration
|
||||
</Accordion>
|
||||
|
||||
### Diagnostic Commands
|
||||
|
||||
```bash
|
||||
# Check VM status
|
||||
az vm get-instance-view \
|
||||
--resource-group chatwoot-rg \
|
||||
--name chatwoot-vm
|
||||
|
||||
# View application logs
|
||||
az webapp log tail \
|
||||
--resource-group chatwoot-rg \
|
||||
--name chatwoot-app
|
||||
|
||||
# Check database connectivity
|
||||
az postgres server show \
|
||||
--resource-group chatwoot-rg \
|
||||
--name chatwoot-postgres
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
### Security
|
||||
- Use Azure Key Vault for secrets management
|
||||
- Enable managed identities for Azure resources
|
||||
- Implement network security groups with least privilege
|
||||
- Enable Azure Security Center recommendations
|
||||
|
||||
### Performance
|
||||
- Use Azure CDN for static assets
|
||||
- Implement Redis caching strategies
|
||||
- Monitor with Application Insights
|
||||
- Use proximity placement groups for low latency
|
||||
|
||||
### Cost Management
|
||||
- Use Azure Cost Management for monitoring
|
||||
- Implement auto-shutdown for development VMs
|
||||
- Consider spot instances for non-critical workloads
|
||||
- Use reserved instances for predictable workloads
|
||||
|
||||
### Backup and Recovery
|
||||
- Enable automated backups for all data services
|
||||
- Test backup restoration procedures regularly
|
||||
- Implement geo-redundant storage for critical data
|
||||
- Document disaster recovery procedures
|
||||
|
||||
---
|
||||
|
||||
This Azure deployment guide provides multiple options for hosting Chatwoot on Microsoft Azure. Choose the deployment method that best fits your requirements, budget, and operational preferences.
|
||||
@@ -1,670 +0,0 @@
|
||||
---
|
||||
title: DigitalOcean Deployment
|
||||
description: Deploy Chatwoot on DigitalOcean with Droplets, App Platform, or Kubernetes
|
||||
sidebarTitle: DigitalOcean
|
||||
---
|
||||
|
||||
# DigitalOcean Deployment Guide
|
||||
|
||||
Deploy Chatwoot on DigitalOcean using Droplets, App Platform, or DigitalOcean Kubernetes for a scalable, cost-effective solution.
|
||||
|
||||
## Deployment Options
|
||||
|
||||
<CardGroup cols={3}>
|
||||
<Card title="Droplets" icon="server" href="#droplets-deployment">
|
||||
Traditional VPS deployment with full control
|
||||
</Card>
|
||||
<Card title="App Platform" icon="cloud" href="#app-platform">
|
||||
Platform-as-a-Service deployment
|
||||
</Card>
|
||||
<Card title="Kubernetes" icon="kubernetes" href="#kubernetes-deployment">
|
||||
Container orchestration with DOKS
|
||||
</Card>
|
||||
</CardGroup>
|
||||
|
||||
## Droplets Deployment
|
||||
|
||||
### Quick Start with One-Click Install
|
||||
|
||||
DigitalOcean offers a one-click Chatwoot installation from the Marketplace:
|
||||
|
||||
1. **Navigate to DigitalOcean Marketplace**
|
||||
2. **Search for "Chatwoot"**
|
||||
3. **Click "Create Chatwoot Droplet"**
|
||||
4. **Configure your Droplet:**
|
||||
- **Plan**: Basic ($12/month minimum recommended)
|
||||
- **CPU options**: Regular Intel
|
||||
- **Region**: Choose closest to your users
|
||||
- **Authentication**: SSH keys (recommended)
|
||||
- **Hostname**: chatwoot-production
|
||||
|
||||
5. **Access your installation:**
|
||||
```bash
|
||||
ssh root@your-droplet-ip
|
||||
```
|
||||
|
||||
### Manual Installation
|
||||
|
||||
#### Create Droplet
|
||||
|
||||
```bash
|
||||
# Using doctl CLI
|
||||
doctl compute droplet create chatwoot-prod \
|
||||
--image ubuntu-20-04-x64 \
|
||||
--size s-2vcpu-4gb \
|
||||
--region nyc3 \
|
||||
--ssh-keys your-ssh-key-id \
|
||||
--enable-monitoring \
|
||||
--enable-ipv6
|
||||
```
|
||||
|
||||
#### Install Chatwoot
|
||||
|
||||
```bash
|
||||
# SSH to droplet
|
||||
ssh root@your-droplet-ip
|
||||
|
||||
# Download and run installation script
|
||||
wget https://get.chatwoot.app/linux/install.sh
|
||||
chmod +x install.sh
|
||||
./install.sh --install
|
||||
```
|
||||
|
||||
### Database Setup
|
||||
|
||||
#### Managed PostgreSQL
|
||||
|
||||
```bash
|
||||
# Create managed database cluster
|
||||
doctl databases create chatwoot-db \
|
||||
--engine postgres \
|
||||
--version 13 \
|
||||
--size db-s-1vcpu-1gb \
|
||||
--region nyc3 \
|
||||
--num-nodes 1
|
||||
|
||||
# Create database
|
||||
doctl databases db create chatwoot-db-id chatwoot_production
|
||||
|
||||
# Create user
|
||||
doctl databases user create chatwoot-db-id chatwoot
|
||||
```
|
||||
|
||||
#### Managed Redis
|
||||
|
||||
```bash
|
||||
# Create managed Redis cluster
|
||||
doctl databases create chatwoot-redis \
|
||||
--engine redis \
|
||||
--version 6 \
|
||||
--size db-s-1vcpu-1gb \
|
||||
--region nyc3 \
|
||||
--num-nodes 1
|
||||
```
|
||||
|
||||
### Configuration
|
||||
|
||||
Update Chatwoot configuration to use managed services:
|
||||
|
||||
```bash
|
||||
# Switch to chatwoot user
|
||||
sudo -i -u chatwoot
|
||||
cd chatwoot
|
||||
|
||||
# Edit environment file
|
||||
nano .env
|
||||
```
|
||||
|
||||
Add managed database configuration:
|
||||
|
||||
```bash
|
||||
# Database (from DigitalOcean dashboard)
|
||||
DATABASE_URL="postgresql://chatwoot:password@chatwoot-db-do-user-123456-0.b.db.ondigitalocean.com:25060/chatwoot_production?sslmode=require"
|
||||
|
||||
# Redis (from DigitalOcean dashboard)
|
||||
REDIS_URL="rediss://default:password@chatwoot-redis-do-user-123456-0.b.db.ondigitalocean.com:25061"
|
||||
|
||||
# Frontend URL
|
||||
FRONTEND_URL="https://chatwoot.yourdomain.com"
|
||||
FORCE_SSL=true
|
||||
|
||||
# Storage (DigitalOcean Spaces)
|
||||
ACTIVE_STORAGE_SERVICE="amazon"
|
||||
S3_BUCKET_NAME="your-chatwoot-space"
|
||||
AWS_ACCESS_KEY_ID="your-spaces-key"
|
||||
AWS_SECRET_ACCESS_KEY="your-spaces-secret"
|
||||
AWS_REGION="nyc3"
|
||||
S3_ENDPOINT="https://nyc3.digitaloceanspaces.com"
|
||||
```
|
||||
|
||||
### Load Balancer Setup
|
||||
|
||||
```bash
|
||||
# Create load balancer
|
||||
doctl compute load-balancer create \
|
||||
--name chatwoot-lb \
|
||||
--forwarding-rules entry_protocol:https,entry_port:443,target_protocol:http,target_port:3000,certificate_id:your-cert-id \
|
||||
--forwarding-rules entry_protocol:http,entry_port:80,target_protocol:http,target_port:3000 \
|
||||
--health-check protocol:http,port:3000,path:/api,check_interval_seconds:10,response_timeout_seconds:5,healthy_threshold:3,unhealthy_threshold:3 \
|
||||
--region nyc3 \
|
||||
--droplet-ids droplet-id-1,droplet-id-2
|
||||
```
|
||||
|
||||
## App Platform Deployment
|
||||
|
||||
### App Spec Configuration
|
||||
|
||||
Create `app.yaml`:
|
||||
|
||||
```yaml
|
||||
name: chatwoot-app
|
||||
services:
|
||||
- name: web
|
||||
source_dir: /
|
||||
github:
|
||||
repo: your-username/chatwoot-fork
|
||||
branch: main
|
||||
run_command: bundle exec rails server -b 0.0.0.0 -p $PORT
|
||||
environment_slug: ruby
|
||||
instance_count: 1
|
||||
instance_size_slug: basic-xxs
|
||||
envs:
|
||||
- key: RAILS_ENV
|
||||
value: production
|
||||
- key: DATABASE_URL
|
||||
value: ${chatwoot-db.DATABASE_URL}
|
||||
- key: REDIS_URL
|
||||
value: ${chatwoot-redis.REDIS_URL}
|
||||
- key: FRONTEND_URL
|
||||
value: ${APP_URL}
|
||||
- key: FORCE_SSL
|
||||
value: "true"
|
||||
http_port: 8080
|
||||
|
||||
- name: worker
|
||||
source_dir: /
|
||||
github:
|
||||
repo: your-username/chatwoot-fork
|
||||
branch: main
|
||||
run_command: bundle exec sidekiq -C config/sidekiq.yml
|
||||
environment_slug: ruby
|
||||
instance_count: 1
|
||||
instance_size_slug: basic-xxs
|
||||
envs:
|
||||
- key: RAILS_ENV
|
||||
value: production
|
||||
- key: DATABASE_URL
|
||||
value: ${chatwoot-db.DATABASE_URL}
|
||||
- key: REDIS_URL
|
||||
value: ${chatwoot-redis.REDIS_URL}
|
||||
|
||||
databases:
|
||||
- name: chatwoot-db
|
||||
engine: PG
|
||||
version: "13"
|
||||
size: db-s-dev-database
|
||||
|
||||
- name: chatwoot-redis
|
||||
engine: REDIS
|
||||
version: "6"
|
||||
size: db-s-dev-database
|
||||
|
||||
static_sites:
|
||||
- name: assets
|
||||
source_dir: /public
|
||||
github:
|
||||
repo: your-username/chatwoot-fork
|
||||
branch: main
|
||||
build_command: bundle exec rails assets:precompile
|
||||
```
|
||||
|
||||
### Deploy with App Platform
|
||||
|
||||
```bash
|
||||
# Deploy using doctl
|
||||
doctl apps create --spec app.yaml
|
||||
|
||||
# Or deploy via DigitalOcean Control Panel
|
||||
# 1. Go to App Platform
|
||||
# 2. Create App
|
||||
# 3. Connect your GitHub repository
|
||||
# 4. Configure build and run commands
|
||||
# 5. Add environment variables
|
||||
# 6. Deploy
|
||||
```
|
||||
|
||||
## Kubernetes Deployment
|
||||
|
||||
### Create DOKS Cluster
|
||||
|
||||
```bash
|
||||
# Create Kubernetes cluster
|
||||
doctl kubernetes cluster create chatwoot-k8s \
|
||||
--region nyc3 \
|
||||
--version 1.24.4-do.0 \
|
||||
--count 3 \
|
||||
--size s-2vcpu-4gb \
|
||||
--auto-upgrade=true \
|
||||
--maintenance-window="saturday=06:00"
|
||||
|
||||
# Get kubeconfig
|
||||
doctl kubernetes cluster kubeconfig save chatwoot-k8s
|
||||
```
|
||||
|
||||
### Helm Deployment
|
||||
|
||||
```bash
|
||||
# Add Chatwoot Helm repository
|
||||
helm repo add chatwoot https://chatwoot.github.io/charts
|
||||
helm repo update
|
||||
|
||||
# Create namespace
|
||||
kubectl create namespace chatwoot
|
||||
|
||||
# Install with DigitalOcean-specific values
|
||||
helm install chatwoot chatwoot/chatwoot \
|
||||
--namespace chatwoot \
|
||||
--set ingress.enabled=true \
|
||||
--set ingress.className=nginx \
|
||||
--set ingress.hosts[0].host=chatwoot.yourdomain.com \
|
||||
--set postgresql.enabled=false \
|
||||
--set redis.enabled=false \
|
||||
--set env.DATABASE_URL="postgresql://..." \
|
||||
--set env.REDIS_URL="redis://..."
|
||||
```
|
||||
|
||||
### DigitalOcean-Specific Values
|
||||
|
||||
Create `do-values.yaml`:
|
||||
|
||||
```yaml
|
||||
# DigitalOcean Kubernetes values
|
||||
ingress:
|
||||
enabled: true
|
||||
className: nginx
|
||||
annotations:
|
||||
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
||||
kubernetes.digitalocean.com/load-balancer-id: "your-lb-id"
|
||||
hosts:
|
||||
- host: chatwoot.yourdomain.com
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
|
||||
# Use DigitalOcean managed databases
|
||||
postgresql:
|
||||
enabled: false
|
||||
|
||||
redis:
|
||||
enabled: false
|
||||
|
||||
# DigitalOcean Spaces for storage
|
||||
env:
|
||||
ACTIVE_STORAGE_SERVICE: "amazon"
|
||||
S3_BUCKET_NAME: "your-chatwoot-space"
|
||||
AWS_ACCESS_KEY_ID: "your-spaces-key"
|
||||
AWS_SECRET_ACCESS_KEY: "your-spaces-secret"
|
||||
AWS_REGION: "nyc3"
|
||||
S3_ENDPOINT: "https://nyc3.digitaloceanspaces.com"
|
||||
|
||||
# Resource limits for DigitalOcean
|
||||
resources:
|
||||
limits:
|
||||
cpu: 1000m
|
||||
memory: 2Gi
|
||||
requests:
|
||||
cpu: 500m
|
||||
memory: 1Gi
|
||||
|
||||
# Storage class for DigitalOcean Block Storage
|
||||
persistence:
|
||||
enabled: true
|
||||
storageClass: "do-block-storage"
|
||||
size: 20Gi
|
||||
```
|
||||
|
||||
## Storage Configuration
|
||||
|
||||
### DigitalOcean Spaces
|
||||
|
||||
```bash
|
||||
# Create Spaces bucket
|
||||
doctl compute cdn create \
|
||||
--origin nyc3.digitaloceanspaces.com/your-chatwoot-space \
|
||||
--ttl 3600
|
||||
|
||||
# Configure CORS for Spaces
|
||||
# Create cors.json:
|
||||
{
|
||||
"CORSRules": [
|
||||
{
|
||||
"AllowedOrigins": ["https://chatwoot.yourdomain.com"],
|
||||
"AllowedMethods": ["GET", "PUT", "POST", "DELETE"],
|
||||
"AllowedHeaders": ["*"],
|
||||
"MaxAgeSeconds": 3000
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
# Apply CORS configuration
|
||||
s3cmd setcors cors.json s3://your-chatwoot-space
|
||||
```
|
||||
|
||||
### Block Storage for Droplets
|
||||
|
||||
```bash
|
||||
# Create and attach block storage
|
||||
doctl compute volume create chatwoot-storage \
|
||||
--size 100GiB \
|
||||
--region nyc3
|
||||
|
||||
doctl compute volume-action attach chatwoot-storage \
|
||||
--droplet-id your-droplet-id
|
||||
|
||||
# Mount the volume
|
||||
sudo mkdir /mnt/chatwoot-storage
|
||||
sudo mount -o discard,defaults /dev/disk/by-id/scsi-0DO_Volume_chatwoot-storage /mnt/chatwoot-storage
|
||||
echo '/dev/disk/by-id/scsi-0DO_Volume_chatwoot-storage /mnt/chatwoot-storage ext4 defaults,nofail,discard 0 0' | sudo tee -a /etc/fstab
|
||||
```
|
||||
|
||||
## SSL Certificate
|
||||
|
||||
### Let's Encrypt with Certbot
|
||||
|
||||
```bash
|
||||
# Install Certbot
|
||||
sudo apt update
|
||||
sudo apt install certbot python3-certbot-nginx
|
||||
|
||||
# Obtain certificate
|
||||
sudo certbot --nginx -d chatwoot.yourdomain.com
|
||||
|
||||
# Auto-renewal
|
||||
sudo crontab -e
|
||||
# Add: 0 12 * * * /usr/bin/certbot renew --quiet
|
||||
```
|
||||
|
||||
### DigitalOcean Load Balancer SSL
|
||||
|
||||
```bash
|
||||
# Upload certificate to DigitalOcean
|
||||
doctl compute certificate create \
|
||||
--name chatwoot-cert \
|
||||
--private-key-path private.key \
|
||||
--leaf-certificate-path certificate.crt \
|
||||
--certificate-chain-path ca_bundle.crt
|
||||
|
||||
# Update load balancer with certificate
|
||||
doctl compute load-balancer update your-lb-id \
|
||||
--forwarding-rules entry_protocol:https,entry_port:443,target_protocol:http,target_port:3000,certificate_id:your-cert-id
|
||||
```
|
||||
|
||||
## Monitoring and Alerting
|
||||
|
||||
### DigitalOcean Monitoring
|
||||
|
||||
```bash
|
||||
# Enable monitoring for droplets
|
||||
doctl compute droplet create chatwoot-prod \
|
||||
--enable-monitoring \
|
||||
--enable-ipv6
|
||||
|
||||
# Create alert policies
|
||||
doctl monitoring alert-policy create \
|
||||
--type v1/insights/droplet/cpu \
|
||||
--description "High CPU usage" \
|
||||
--compare GreaterThan \
|
||||
--value 80 \
|
||||
--window 5m \
|
||||
--entities droplet:your-droplet-id
|
||||
```
|
||||
|
||||
### Custom Metrics with Prometheus
|
||||
|
||||
```yaml
|
||||
# prometheus-config.yaml
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: prometheus-config
|
||||
namespace: monitoring
|
||||
data:
|
||||
prometheus.yml: |
|
||||
global:
|
||||
scrape_interval: 15s
|
||||
scrape_configs:
|
||||
- job_name: 'chatwoot'
|
||||
static_configs:
|
||||
- targets: ['chatwoot-service:3000']
|
||||
metrics_path: /metrics
|
||||
```
|
||||
|
||||
## Backup Strategy
|
||||
|
||||
### Database Backups
|
||||
|
||||
```bash
|
||||
# Automated backups for managed databases are enabled by default
|
||||
# Manual backup
|
||||
doctl databases backups list chatwoot-db-id
|
||||
|
||||
# Restore from backup
|
||||
doctl databases backups restore chatwoot-db-id backup-id
|
||||
```
|
||||
|
||||
### Droplet Snapshots
|
||||
|
||||
```bash
|
||||
# Create snapshot
|
||||
doctl compute droplet-action snapshot your-droplet-id \
|
||||
--snapshot-name "chatwoot-backup-$(date +%Y%m%d)"
|
||||
|
||||
# Schedule automated snapshots
|
||||
doctl compute droplet-action enable-backups your-droplet-id
|
||||
```
|
||||
|
||||
### Application Data Backup
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# backup-script.sh
|
||||
DATE=$(date +%Y%m%d_%H%M%S)
|
||||
|
||||
# Database backup (if using managed database)
|
||||
pg_dump $DATABASE_URL | gzip > "/tmp/chatwoot_db_$DATE.sql.gz"
|
||||
|
||||
# Upload to Spaces
|
||||
s3cmd put "/tmp/chatwoot_db_$DATE.sql.gz" s3://your-backup-space/db/
|
||||
|
||||
# File uploads backup
|
||||
s3cmd sync s3://your-chatwoot-space/ s3://your-backup-space/files/
|
||||
|
||||
# Cleanup local backup
|
||||
rm "/tmp/chatwoot_db_$DATE.sql.gz"
|
||||
```
|
||||
|
||||
## Scaling and Performance
|
||||
|
||||
### Horizontal Scaling with Load Balancer
|
||||
|
||||
```bash
|
||||
# Create additional droplets
|
||||
for i in {2..3}; do
|
||||
doctl compute droplet create chatwoot-prod-$i \
|
||||
--image ubuntu-20-04-x64 \
|
||||
--size s-2vcpu-4gb \
|
||||
--region nyc3 \
|
||||
--ssh-keys your-ssh-key-id \
|
||||
--user-data-file cloud-init.yaml
|
||||
done
|
||||
|
||||
# Add droplets to load balancer
|
||||
doctl compute load-balancer add-droplets your-lb-id \
|
||||
--droplet-ids droplet-id-2,droplet-id-3
|
||||
```
|
||||
|
||||
### Vertical Scaling
|
||||
|
||||
```bash
|
||||
# Resize droplet
|
||||
doctl compute droplet-action resize your-droplet-id \
|
||||
--size s-4vcpu-8gb \
|
||||
--resize-disk
|
||||
```
|
||||
|
||||
### Auto-scaling with Kubernetes
|
||||
|
||||
```yaml
|
||||
# hpa.yaml
|
||||
apiVersion: autoscaling/v2
|
||||
kind: HorizontalPodAutoscaler
|
||||
metadata:
|
||||
name: chatwoot-hpa
|
||||
namespace: chatwoot
|
||||
spec:
|
||||
scaleTargetRef:
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
name: chatwoot
|
||||
minReplicas: 2
|
||||
maxReplicas: 10
|
||||
metrics:
|
||||
- type: Resource
|
||||
resource:
|
||||
name: cpu
|
||||
target:
|
||||
type: Utilization
|
||||
averageUtilization: 70
|
||||
- type: Resource
|
||||
resource:
|
||||
name: memory
|
||||
target:
|
||||
type: Utilization
|
||||
averageUtilization: 80
|
||||
```
|
||||
|
||||
## Cost Optimization
|
||||
|
||||
### Reserved Instances
|
||||
|
||||
```bash
|
||||
# DigitalOcean doesn't offer reserved instances
|
||||
# But you can optimize costs by:
|
||||
|
||||
# 1. Right-sizing droplets
|
||||
doctl compute size list
|
||||
|
||||
# 2. Using appropriate database sizes
|
||||
doctl databases options sizes
|
||||
|
||||
# 3. Implementing auto-scaling to scale down during low usage
|
||||
```
|
||||
|
||||
### Cost Monitoring
|
||||
|
||||
```bash
|
||||
# Check current usage and costs
|
||||
doctl account get
|
||||
|
||||
# Monitor resource usage
|
||||
doctl monitoring metrics bandwidth droplet:your-droplet-id
|
||||
doctl monitoring metrics cpu droplet:your-droplet-id
|
||||
doctl monitoring metrics memory droplet:your-droplet-id
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
<Accordion title="Droplet connection issues">
|
||||
Check:
|
||||
- Firewall rules (ufw status)
|
||||
- DigitalOcean Cloud Firewalls
|
||||
- SSH key configuration
|
||||
- Network connectivity
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Database connection problems">
|
||||
Verify:
|
||||
- Database cluster status
|
||||
- Connection string format
|
||||
- SSL requirements for managed databases
|
||||
- Firewall rules for database access
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Load balancer health check failures">
|
||||
Solutions:
|
||||
- Verify health check path (/api)
|
||||
- Check application startup time
|
||||
- Ensure proper port configuration
|
||||
- Review application logs
|
||||
</Accordion>
|
||||
|
||||
### Diagnostic Commands
|
||||
|
||||
```bash
|
||||
# Check droplet status
|
||||
doctl compute droplet get your-droplet-id
|
||||
|
||||
# View load balancer status
|
||||
doctl compute load-balancer get your-lb-id
|
||||
|
||||
# Check database status
|
||||
doctl databases get chatwoot-db-id
|
||||
|
||||
# Monitor application logs
|
||||
sudo journalctl -u chatwoot-web.1.service -f
|
||||
sudo journalctl -u chatwoot-worker.1.service -f
|
||||
```
|
||||
|
||||
### Performance Monitoring
|
||||
|
||||
```bash
|
||||
# System resources
|
||||
htop
|
||||
iostat -x 1
|
||||
free -h
|
||||
df -h
|
||||
|
||||
# Network monitoring
|
||||
iftop
|
||||
netstat -tulpn
|
||||
|
||||
# Application metrics
|
||||
curl http://localhost:3000/api
|
||||
curl http://localhost:3000/metrics
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
### Security
|
||||
- Enable DigitalOcean Cloud Firewalls
|
||||
- Use SSH keys instead of passwords
|
||||
- Enable automatic security updates
|
||||
- Implement fail2ban for SSH protection
|
||||
- Use managed databases for better security
|
||||
|
||||
### Performance
|
||||
- Use DigitalOcean Spaces CDN for static assets
|
||||
- Implement Redis caching
|
||||
- Monitor with DigitalOcean Monitoring
|
||||
- Use SSD-backed droplets
|
||||
- Place resources in the same region
|
||||
|
||||
### Reliability
|
||||
- Use multiple availability zones
|
||||
- Implement automated backups
|
||||
- Set up monitoring and alerting
|
||||
- Use load balancers for high availability
|
||||
- Test disaster recovery procedures
|
||||
|
||||
### Cost Management
|
||||
- Right-size your resources
|
||||
- Use managed services to reduce operational overhead
|
||||
- Implement monitoring to track usage
|
||||
- Clean up unused resources regularly
|
||||
- Consider using Kubernetes for better resource utilization
|
||||
|
||||
---
|
||||
|
||||
This DigitalOcean deployment guide provides multiple options for hosting Chatwoot on DigitalOcean's infrastructure. Choose the deployment method that best fits your technical requirements and budget constraints.
|
||||
@@ -1,745 +0,0 @@
|
||||
---
|
||||
title: Google Cloud Platform (GCP) Deployment
|
||||
description: Deploy Chatwoot on Google Cloud Platform with Compute Engine, Cloud Run, or GKE
|
||||
sidebarTitle: GCP
|
||||
---
|
||||
|
||||
# Google Cloud Platform Deployment Guide
|
||||
|
||||
Deploy Chatwoot on Google Cloud Platform using Compute Engine, Cloud Run, or Google Kubernetes Engine for a scalable, enterprise-ready solution.
|
||||
|
||||
## Deployment Options
|
||||
|
||||
<CardGroup cols={3}>
|
||||
<Card title="Compute Engine" icon="server" href="#compute-engine">
|
||||
Traditional VM deployment with full control
|
||||
</Card>
|
||||
<Card title="Cloud Run" icon="cloud" href="#cloud-run">
|
||||
Serverless container deployment
|
||||
</Card>
|
||||
<Card title="GKE" icon="kubernetes" href="#google-kubernetes-engine">
|
||||
Managed Kubernetes deployment
|
||||
</Card>
|
||||
</CardGroup>
|
||||
|
||||
## Compute Engine Deployment
|
||||
|
||||
### Prerequisites
|
||||
|
||||
```bash
|
||||
# Install and configure gcloud CLI
|
||||
curl https://sdk.cloud.google.com | bash
|
||||
exec -l $SHELL
|
||||
gcloud init
|
||||
|
||||
# Set project and region
|
||||
gcloud config set project your-project-id
|
||||
gcloud config set compute/region us-central1
|
||||
gcloud config set compute/zone us-central1-a
|
||||
```
|
||||
|
||||
### Network Setup
|
||||
|
||||
```bash
|
||||
# Create VPC network
|
||||
gcloud compute networks create chatwoot-vpc --subnet-mode=custom
|
||||
|
||||
# Create subnet
|
||||
gcloud compute networks subnets create chatwoot-subnet \
|
||||
--network=chatwoot-vpc \
|
||||
--range=10.0.1.0/24 \
|
||||
--region=us-central1
|
||||
|
||||
# Create firewall rules
|
||||
gcloud compute firewall-rules create chatwoot-allow-http \
|
||||
--network=chatwoot-vpc \
|
||||
--allow=tcp:80,tcp:443,tcp:3000 \
|
||||
--source-ranges=0.0.0.0/0 \
|
||||
--target-tags=chatwoot-server
|
||||
|
||||
gcloud compute firewall-rules create chatwoot-allow-ssh \
|
||||
--network=chatwoot-vpc \
|
||||
--allow=tcp:22 \
|
||||
--source-ranges=0.0.0.0/0 \
|
||||
--target-tags=chatwoot-server
|
||||
```
|
||||
|
||||
### Database Setup
|
||||
|
||||
#### Cloud SQL PostgreSQL
|
||||
|
||||
```bash
|
||||
# Create Cloud SQL instance
|
||||
gcloud sql instances create chatwoot-db \
|
||||
--database-version=POSTGRES_13 \
|
||||
--tier=db-g1-small \
|
||||
--region=us-central1 \
|
||||
--storage-type=SSD \
|
||||
--storage-size=100GB \
|
||||
--storage-auto-increase \
|
||||
--backup-start-time=03:00 \
|
||||
--enable-bin-log \
|
||||
--maintenance-window-day=SUN \
|
||||
--maintenance-window-hour=04
|
||||
|
||||
# Create database
|
||||
gcloud sql databases create chatwoot_production --instance=chatwoot-db
|
||||
|
||||
# Create user
|
||||
gcloud sql users create chatwoot \
|
||||
--instance=chatwoot-db \
|
||||
--password=your-secure-password
|
||||
|
||||
# Get connection name
|
||||
gcloud sql instances describe chatwoot-db --format="value(connectionName)"
|
||||
```
|
||||
|
||||
#### Memorystore Redis
|
||||
|
||||
```bash
|
||||
# Create Redis instance
|
||||
gcloud redis instances create chatwoot-redis \
|
||||
--size=1 \
|
||||
--region=us-central1 \
|
||||
--redis-version=redis_6_x \
|
||||
--network=chatwoot-vpc
|
||||
```
|
||||
|
||||
### Storage Setup
|
||||
|
||||
```bash
|
||||
# Create Cloud Storage bucket
|
||||
gsutil mb -p your-project-id -c STANDARD -l us-central1 gs://your-chatwoot-bucket
|
||||
|
||||
# Set bucket permissions
|
||||
gsutil iam ch allUsers:objectViewer gs://your-chatwoot-bucket
|
||||
|
||||
# Enable CORS
|
||||
cat > cors.json << EOF
|
||||
[
|
||||
{
|
||||
"origin": ["https://chatwoot.yourdomain.com"],
|
||||
"method": ["GET", "PUT", "POST", "DELETE"],
|
||||
"responseHeader": ["Content-Type"],
|
||||
"maxAgeSeconds": 3600
|
||||
}
|
||||
]
|
||||
EOF
|
||||
|
||||
gsutil cors set cors.json gs://your-chatwoot-bucket
|
||||
```
|
||||
|
||||
### Compute Instance
|
||||
|
||||
#### Create Instance Template
|
||||
|
||||
```bash
|
||||
# Create startup script
|
||||
cat > startup-script.sh << 'EOF'
|
||||
#!/bin/bash
|
||||
apt-get update
|
||||
apt-get install -y wget curl
|
||||
|
||||
# Download and install Chatwoot
|
||||
wget https://get.chatwoot.app/linux/install.sh
|
||||
chmod +x install.sh
|
||||
./install.sh --install
|
||||
|
||||
# Configure environment
|
||||
sudo -u chatwoot bash << 'INNER_EOF'
|
||||
cd /home/chatwoot/chatwoot
|
||||
cat > .env << 'ENV_EOF'
|
||||
RAILS_ENV=production
|
||||
NODE_ENV=production
|
||||
FRONTEND_URL=https://chatwoot.yourdomain.com
|
||||
FORCE_SSL=true
|
||||
|
||||
# Database
|
||||
DATABASE_URL=postgresql://chatwoot:password@/chatwoot_production?host=/cloudsql/your-project:us-central1:chatwoot-db
|
||||
|
||||
# Redis
|
||||
REDIS_URL=redis://10.0.0.3:6379/0
|
||||
|
||||
# Storage
|
||||
ACTIVE_STORAGE_SERVICE=google
|
||||
GCS_PROJECT=your-project-id
|
||||
GCS_BUCKET=your-chatwoot-bucket
|
||||
|
||||
# Email (using SendGrid)
|
||||
MAILER_SENDER_EMAIL=noreply@yourdomain.com
|
||||
SMTP_ADDRESS=smtp.sendgrid.net
|
||||
SMTP_PORT=587
|
||||
SMTP_USERNAME=apikey
|
||||
SMTP_PASSWORD=your-sendgrid-api-key
|
||||
SMTP_AUTHENTICATION=plain
|
||||
SMTP_ENABLE_STARTTLS_AUTO=true
|
||||
ENV_EOF
|
||||
|
||||
# Prepare database
|
||||
RAILS_ENV=production bundle exec rake db:chatwoot_prepare
|
||||
INNER_EOF
|
||||
|
||||
# Restart services
|
||||
systemctl restart chatwoot.target
|
||||
EOF
|
||||
|
||||
# Create instance template
|
||||
gcloud compute instance-templates create chatwoot-template \
|
||||
--machine-type=e2-standard-2 \
|
||||
--network-interface=network=chatwoot-vpc,subnet=chatwoot-subnet \
|
||||
--boot-disk-size=50GB \
|
||||
--boot-disk-type=pd-ssd \
|
||||
--image-family=ubuntu-2004-lts \
|
||||
--image-project=ubuntu-os-cloud \
|
||||
--tags=chatwoot-server \
|
||||
--metadata-from-file startup-script=startup-script.sh \
|
||||
--service-account=chatwoot-sa@your-project-id.iam.gserviceaccount.com \
|
||||
--scopes=https://www.googleapis.com/auth/cloud-platform
|
||||
```
|
||||
|
||||
#### Create Managed Instance Group
|
||||
|
||||
```bash
|
||||
# Create instance group
|
||||
gcloud compute instance-groups managed create chatwoot-ig \
|
||||
--template=chatwoot-template \
|
||||
--size=2 \
|
||||
--zone=us-central1-a
|
||||
|
||||
# Configure autoscaling
|
||||
gcloud compute instance-groups managed set-autoscaling chatwoot-ig \
|
||||
--max-num-replicas=5 \
|
||||
--min-num-replicas=2 \
|
||||
--target-cpu-utilization=0.7 \
|
||||
--zone=us-central1-a
|
||||
```
|
||||
|
||||
### Load Balancer
|
||||
|
||||
```bash
|
||||
# Create health check
|
||||
gcloud compute health-checks create http chatwoot-health-check \
|
||||
--port=3000 \
|
||||
--request-path=/api
|
||||
|
||||
# Create backend service
|
||||
gcloud compute backend-services create chatwoot-backend \
|
||||
--protocol=HTTP \
|
||||
--health-checks=chatwoot-health-check \
|
||||
--global
|
||||
|
||||
# Add instance group to backend service
|
||||
gcloud compute backend-services add-backend chatwoot-backend \
|
||||
--instance-group=chatwoot-ig \
|
||||
--instance-group-zone=us-central1-a \
|
||||
--global
|
||||
|
||||
# Create URL map
|
||||
gcloud compute url-maps create chatwoot-map \
|
||||
--default-service=chatwoot-backend
|
||||
|
||||
# Create SSL certificate
|
||||
gcloud compute ssl-certificates create chatwoot-ssl \
|
||||
--domains=chatwoot.yourdomain.com
|
||||
|
||||
# Create HTTPS proxy
|
||||
gcloud compute target-https-proxies create chatwoot-https-proxy \
|
||||
--url-map=chatwoot-map \
|
||||
--ssl-certificates=chatwoot-ssl
|
||||
|
||||
# Create global forwarding rule
|
||||
gcloud compute forwarding-rules create chatwoot-https-rule \
|
||||
--global \
|
||||
--target-https-proxy=chatwoot-https-proxy \
|
||||
--ports=443
|
||||
|
||||
# Create HTTP to HTTPS redirect
|
||||
gcloud compute url-maps create chatwoot-redirect \
|
||||
--default-url-redirect-response-code=301 \
|
||||
--default-url-redirect-https-redirect
|
||||
|
||||
gcloud compute target-http-proxies create chatwoot-http-proxy \
|
||||
--url-map=chatwoot-redirect
|
||||
|
||||
gcloud compute forwarding-rules create chatwoot-http-rule \
|
||||
--global \
|
||||
--target-http-proxy=chatwoot-http-proxy \
|
||||
--ports=80
|
||||
```
|
||||
|
||||
## Cloud Run Deployment
|
||||
|
||||
### Containerize Chatwoot
|
||||
|
||||
Create `Dockerfile`:
|
||||
|
||||
```dockerfile
|
||||
FROM chatwoot/chatwoot:latest
|
||||
|
||||
# Set environment variables
|
||||
ENV RAILS_ENV=production
|
||||
ENV NODE_ENV=production
|
||||
ENV PORT=8080
|
||||
|
||||
# Expose port
|
||||
EXPOSE 8080
|
||||
|
||||
# Start command
|
||||
CMD ["bundle", "exec", "rails", "server", "-b", "0.0.0.0", "-p", "8080"]
|
||||
```
|
||||
|
||||
### Build and Deploy
|
||||
|
||||
```bash
|
||||
# Build container image
|
||||
gcloud builds submit --tag gcr.io/your-project-id/chatwoot
|
||||
|
||||
# Deploy to Cloud Run
|
||||
gcloud run deploy chatwoot \
|
||||
--image gcr.io/your-project-id/chatwoot \
|
||||
--platform managed \
|
||||
--region us-central1 \
|
||||
--allow-unauthenticated \
|
||||
--memory 2Gi \
|
||||
--cpu 2 \
|
||||
--max-instances 10 \
|
||||
--set-env-vars RAILS_ENV=production \
|
||||
--set-env-vars DATABASE_URL="postgresql://..." \
|
||||
--set-env-vars REDIS_URL="redis://..." \
|
||||
--set-env-vars FRONTEND_URL="https://chatwoot.yourdomain.com"
|
||||
|
||||
# Deploy worker service
|
||||
gcloud run deploy chatwoot-worker \
|
||||
--image gcr.io/your-project-id/chatwoot \
|
||||
--platform managed \
|
||||
--region us-central1 \
|
||||
--no-allow-unauthenticated \
|
||||
--memory 1Gi \
|
||||
--cpu 1 \
|
||||
--max-instances 5 \
|
||||
--command "bundle,exec,sidekiq,-C,config/sidekiq.yml" \
|
||||
--set-env-vars RAILS_ENV=production \
|
||||
--set-env-vars DATABASE_URL="postgresql://..." \
|
||||
--set-env-vars REDIS_URL="redis://..."
|
||||
```
|
||||
|
||||
### Custom Domain
|
||||
|
||||
```bash
|
||||
# Map custom domain
|
||||
gcloud run domain-mappings create \
|
||||
--service chatwoot \
|
||||
--domain chatwoot.yourdomain.com \
|
||||
--region us-central1
|
||||
```
|
||||
|
||||
## Google Kubernetes Engine (GKE)
|
||||
|
||||
### Create GKE Cluster
|
||||
|
||||
```bash
|
||||
# Create GKE cluster
|
||||
gcloud container clusters create chatwoot-cluster \
|
||||
--zone us-central1-a \
|
||||
--num-nodes 3 \
|
||||
--machine-type e2-standard-2 \
|
||||
--disk-size 50GB \
|
||||
--disk-type pd-ssd \
|
||||
--enable-autoscaling \
|
||||
--min-nodes 1 \
|
||||
--max-nodes 5 \
|
||||
--enable-autorepair \
|
||||
--enable-autoupgrade \
|
||||
--network chatwoot-vpc \
|
||||
--subnetwork chatwoot-subnet
|
||||
|
||||
# Get credentials
|
||||
gcloud container clusters get-credentials chatwoot-cluster --zone us-central1-a
|
||||
```
|
||||
|
||||
### Helm Deployment
|
||||
|
||||
```bash
|
||||
# Add Chatwoot Helm repository
|
||||
helm repo add chatwoot https://chatwoot.github.io/charts
|
||||
helm repo update
|
||||
|
||||
# Create namespace
|
||||
kubectl create namespace chatwoot
|
||||
|
||||
# Create values file for GCP
|
||||
cat > gcp-values.yaml << EOF
|
||||
# GCP-specific values
|
||||
ingress:
|
||||
enabled: true
|
||||
className: gce
|
||||
annotations:
|
||||
kubernetes.io/ingress.global-static-ip-name: "chatwoot-ip"
|
||||
networking.gke.io/managed-certificates: "chatwoot-ssl"
|
||||
kubernetes.io/ingress.allow-http: "false"
|
||||
hosts:
|
||||
- host: chatwoot.yourdomain.com
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
|
||||
# Use Cloud SQL and Memorystore
|
||||
postgresql:
|
||||
enabled: false
|
||||
|
||||
redis:
|
||||
enabled: false
|
||||
|
||||
env:
|
||||
DATABASE_URL: "postgresql://chatwoot:password@/chatwoot_production?host=/cloudsql/your-project:us-central1:chatwoot-db"
|
||||
REDIS_URL: "redis://10.0.0.3:6379/0"
|
||||
ACTIVE_STORAGE_SERVICE: "google"
|
||||
GCS_PROJECT: "your-project-id"
|
||||
GCS_BUCKET: "your-chatwoot-bucket"
|
||||
|
||||
# Resource limits
|
||||
resources:
|
||||
limits:
|
||||
cpu: 1000m
|
||||
memory: 2Gi
|
||||
requests:
|
||||
cpu: 500m
|
||||
memory: 1Gi
|
||||
|
||||
# Workload Identity
|
||||
serviceAccount:
|
||||
create: true
|
||||
annotations:
|
||||
iam.gke.io/gcp-service-account: chatwoot-sa@your-project-id.iam.gserviceaccount.com
|
||||
EOF
|
||||
|
||||
# Install Chatwoot
|
||||
helm install chatwoot chatwoot/chatwoot \
|
||||
--namespace chatwoot \
|
||||
--values gcp-values.yaml
|
||||
```
|
||||
|
||||
### SSL Certificate
|
||||
|
||||
```yaml
|
||||
# managed-cert.yaml
|
||||
apiVersion: networking.gke.io/v1
|
||||
kind: ManagedCertificate
|
||||
metadata:
|
||||
name: chatwoot-ssl
|
||||
namespace: chatwoot
|
||||
spec:
|
||||
domains:
|
||||
- chatwoot.yourdomain.com
|
||||
```
|
||||
|
||||
```bash
|
||||
kubectl apply -f managed-cert.yaml
|
||||
```
|
||||
|
||||
## Service Account and IAM
|
||||
|
||||
### Create Service Account
|
||||
|
||||
```bash
|
||||
# Create service account
|
||||
gcloud iam service-accounts create chatwoot-sa \
|
||||
--display-name="Chatwoot Service Account"
|
||||
|
||||
# Grant necessary permissions
|
||||
gcloud projects add-iam-policy-binding your-project-id \
|
||||
--member="serviceAccount:chatwoot-sa@your-project-id.iam.gserviceaccount.com" \
|
||||
--role="roles/cloudsql.client"
|
||||
|
||||
gcloud projects add-iam-policy-binding your-project-id \
|
||||
--member="serviceAccount:chatwoot-sa@your-project-id.iam.gserviceaccount.com" \
|
||||
--role="roles/storage.objectAdmin"
|
||||
|
||||
gcloud projects add-iam-policy-binding your-project-id \
|
||||
--member="serviceAccount:chatwoot-sa@your-project-id.iam.gserviceaccount.com" \
|
||||
--role="roles/redis.editor"
|
||||
|
||||
# Create and download key
|
||||
gcloud iam service-accounts keys create chatwoot-key.json \
|
||||
--iam-account=chatwoot-sa@your-project-id.iam.gserviceaccount.com
|
||||
```
|
||||
|
||||
## Monitoring and Logging
|
||||
|
||||
### Cloud Monitoring
|
||||
|
||||
```bash
|
||||
# Enable APIs
|
||||
gcloud services enable monitoring.googleapis.com
|
||||
gcloud services enable logging.googleapis.com
|
||||
|
||||
# Create notification channel
|
||||
gcloud alpha monitoring channels create \
|
||||
--display-name="Email Alerts" \
|
||||
--type=email \
|
||||
--channel-labels=email_address=admin@yourdomain.com
|
||||
```
|
||||
|
||||
### Custom Metrics
|
||||
|
||||
```yaml
|
||||
# monitoring.yaml
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: prometheus-config
|
||||
namespace: chatwoot
|
||||
data:
|
||||
prometheus.yml: |
|
||||
global:
|
||||
scrape_interval: 15s
|
||||
scrape_configs:
|
||||
- job_name: 'chatwoot'
|
||||
static_configs:
|
||||
- targets: ['chatwoot-service:3000']
|
||||
metrics_path: /metrics
|
||||
```
|
||||
|
||||
### Alerting Policies
|
||||
|
||||
```bash
|
||||
# Create alerting policy for high CPU
|
||||
gcloud alpha monitoring policies create \
|
||||
--policy-from-file=cpu-alert-policy.yaml
|
||||
|
||||
# cpu-alert-policy.yaml
|
||||
cat > cpu-alert-policy.yaml << EOF
|
||||
displayName: "High CPU Usage"
|
||||
conditions:
|
||||
- displayName: "CPU usage above 80%"
|
||||
conditionThreshold:
|
||||
filter: 'resource.type="gce_instance"'
|
||||
comparison: COMPARISON_GREATER_THAN
|
||||
thresholdValue: 0.8
|
||||
duration: 300s
|
||||
combiner: OR
|
||||
enabled: true
|
||||
notificationChannels:
|
||||
- projects/your-project-id/notificationChannels/CHANNEL_ID
|
||||
EOF
|
||||
```
|
||||
|
||||
## Backup and Disaster Recovery
|
||||
|
||||
### Database Backups
|
||||
|
||||
```bash
|
||||
# Cloud SQL automatic backups are enabled by default
|
||||
# Create on-demand backup
|
||||
gcloud sql backups create --instance=chatwoot-db
|
||||
|
||||
# List backups
|
||||
gcloud sql backups list --instance=chatwoot-db
|
||||
|
||||
# Restore from backup
|
||||
gcloud sql backups restore BACKUP_ID --restore-instance=chatwoot-db-restore
|
||||
```
|
||||
|
||||
### Application Backups
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# backup-script.sh
|
||||
DATE=$(date +%Y%m%d_%H%M%S)
|
||||
|
||||
# Database backup
|
||||
gcloud sql export sql chatwoot-db gs://your-backup-bucket/db/chatwoot_$DATE.sql
|
||||
|
||||
# File storage backup
|
||||
gsutil -m rsync -r -d gs://your-chatwoot-bucket gs://your-backup-bucket/files/
|
||||
|
||||
# Kubernetes configuration backup
|
||||
kubectl get all -n chatwoot -o yaml > k8s-backup-$DATE.yaml
|
||||
gsutil cp k8s-backup-$DATE.yaml gs://your-backup-bucket/k8s/
|
||||
```
|
||||
|
||||
## Security Best Practices
|
||||
|
||||
### Network Security
|
||||
|
||||
```bash
|
||||
# Create private cluster
|
||||
gcloud container clusters create chatwoot-private \
|
||||
--enable-private-nodes \
|
||||
--master-ipv4-cidr-block 172.16.0.0/28 \
|
||||
--enable-ip-alias \
|
||||
--enable-network-policy
|
||||
|
||||
# Create firewall rules for private access
|
||||
gcloud compute firewall-rules create allow-chatwoot-private \
|
||||
--network chatwoot-vpc \
|
||||
--allow tcp:443,tcp:80 \
|
||||
--source-ranges 10.0.0.0/8
|
||||
```
|
||||
|
||||
### Secret Management
|
||||
|
||||
```bash
|
||||
# Create secrets in Secret Manager
|
||||
gcloud secrets create database-password --data-file=db-password.txt
|
||||
gcloud secrets create redis-password --data-file=redis-password.txt
|
||||
|
||||
# Grant access to service account
|
||||
gcloud secrets add-iam-policy-binding database-password \
|
||||
--member="serviceAccount:chatwoot-sa@your-project-id.iam.gserviceaccount.com" \
|
||||
--role="roles/secretmanager.secretAccessor"
|
||||
```
|
||||
|
||||
### Binary Authorization
|
||||
|
||||
```bash
|
||||
# Enable Binary Authorization
|
||||
gcloud container binauthz policy import policy.yaml
|
||||
|
||||
# policy.yaml
|
||||
cat > policy.yaml << EOF
|
||||
defaultAdmissionRule:
|
||||
requireAttestationsBy:
|
||||
- projects/your-project-id/attestors/prod-attestor
|
||||
enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
|
||||
globalPolicyEvaluationMode: ENABLE
|
||||
EOF
|
||||
```
|
||||
|
||||
## Cost Optimization
|
||||
|
||||
### Preemptible Instances
|
||||
|
||||
```bash
|
||||
# Create preemptible node pool
|
||||
gcloud container node-pools create preemptible-pool \
|
||||
--cluster=chatwoot-cluster \
|
||||
--zone=us-central1-a \
|
||||
--machine-type=e2-standard-2 \
|
||||
--preemptible \
|
||||
--num-nodes=2 \
|
||||
--enable-autoscaling \
|
||||
--min-nodes=0 \
|
||||
--max-nodes=5
|
||||
```
|
||||
|
||||
### Committed Use Discounts
|
||||
|
||||
```bash
|
||||
# Purchase committed use discount
|
||||
gcloud compute commitments create chatwoot-commitment \
|
||||
--plan=12-month \
|
||||
--region=us-central1 \
|
||||
--resources=type=VCPU,amount=4 \
|
||||
--resources=type=MEMORY,amount=16
|
||||
```
|
||||
|
||||
### Resource Optimization
|
||||
|
||||
```yaml
|
||||
# resource-quota.yaml
|
||||
apiVersion: v1
|
||||
kind: ResourceQuota
|
||||
metadata:
|
||||
name: chatwoot-quota
|
||||
namespace: chatwoot
|
||||
spec:
|
||||
hard:
|
||||
requests.cpu: "4"
|
||||
requests.memory: 8Gi
|
||||
limits.cpu: "8"
|
||||
limits.memory: 16Gi
|
||||
persistentvolumeclaims: "4"
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
<Accordion title="Cloud SQL connection issues">
|
||||
Check:
|
||||
- Cloud SQL Proxy configuration
|
||||
- Service account permissions
|
||||
- Network connectivity
|
||||
- SSL requirements
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="GKE pod startup failures">
|
||||
Verify:
|
||||
- Resource quotas and limits
|
||||
- Image pull permissions
|
||||
- Service account configuration
|
||||
- Network policies
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Load balancer health check failures">
|
||||
Solutions:
|
||||
- Verify health check path (/api)
|
||||
- Check firewall rules
|
||||
- Ensure proper backend configuration
|
||||
- Review application startup time
|
||||
</Accordion>
|
||||
|
||||
### Diagnostic Commands
|
||||
|
||||
```bash
|
||||
# Check Compute Engine instances
|
||||
gcloud compute instances list
|
||||
|
||||
# View Cloud Run services
|
||||
gcloud run services list
|
||||
|
||||
# Check GKE cluster status
|
||||
gcloud container clusters describe chatwoot-cluster --zone us-central1-a
|
||||
|
||||
# View logs
|
||||
gcloud logging read "resource.type=gce_instance" --limit 50
|
||||
gcloud logging read "resource.type=cloud_run_revision" --limit 50
|
||||
|
||||
# Check Cloud SQL status
|
||||
gcloud sql instances describe chatwoot-db
|
||||
```
|
||||
|
||||
### Performance Monitoring
|
||||
|
||||
```bash
|
||||
# View metrics
|
||||
gcloud monitoring metrics list --filter="metric.type:compute"
|
||||
|
||||
# Create dashboard
|
||||
gcloud monitoring dashboards create --config-from-file=dashboard.json
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
### Security
|
||||
- Use private GKE clusters
|
||||
- Enable Workload Identity
|
||||
- Implement Binary Authorization
|
||||
- Use Secret Manager for sensitive data
|
||||
- Enable audit logging
|
||||
|
||||
### Performance
|
||||
- Use Cloud CDN for static assets
|
||||
- Implement Cloud Memorystore for caching
|
||||
- Use SSD persistent disks
|
||||
- Enable HTTP/2 and gRPC
|
||||
- Optimize container images
|
||||
|
||||
### Reliability
|
||||
- Deploy across multiple zones
|
||||
- Use managed services (Cloud SQL, Memorystore)
|
||||
- Implement proper health checks
|
||||
- Set up monitoring and alerting
|
||||
- Test disaster recovery procedures
|
||||
|
||||
### Cost Management
|
||||
- Use preemptible instances for non-critical workloads
|
||||
- Implement resource quotas
|
||||
- Purchase committed use discounts
|
||||
- Monitor usage with Cloud Billing
|
||||
- Use Cloud Functions for event-driven tasks
|
||||
|
||||
---
|
||||
|
||||
This GCP deployment guide provides comprehensive options for hosting Chatwoot on Google Cloud Platform. Choose the deployment method that best aligns with your scalability, security, and operational requirements.
|
||||
@@ -1,505 +0,0 @@
|
||||
---
|
||||
title: Heroku Deployment
|
||||
description: Deploy Chatwoot on Heroku with one-click deployment and managed services
|
||||
sidebarTitle: Heroku
|
||||
---
|
||||
|
||||
# Heroku Deployment Guide
|
||||
|
||||
Deploy Chatwoot on Heroku using the one-click deployment option for a quick and managed hosting solution. This guide covers deployment, configuration, and maintenance on Heroku's platform.
|
||||
|
||||
<Note>
|
||||
Heroku has discontinued free dynos, postgres and redis. [Chatwoot will use basic/mini plans](https://blog.heroku.com/new-low-cost-plans) for all new Heroku deployments going forward.
|
||||
</Note>
|
||||
|
||||
## Quick Deployment
|
||||
|
||||
### One-Click Deploy
|
||||
|
||||
The fastest way to get Chatwoot running on Heroku is using the one-click deploy button:
|
||||
|
||||
<Card title="Deploy to Heroku" icon="heroku" href="https://heroku.com/deploy?template=https://github.com/chatwoot/chatwoot">
|
||||
Click here to deploy Chatwoot to Heroku with one click
|
||||
</Card>
|
||||
|
||||
### Deployment Steps
|
||||
|
||||
1. **Click the Deploy Button**: Use the one-click deploy button above
|
||||
2. **Configure App Settings**:
|
||||
- Choose an app name (or let Heroku generate one)
|
||||
- Select your region (US or Europe)
|
||||
- Review the default configuration
|
||||
|
||||
3. **Deploy the Application**: Click "Deploy app" and wait for the build to complete
|
||||
|
||||
4. **Enable Worker Dynos**:
|
||||
- Go to the **Resources** tab in your Heroku app dashboard
|
||||
- Ensure the **worker** dynos are turned on
|
||||
- This is crucial for background job processing
|
||||
|
||||
5. **Configure Environment Variables**:
|
||||
- Go to **Settings** tab in Heroku app dashboard
|
||||
- Click **Reveal Config Vars**
|
||||
- Configure additional variables as needed
|
||||
|
||||
6. **Access Your Installation**: Navigate to `yourapp.herokuapp.com`
|
||||
|
||||
## Configuration
|
||||
|
||||
### Required Environment Variables
|
||||
|
||||
Heroku automatically sets up basic configuration, but you'll need to configure additional variables:
|
||||
|
||||
#### Email Configuration
|
||||
|
||||
```bash
|
||||
# SMTP Settings (required for notifications)
|
||||
MAILER_SENDER_EMAIL=noreply@yourdomain.com
|
||||
SMTP_ADDRESS=smtp.sendgrid.net
|
||||
SMTP_PORT=587
|
||||
SMTP_USERNAME=apikey
|
||||
SMTP_PASSWORD=your-sendgrid-api-key
|
||||
SMTP_AUTHENTICATION=plain
|
||||
SMTP_ENABLE_STARTTLS_AUTO=true
|
||||
```
|
||||
|
||||
#### File Storage Configuration
|
||||
|
||||
<Warning>
|
||||
Heroku has an "ephemeral" hard disk. Files uploaded to Chatwoot will not persist after application restarts. You must configure cloud storage.
|
||||
</Warning>
|
||||
|
||||
**Amazon S3 Configuration:**
|
||||
|
||||
```bash
|
||||
ACTIVE_STORAGE_SERVICE=amazon
|
||||
S3_BUCKET_NAME=your-chatwoot-bucket
|
||||
AWS_ACCESS_KEY_ID=your-access-key
|
||||
AWS_SECRET_ACCESS_KEY=your-secret-key
|
||||
AWS_REGION=us-east-1
|
||||
```
|
||||
|
||||
**Google Cloud Storage Configuration:**
|
||||
|
||||
```bash
|
||||
ACTIVE_STORAGE_SERVICE=google
|
||||
GCS_PROJECT=your-project-id
|
||||
GCS_BUCKET=your-chatwoot-bucket
|
||||
GOOGLE_APPLICATION_CREDENTIALS={"type":"service_account",...}
|
||||
```
|
||||
|
||||
#### Frontend URL
|
||||
|
||||
```bash
|
||||
FRONTEND_URL=https://yourapp.herokuapp.com
|
||||
FORCE_SSL=true
|
||||
```
|
||||
|
||||
### Setting Environment Variables
|
||||
|
||||
#### Via Heroku Dashboard
|
||||
|
||||
1. Go to your app's **Settings** tab
|
||||
2. Click **Reveal Config Vars**
|
||||
3. Add each variable name and value
|
||||
4. Click **Add** for each variable
|
||||
|
||||
#### Via Heroku CLI
|
||||
|
||||
```bash
|
||||
# Install Heroku CLI
|
||||
npm install -g heroku
|
||||
|
||||
# Login to Heroku
|
||||
heroku login
|
||||
|
||||
# Set environment variables
|
||||
heroku config:set MAILER_SENDER_EMAIL=noreply@yourdomain.com -a your-app-name
|
||||
heroku config:set SMTP_ADDRESS=smtp.sendgrid.net -a your-app-name
|
||||
heroku config:set SMTP_PORT=587 -a your-app-name
|
||||
|
||||
# Set storage configuration
|
||||
heroku config:set ACTIVE_STORAGE_SERVICE=amazon -a your-app-name
|
||||
heroku config:set S3_BUCKET_NAME=your-bucket -a your-app-name
|
||||
heroku config:set AWS_ACCESS_KEY_ID=your-key -a your-app-name
|
||||
heroku config:set AWS_SECRET_ACCESS_KEY=your-secret -a your-app-name
|
||||
```
|
||||
|
||||
## Add-ons and Services
|
||||
|
||||
### Database (PostgreSQL)
|
||||
|
||||
Heroku automatically provisions a PostgreSQL database:
|
||||
|
||||
```bash
|
||||
# Check database info
|
||||
heroku pg:info -a your-app-name
|
||||
|
||||
# Access database console
|
||||
heroku pg:psql -a your-app-name
|
||||
|
||||
# Create database backup
|
||||
heroku pg:backups:capture -a your-app-name
|
||||
|
||||
# Download backup
|
||||
heroku pg:backups:download -a your-app-name
|
||||
```
|
||||
|
||||
### Redis
|
||||
|
||||
Heroku automatically provisions Redis for caching and background jobs:
|
||||
|
||||
```bash
|
||||
# Check Redis info
|
||||
heroku redis:info -a your-app-name
|
||||
|
||||
# Access Redis CLI
|
||||
heroku redis:cli -a your-app-name
|
||||
|
||||
# Monitor Redis
|
||||
heroku redis:monitor -a your-app-name
|
||||
```
|
||||
|
||||
### Email Service (SendGrid)
|
||||
|
||||
Add SendGrid for email delivery:
|
||||
|
||||
```bash
|
||||
# Add SendGrid add-on
|
||||
heroku addons:create sendgrid:starter -a your-app-name
|
||||
|
||||
# Get SendGrid credentials
|
||||
heroku config:get SENDGRID_USERNAME -a your-app-name
|
||||
heroku config:get SENDGRID_PASSWORD -a your-app-name
|
||||
```
|
||||
|
||||
## Updating Your Deployment
|
||||
|
||||
### Method 1: GitHub Integration (Recommended)
|
||||
|
||||
1. **Connect GitHub Repository**:
|
||||
- Go to the **Deploy** tab in your Heroku app dashboard
|
||||
- Choose **GitHub** as the deployment method
|
||||
- Connect the `chatwoot/chatwoot` repository
|
||||
|
||||
2. **Enable Automatic Deploys** (Optional):
|
||||
- Enable automatic deploys from the `master` branch
|
||||
- This will automatically deploy when new releases are available
|
||||
|
||||
3. **Manual Deploy**:
|
||||
- Go to **Manual deploy** section
|
||||
- Choose `master` branch
|
||||
- Click **Deploy Branch**
|
||||
|
||||
### Method 2: Heroku CLI
|
||||
|
||||
```bash
|
||||
# Clone the Chatwoot repository
|
||||
git clone https://github.com/chatwoot/chatwoot.git
|
||||
cd chatwoot
|
||||
|
||||
# Add Heroku remote
|
||||
heroku git:remote -a your-app-name
|
||||
|
||||
# Deploy latest version
|
||||
git push heroku master
|
||||
```
|
||||
|
||||
### Method 3: Docker Deployment
|
||||
|
||||
```bash
|
||||
# Login to Heroku Container Registry
|
||||
heroku container:login
|
||||
|
||||
# Build and push Docker image
|
||||
heroku container:push web -a your-app-name
|
||||
|
||||
# Release the image
|
||||
heroku container:release web -a your-app-name
|
||||
```
|
||||
|
||||
## Scaling and Performance
|
||||
|
||||
### Dyno Management
|
||||
|
||||
```bash
|
||||
# Scale web dynos
|
||||
heroku ps:scale web=2 -a your-app-name
|
||||
|
||||
# Scale worker dynos
|
||||
heroku ps:scale worker=1 -a your-app-name
|
||||
|
||||
# Check dyno status
|
||||
heroku ps -a your-app-name
|
||||
```
|
||||
|
||||
### Performance Monitoring
|
||||
|
||||
```bash
|
||||
# View application metrics
|
||||
heroku logs --tail -a your-app-name
|
||||
|
||||
# Monitor dyno performance
|
||||
heroku ps:exec -a your-app-name
|
||||
|
||||
# Check memory usage
|
||||
heroku logs --source app --tail -a your-app-name | grep "Memory usage"
|
||||
```
|
||||
|
||||
## Monitoring and Logging
|
||||
|
||||
### Application Logs
|
||||
|
||||
```bash
|
||||
# View recent logs
|
||||
heroku logs -a your-app-name
|
||||
|
||||
# Tail logs in real-time
|
||||
heroku logs --tail -a your-app-name
|
||||
|
||||
# Filter logs by source
|
||||
heroku logs --source app -a your-app-name
|
||||
heroku logs --source heroku -a your-app-name
|
||||
```
|
||||
|
||||
### Add Monitoring Services
|
||||
|
||||
#### Papertrail (Log Management)
|
||||
|
||||
```bash
|
||||
# Add Papertrail
|
||||
heroku addons:create papertrail:choklad -a your-app-name
|
||||
|
||||
# View logs in Papertrail
|
||||
heroku addons:open papertrail -a your-app-name
|
||||
```
|
||||
|
||||
#### New Relic (Application Monitoring)
|
||||
|
||||
```bash
|
||||
# Add New Relic
|
||||
heroku addons:create newrelic:wayne -a your-app-name
|
||||
|
||||
# Configure New Relic
|
||||
heroku config:set NEW_RELIC_APP_NAME="Chatwoot Production" -a your-app-name
|
||||
|
||||
# Open New Relic dashboard
|
||||
heroku addons:open newrelic -a your-app-name
|
||||
```
|
||||
|
||||
## Security Configuration
|
||||
|
||||
### SSL/TLS
|
||||
|
||||
Heroku automatically provides SSL certificates for custom domains:
|
||||
|
||||
```bash
|
||||
# Add custom domain
|
||||
heroku domains:add chatwoot.yourdomain.com -a your-app-name
|
||||
|
||||
# Check SSL certificate status
|
||||
heroku certs -a your-app-name
|
||||
|
||||
# Enable Automated Certificate Management
|
||||
heroku certs:auto:enable -a your-app-name
|
||||
```
|
||||
|
||||
### Environment Security
|
||||
|
||||
```bash
|
||||
# Rotate database credentials
|
||||
heroku pg:credentials:rotate -a your-app-name
|
||||
|
||||
# Rotate Redis credentials
|
||||
heroku redis:credentials:rotate -a your-app-name
|
||||
|
||||
# Review security settings
|
||||
heroku config -a your-app-name
|
||||
```
|
||||
|
||||
## Backup and Recovery
|
||||
|
||||
### Database Backups
|
||||
|
||||
```bash
|
||||
# Schedule automatic backups
|
||||
heroku pg:backups:schedule DATABASE_URL --at '02:00 America/Los_Angeles' -a your-app-name
|
||||
|
||||
# Create manual backup
|
||||
heroku pg:backups:capture -a your-app-name
|
||||
|
||||
# List all backups
|
||||
heroku pg:backups -a your-app-name
|
||||
|
||||
# Restore from backup
|
||||
heroku pg:backups:restore b001 DATABASE_URL -a your-app-name
|
||||
```
|
||||
|
||||
### File Storage Backups
|
||||
|
||||
Since Heroku has ephemeral storage, ensure your cloud storage has backup policies:
|
||||
|
||||
**For S3:**
|
||||
```bash
|
||||
# Enable versioning on S3 bucket
|
||||
aws s3api put-bucket-versioning \
|
||||
--bucket your-chatwoot-bucket \
|
||||
--versioning-configuration Status=Enabled
|
||||
|
||||
# Set up lifecycle policy for old versions
|
||||
aws s3api put-bucket-lifecycle-configuration \
|
||||
--bucket your-chatwoot-bucket \
|
||||
--lifecycle-configuration file://lifecycle.json
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
<Accordion title="Application not starting">
|
||||
**Symptoms**: App crashes on startup, H10 errors
|
||||
|
||||
**Solutions**:
|
||||
- Check that worker dynos are enabled in Resources tab
|
||||
- Verify all required environment variables are set
|
||||
- Check application logs: `heroku logs --tail -a your-app-name`
|
||||
- Ensure database migrations have run: `heroku run rails db:migrate -a your-app-name`
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="File uploads not working">
|
||||
**Symptoms**: Files upload but disappear after app restart
|
||||
|
||||
**Solutions**:
|
||||
- Configure cloud storage (S3, GCS, etc.)
|
||||
- Verify storage credentials are correct
|
||||
- Check CORS settings on your storage bucket
|
||||
- Test storage configuration: `heroku run rails console -a your-app-name`
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Email notifications not sending">
|
||||
**Symptoms**: Users not receiving email notifications
|
||||
|
||||
**Solutions**:
|
||||
- Verify SMTP configuration in config vars
|
||||
- Check SendGrid add-on status
|
||||
- Test email configuration: `heroku run rails console -a your-app-name`
|
||||
- Review email logs in SendGrid dashboard
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Build version shows as unknown">
|
||||
**Symptoms**: Settings page shows "unknown" build version
|
||||
|
||||
**Solution**:
|
||||
Enable runtime dyno metadata:
|
||||
```bash
|
||||
heroku labs:enable runtime-dyno-metadata -a your-app-name
|
||||
```
|
||||
</Accordion>
|
||||
|
||||
### Performance Issues
|
||||
|
||||
<Accordion title="Slow response times">
|
||||
**Solutions**:
|
||||
- Scale up web dynos: `heroku ps:scale web=2 -a your-app-name`
|
||||
- Upgrade to higher performance dynos
|
||||
- Monitor database performance with `heroku pg:diagnose -a your-app-name`
|
||||
- Check Redis performance with `heroku redis:info -a your-app-name`
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Background jobs not processing">
|
||||
**Solutions**:
|
||||
- Ensure worker dynos are running: `heroku ps -a your-app-name`
|
||||
- Scale worker dynos if needed: `heroku ps:scale worker=1 -a your-app-name`
|
||||
- Check Sidekiq logs: `heroku logs --source app --tail -a your-app-name | grep sidekiq`
|
||||
</Accordion>
|
||||
|
||||
### Diagnostic Commands
|
||||
|
||||
```bash
|
||||
# Check app status
|
||||
heroku ps -a your-app-name
|
||||
|
||||
# View configuration
|
||||
heroku config -a your-app-name
|
||||
|
||||
# Check add-ons
|
||||
heroku addons -a your-app-name
|
||||
|
||||
# Run Rails console
|
||||
heroku run rails console -a your-app-name
|
||||
|
||||
# Run database migrations
|
||||
heroku run rails db:migrate -a your-app-name
|
||||
|
||||
# Check database status
|
||||
heroku pg:info -a your-app-name
|
||||
|
||||
# Check Redis status
|
||||
heroku redis:info -a your-app-name
|
||||
```
|
||||
|
||||
## Known Limitations
|
||||
|
||||
### Platform Limitations
|
||||
|
||||
1. **Ephemeral File System**: Files uploaded to local storage will be lost on dyno restart
|
||||
2. **Dyno Sleep**: Free tier dynos sleep after 30 minutes of inactivity (upgrade to paid tier to avoid)
|
||||
3. **Request Timeout**: Heroku has a 30-second request timeout limit
|
||||
4. **Memory Limits**: Dynos have memory limits based on the plan selected
|
||||
|
||||
### Workarounds
|
||||
|
||||
1. **File Storage**: Use cloud storage (S3, GCS) instead of local storage
|
||||
2. **Dyno Sleep**: Upgrade to paid dynos or use external monitoring to keep app awake
|
||||
3. **Long Requests**: Implement background job processing for long-running tasks
|
||||
4. **Memory Usage**: Monitor and optimize application memory usage
|
||||
|
||||
## Cost Optimization
|
||||
|
||||
### Dyno Sizing
|
||||
|
||||
```bash
|
||||
# Check current dyno usage
|
||||
heroku ps -a your-app-name
|
||||
|
||||
# Optimize dyno allocation
|
||||
heroku ps:scale web=1:standard-1x worker=1:standard-1x -a your-app-name
|
||||
```
|
||||
|
||||
### Add-on Optimization
|
||||
|
||||
- Use appropriate add-on tiers based on usage
|
||||
- Monitor add-on usage and costs in Heroku dashboard
|
||||
- Consider consolidating services where possible
|
||||
|
||||
## Best Practices
|
||||
|
||||
### Security
|
||||
- Use environment variables for all sensitive configuration
|
||||
- Enable Automated Certificate Management for SSL
|
||||
- Regularly rotate database and Redis credentials
|
||||
- Monitor access logs and set up alerts
|
||||
|
||||
### Performance
|
||||
- Use appropriate dyno types for your workload
|
||||
- Monitor application performance with New Relic or similar
|
||||
- Implement caching strategies
|
||||
- Optimize database queries
|
||||
|
||||
### Reliability
|
||||
- Set up automatic database backups
|
||||
- Monitor application health with external services
|
||||
- Implement proper error handling and logging
|
||||
- Use multiple dynos for high availability
|
||||
|
||||
### Cost Management
|
||||
- Monitor dyno usage and scale appropriately
|
||||
- Use scheduler add-on for periodic tasks instead of always-on workers
|
||||
- Review and optimize add-on usage regularly
|
||||
- Consider reserved capacity for predictable workloads
|
||||
|
||||
---
|
||||
|
||||
This Heroku deployment guide provides a complete solution for hosting Chatwoot on Heroku's platform. The managed infrastructure and add-on ecosystem make it an excellent choice for teams who want to focus on using Chatwoot rather than managing infrastructure.
|
||||
|
||||
For more information, visit the [official Chatwoot Heroku documentation](https://www.chatwoot.com/docs/self-hosted/deployment/heroku).
|
||||
@@ -1,748 +0,0 @@
|
||||
---
|
||||
title: Environment Variables
|
||||
description: Complete reference for Chatwoot environment variables and configuration options
|
||||
sidebarTitle: Environment Variables
|
||||
---
|
||||
|
||||
# Environment Variables Reference
|
||||
|
||||
Chatwoot uses environment variables for configuration. This guide provides a comprehensive reference for all available environment variables and their usage.
|
||||
|
||||
## Core Application Settings
|
||||
|
||||
### Basic Configuration
|
||||
|
||||
```bash
|
||||
# Rails Environment
|
||||
RAILS_ENV=production
|
||||
|
||||
# Node Environment
|
||||
NODE_ENV=production
|
||||
|
||||
# Frontend URL (required)
|
||||
FRONTEND_URL=https://chatwoot.yourdomain.com
|
||||
|
||||
# Force SSL (recommended for production)
|
||||
FORCE_SSL=true
|
||||
|
||||
# Secret Key Base (auto-generated during installation)
|
||||
SECRET_KEY_BASE=your-secret-key-base
|
||||
|
||||
# Rails Log Level
|
||||
RAILS_LOG_LEVEL=info
|
||||
|
||||
# Rails Max Threads
|
||||
RAILS_MAX_THREADS=5
|
||||
|
||||
# Web Concurrency (Puma workers)
|
||||
WEB_CONCURRENCY=2
|
||||
```
|
||||
|
||||
### Application Behavior
|
||||
|
||||
```bash
|
||||
# Enable/disable account signup
|
||||
ENABLE_ACCOUNT_SIGNUP=false
|
||||
|
||||
# Auto-assign conversations to online agents
|
||||
AUTO_ASSIGN_CONVERSATIONS=true
|
||||
|
||||
# Enable conversation continuity (link conversations across sessions)
|
||||
CONVERSATION_CONTINUITY=true
|
||||
|
||||
# Maximum file upload size (in MB)
|
||||
MAXIMUM_FILE_UPLOAD_SIZE=40
|
||||
|
||||
# Enable IP-based rate limiting
|
||||
ENABLE_IP_RATE_LIMIT=true
|
||||
|
||||
# Rate limit per IP (requests per minute)
|
||||
IP_RATE_LIMIT=100
|
||||
```
|
||||
|
||||
## Database Configuration
|
||||
|
||||
### PostgreSQL
|
||||
|
||||
```bash
|
||||
# Database URL (primary configuration method)
|
||||
DATABASE_URL=postgresql://username:password@hostname:port/database_name
|
||||
|
||||
# Alternative: Individual components
|
||||
POSTGRES_HOST=localhost
|
||||
POSTGRES_PORT=5432
|
||||
POSTGRES_USERNAME=chatwoot
|
||||
POSTGRES_PASSWORD=your-password
|
||||
POSTGRES_DATABASE=chatwoot_production
|
||||
|
||||
# Database pool size
|
||||
DATABASE_POOL_SIZE=5
|
||||
|
||||
# Database timeout (seconds)
|
||||
DATABASE_TIMEOUT=5000
|
||||
|
||||
# Enable prepared statements
|
||||
DATABASE_PREPARED_STATEMENTS=true
|
||||
```
|
||||
|
||||
### Database SSL Configuration
|
||||
|
||||
```bash
|
||||
# SSL Mode (disable, allow, prefer, require, verify-ca, verify-full)
|
||||
DATABASE_SSL_MODE=require
|
||||
|
||||
# SSL Certificate paths (for verify-ca and verify-full modes)
|
||||
DATABASE_SSL_CERT=/path/to/client-cert.pem
|
||||
DATABASE_SSL_KEY=/path/to/client-key.pem
|
||||
DATABASE_SSL_ROOT_CERT=/path/to/ca-cert.pem
|
||||
```
|
||||
|
||||
## Redis Configuration
|
||||
|
||||
### Basic Redis Settings
|
||||
|
||||
```bash
|
||||
# Redis URL (primary configuration method)
|
||||
REDIS_URL=redis://localhost:6379/0
|
||||
|
||||
# Alternative: Individual components
|
||||
REDIS_HOST=localhost
|
||||
REDIS_PORT=6379
|
||||
REDIS_DB=0
|
||||
REDIS_PASSWORD=your-redis-password
|
||||
|
||||
# Redis connection pool size
|
||||
REDIS_POOL_SIZE=5
|
||||
|
||||
# Redis timeout (seconds)
|
||||
REDIS_TIMEOUT=1
|
||||
```
|
||||
|
||||
### Redis SSL Configuration
|
||||
|
||||
```bash
|
||||
# Enable SSL for Redis
|
||||
REDIS_SSL=true
|
||||
|
||||
# Redis SSL certificate verification
|
||||
REDIS_SSL_VERIFY=true
|
||||
|
||||
# Redis SSL certificate paths
|
||||
REDIS_SSL_CERT=/path/to/redis-client.crt
|
||||
REDIS_SSL_KEY=/path/to/redis-client.key
|
||||
REDIS_SSL_CA=/path/to/redis-ca.crt
|
||||
```
|
||||
|
||||
### Sidekiq Configuration
|
||||
|
||||
```bash
|
||||
# Sidekiq concurrency (number of worker threads)
|
||||
SIDEKIQ_CONCURRENCY=10
|
||||
|
||||
# Sidekiq Redis namespace
|
||||
SIDEKIQ_REDIS_NAMESPACE=chatwoot_sidekiq
|
||||
|
||||
# Sidekiq log level
|
||||
SIDEKIQ_LOG_LEVEL=info
|
||||
|
||||
# Enable Sidekiq web UI
|
||||
SIDEKIQ_WEB_UI=true
|
||||
|
||||
# Sidekiq web UI username/password
|
||||
SIDEKIQ_WEB_USERNAME=admin
|
||||
SIDEKIQ_WEB_PASSWORD=your-password
|
||||
```
|
||||
|
||||
## Email Configuration
|
||||
|
||||
### SMTP Settings
|
||||
|
||||
```bash
|
||||
# Sender email address
|
||||
MAILER_SENDER_EMAIL=noreply@yourdomain.com
|
||||
|
||||
# SMTP server configuration
|
||||
SMTP_ADDRESS=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
|
||||
SMTP_OPENSSL_VERIFY_MODE=peer
|
||||
|
||||
# SMTP domain (for HELO command)
|
||||
SMTP_DOMAIN=yourdomain.com
|
||||
|
||||
# Force TLS
|
||||
SMTP_TLS=true
|
||||
```
|
||||
|
||||
### Email Provider Examples
|
||||
|
||||
<Tabs>
|
||||
<Tab title="Gmail">
|
||||
```bash
|
||||
SMTP_ADDRESS=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
|
||||
```
|
||||
</Tab>
|
||||
|
||||
<Tab title="SendGrid">
|
||||
```bash
|
||||
SMTP_ADDRESS=smtp.sendgrid.net
|
||||
SMTP_PORT=587
|
||||
SMTP_USERNAME=apikey
|
||||
SMTP_PASSWORD=your-sendgrid-api-key
|
||||
SMTP_AUTHENTICATION=plain
|
||||
SMTP_ENABLE_STARTTLS_AUTO=true
|
||||
```
|
||||
</Tab>
|
||||
|
||||
<Tab title="Mailgun">
|
||||
```bash
|
||||
SMTP_ADDRESS=smtp.mailgun.org
|
||||
SMTP_PORT=587
|
||||
SMTP_USERNAME=postmaster@mg.yourdomain.com
|
||||
SMTP_PASSWORD=your-mailgun-password
|
||||
SMTP_AUTHENTICATION=plain
|
||||
SMTP_ENABLE_STARTTLS_AUTO=true
|
||||
```
|
||||
</Tab>
|
||||
|
||||
<Tab title="AWS SES">
|
||||
```bash
|
||||
SMTP_ADDRESS=email-smtp.us-east-1.amazonaws.com
|
||||
SMTP_PORT=587
|
||||
SMTP_USERNAME=your-ses-username
|
||||
SMTP_PASSWORD=your-ses-password
|
||||
SMTP_AUTHENTICATION=plain
|
||||
SMTP_ENABLE_STARTTLS_AUTO=true
|
||||
```
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
### Email Templates
|
||||
|
||||
```bash
|
||||
# Custom email template path
|
||||
CUSTOM_EMAIL_TEMPLATE_PATH=/path/to/custom/templates
|
||||
|
||||
# Email template language
|
||||
EMAIL_TEMPLATE_LANGUAGE=en
|
||||
|
||||
# Enable email tracking
|
||||
EMAIL_TRACKING_ENABLED=true
|
||||
|
||||
# Email delivery method (smtp, sendmail, test)
|
||||
EMAIL_DELIVERY_METHOD=smtp
|
||||
```
|
||||
|
||||
## File Storage Configuration
|
||||
|
||||
### Local Storage
|
||||
|
||||
```bash
|
||||
# Active storage service
|
||||
ACTIVE_STORAGE_SERVICE=local
|
||||
|
||||
# Local storage path
|
||||
LOCAL_STORAGE_PATH=/home/chatwoot/chatwoot/storage
|
||||
```
|
||||
|
||||
### Amazon S3
|
||||
|
||||
```bash
|
||||
# Active storage service
|
||||
ACTIVE_STORAGE_SERVICE=amazon
|
||||
|
||||
# S3 configuration
|
||||
S3_BUCKET_NAME=your-chatwoot-bucket
|
||||
AWS_ACCESS_KEY_ID=your-access-key
|
||||
AWS_SECRET_ACCESS_KEY=your-secret-key
|
||||
AWS_REGION=us-east-1
|
||||
|
||||
# S3 endpoint (for S3-compatible services)
|
||||
S3_ENDPOINT=https://s3.amazonaws.com
|
||||
|
||||
# S3 force path style (for MinIO and other S3-compatible services)
|
||||
S3_FORCE_PATH_STYLE=false
|
||||
|
||||
# S3 public URL (for CDN)
|
||||
S3_PUBLIC_URL=https://cdn.yourdomain.com
|
||||
```
|
||||
|
||||
### Google Cloud Storage
|
||||
|
||||
```bash
|
||||
# Active storage service
|
||||
ACTIVE_STORAGE_SERVICE=google
|
||||
|
||||
# GCS configuration
|
||||
GCS_PROJECT=your-project-id
|
||||
GCS_BUCKET=your-chatwoot-bucket
|
||||
|
||||
# GCS credentials (JSON key file path)
|
||||
GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json
|
||||
|
||||
# GCS public URL (for CDN)
|
||||
GCS_PUBLIC_URL=https://cdn.yourdomain.com
|
||||
```
|
||||
|
||||
### Azure Blob Storage
|
||||
|
||||
```bash
|
||||
# Active storage service
|
||||
ACTIVE_STORAGE_SERVICE=azure
|
||||
|
||||
# Azure configuration
|
||||
AZURE_STORAGE_ACCOUNT_NAME=your-storage-account
|
||||
AZURE_STORAGE_ACCESS_KEY=your-access-key
|
||||
AZURE_STORAGE_CONTAINER=your-container-name
|
||||
|
||||
# Azure public URL (for CDN)
|
||||
AZURE_PUBLIC_URL=https://cdn.yourdomain.com
|
||||
```
|
||||
|
||||
## Third-Party Integrations
|
||||
|
||||
### Facebook
|
||||
|
||||
```bash
|
||||
# Facebook App ID and Secret
|
||||
FB_APP_ID=your-facebook-app-id
|
||||
FB_APP_SECRET=your-facebook-app-secret
|
||||
|
||||
# Facebook Verify Token
|
||||
FB_VERIFY_TOKEN=your-verify-token
|
||||
|
||||
# Facebook API Version
|
||||
FB_API_VERSION=v13.0
|
||||
```
|
||||
|
||||
### Twitter
|
||||
|
||||
```bash
|
||||
# Twitter API credentials
|
||||
TWITTER_APP_ID=your-twitter-app-id
|
||||
TWITTER_CONSUMER_KEY=your-consumer-key
|
||||
TWITTER_CONSUMER_SECRET=your-consumer-secret
|
||||
TWITTER_ENVIRONMENT=your-twitter-environment
|
||||
```
|
||||
|
||||
### Slack
|
||||
|
||||
```bash
|
||||
# Slack App credentials
|
||||
SLACK_CLIENT_ID=your-slack-client-id
|
||||
SLACK_CLIENT_SECRET=your-slack-client-secret
|
||||
```
|
||||
|
||||
### Google OAuth
|
||||
|
||||
```bash
|
||||
# Google OAuth credentials
|
||||
GOOGLE_OAUTH_CLIENT_ID=your-google-client-id
|
||||
GOOGLE_OAUTH_CLIENT_SECRET=your-google-client-secret
|
||||
```
|
||||
|
||||
### Microsoft OAuth
|
||||
|
||||
```bash
|
||||
# Microsoft OAuth credentials
|
||||
MICROSOFT_APP_ID=your-microsoft-app-id
|
||||
MICROSOFT_APP_SECRET=your-microsoft-app-secret
|
||||
```
|
||||
|
||||
## Push Notifications
|
||||
|
||||
### FCM (Firebase Cloud Messaging)
|
||||
|
||||
```bash
|
||||
# FCM Server Key
|
||||
FCM_SERVER_KEY=your-fcm-server-key
|
||||
|
||||
# FCM Project ID
|
||||
FCM_PROJECT_ID=your-firebase-project-id
|
||||
|
||||
# FCM credentials file
|
||||
GOOGLE_APPLICATION_CREDENTIALS=/path/to/firebase-service-account.json
|
||||
```
|
||||
|
||||
### Vapid Keys (Web Push)
|
||||
|
||||
```bash
|
||||
# Vapid public and private keys
|
||||
VAPID_PUBLIC_KEY=your-vapid-public-key
|
||||
VAPID_PRIVATE_KEY=your-vapid-private-key
|
||||
|
||||
# Vapid subject (email or URL)
|
||||
VAPID_SUBJECT=mailto:admin@yourdomain.com
|
||||
```
|
||||
|
||||
## Analytics and Monitoring
|
||||
|
||||
### Application Monitoring
|
||||
|
||||
```bash
|
||||
# Enable application metrics
|
||||
ENABLE_METRICS=true
|
||||
|
||||
# Metrics endpoint path
|
||||
METRICS_PATH=/metrics
|
||||
|
||||
# Prometheus exporter
|
||||
PROMETHEUS_EXPORTER=true
|
||||
PROMETHEUS_EXPORTER_PORT=9394
|
||||
|
||||
# New Relic
|
||||
NEW_RELIC_LICENSE_KEY=your-newrelic-license-key
|
||||
NEW_RELIC_APP_NAME=Chatwoot
|
||||
|
||||
# Sentry error tracking
|
||||
SENTRY_DSN=your-sentry-dsn
|
||||
```
|
||||
|
||||
### Google Analytics
|
||||
|
||||
```bash
|
||||
# Google Analytics tracking ID
|
||||
GOOGLE_ANALYTICS_ID=UA-XXXXXXXXX-X
|
||||
|
||||
# Google Tag Manager ID
|
||||
GOOGLE_TAG_MANAGER_ID=GTM-XXXXXXX
|
||||
```
|
||||
|
||||
### Hotjar
|
||||
|
||||
```bash
|
||||
# Hotjar site ID
|
||||
HOTJAR_SITE_ID=your-hotjar-site-id
|
||||
```
|
||||
|
||||
## Security Configuration
|
||||
|
||||
### Authentication
|
||||
|
||||
```bash
|
||||
# JWT secret key
|
||||
JWT_SECRET_KEY=your-jwt-secret-key
|
||||
|
||||
# Session timeout (in seconds)
|
||||
SESSION_TIMEOUT=86400
|
||||
|
||||
# Password minimum length
|
||||
PASSWORD_MIN_LENGTH=8
|
||||
|
||||
# Enable two-factor authentication
|
||||
ENABLE_2FA=true
|
||||
|
||||
# TOTP issuer name
|
||||
TOTP_ISSUER_NAME=Chatwoot
|
||||
```
|
||||
|
||||
### CORS Configuration
|
||||
|
||||
```bash
|
||||
# Allowed origins for CORS
|
||||
CORS_ORIGINS=https://yourdomain.com,https://www.yourdomain.com
|
||||
|
||||
# Enable CORS credentials
|
||||
CORS_CREDENTIALS=true
|
||||
```
|
||||
|
||||
### Content Security Policy
|
||||
|
||||
```bash
|
||||
# Enable CSP
|
||||
ENABLE_CSP=true
|
||||
|
||||
# CSP report URI
|
||||
CSP_REPORT_URI=/csp-report
|
||||
|
||||
# CSP directives
|
||||
CSP_DEFAULT_SRC='self'
|
||||
CSP_SCRIPT_SRC='self' 'unsafe-inline' 'unsafe-eval'
|
||||
CSP_STYLE_SRC='self' 'unsafe-inline'
|
||||
```
|
||||
|
||||
## Performance Configuration
|
||||
|
||||
### Caching
|
||||
|
||||
```bash
|
||||
# Enable caching
|
||||
ENABLE_CACHING=true
|
||||
|
||||
# Cache store (memory_store, redis_cache_store)
|
||||
CACHE_STORE=redis_cache_store
|
||||
|
||||
# Cache namespace
|
||||
CACHE_NAMESPACE=chatwoot_cache
|
||||
|
||||
# Cache TTL (seconds)
|
||||
CACHE_TTL=3600
|
||||
```
|
||||
|
||||
### Rate Limiting
|
||||
|
||||
```bash
|
||||
# Enable rate limiting
|
||||
ENABLE_RATE_LIMITING=true
|
||||
|
||||
# Rate limit store (memory_store, redis_store)
|
||||
RATE_LIMIT_STORE=redis_store
|
||||
|
||||
# API rate limit (requests per minute)
|
||||
API_RATE_LIMIT=100
|
||||
|
||||
# Login rate limit (attempts per minute)
|
||||
LOGIN_RATE_LIMIT=5
|
||||
```
|
||||
|
||||
### Asset Configuration
|
||||
|
||||
```bash
|
||||
# Asset host (for CDN)
|
||||
ASSET_HOST=https://cdn.yourdomain.com
|
||||
|
||||
# Enable asset compression
|
||||
ENABLE_ASSET_COMPRESSION=true
|
||||
|
||||
# Asset cache TTL (seconds)
|
||||
ASSET_CACHE_TTL=31536000
|
||||
```
|
||||
|
||||
## Development and Testing
|
||||
|
||||
### Development Settings
|
||||
|
||||
```bash
|
||||
# Enable development features
|
||||
ENABLE_DEVELOPMENT_FEATURES=false
|
||||
|
||||
# Development email delivery
|
||||
DEVELOPMENT_EMAIL_DELIVERY=true
|
||||
|
||||
# Development file storage
|
||||
DEVELOPMENT_FILE_STORAGE=local
|
||||
|
||||
# Enable SQL logging
|
||||
ENABLE_SQL_LOGGING=false
|
||||
```
|
||||
|
||||
### Testing Configuration
|
||||
|
||||
```bash
|
||||
# Test database URL
|
||||
TEST_DATABASE_URL=postgresql://username:password@localhost/chatwoot_test
|
||||
|
||||
# Test Redis URL
|
||||
TEST_REDIS_URL=redis://localhost:6379/1
|
||||
|
||||
# Enable test coverage
|
||||
ENABLE_TEST_COVERAGE=true
|
||||
|
||||
# Test email delivery
|
||||
TEST_EMAIL_DELIVERY=test
|
||||
```
|
||||
|
||||
## Logging Configuration
|
||||
|
||||
### Log Settings
|
||||
|
||||
```bash
|
||||
# Log level (debug, info, warn, error, fatal)
|
||||
LOG_LEVEL=info
|
||||
|
||||
# Log format (text, json)
|
||||
LOG_FORMAT=text
|
||||
|
||||
# Log to stdout
|
||||
LOG_TO_STDOUT=true
|
||||
|
||||
# Log file path
|
||||
LOG_FILE_PATH=/var/log/chatwoot/chatwoot.log
|
||||
|
||||
# Log rotation
|
||||
LOG_ROTATION=daily
|
||||
LOG_RETENTION=30
|
||||
```
|
||||
|
||||
### Structured Logging
|
||||
|
||||
```bash
|
||||
# Enable structured logging
|
||||
ENABLE_STRUCTURED_LOGGING=true
|
||||
|
||||
# Log correlation ID
|
||||
LOG_CORRELATION_ID=true
|
||||
|
||||
# Log request ID
|
||||
LOG_REQUEST_ID=true
|
||||
|
||||
# Log user context
|
||||
LOG_USER_CONTEXT=true
|
||||
```
|
||||
|
||||
## Feature Flags
|
||||
|
||||
### Experimental Features
|
||||
|
||||
```bash
|
||||
# Enable experimental features
|
||||
ENABLE_EXPERIMENTAL_FEATURES=false
|
||||
|
||||
# Feature flags
|
||||
FEATURE_FLAG_CONVERSATION_CONTINUITY=true
|
||||
FEATURE_FLAG_AUTO_RESOLVE=false
|
||||
FEATURE_FLAG_CUSTOM_ATTRIBUTES=true
|
||||
FEATURE_FLAG_TEAM_MANAGEMENT=true
|
||||
```
|
||||
|
||||
## Webhook Configuration
|
||||
|
||||
```bash
|
||||
# Webhook URL for external integrations
|
||||
WEBHOOK_URL=https://your-webhook-endpoint.com/chatwoot
|
||||
|
||||
# Webhook secret for verification
|
||||
WEBHOOK_SECRET=your-webhook-secret
|
||||
|
||||
# Webhook timeout (seconds)
|
||||
WEBHOOK_TIMEOUT=30
|
||||
|
||||
# Webhook retry attempts
|
||||
WEBHOOK_RETRY_ATTEMPTS=3
|
||||
```
|
||||
|
||||
## Custom Branding
|
||||
|
||||
```bash
|
||||
# Custom brand name
|
||||
BRAND_NAME=Your Company
|
||||
|
||||
# Custom logo URL
|
||||
BRAND_LOGO_URL=https://yourdomain.com/logo.png
|
||||
|
||||
# Custom favicon URL
|
||||
BRAND_FAVICON_URL=https://yourdomain.com/favicon.ico
|
||||
|
||||
# Custom primary color
|
||||
BRAND_PRIMARY_COLOR=#1f93ff
|
||||
|
||||
# Custom secondary color
|
||||
BRAND_SECONDARY_COLOR=#f0f0f0
|
||||
```
|
||||
|
||||
## Environment-Specific Examples
|
||||
|
||||
### Production Environment
|
||||
|
||||
```bash
|
||||
# Production .env example
|
||||
RAILS_ENV=production
|
||||
NODE_ENV=production
|
||||
FRONTEND_URL=https://chat.yourcompany.com
|
||||
FORCE_SSL=true
|
||||
SECRET_KEY_BASE=your-production-secret-key
|
||||
|
||||
# Database
|
||||
DATABASE_URL=postgresql://chatwoot:secure-password@db.yourcompany.com:5432/chatwoot_production
|
||||
|
||||
# Redis
|
||||
REDIS_URL=redis://redis.yourcompany.com:6379/0
|
||||
|
||||
# Email
|
||||
MAILER_SENDER_EMAIL=noreply@yourcompany.com
|
||||
SMTP_ADDRESS=smtp.yourcompany.com
|
||||
SMTP_PORT=587
|
||||
SMTP_USERNAME=noreply@yourcompany.com
|
||||
SMTP_PASSWORD=your-smtp-password
|
||||
|
||||
# Storage
|
||||
ACTIVE_STORAGE_SERVICE=amazon
|
||||
S3_BUCKET_NAME=yourcompany-chatwoot
|
||||
AWS_ACCESS_KEY_ID=your-aws-key
|
||||
AWS_SECRET_ACCESS_KEY=your-aws-secret
|
||||
AWS_REGION=us-east-1
|
||||
|
||||
# Security
|
||||
ENABLE_2FA=true
|
||||
ENABLE_RATE_LIMITING=true
|
||||
CORS_ORIGINS=https://yourcompany.com
|
||||
|
||||
# Monitoring
|
||||
SENTRY_DSN=your-sentry-dsn
|
||||
NEW_RELIC_LICENSE_KEY=your-newrelic-key
|
||||
```
|
||||
|
||||
### Development Environment
|
||||
|
||||
```bash
|
||||
# Development .env example
|
||||
RAILS_ENV=development
|
||||
NODE_ENV=development
|
||||
FRONTEND_URL=http://localhost:3000
|
||||
FORCE_SSL=false
|
||||
|
||||
# Database
|
||||
DATABASE_URL=postgresql://chatwoot:password@localhost:5432/chatwoot_development
|
||||
|
||||
# Redis
|
||||
REDIS_URL=redis://localhost:6379/0
|
||||
|
||||
# Email (development)
|
||||
MAILER_SENDER_EMAIL=dev@localhost
|
||||
EMAIL_DELIVERY_METHOD=test
|
||||
|
||||
# Storage (local)
|
||||
ACTIVE_STORAGE_SERVICE=local
|
||||
|
||||
# Development features
|
||||
ENABLE_DEVELOPMENT_FEATURES=true
|
||||
ENABLE_SQL_LOGGING=true
|
||||
LOG_LEVEL=debug
|
||||
```
|
||||
|
||||
## Validation and Best Practices
|
||||
|
||||
### Required Variables
|
||||
|
||||
<Warning>
|
||||
These environment variables are required for Chatwoot to function properly:
|
||||
- `FRONTEND_URL`
|
||||
- `SECRET_KEY_BASE`
|
||||
- `DATABASE_URL` or individual database components
|
||||
- `REDIS_URL` or individual Redis components
|
||||
</Warning>
|
||||
|
||||
### Security Best Practices
|
||||
|
||||
<Tip>
|
||||
**Security Recommendations:**
|
||||
- Use strong, unique passwords for all services
|
||||
- Enable SSL/TLS for all external connections
|
||||
- Use environment-specific secret keys
|
||||
- Enable rate limiting and CORS protection
|
||||
- Regularly rotate API keys and passwords
|
||||
- Use managed services for databases when possible
|
||||
</Tip>
|
||||
|
||||
### Performance Optimization
|
||||
|
||||
<Note>
|
||||
**Performance Tips:**
|
||||
- Adjust `SIDEKIQ_CONCURRENCY` based on your server resources
|
||||
- Use Redis for caching and session storage
|
||||
- Configure CDN for static assets
|
||||
- Enable compression and caching
|
||||
- Monitor and adjust database pool sizes
|
||||
</Note>
|
||||
|
||||
---
|
||||
|
||||
This comprehensive environment variables reference covers all aspects of Chatwoot configuration. Customize these settings based on your specific deployment requirements and infrastructure setup.
|
||||
@@ -1,416 +0,0 @@
|
||||
---
|
||||
title: Chatwoot CTL (cwctl)
|
||||
description: Command-line tool for managing Chatwoot installations with ease
|
||||
sidebarTitle: Chatwoot CTL
|
||||
---
|
||||
|
||||
# Chatwoot CTL (cwctl)
|
||||
|
||||
Chatwoot CTL (`cwctl`) is a command-line tool that simplifies the management of your Chatwoot installation. It provides convenient commands for common administrative tasks like upgrades, restarts, console access, and log viewing.
|
||||
|
||||
## Installation
|
||||
|
||||
### Automatic Installation
|
||||
|
||||
`cwctl` is automatically installed when you use the Linux installation script (v2.7.0+):
|
||||
|
||||
```bash
|
||||
wget https://get.chatwoot.app/linux/install.sh
|
||||
chmod +x install.sh
|
||||
./install.sh --install
|
||||
```
|
||||
|
||||
### Manual Installation
|
||||
|
||||
If you have an older installation or need to install `cwctl` separately:
|
||||
|
||||
```bash
|
||||
# Download and install cwctl
|
||||
wget https://get.chatwoot.app/linux/install.sh -O /usr/local/bin/cwctl
|
||||
chmod +x /usr/local/bin/cwctl
|
||||
|
||||
# Verify installation
|
||||
cwctl --help
|
||||
```
|
||||
|
||||
<Note>
|
||||
The manual installation requires root access to install `cwctl` to `/usr/local/bin`.
|
||||
</Note>
|
||||
|
||||
## Available Commands
|
||||
|
||||
### Help and Version
|
||||
|
||||
```bash
|
||||
# Display help information
|
||||
cwctl --help
|
||||
cwctl -h
|
||||
|
||||
# Show version information
|
||||
cwctl --version
|
||||
cwctl -v
|
||||
```
|
||||
|
||||
### Installation Management
|
||||
|
||||
```bash
|
||||
# Install Chatwoot (same as running install.sh --install)
|
||||
cwctl --install
|
||||
|
||||
# Upgrade to the latest version
|
||||
cwctl --upgrade
|
||||
|
||||
# Restart Chatwoot services
|
||||
cwctl --restart
|
||||
cwctl -r
|
||||
```
|
||||
|
||||
### Console and Debugging
|
||||
|
||||
```bash
|
||||
# Access Rails console
|
||||
cwctl --console
|
||||
cwctl -c
|
||||
|
||||
# View web server logs
|
||||
cwctl --logs web
|
||||
cwctl -l web
|
||||
|
||||
# View worker logs
|
||||
cwctl --logs worker
|
||||
cwctl -l worker
|
||||
|
||||
# View all logs
|
||||
cwctl --logs
|
||||
cwctl -l
|
||||
```
|
||||
|
||||
### Service Management
|
||||
|
||||
```bash
|
||||
# Check service status
|
||||
cwctl --status
|
||||
cwctl -s
|
||||
|
||||
# Stop Chatwoot services
|
||||
cwctl --stop
|
||||
|
||||
# Start Chatwoot services
|
||||
cwctl --start
|
||||
```
|
||||
|
||||
## Detailed Command Usage
|
||||
|
||||
### Upgrading Chatwoot
|
||||
|
||||
The upgrade command handles the complete upgrade process:
|
||||
|
||||
```bash
|
||||
cwctl --upgrade
|
||||
```
|
||||
|
||||
This command performs the following steps:
|
||||
1. Switches to the chatwoot user
|
||||
2. Navigates to the Chatwoot directory
|
||||
3. Pulls the latest code from the master branch
|
||||
4. Updates Ruby version if needed
|
||||
5. Installs/updates dependencies (bundle, pnpm)
|
||||
6. Precompiles assets
|
||||
7. Runs database migrations
|
||||
8. Updates systemd service files
|
||||
9. Restarts services
|
||||
|
||||
<Warning>
|
||||
Always backup your database before upgrading:
|
||||
```bash
|
||||
# Create a backup before upgrading
|
||||
sudo -u postgres pg_dump chatwoot_production > chatwoot_backup_$(date +%Y%m%d).sql
|
||||
```
|
||||
</Warning>
|
||||
|
||||
### Console Access
|
||||
|
||||
Access the Rails console for debugging and administration:
|
||||
|
||||
```bash
|
||||
cwctl --console
|
||||
```
|
||||
|
||||
This opens an interactive Ruby console where you can:
|
||||
|
||||
```ruby
|
||||
# Check application version
|
||||
Rails.application.config.version
|
||||
|
||||
# List all accounts
|
||||
Account.all
|
||||
|
||||
# Find a specific user
|
||||
User.find_by(email: 'admin@example.com')
|
||||
|
||||
# Check system statistics
|
||||
Account.count
|
||||
User.count
|
||||
Conversation.count
|
||||
|
||||
# Clear cache
|
||||
Rails.cache.clear
|
||||
```
|
||||
|
||||
### Log Management
|
||||
|
||||
View real-time logs for troubleshooting:
|
||||
|
||||
```bash
|
||||
# Web server logs (Rails application)
|
||||
cwctl -l web
|
||||
|
||||
# Worker logs (Sidekiq background jobs)
|
||||
cwctl -l worker
|
||||
|
||||
# All logs (both web and worker)
|
||||
cwctl -l
|
||||
```
|
||||
|
||||
### Service Management
|
||||
|
||||
Control Chatwoot services:
|
||||
|
||||
```bash
|
||||
# Check if services are running
|
||||
cwctl --status
|
||||
|
||||
# Restart all services (web + worker)
|
||||
cwctl --restart
|
||||
|
||||
# Stop all services
|
||||
cwctl --stop
|
||||
|
||||
# Start all services
|
||||
cwctl --start
|
||||
```
|
||||
|
||||
## Configuration
|
||||
|
||||
### Environment Variables
|
||||
|
||||
`cwctl` respects the same environment variables as your Chatwoot installation. Key variables include:
|
||||
|
||||
```bash
|
||||
# Chatwoot installation directory
|
||||
CHATWOOT_DIR="/home/chatwoot/chatwoot"
|
||||
|
||||
# Rails environment
|
||||
RAILS_ENV="production"
|
||||
|
||||
# Database configuration
|
||||
DATABASE_URL="postgresql://..."
|
||||
|
||||
# Redis configuration
|
||||
REDIS_URL="redis://..."
|
||||
```
|
||||
|
||||
### Custom Installation Paths
|
||||
|
||||
If Chatwoot is installed in a non-standard location, you can specify the path:
|
||||
|
||||
```bash
|
||||
# Set custom Chatwoot directory
|
||||
export CHATWOOT_DIR="/opt/chatwoot"
|
||||
cwctl --restart
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
<Accordion title="cwctl command not found">
|
||||
If `cwctl` is not found, ensure it's installed and in your PATH:
|
||||
|
||||
```bash
|
||||
# Check if cwctl exists
|
||||
which cwctl
|
||||
|
||||
# If not found, install it
|
||||
wget https://get.chatwoot.app/linux/install.sh -O /usr/local/bin/cwctl
|
||||
chmod +x /usr/local/bin/cwctl
|
||||
|
||||
# Add to PATH if needed
|
||||
echo 'export PATH="/usr/local/bin:$PATH"' >> ~/.bashrc
|
||||
source ~/.bashrc
|
||||
```
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Permission denied errors">
|
||||
Ensure you have the necessary permissions:
|
||||
|
||||
```bash
|
||||
# Run with sudo if needed
|
||||
sudo cwctl --restart
|
||||
|
||||
# Or ensure your user is in the chatwoot group
|
||||
sudo usermod -a -G chatwoot $USER
|
||||
```
|
||||
</Accordion>
|
||||
|
||||
<Accordion title="Service restart failures">
|
||||
If services fail to restart, check the logs:
|
||||
|
||||
```bash
|
||||
# Check systemd status
|
||||
sudo systemctl status chatwoot.target
|
||||
sudo systemctl status chatwoot-web.1.service
|
||||
sudo systemctl status chatwoot-worker.1.service
|
||||
|
||||
# View detailed logs
|
||||
sudo journalctl -u chatwoot-web.1.service -f
|
||||
sudo journalctl -u chatwoot-worker.1.service -f
|
||||
```
|
||||
</Accordion>
|
||||
|
||||
### Debug Mode
|
||||
|
||||
For verbose output during operations:
|
||||
|
||||
```bash
|
||||
# Enable debug mode
|
||||
export CWCTL_DEBUG=1
|
||||
cwctl --upgrade
|
||||
```
|
||||
|
||||
### Manual Operations
|
||||
|
||||
If `cwctl` fails, you can perform operations manually:
|
||||
|
||||
```bash
|
||||
# Manual upgrade process
|
||||
sudo -i -u chatwoot
|
||||
cd chatwoot
|
||||
git checkout master && git pull
|
||||
rvm use 3.3.3 --default
|
||||
bundle install
|
||||
pnpm install
|
||||
RAILS_ENV=production bundle exec rake assets:precompile
|
||||
RAILS_ENV=production bundle exec rake db:migrate
|
||||
exit
|
||||
|
||||
# Restart services manually
|
||||
sudo systemctl restart chatwoot.target
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
### Regular Maintenance
|
||||
|
||||
```bash
|
||||
# Weekly upgrade check
|
||||
cwctl --upgrade
|
||||
|
||||
# Daily log monitoring
|
||||
cwctl -l | grep ERROR
|
||||
|
||||
# Monthly service restart
|
||||
cwctl --restart
|
||||
```
|
||||
|
||||
### Backup Before Operations
|
||||
|
||||
```bash
|
||||
# Create backup script
|
||||
#!/bin/bash
|
||||
DATE=$(date +%Y%m%d_%H%M%S)
|
||||
sudo -u postgres pg_dump chatwoot_production > "/backup/chatwoot_$DATE.sql"
|
||||
cwctl --upgrade
|
||||
```
|
||||
|
||||
### Monitoring
|
||||
|
||||
```bash
|
||||
# Check service health
|
||||
cwctl --status
|
||||
|
||||
# Monitor logs for errors
|
||||
cwctl -l | grep -E "(ERROR|FATAL|Exception)"
|
||||
|
||||
# Check disk space before upgrades
|
||||
df -h /home/chatwoot
|
||||
```
|
||||
|
||||
## Integration with System Tools
|
||||
|
||||
### Systemd Integration
|
||||
|
||||
`cwctl` works seamlessly with systemd:
|
||||
|
||||
```bash
|
||||
# These commands are equivalent
|
||||
cwctl --restart
|
||||
sudo systemctl restart chatwoot.target
|
||||
|
||||
cwctl --status
|
||||
sudo systemctl status chatwoot.target
|
||||
```
|
||||
|
||||
### Cron Jobs
|
||||
|
||||
Automate maintenance tasks:
|
||||
|
||||
```bash
|
||||
# Add to crontab
|
||||
# Weekly upgrade (Sundays at 2 AM)
|
||||
0 2 * * 0 /usr/local/bin/cwctl --upgrade
|
||||
|
||||
# Daily restart (to clear memory leaks)
|
||||
0 3 * * * /usr/local/bin/cwctl --restart
|
||||
```
|
||||
|
||||
### Monitoring Scripts
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# Health check script
|
||||
if ! cwctl --status > /dev/null 2>&1; then
|
||||
echo "Chatwoot services are down, attempting restart..."
|
||||
cwctl --restart
|
||||
# Send alert notification
|
||||
fi
|
||||
```
|
||||
|
||||
## Advanced Usage
|
||||
|
||||
### Custom Commands
|
||||
|
||||
You can extend `cwctl` functionality by creating wrapper scripts:
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# custom-cwctl.sh - Extended cwctl with additional features
|
||||
|
||||
case "$1" in
|
||||
--backup)
|
||||
echo "Creating backup..."
|
||||
sudo -u postgres pg_dump chatwoot_production > "backup_$(date +%Y%m%d).sql"
|
||||
;;
|
||||
--health-check)
|
||||
echo "Performing health check..."
|
||||
curl -f http://localhost:3000/api || echo "Health check failed"
|
||||
;;
|
||||
*)
|
||||
cwctl "$@"
|
||||
;;
|
||||
esac
|
||||
```
|
||||
|
||||
### Environment-Specific Operations
|
||||
|
||||
```bash
|
||||
# Development environment
|
||||
RAILS_ENV=development cwctl --console
|
||||
|
||||
# Staging environment
|
||||
RAILS_ENV=staging cwctl --restart
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
`cwctl` simplifies Chatwoot administration by providing a unified interface for common tasks. Use it regularly to maintain your installation and troubleshoot issues efficiently.
|
||||
@@ -1,572 +0,0 @@
|
||||
---
|
||||
title: Docker Deployment Guide
|
||||
description: Complete guide to deploy Chatwoot using Docker containers for production environments.
|
||||
sidebarTitle: Docker
|
||||
---
|
||||
|
||||
Docker provides a consistent, portable way to deploy Chatwoot across different environments. This guide covers production deployment using Docker Compose with best practices for security, performance, and maintenance.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
Before starting, ensure you have:
|
||||
|
||||
- Docker 20.10+ installed
|
||||
- Docker Compose 2.0+ installed
|
||||
- At least 4GB RAM and 2 CPU cores
|
||||
- Domain name with DNS configured (recommended)
|
||||
- Basic understanding of Docker concepts
|
||||
|
||||
### Version Check
|
||||
|
||||
Verify your Docker installation:
|
||||
|
||||
```bash
|
||||
$ docker --version
|
||||
Docker version 25.0.4, build 1a576c5
|
||||
|
||||
$ docker compose version
|
||||
Docker Compose version v2.24.7
|
||||
```
|
||||
|
||||
<Note>
|
||||
Container names use dashes instead of underscores by default with newer Docker Compose versions. If using an older version, replace `-` with `_` and use `docker-compose` instead of `docker compose`.
|
||||
</Note>
|
||||
|
||||
## Quick Start
|
||||
|
||||
### 1. Install Docker
|
||||
|
||||
**Ubuntu/Debian:**
|
||||
```bash
|
||||
# Update package index
|
||||
apt-get update && apt-get upgrade -y
|
||||
|
||||
# Install Docker
|
||||
curl -fsSL https://get.docker.com -o get-docker.sh
|
||||
sudo sh get-docker.sh
|
||||
|
||||
# Install Docker Compose plugin
|
||||
apt install docker-compose-plugin
|
||||
|
||||
# Add user to docker group (optional)
|
||||
sudo usermod -aG docker $USER
|
||||
```
|
||||
|
||||
**CentOS/RHEL:**
|
||||
```bash
|
||||
# Install Docker
|
||||
sudo yum install -y yum-utils
|
||||
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
|
||||
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
|
||||
|
||||
# Start Docker service
|
||||
sudo systemctl start docker
|
||||
sudo systemctl enable docker
|
||||
```
|
||||
|
||||
### 2. Download Configuration Files
|
||||
|
||||
```bash
|
||||
# Create project directory
|
||||
mkdir chatwoot && cd chatwoot
|
||||
|
||||
# Download environment template
|
||||
wget -O .env https://raw.githubusercontent.com/chatwoot/chatwoot/develop/.env.example
|
||||
|
||||
# Download Docker Compose configuration
|
||||
wget -O docker-compose.yaml https://raw.githubusercontent.com/chatwoot/chatwoot/develop/docker-compose.production.yaml
|
||||
```
|
||||
|
||||
### 3. Configure Environment
|
||||
|
||||
Edit the `.env` file with your settings:
|
||||
|
||||
```bash
|
||||
nano .env
|
||||
```
|
||||
|
||||
**Essential configurations:**
|
||||
|
||||
```env
|
||||
# Database Configuration
|
||||
POSTGRES_PASSWORD=your_secure_postgres_password
|
||||
REDIS_PASSWORD=your_secure_redis_password
|
||||
|
||||
# Application Configuration
|
||||
SECRET_KEY_BASE=your_secret_key_base_64_chars_long
|
||||
FRONTEND_URL=https://your-domain.com
|
||||
|
||||
# Email Configuration (required for notifications)
|
||||
MAILER_SENDER_EMAIL=noreply@your-domain.com
|
||||
SMTP_ADDRESS=smtp.your-provider.com
|
||||
SMTP_PORT=587
|
||||
SMTP_USERNAME=your-smtp-username
|
||||
SMTP_PASSWORD=your-smtp-password
|
||||
SMTP_AUTHENTICATION=plain
|
||||
SMTP_ENABLE_STARTTLS_AUTO=true
|
||||
|
||||
# File Storage (optional - defaults to local)
|
||||
ACTIVE_STORAGE_SERVICE=local
|
||||
# For S3: ACTIVE_STORAGE_SERVICE=amazon
|
||||
# AWS_ACCESS_KEY_ID=your_access_key
|
||||
# AWS_SECRET_ACCESS_KEY=your_secret_key
|
||||
# AWS_REGION=us-east-1
|
||||
# AWS_BUCKET=your-bucket-name
|
||||
```
|
||||
|
||||
### 4. Update Docker Compose
|
||||
|
||||
Edit `docker-compose.yaml` to match your `.env` passwords:
|
||||
|
||||
```yaml
|
||||
services:
|
||||
postgres:
|
||||
environment:
|
||||
- POSTGRES_PASSWORD=your_secure_postgres_password # Match .env
|
||||
|
||||
redis:
|
||||
command: ["sh", "-c", "redis-server --requirepass your_secure_redis_password"]
|
||||
```
|
||||
|
||||
### 5. Initialize Database
|
||||
|
||||
```bash
|
||||
# Prepare the database
|
||||
docker compose run --rm rails bundle exec rails db:chatwoot_prepare
|
||||
```
|
||||
|
||||
### 6. Start Services
|
||||
|
||||
```bash
|
||||
# Start all services in background
|
||||
docker compose up -d
|
||||
|
||||
# Check service status
|
||||
docker compose ps
|
||||
```
|
||||
|
||||
### 7. Verify Installation
|
||||
|
||||
```bash
|
||||
# Check if Chatwoot is responding
|
||||
curl -I localhost:3000/api
|
||||
|
||||
# Should return: HTTP/1.1 200 OK
|
||||
```
|
||||
|
||||
## Production Configuration
|
||||
|
||||
### Docker Compose Setup
|
||||
|
||||
Here's a complete production-ready `docker-compose.yaml`:
|
||||
|
||||
```yaml
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
base: &base
|
||||
image: chatwoot/chatwoot:latest
|
||||
env_file: .env
|
||||
volumes:
|
||||
- ./data/storage:/app/storage
|
||||
depends_on:
|
||||
- postgres
|
||||
- redis
|
||||
|
||||
rails:
|
||||
<<: *base
|
||||
container_name: chatwoot-rails
|
||||
command: ["sh", "-c", "bundle exec rails s -b 0.0.0.0 -p 3000"]
|
||||
ports:
|
||||
- "127.0.0.1:3000:3000"
|
||||
environment:
|
||||
- NODE_ENV=production
|
||||
- RAILS_ENV=production
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:3000/api"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
|
||||
sidekiq:
|
||||
<<: *base
|
||||
container_name: chatwoot-sidekiq
|
||||
command: ["sh", "-c", "bundle exec sidekiq -C config/sidekiq.yml"]
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: ["CMD", "pgrep", "-f", "sidekiq"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
|
||||
postgres:
|
||||
image: postgres:14-alpine
|
||||
container_name: chatwoot-postgres
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "127.0.0.1:5432:5432"
|
||||
volumes:
|
||||
- ./data/postgres:/var/lib/postgresql/data
|
||||
environment:
|
||||
- POSTGRES_DB=chatwoot
|
||||
- POSTGRES_USER=postgres
|
||||
- POSTGRES_PASSWORD=your_secure_postgres_password
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U postgres"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
|
||||
redis:
|
||||
image: redis:7-alpine
|
||||
container_name: chatwoot-redis
|
||||
restart: unless-stopped
|
||||
command: ["sh", "-c", "redis-server --requirepass your_secure_redis_password"]
|
||||
ports:
|
||||
- "127.0.0.1:6379:6379"
|
||||
volumes:
|
||||
- ./data/redis:/data
|
||||
healthcheck:
|
||||
test: ["CMD", "redis-cli", "--raw", "incr", "ping"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
|
||||
volumes:
|
||||
postgres_data:
|
||||
redis_data:
|
||||
storage_data:
|
||||
```
|
||||
|
||||
### Nginx Reverse Proxy
|
||||
|
||||
Create `/etc/nginx/sites-available/chatwoot.conf`:
|
||||
|
||||
```nginx
|
||||
server {
|
||||
server_name your-domain.com;
|
||||
|
||||
# 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;
|
||||
|
||||
# Increase client max body size for file uploads
|
||||
client_max_body_size 50M;
|
||||
|
||||
location /.well-known {
|
||||
alias /var/www/ssl-proof/chatwoot/.well-known;
|
||||
}
|
||||
|
||||
location / {
|
||||
proxy_pass_header Authorization;
|
||||
proxy_pass http://$upstream;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header X-Forwarded-Ssl on;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
|
||||
proxy_http_version 1.1;
|
||||
proxy_buffering off;
|
||||
proxy_read_timeout 36000s;
|
||||
proxy_redirect off;
|
||||
}
|
||||
|
||||
listen 80;
|
||||
}
|
||||
```
|
||||
|
||||
Enable the site and configure SSL:
|
||||
|
||||
```bash
|
||||
# Enable site
|
||||
sudo ln -s /etc/nginx/sites-available/chatwoot.conf /etc/nginx/sites-enabled/
|
||||
sudo nginx -t
|
||||
sudo systemctl reload nginx
|
||||
|
||||
# Install Certbot and get SSL certificate
|
||||
sudo apt install certbot python3-certbot-nginx
|
||||
sudo mkdir -p /var/www/ssl-proof/chatwoot/.well-known
|
||||
sudo certbot --webroot -w /var/www/ssl-proof/chatwoot/ -d your-domain.com -i nginx
|
||||
```
|
||||
|
||||
## Advanced Configuration
|
||||
|
||||
### Environment Variables
|
||||
|
||||
Key environment variables for production:
|
||||
|
||||
```env
|
||||
# Application
|
||||
RAILS_ENV=production
|
||||
NODE_ENV=production
|
||||
SECRET_KEY_BASE=generate_64_character_secret
|
||||
FRONTEND_URL=https://your-domain.com
|
||||
|
||||
# Database
|
||||
DATABASE_URL=postgresql://postgres:password@postgres:5432/chatwoot
|
||||
REDIS_URL=redis://redis:6379/0
|
||||
REDIS_PASSWORD=your_redis_password
|
||||
|
||||
# Email
|
||||
MAILER_SENDER_EMAIL=noreply@your-domain.com
|
||||
SMTP_ADDRESS=smtp.your-provider.com
|
||||
SMTP_PORT=587
|
||||
SMTP_USERNAME=your_username
|
||||
SMTP_PASSWORD=your_password
|
||||
SMTP_AUTHENTICATION=plain
|
||||
SMTP_ENABLE_STARTTLS_AUTO=true
|
||||
|
||||
# File Storage
|
||||
ACTIVE_STORAGE_SERVICE=amazon
|
||||
AWS_ACCESS_KEY_ID=your_access_key
|
||||
AWS_SECRET_ACCESS_KEY=your_secret_key
|
||||
AWS_REGION=us-east-1
|
||||
AWS_BUCKET=your-bucket-name
|
||||
|
||||
# Security
|
||||
FORCE_SSL=true
|
||||
RAILS_LOG_TO_STDOUT=true
|
||||
|
||||
# Performance
|
||||
RAILS_MAX_THREADS=5
|
||||
WEB_CONCURRENCY=2
|
||||
```
|
||||
|
||||
### Resource Limits
|
||||
|
||||
Add resource limits to your `docker-compose.yaml`:
|
||||
|
||||
```yaml
|
||||
services:
|
||||
rails:
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
cpus: '2.0'
|
||||
memory: 2G
|
||||
reservations:
|
||||
cpus: '1.0'
|
||||
memory: 1G
|
||||
|
||||
sidekiq:
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
cpus: '1.0'
|
||||
memory: 1G
|
||||
reservations:
|
||||
cpus: '0.5'
|
||||
memory: 512M
|
||||
|
||||
postgres:
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
cpus: '1.0'
|
||||
memory: 1G
|
||||
reservations:
|
||||
cpus: '0.5'
|
||||
memory: 512M
|
||||
|
||||
redis:
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
cpus: '0.5'
|
||||
memory: 512M
|
||||
reservations:
|
||||
cpus: '0.25'
|
||||
memory: 256M
|
||||
```
|
||||
|
||||
### Logging Configuration
|
||||
|
||||
Configure centralized logging:
|
||||
|
||||
```yaml
|
||||
services:
|
||||
rails:
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "10m"
|
||||
max-file: "3"
|
||||
|
||||
sidekiq:
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "10m"
|
||||
max-file: "3"
|
||||
```
|
||||
|
||||
## Maintenance Operations
|
||||
|
||||
### Upgrading Chatwoot
|
||||
|
||||
```bash
|
||||
# Pull latest images
|
||||
docker compose pull
|
||||
|
||||
# Stop services
|
||||
docker compose down
|
||||
|
||||
# Start with new images
|
||||
docker compose up -d
|
||||
|
||||
# Run database migrations
|
||||
docker compose run --rm rails bundle exec rails db:chatwoot_prepare
|
||||
```
|
||||
|
||||
### Backup and Restore
|
||||
|
||||
**Database Backup:**
|
||||
```bash
|
||||
# Create backup
|
||||
docker compose exec postgres pg_dump -U postgres chatwoot > backup_$(date +%Y%m%d_%H%M%S).sql
|
||||
|
||||
# Restore backup
|
||||
docker compose exec -T postgres psql -U postgres chatwoot < backup_file.sql
|
||||
```
|
||||
|
||||
**File Storage Backup:**
|
||||
```bash
|
||||
# Backup storage directory
|
||||
tar -czf storage_backup_$(date +%Y%m%d_%H%M%S).tar.gz ./data/storage/
|
||||
```
|
||||
|
||||
### Monitoring and Logs
|
||||
|
||||
**View logs:**
|
||||
```bash
|
||||
# All services
|
||||
docker compose logs -f
|
||||
|
||||
# Specific service
|
||||
docker compose logs -f rails
|
||||
docker compose logs -f sidekiq
|
||||
|
||||
# Last 100 lines
|
||||
docker compose logs --tail=100 rails
|
||||
```
|
||||
|
||||
**Monitor resources:**
|
||||
```bash
|
||||
# Container stats
|
||||
docker stats
|
||||
|
||||
# Service health
|
||||
docker compose ps
|
||||
```
|
||||
|
||||
### Rails Console Access
|
||||
|
||||
```bash
|
||||
# Access Rails console
|
||||
docker compose exec rails bundle exec rails console
|
||||
|
||||
# Run one-off commands
|
||||
docker compose run --rm rails bundle exec rails runner "puts User.count"
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
**1. Permission Issues:**
|
||||
```bash
|
||||
# Fix file permissions
|
||||
sudo chown -R 1000:1000 ./data/
|
||||
```
|
||||
|
||||
**2. Database Connection Issues:**
|
||||
```bash
|
||||
# Check database connectivity
|
||||
docker compose exec rails bundle exec rails db:version
|
||||
```
|
||||
|
||||
**3. Memory Issues:**
|
||||
```bash
|
||||
# Check memory usage
|
||||
docker stats --no-stream
|
||||
```
|
||||
|
||||
**4. SSL Certificate Issues:**
|
||||
```bash
|
||||
# Renew certificates
|
||||
sudo certbot renew --dry-run
|
||||
```
|
||||
|
||||
### Performance Optimization
|
||||
|
||||
**1. Database Optimization:**
|
||||
```sql
|
||||
-- Connect to database
|
||||
docker compose exec postgres psql -U postgres chatwoot
|
||||
|
||||
-- Check slow queries
|
||||
SELECT query, mean_time, calls
|
||||
FROM pg_stat_statements
|
||||
ORDER BY mean_time DESC
|
||||
LIMIT 10;
|
||||
```
|
||||
|
||||
**2. Redis Optimization:**
|
||||
```bash
|
||||
# Check Redis memory usage
|
||||
docker compose exec redis redis-cli info memory
|
||||
```
|
||||
|
||||
### Security Hardening
|
||||
|
||||
**1. Network Security:**
|
||||
```yaml
|
||||
# Add to docker-compose.yaml
|
||||
networks:
|
||||
chatwoot:
|
||||
driver: bridge
|
||||
internal: true
|
||||
|
||||
services:
|
||||
rails:
|
||||
networks:
|
||||
- chatwoot
|
||||
- default # Only rails needs external access
|
||||
```
|
||||
|
||||
**2. Secrets Management:**
|
||||
```bash
|
||||
# Use Docker secrets for sensitive data
|
||||
echo "your_secret_password" | docker secret create postgres_password -
|
||||
```
|
||||
|
||||
## Community Edition vs Enterprise
|
||||
|
||||
This guide covers Chatwoot Community Edition (CE). For Enterprise features:
|
||||
|
||||
**CE Docker Tags:**
|
||||
- `chatwoot/chatwoot:latest-ce` (latest CE)
|
||||
- `chatwoot/chatwoot:v2.3.2-ce` (specific version CE)
|
||||
|
||||
**Enterprise Features:**
|
||||
- Advanced reporting and analytics
|
||||
- SAML SSO integration
|
||||
- Advanced automation rules
|
||||
- Priority support
|
||||
|
||||
---
|
||||
|
||||
<Warning>
|
||||
Always test upgrades in a staging environment before applying to production. Keep regular backups of your database and file storage.
|
||||
</Warning>
|
||||
|
||||
<Note>
|
||||
For high-availability deployments, consider using Docker Swarm or Kubernetes instead of Docker Compose.
|
||||
</Note>
|
||||
@@ -1,537 +0,0 @@
|
||||
---
|
||||
title: Kubernetes Deployment
|
||||
description: Deploy Chatwoot on Kubernetes using Helm charts for scalable, production-ready installations
|
||||
sidebarTitle: Kubernetes
|
||||
---
|
||||
|
||||
# Kubernetes Deployment Guide
|
||||
|
||||
Deploy Chatwoot on Kubernetes using our official Helm charts for a scalable, production-ready installation.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
Before deploying Chatwoot on Kubernetes, ensure you have:
|
||||
|
||||
- **Kubernetes cluster** (v1.19+) with sufficient resources
|
||||
- **Helm 3.x** installed and configured
|
||||
- **kubectl** configured to access your cluster
|
||||
- **Ingress controller** (nginx, traefik, etc.) for external access
|
||||
- **Cert-manager** (optional, for automatic SSL certificates)
|
||||
|
||||
### Minimum Resource Requirements
|
||||
|
||||
- **CPU**: 2 cores minimum (4+ cores recommended)
|
||||
- **Memory**: 4GB RAM minimum (8GB+ recommended)
|
||||
- **Storage**: 20GB persistent storage for PostgreSQL
|
||||
- **Nodes**: 3+ nodes for high availability
|
||||
|
||||
## Quick Start
|
||||
|
||||
### 1. Add Chatwoot Helm Repository
|
||||
|
||||
```bash
|
||||
helm repo add chatwoot https://chatwoot.github.io/charts
|
||||
helm repo update
|
||||
```
|
||||
|
||||
### 2. Create Namespace
|
||||
|
||||
```bash
|
||||
kubectl create namespace chatwoot
|
||||
```
|
||||
|
||||
### 3. Install with Default Values
|
||||
|
||||
```bash
|
||||
helm install chatwoot chatwoot/chatwoot \
|
||||
--namespace chatwoot \
|
||||
--set ingress.enabled=true \
|
||||
--set ingress.hosts[0].host=chatwoot.yourdomain.com \
|
||||
--set ingress.hosts[0].paths[0].path=/ \
|
||||
--set ingress.hosts[0].paths[0].pathType=Prefix
|
||||
```
|
||||
|
||||
## Production Configuration
|
||||
|
||||
### Custom Values File
|
||||
|
||||
Create a `values.yaml` file for production deployment:
|
||||
|
||||
```yaml
|
||||
# values.yaml
|
||||
replicaCount: 3
|
||||
|
||||
image:
|
||||
repository: chatwoot/chatwoot
|
||||
tag: "latest"
|
||||
pullPolicy: IfNotPresent
|
||||
|
||||
env:
|
||||
RAILS_ENV: production
|
||||
NODE_ENV: production
|
||||
FRONTEND_URL: "https://chatwoot.yourdomain.com"
|
||||
FORCE_SSL: "true"
|
||||
|
||||
# Database Configuration
|
||||
postgresql:
|
||||
enabled: true
|
||||
auth:
|
||||
postgresPassword: "your-secure-password"
|
||||
database: "chatwoot_production"
|
||||
primary:
|
||||
persistence:
|
||||
enabled: true
|
||||
size: 50Gi
|
||||
storageClass: "fast-ssd"
|
||||
metrics:
|
||||
enabled: true
|
||||
|
||||
# Redis Configuration
|
||||
redis:
|
||||
enabled: true
|
||||
auth:
|
||||
enabled: true
|
||||
password: "your-redis-password"
|
||||
master:
|
||||
persistence:
|
||||
enabled: true
|
||||
size: 10Gi
|
||||
metrics:
|
||||
enabled: true
|
||||
|
||||
# Ingress Configuration
|
||||
ingress:
|
||||
enabled: true
|
||||
className: "nginx"
|
||||
annotations:
|
||||
cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
||||
nginx.ingress.kubernetes.io/proxy-body-size: "50m"
|
||||
nginx.ingress.kubernetes.io/proxy-read-timeout: "300"
|
||||
nginx.ingress.kubernetes.io/proxy-send-timeout: "300"
|
||||
hosts:
|
||||
- host: chatwoot.yourdomain.com
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
tls:
|
||||
- secretName: chatwoot-tls
|
||||
hosts:
|
||||
- chatwoot.yourdomain.com
|
||||
|
||||
# Resource Limits
|
||||
resources:
|
||||
limits:
|
||||
cpu: 2000m
|
||||
memory: 4Gi
|
||||
requests:
|
||||
cpu: 1000m
|
||||
memory: 2Gi
|
||||
|
||||
# Horizontal Pod Autoscaler
|
||||
autoscaling:
|
||||
enabled: true
|
||||
minReplicas: 3
|
||||
maxReplicas: 10
|
||||
targetCPUUtilizationPercentage: 70
|
||||
targetMemoryUtilizationPercentage: 80
|
||||
|
||||
# Storage Configuration
|
||||
persistence:
|
||||
enabled: true
|
||||
storageClass: "fast-ssd"
|
||||
size: 20Gi
|
||||
|
||||
# Service Configuration
|
||||
service:
|
||||
type: ClusterIP
|
||||
port: 3000
|
||||
|
||||
# Worker Configuration
|
||||
worker:
|
||||
enabled: true
|
||||
replicaCount: 2
|
||||
resources:
|
||||
limits:
|
||||
cpu: 1000m
|
||||
memory: 2Gi
|
||||
requests:
|
||||
cpu: 500m
|
||||
memory: 1Gi
|
||||
|
||||
# Monitoring
|
||||
serviceMonitor:
|
||||
enabled: true
|
||||
namespace: monitoring
|
||||
```
|
||||
|
||||
### Deploy with Custom Configuration
|
||||
|
||||
```bash
|
||||
helm install chatwoot chatwoot/chatwoot \
|
||||
--namespace chatwoot \
|
||||
--values values.yaml
|
||||
```
|
||||
|
||||
## External Dependencies
|
||||
|
||||
### Using External PostgreSQL
|
||||
|
||||
```yaml
|
||||
postgresql:
|
||||
enabled: false
|
||||
|
||||
env:
|
||||
DATABASE_URL: "postgresql://username:password@postgres-host:5432/chatwoot_production"
|
||||
```
|
||||
|
||||
### Using External Redis
|
||||
|
||||
```yaml
|
||||
redis:
|
||||
enabled: false
|
||||
|
||||
env:
|
||||
REDIS_URL: "redis://redis-host:6379/0"
|
||||
```
|
||||
|
||||
### Using Cloud Storage
|
||||
|
||||
```yaml
|
||||
env:
|
||||
# AWS S3
|
||||
ACTIVE_STORAGE_SERVICE: "amazon"
|
||||
S3_BUCKET_NAME: "your-chatwoot-bucket"
|
||||
AWS_ACCESS_KEY_ID: "your-access-key"
|
||||
AWS_SECRET_ACCESS_KEY: "your-secret-key"
|
||||
AWS_REGION: "us-east-1"
|
||||
|
||||
# Google Cloud Storage
|
||||
# ACTIVE_STORAGE_SERVICE: "google"
|
||||
# GCS_PROJECT: "your-project"
|
||||
# GCS_BUCKET: "your-bucket"
|
||||
```
|
||||
|
||||
## High Availability Setup
|
||||
|
||||
### Multi-Zone Deployment
|
||||
|
||||
```yaml
|
||||
# Spread pods across availability zones
|
||||
affinity:
|
||||
podAntiAffinity:
|
||||
preferredDuringSchedulingIgnoredDuringExecution:
|
||||
- weight: 100
|
||||
podAffinityTerm:
|
||||
labelSelector:
|
||||
matchExpressions:
|
||||
- key: app.kubernetes.io/name
|
||||
operator: In
|
||||
values:
|
||||
- chatwoot
|
||||
topologyKey: topology.kubernetes.io/zone
|
||||
|
||||
# Node selection
|
||||
nodeSelector:
|
||||
node-type: "application"
|
||||
|
||||
# Tolerations for dedicated nodes
|
||||
tolerations:
|
||||
- key: "dedicated"
|
||||
operator: "Equal"
|
||||
value: "chatwoot"
|
||||
effect: "NoSchedule"
|
||||
```
|
||||
|
||||
### Database High Availability
|
||||
|
||||
```yaml
|
||||
postgresql:
|
||||
enabled: true
|
||||
architecture: replication
|
||||
auth:
|
||||
replicationPassword: "replication-password"
|
||||
primary:
|
||||
persistence:
|
||||
enabled: true
|
||||
size: 100Gi
|
||||
readReplicas:
|
||||
replicaCount: 2
|
||||
persistence:
|
||||
enabled: true
|
||||
size: 100Gi
|
||||
```
|
||||
|
||||
## Security Configuration
|
||||
|
||||
### Network Policies
|
||||
|
||||
```yaml
|
||||
# network-policy.yaml
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: NetworkPolicy
|
||||
metadata:
|
||||
name: chatwoot-network-policy
|
||||
namespace: chatwoot
|
||||
spec:
|
||||
podSelector:
|
||||
matchLabels:
|
||||
app.kubernetes.io/name: chatwoot
|
||||
policyTypes:
|
||||
- Ingress
|
||||
- Egress
|
||||
ingress:
|
||||
- from:
|
||||
- namespaceSelector:
|
||||
matchLabels:
|
||||
name: ingress-nginx
|
||||
ports:
|
||||
- protocol: TCP
|
||||
port: 3000
|
||||
egress:
|
||||
- to:
|
||||
- podSelector:
|
||||
matchLabels:
|
||||
app.kubernetes.io/name: postgresql
|
||||
ports:
|
||||
- protocol: TCP
|
||||
port: 5432
|
||||
- to:
|
||||
- podSelector:
|
||||
matchLabels:
|
||||
app.kubernetes.io/name: redis
|
||||
ports:
|
||||
- protocol: TCP
|
||||
port: 6379
|
||||
```
|
||||
|
||||
### Pod Security Standards
|
||||
|
||||
```yaml
|
||||
securityContext:
|
||||
runAsNonRoot: true
|
||||
runAsUser: 1001
|
||||
fsGroup: 1001
|
||||
seccompProfile:
|
||||
type: RuntimeDefault
|
||||
|
||||
containerSecurityContext:
|
||||
allowPrivilegeEscalation: false
|
||||
readOnlyRootFilesystem: true
|
||||
runAsNonRoot: true
|
||||
runAsUser: 1001
|
||||
capabilities:
|
||||
drop:
|
||||
- ALL
|
||||
```
|
||||
|
||||
## Monitoring and Observability
|
||||
|
||||
### Prometheus Monitoring
|
||||
|
||||
```yaml
|
||||
serviceMonitor:
|
||||
enabled: true
|
||||
labels:
|
||||
app: chatwoot
|
||||
interval: 30s
|
||||
scrapeTimeout: 10s
|
||||
path: /metrics
|
||||
|
||||
# Custom metrics
|
||||
env:
|
||||
PROMETHEUS_EXPORTER: "true"
|
||||
PROMETHEUS_EXPORTER_PORT: "9394"
|
||||
```
|
||||
|
||||
### Logging Configuration
|
||||
|
||||
```yaml
|
||||
# Structured logging
|
||||
env:
|
||||
LOG_LEVEL: "info"
|
||||
LOG_FORMAT: "json"
|
||||
|
||||
# Log aggregation with Fluentd/Fluent Bit
|
||||
annotations:
|
||||
fluentbit.io/parser: "json"
|
||||
fluentbit.io/exclude: "false"
|
||||
```
|
||||
|
||||
### Health Checks
|
||||
|
||||
```yaml
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: /api
|
||||
port: 3000
|
||||
initialDelaySeconds: 60
|
||||
periodSeconds: 30
|
||||
timeoutSeconds: 10
|
||||
failureThreshold: 3
|
||||
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: /api
|
||||
port: 3000
|
||||
initialDelaySeconds: 30
|
||||
periodSeconds: 10
|
||||
timeoutSeconds: 5
|
||||
failureThreshold: 3
|
||||
```
|
||||
|
||||
## Backup and Disaster Recovery
|
||||
|
||||
### Database Backup
|
||||
|
||||
```yaml
|
||||
# CronJob for database backup
|
||||
apiVersion: batch/v1
|
||||
kind: CronJob
|
||||
metadata:
|
||||
name: chatwoot-db-backup
|
||||
namespace: chatwoot
|
||||
spec:
|
||||
schedule: "0 2 * * *" # Daily at 2 AM
|
||||
jobTemplate:
|
||||
spec:
|
||||
template:
|
||||
spec:
|
||||
containers:
|
||||
- name: postgres-backup
|
||||
image: postgres:15
|
||||
command:
|
||||
- /bin/bash
|
||||
- -c
|
||||
- |
|
||||
pg_dump $DATABASE_URL | gzip > /backup/chatwoot-$(date +%Y%m%d-%H%M%S).sql.gz
|
||||
# Upload to S3 or other storage
|
||||
env:
|
||||
- name: DATABASE_URL
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: chatwoot-secrets
|
||||
key: database-url
|
||||
volumeMounts:
|
||||
- name: backup-storage
|
||||
mountPath: /backup
|
||||
volumes:
|
||||
- name: backup-storage
|
||||
persistentVolumeClaim:
|
||||
claimName: backup-pvc
|
||||
restartPolicy: OnFailure
|
||||
```
|
||||
|
||||
## Upgrading Chatwoot
|
||||
|
||||
### Rolling Update
|
||||
|
||||
```bash
|
||||
# Update to latest version
|
||||
helm upgrade chatwoot chatwoot/chatwoot \
|
||||
--namespace chatwoot \
|
||||
--values values.yaml
|
||||
|
||||
# Update to specific version
|
||||
helm upgrade chatwoot chatwoot/chatwoot \
|
||||
--namespace chatwoot \
|
||||
--values values.yaml \
|
||||
--set image.tag="v2.15.0"
|
||||
```
|
||||
|
||||
### Database Migration
|
||||
|
||||
```bash
|
||||
# Run migrations after upgrade
|
||||
kubectl exec -it deployment/chatwoot -n chatwoot -- \
|
||||
bundle exec rails db:migrate RAILS_ENV=production
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
<Tip>
|
||||
**Pod Startup Issues**: Check resource limits and node capacity
|
||||
```bash
|
||||
kubectl describe pod <pod-name> -n chatwoot
|
||||
kubectl top nodes
|
||||
```
|
||||
</Tip>
|
||||
|
||||
<Warning>
|
||||
**Database Connection Issues**: Verify database credentials and network policies
|
||||
```bash
|
||||
kubectl logs deployment/chatwoot -n chatwoot
|
||||
kubectl exec -it deployment/chatwoot -n chatwoot -- nc -zv postgres-host 5432
|
||||
```
|
||||
</Warning>
|
||||
|
||||
### Debug Commands
|
||||
|
||||
```bash
|
||||
# Check pod status
|
||||
kubectl get pods -n chatwoot
|
||||
|
||||
# View logs
|
||||
kubectl logs -f deployment/chatwoot -n chatwoot
|
||||
|
||||
# Access pod shell
|
||||
kubectl exec -it deployment/chatwoot -n chatwoot -- /bin/bash
|
||||
|
||||
# Check service endpoints
|
||||
kubectl get endpoints -n chatwoot
|
||||
|
||||
# Describe ingress
|
||||
kubectl describe ingress chatwoot -n chatwoot
|
||||
```
|
||||
|
||||
### Performance Tuning
|
||||
|
||||
```yaml
|
||||
# Optimize for high traffic
|
||||
env:
|
||||
RAILS_MAX_THREADS: "20"
|
||||
WEB_CONCURRENCY: "4"
|
||||
SIDEKIQ_CONCURRENCY: "25"
|
||||
|
||||
resources:
|
||||
limits:
|
||||
cpu: 4000m
|
||||
memory: 8Gi
|
||||
requests:
|
||||
cpu: 2000m
|
||||
memory: 4Gi
|
||||
|
||||
# Database connection pooling
|
||||
env:
|
||||
DATABASE_POOL_SIZE: "25"
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
### Resource Management
|
||||
- Set appropriate resource requests and limits
|
||||
- Use horizontal pod autoscaling for dynamic scaling
|
||||
- Monitor resource usage and adjust as needed
|
||||
|
||||
### Security
|
||||
- Use network policies to restrict traffic
|
||||
- Enable pod security standards
|
||||
- Regularly update container images
|
||||
- Use secrets for sensitive configuration
|
||||
|
||||
### Monitoring
|
||||
- Enable Prometheus metrics collection
|
||||
- Set up alerting for critical metrics
|
||||
- Monitor application and infrastructure health
|
||||
- Use distributed tracing for complex issues
|
||||
|
||||
### Backup
|
||||
- Implement automated database backups
|
||||
- Test backup restoration procedures
|
||||
- Store backups in multiple locations
|
||||
- Document recovery procedures
|
||||
|
||||
---
|
||||
|
||||
This Kubernetes deployment guide provides a solid foundation for running Chatwoot in production. Customize the configuration based on your specific requirements and infrastructure setup.
|
||||
@@ -1,675 +0,0 @@
|
||||
---
|
||||
title: Linux VM Deployment Guide
|
||||
description: Complete guide to deploy Chatwoot on Linux virtual machines using the automated installation script.
|
||||
sidebarTitle: Linux VM
|
||||
---
|
||||
|
||||
This guide covers deploying Chatwoot on Linux virtual machines using our automated installation script. This method is ideal for traditional server environments and provides full control over the installation process.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
Before starting, ensure you have:
|
||||
|
||||
- Ubuntu 20.04 LTS or later (recommended)
|
||||
- At least 4GB RAM and 2 CPU cores
|
||||
- 50GB+ available disk space
|
||||
- Root or sudo access
|
||||
- Domain name with DNS configured (optional but recommended)
|
||||
- SMTP server for email notifications
|
||||
|
||||
### Supported Operating Systems
|
||||
|
||||
| OS | Version | Status |
|
||||
|---|---|---|
|
||||
| **Ubuntu** | 20.04 LTS, 22.04 LTS, 24.04 LTS | ✅ Recommended |
|
||||
| **Debian** | 10, 11, 12 | ✅ Supported |
|
||||
| **CentOS** | 8, 9 | ✅ Supported |
|
||||
| **RHEL** | 8, 9 | ✅ Supported |
|
||||
| **Amazon Linux** | 2 | ✅ Supported |
|
||||
|
||||
## Quick Installation
|
||||
|
||||
### 1. Download Installation Script
|
||||
|
||||
```bash
|
||||
# Download the installation script
|
||||
wget https://get.chatwoot.app/linux/install.sh
|
||||
|
||||
# Make it executable
|
||||
chmod +x install.sh
|
||||
```
|
||||
|
||||
### 2. Run Installation
|
||||
|
||||
```bash
|
||||
# Run the installation script
|
||||
./install.sh --install
|
||||
```
|
||||
|
||||
The script will:
|
||||
- Install all required dependencies
|
||||
- Set up PostgreSQL and Redis
|
||||
- Install Ruby, Node.js, and other runtime dependencies
|
||||
- Clone and configure Chatwoot
|
||||
- Set up systemd services
|
||||
- Configure Nginx (if domain is provided)
|
||||
- Set up SSL with Let's Encrypt (if domain is provided)
|
||||
|
||||
### 3. Domain Configuration (Optional)
|
||||
|
||||
If you have a domain name:
|
||||
|
||||
1. **Create DNS A Record**: Point your domain to your server's IP address
|
||||
2. **During installation**: Enter `yes` when prompted about domain setup
|
||||
3. **Enter your domain**: The script will configure Nginx and SSL automatically
|
||||
|
||||
### 4. Access Your Installation
|
||||
|
||||
- **With domain**: `https://your-domain.com`
|
||||
- **Without domain**: `http://your-server-ip:3000`
|
||||
|
||||
**Default login credentials:**
|
||||
```
|
||||
URL: https://your-domain.com
|
||||
Email: john@acme.inc
|
||||
Password: Password1!
|
||||
```
|
||||
|
||||
## Manual Installation
|
||||
|
||||
For more control over the installation process, you can install manually:
|
||||
|
||||
### 1. System Preparation
|
||||
|
||||
```bash
|
||||
# Update system packages
|
||||
sudo apt update && sudo apt upgrade -y
|
||||
|
||||
# Install essential packages
|
||||
sudo apt install -y curl wget gnupg2 software-properties-common apt-transport-https ca-certificates lsb-release
|
||||
```
|
||||
|
||||
### 2. Install Dependencies
|
||||
|
||||
**PostgreSQL:**
|
||||
```bash
|
||||
# Install PostgreSQL
|
||||
sudo apt install -y postgresql postgresql-contrib
|
||||
|
||||
# Start and enable PostgreSQL
|
||||
sudo systemctl start postgresql
|
||||
sudo systemctl enable postgresql
|
||||
|
||||
# Create database and user
|
||||
sudo -u postgres psql << EOF
|
||||
CREATE DATABASE chatwoot;
|
||||
CREATE USER chatwoot WITH ENCRYPTED PASSWORD 'your_secure_password';
|
||||
GRANT ALL PRIVILEGES ON DATABASE chatwoot TO chatwoot;
|
||||
ALTER USER chatwoot CREATEDB;
|
||||
\q
|
||||
EOF
|
||||
```
|
||||
|
||||
**Redis:**
|
||||
```bash
|
||||
# Install Redis
|
||||
sudo apt install -y redis-server
|
||||
|
||||
# Configure Redis
|
||||
sudo sed -i 's/^# requirepass foobared/requirepass your_redis_password/' /etc/redis/redis.conf
|
||||
|
||||
# Start and enable Redis
|
||||
sudo systemctl start redis-server
|
||||
sudo systemctl enable redis-server
|
||||
```
|
||||
|
||||
**Ruby (using RVM):**
|
||||
```bash
|
||||
# Install RVM
|
||||
curl -sSL https://get.rvm.io | bash -s stable
|
||||
source ~/.rvm/scripts/rvm
|
||||
|
||||
# Install Ruby
|
||||
rvm install 3.3.3
|
||||
rvm use 3.3.3 --default
|
||||
```
|
||||
|
||||
**Node.js:**
|
||||
```bash
|
||||
# Install Node.js 20.x
|
||||
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
|
||||
sudo apt install -y nodejs
|
||||
|
||||
# Install pnpm
|
||||
npm install -g pnpm
|
||||
```
|
||||
|
||||
**Additional Dependencies:**
|
||||
```bash
|
||||
# Install build tools and libraries
|
||||
sudo apt install -y git build-essential libssl-dev libreadline-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm-dev libyaml-dev libsqlite3-dev libgdbm-compat-dev libncurses5-dev libreadline6-dev
|
||||
|
||||
# Install ImageMagick for image processing
|
||||
sudo apt install -y imagemagick libmagickwand-dev
|
||||
|
||||
# Install FFmpeg for media processing
|
||||
sudo apt install -y ffmpeg
|
||||
```
|
||||
|
||||
### 3. Install Chatwoot
|
||||
|
||||
```bash
|
||||
# Create chatwoot user
|
||||
sudo adduser --disabled-login --gecos "" chatwoot
|
||||
|
||||
# Switch to chatwoot user
|
||||
sudo -i -u chatwoot
|
||||
|
||||
# Clone Chatwoot repository
|
||||
git clone https://github.com/chatwoot/chatwoot.git
|
||||
cd chatwoot
|
||||
|
||||
# Checkout latest stable version
|
||||
git checkout master
|
||||
|
||||
# Install Ruby dependencies
|
||||
bundle install
|
||||
|
||||
# Install Node.js dependencies
|
||||
pnpm install
|
||||
|
||||
# Copy environment file
|
||||
cp .env.example .env
|
||||
```
|
||||
|
||||
### 4. Configure Environment
|
||||
|
||||
Edit the `.env` file:
|
||||
|
||||
```bash
|
||||
nano .env
|
||||
```
|
||||
|
||||
**Essential configurations:**
|
||||
|
||||
```env
|
||||
# Database Configuration
|
||||
DATABASE_URL=postgresql://chatwoot:your_secure_password@localhost:5432/chatwoot
|
||||
|
||||
# Redis Configuration
|
||||
REDIS_URL=redis://localhost:6379/0
|
||||
REDIS_PASSWORD=your_redis_password
|
||||
|
||||
# Application Configuration
|
||||
SECRET_KEY_BASE=generate_a_64_character_secret_key
|
||||
FRONTEND_URL=https://your-domain.com
|
||||
|
||||
# Email Configuration
|
||||
MAILER_SENDER_EMAIL=noreply@your-domain.com
|
||||
SMTP_ADDRESS=smtp.your-provider.com
|
||||
SMTP_PORT=587
|
||||
SMTP_USERNAME=your-smtp-username
|
||||
SMTP_PASSWORD=your-smtp-password
|
||||
SMTP_AUTHENTICATION=plain
|
||||
SMTP_ENABLE_STARTTLS_AUTO=true
|
||||
|
||||
# File Storage (optional)
|
||||
ACTIVE_STORAGE_SERVICE=local
|
||||
# For S3: ACTIVE_STORAGE_SERVICE=amazon
|
||||
# AWS_ACCESS_KEY_ID=your_access_key
|
||||
# AWS_SECRET_ACCESS_KEY=your_secret_key
|
||||
# AWS_REGION=us-east-1
|
||||
# AWS_BUCKET=your-bucket-name
|
||||
|
||||
# Security
|
||||
FORCE_SSL=true
|
||||
RAILS_ENV=production
|
||||
NODE_ENV=production
|
||||
```
|
||||
|
||||
### 5. Setup Database
|
||||
|
||||
```bash
|
||||
# Prepare the database
|
||||
RAILS_ENV=production bundle exec rails db:chatwoot_prepare
|
||||
|
||||
# Precompile assets
|
||||
RAILS_ENV=production bundle exec rails assets:precompile
|
||||
```
|
||||
|
||||
### 6. Configure Systemd Services
|
||||
|
||||
Create systemd service files:
|
||||
|
||||
**Web Service (`/etc/systemd/system/chatwoot-web.1.service`):**
|
||||
```ini
|
||||
[Unit]
|
||||
Description=Chatwoot web server
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=chatwoot
|
||||
WorkingDirectory=/home/chatwoot/chatwoot
|
||||
Environment=RAILS_ENV=production
|
||||
Environment=BUNDLE_GEMFILE=/home/chatwoot/chatwoot/Gemfile
|
||||
ExecStart=/home/chatwoot/.rvm/bin/rvm default do bundle exec rails server -b 0.0.0.0 -p 3000 -e production
|
||||
Restart=always
|
||||
RestartSec=1
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
**Worker Service (`/etc/systemd/system/chatwoot-worker.1.service`):**
|
||||
```ini
|
||||
[Unit]
|
||||
Description=Chatwoot sidekiq worker
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=chatwoot
|
||||
WorkingDirectory=/home/chatwoot/chatwoot
|
||||
Environment=RAILS_ENV=production
|
||||
Environment=BUNDLE_GEMFILE=/home/chatwoot/chatwoot/Gemfile
|
||||
ExecStart=/home/chatwoot/.rvm/bin/rvm default do bundle exec sidekiq -C config/sidekiq.yml
|
||||
Restart=always
|
||||
RestartSec=1
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
**Target Service (`/etc/systemd/system/chatwoot.target`):**
|
||||
```ini
|
||||
[Unit]
|
||||
Description=Chatwoot services
|
||||
Wants=chatwoot-web.1.service chatwoot-worker.1.service
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
Enable and start services:
|
||||
```bash
|
||||
# Reload systemd
|
||||
sudo systemctl daemon-reload
|
||||
|
||||
# Enable and start Chatwoot services
|
||||
sudo systemctl enable chatwoot.target
|
||||
sudo systemctl start chatwoot.target
|
||||
|
||||
# Check status
|
||||
sudo systemctl status chatwoot.target
|
||||
```
|
||||
|
||||
### 7. Configure Nginx
|
||||
|
||||
Install and configure Nginx:
|
||||
|
||||
```bash
|
||||
# Install Nginx
|
||||
sudo apt install -y nginx
|
||||
|
||||
# Create Nginx configuration
|
||||
sudo nano /etc/nginx/sites-available/chatwoot
|
||||
```
|
||||
|
||||
**Nginx configuration:**
|
||||
```nginx
|
||||
server {
|
||||
server_name your-domain.com;
|
||||
|
||||
# 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;
|
||||
|
||||
# Increase client max body size for file uploads
|
||||
client_max_body_size 50M;
|
||||
|
||||
location /.well-known {
|
||||
alias /var/www/ssl-proof/chatwoot/.well-known;
|
||||
}
|
||||
|
||||
location / {
|
||||
proxy_pass_header Authorization;
|
||||
proxy_pass http://$upstream;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header X-Forwarded-Ssl on;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
|
||||
proxy_http_version 1.1;
|
||||
proxy_buffering off;
|
||||
proxy_read_timeout 36000s;
|
||||
proxy_redirect off;
|
||||
}
|
||||
|
||||
listen 80;
|
||||
}
|
||||
```
|
||||
|
||||
Enable the site:
|
||||
```bash
|
||||
# Enable site
|
||||
sudo ln -s /etc/nginx/sites-available/chatwoot /etc/nginx/sites-enabled/
|
||||
|
||||
# Test configuration
|
||||
sudo nginx -t
|
||||
|
||||
# Restart Nginx
|
||||
sudo systemctl restart nginx
|
||||
```
|
||||
|
||||
### 8. Setup SSL with Let's Encrypt
|
||||
|
||||
```bash
|
||||
# Install Certbot
|
||||
sudo apt install -y certbot python3-certbot-nginx
|
||||
|
||||
# Create directory for SSL verification
|
||||
sudo mkdir -p /var/www/ssl-proof/chatwoot/.well-known
|
||||
|
||||
# Get SSL certificate
|
||||
sudo certbot --webroot -w /var/www/ssl-proof/chatwoot/ -d your-domain.com -i nginx
|
||||
|
||||
# Test automatic renewal
|
||||
sudo certbot renew --dry-run
|
||||
```
|
||||
|
||||
## Chatwoot CLI (cwctl)
|
||||
|
||||
Starting with Chatwoot v2.7.0, the installation includes the Chatwoot CLI for easier management:
|
||||
|
||||
### Installation
|
||||
|
||||
If you don't have `cwctl` installed:
|
||||
|
||||
```bash
|
||||
# Download and install cwctl
|
||||
sudo wget https://get.chatwoot.app/linux/install.sh -O /usr/local/bin/cwctl
|
||||
sudo chmod +x /usr/local/bin/cwctl
|
||||
|
||||
# Verify installation
|
||||
cwctl --help
|
||||
```
|
||||
|
||||
### Usage
|
||||
|
||||
```bash
|
||||
# Restart Chatwoot services
|
||||
cwctl -r
|
||||
|
||||
# Upgrade Chatwoot
|
||||
cwctl --upgrade
|
||||
|
||||
# Access Rails console
|
||||
cwctl -c
|
||||
|
||||
# View logs
|
||||
cwctl -l web # Web server logs
|
||||
cwctl -l worker # Worker logs
|
||||
|
||||
# Get help
|
||||
cwctl --help
|
||||
```
|
||||
|
||||
## Maintenance Operations
|
||||
|
||||
### Upgrading Chatwoot
|
||||
|
||||
**Using cwctl (recommended):**
|
||||
```bash
|
||||
cwctl --upgrade
|
||||
```
|
||||
|
||||
**Manual upgrade:**
|
||||
```bash
|
||||
# Switch to chatwoot user
|
||||
sudo -i -u chatwoot
|
||||
cd chatwoot
|
||||
|
||||
# Pull latest changes
|
||||
git checkout master && git pull
|
||||
|
||||
# Update Ruby version if needed
|
||||
rvm install "ruby-3.3.3"
|
||||
rvm use 3.3.3 --default
|
||||
|
||||
# Update dependencies
|
||||
bundle install
|
||||
pnpm install
|
||||
|
||||
# Precompile assets
|
||||
RAILS_ENV=production bundle exec rails assets:precompile
|
||||
|
||||
# Run database migrations
|
||||
RAILS_ENV=production bundle exec rails db:migrate
|
||||
|
||||
# Exit to root user
|
||||
exit
|
||||
|
||||
# Update systemd service files
|
||||
sudo cp /home/chatwoot/chatwoot/deployment/chatwoot-web.1.service /etc/systemd/system/
|
||||
sudo cp /home/chatwoot/chatwoot/deployment/chatwoot-worker.1.service /etc/systemd/system/
|
||||
sudo cp /home/chatwoot/chatwoot/deployment/chatwoot.target /etc/systemd/system/
|
||||
|
||||
# Reload and restart services
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl restart chatwoot.target
|
||||
```
|
||||
|
||||
### Backup and Restore
|
||||
|
||||
**Database Backup:**
|
||||
```bash
|
||||
# Create backup
|
||||
sudo -u postgres pg_dump chatwoot > chatwoot_backup_$(date +%Y%m%d_%H%M%S).sql
|
||||
|
||||
# Restore backup
|
||||
sudo -u postgres psql chatwoot < chatwoot_backup_file.sql
|
||||
```
|
||||
|
||||
**File Storage Backup:**
|
||||
```bash
|
||||
# Backup storage directory
|
||||
sudo tar -czf chatwoot_storage_$(date +%Y%m%d_%H%M%S).tar.gz /home/chatwoot/chatwoot/storage/
|
||||
```
|
||||
|
||||
**Complete System Backup:**
|
||||
```bash
|
||||
# Create backup script
|
||||
cat > /home/chatwoot/backup.sh << 'EOF'
|
||||
#!/bin/bash
|
||||
BACKUP_DIR="/backup/chatwoot/$(date +%Y%m%d_%H%M%S)"
|
||||
mkdir -p $BACKUP_DIR
|
||||
|
||||
# Database backup
|
||||
sudo -u postgres pg_dump chatwoot > $BACKUP_DIR/database.sql
|
||||
|
||||
# Application files
|
||||
tar -czf $BACKUP_DIR/application.tar.gz /home/chatwoot/chatwoot/
|
||||
|
||||
# Storage files
|
||||
tar -czf $BACKUP_DIR/storage.tar.gz /home/chatwoot/chatwoot/storage/
|
||||
|
||||
# Environment file
|
||||
cp /home/chatwoot/chatwoot/.env $BACKUP_DIR/
|
||||
|
||||
echo "Backup completed: $BACKUP_DIR"
|
||||
EOF
|
||||
|
||||
chmod +x /home/chatwoot/backup.sh
|
||||
```
|
||||
|
||||
### Monitoring and Logs
|
||||
|
||||
**View logs:**
|
||||
```bash
|
||||
# Web server logs
|
||||
sudo journalctl -u chatwoot-web.1.service -f
|
||||
|
||||
# Worker logs
|
||||
sudo journalctl -u chatwoot-worker.1.service -f
|
||||
|
||||
# Nginx logs
|
||||
sudo tail -f /var/log/nginx/access.log
|
||||
sudo tail -f /var/log/nginx/error.log
|
||||
|
||||
# PostgreSQL logs
|
||||
sudo tail -f /var/log/postgresql/postgresql-*.log
|
||||
```
|
||||
|
||||
**System monitoring:**
|
||||
```bash
|
||||
# Check service status
|
||||
sudo systemctl status chatwoot.target
|
||||
|
||||
# Check resource usage
|
||||
htop
|
||||
df -h
|
||||
free -h
|
||||
|
||||
# Check database connections
|
||||
sudo -u postgres psql -c "SELECT count(*) FROM pg_stat_activity;"
|
||||
```
|
||||
|
||||
### Rails Console Access
|
||||
|
||||
```bash
|
||||
# Using cwctl
|
||||
cwctl -c
|
||||
|
||||
# Manual access
|
||||
sudo -i -u chatwoot
|
||||
cd chatwoot
|
||||
RAILS_ENV=production bundle exec rails console
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Common Issues
|
||||
|
||||
**1. Asset Precompilation Fails:**
|
||||
```bash
|
||||
# Clear and rebuild assets
|
||||
sudo -i -u chatwoot
|
||||
cd chatwoot
|
||||
RAILS_ENV=production bundle exec rails assets:clean assets:clobber assets:precompile
|
||||
```
|
||||
|
||||
**2. Database Connection Issues:**
|
||||
```bash
|
||||
# Check PostgreSQL status
|
||||
sudo systemctl status postgresql
|
||||
|
||||
# Test database connection
|
||||
sudo -u postgres psql -c "SELECT version();"
|
||||
|
||||
# Check database configuration
|
||||
sudo -i -u chatwoot
|
||||
cd chatwoot
|
||||
RAILS_ENV=production bundle exec rails db:version
|
||||
```
|
||||
|
||||
**3. Permission Issues:**
|
||||
```bash
|
||||
# Fix file permissions
|
||||
sudo chown -R chatwoot:chatwoot /home/chatwoot/chatwoot/
|
||||
```
|
||||
|
||||
**4. Service Won't Start:**
|
||||
```bash
|
||||
# Check service logs
|
||||
sudo journalctl -u chatwoot-web.1.service --no-pager
|
||||
sudo journalctl -u chatwoot-worker.1.service --no-pager
|
||||
|
||||
# Check configuration
|
||||
sudo systemctl status chatwoot.target
|
||||
```
|
||||
|
||||
### Performance Optimization
|
||||
|
||||
**1. Database Optimization:**
|
||||
```sql
|
||||
-- Connect to database
|
||||
sudo -u postgres psql chatwoot
|
||||
|
||||
-- Check database size
|
||||
SELECT pg_size_pretty(pg_database_size('chatwoot'));
|
||||
|
||||
-- Check slow queries (if pg_stat_statements is enabled)
|
||||
SELECT query, mean_time, calls
|
||||
FROM pg_stat_statements
|
||||
ORDER BY mean_time DESC
|
||||
LIMIT 10;
|
||||
```
|
||||
|
||||
**2. System Optimization:**
|
||||
```bash
|
||||
# Increase file limits for chatwoot user
|
||||
echo "chatwoot soft nofile 65536" | sudo tee -a /etc/security/limits.conf
|
||||
echo "chatwoot hard nofile 65536" | sudo tee -a /etc/security/limits.conf
|
||||
|
||||
# Optimize PostgreSQL configuration
|
||||
sudo nano /etc/postgresql/*/main/postgresql.conf
|
||||
# Adjust shared_buffers, effective_cache_size, work_mem based on available RAM
|
||||
```
|
||||
|
||||
### Security Hardening
|
||||
|
||||
**1. Firewall Configuration:**
|
||||
```bash
|
||||
# Install and configure UFW
|
||||
sudo ufw enable
|
||||
sudo ufw default deny incoming
|
||||
sudo ufw default allow outgoing
|
||||
sudo ufw allow ssh
|
||||
sudo ufw allow 80/tcp
|
||||
sudo ufw allow 443/tcp
|
||||
```
|
||||
|
||||
**2. Fail2ban Setup:**
|
||||
```bash
|
||||
# Install Fail2ban
|
||||
sudo apt install -y fail2ban
|
||||
|
||||
# Configure Fail2ban for SSH
|
||||
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
|
||||
sudo systemctl enable fail2ban
|
||||
sudo systemctl start fail2ban
|
||||
```
|
||||
|
||||
**3. Regular Updates:**
|
||||
```bash
|
||||
# Create update script
|
||||
cat > /home/chatwoot/update_system.sh << 'EOF'
|
||||
#!/bin/bash
|
||||
sudo apt update
|
||||
sudo apt upgrade -y
|
||||
sudo apt autoremove -y
|
||||
sudo apt autoclean
|
||||
EOF
|
||||
|
||||
chmod +x /home/chatwoot/update_system.sh
|
||||
|
||||
# Add to crontab for weekly updates
|
||||
echo "0 2 * * 0 /home/chatwoot/update_system.sh" | sudo crontab -
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
<Warning>
|
||||
Always test upgrades in a staging environment before applying to production. Keep regular backups of your database and application files.
|
||||
</Warning>
|
||||
|
||||
<Note>
|
||||
For high-availability deployments, consider setting up multiple servers with load balancing and database replication.
|
||||
</Note>
|
||||
@@ -1,127 +0,0 @@
|
||||
---
|
||||
title: Self-Hosted Installation Guide
|
||||
description: Complete guide to install and setup a production-ready Chatwoot instance on your own infrastructure.
|
||||
sidebarTitle: Introduction
|
||||
---
|
||||
|
||||
Welcome to the Chatwoot self-hosted installation guide. This comprehensive documentation will help you deploy, configure, and maintain your own Chatwoot instance with full control over your data and infrastructure.
|
||||
|
||||
## Why Self-Host Chatwoot?
|
||||
|
||||
Self-hosting Chatwoot gives you complete control over your customer support platform:
|
||||
|
||||
- **Data Privacy**: Keep all customer data on your own servers
|
||||
- **Customization**: Modify the platform to fit your specific needs
|
||||
- **Cost Control**: No per-agent pricing - scale as much as you need
|
||||
- **Compliance**: Meet specific regulatory requirements
|
||||
- **Integration**: Deep integration with your existing infrastructure
|
||||
|
||||
## Deployment Options
|
||||
|
||||
Chatwoot supports multiple deployment methods to fit different infrastructure needs:
|
||||
|
||||
### 🐧 Linux VM Deployment
|
||||
Deploy directly on Ubuntu/Linux virtual machines with our automated installation script.
|
||||
- **Best for**: Traditional server environments
|
||||
- **Complexity**: Low to Medium
|
||||
- **Maintenance**: Manual updates required
|
||||
|
||||
### 🐳 Docker Deployment
|
||||
Use Docker containers for consistent, portable deployments.
|
||||
- **Best for**: Containerized environments
|
||||
- **Complexity**: Medium
|
||||
- **Maintenance**: Easy updates with container pulls
|
||||
|
||||
### ☸️ Kubernetes Deployment
|
||||
Deploy on Kubernetes clusters for enterprise-scale operations.
|
||||
- **Best for**: Large-scale, high-availability deployments
|
||||
- **Complexity**: High
|
||||
- **Maintenance**: Automated with proper CI/CD
|
||||
|
||||
### ☁️ Cloud Provider Deployments
|
||||
One-click deployments on major cloud platforms:
|
||||
- **AWS**: EC2, ECS, and Marketplace options
|
||||
- **Azure**: Container Instances and VM deployments
|
||||
- **DigitalOcean**: Droplets and App Platform
|
||||
- **Google Cloud**: Compute Engine and Cloud Run
|
||||
- **Heroku**: Simple one-click deployment
|
||||
|
||||
## System Requirements
|
||||
|
||||
### Minimum Requirements
|
||||
- **CPU**: 2 cores
|
||||
- **RAM**: 4GB
|
||||
- **Storage**: 20GB SSD
|
||||
- **OS**: Ubuntu 20.04+ or compatible Linux distribution
|
||||
|
||||
### Recommended for Production
|
||||
- **CPU**: 4+ cores
|
||||
- **RAM**: 8GB+
|
||||
- **Storage**: 50GB+ SSD
|
||||
- **Database**: PostgreSQL 12+
|
||||
- **Cache**: Redis 6+
|
||||
- **Reverse Proxy**: Nginx or similar
|
||||
|
||||
## What You'll Need
|
||||
|
||||
Before starting your Chatwoot installation, ensure you have:
|
||||
|
||||
### Technical Requirements
|
||||
- [ ] Server or cloud instance meeting minimum requirements
|
||||
- [ ] Domain name (recommended for production)
|
||||
- [ ] SSL certificate (Let's Encrypt recommended)
|
||||
- [ ] SMTP server for email notifications
|
||||
|
||||
### Access Requirements
|
||||
- [ ] SSH access to your server
|
||||
- [ ] Root or sudo privileges
|
||||
- [ ] Firewall configuration access
|
||||
|
||||
### Optional but Recommended
|
||||
- [ ] Object storage (AWS S3, Google Cloud Storage, etc.)
|
||||
- [ ] CDN for static assets
|
||||
- [ ] Monitoring tools (APM, logging)
|
||||
- [ ] Backup solution
|
||||
|
||||
## Security Considerations
|
||||
|
||||
When self-hosting Chatwoot, consider these security aspects:
|
||||
|
||||
- **Regular Updates**: Keep Chatwoot and system packages updated
|
||||
- **Firewall Configuration**: Only expose necessary ports
|
||||
- **SSL/TLS**: Always use HTTPS in production
|
||||
- **Database Security**: Secure PostgreSQL with strong passwords
|
||||
- **Backup Encryption**: Encrypt sensitive backup data
|
||||
- **Access Control**: Implement proper user access controls
|
||||
|
||||
## Getting Started
|
||||
|
||||
Ready to deploy Chatwoot? Choose your preferred deployment method:
|
||||
|
||||
<CardGroup cols={2}>
|
||||
<Card title="Quick Start with Docker" icon="docker" href="/self-hosted/deployment/docker">
|
||||
Get up and running quickly with Docker containers
|
||||
</Card>
|
||||
<Card title="Linux VM Installation" icon="server" href="/self-hosted/deployment/linux-vm">
|
||||
Traditional server deployment with our automated script
|
||||
</Card>
|
||||
<Card title="Kubernetes Deployment" icon="dharmachakra" href="/self-hosted/deployment/kubernetes">
|
||||
Enterprise-scale deployment on Kubernetes
|
||||
</Card>
|
||||
<Card title="Cloud Providers" icon="cloud" href="/self-hosted/cloud/aws">
|
||||
One-click deployments on major cloud platforms
|
||||
</Card>
|
||||
</CardGroup>
|
||||
|
||||
## Community and Support
|
||||
|
||||
- **Documentation**: Comprehensive guides and API references
|
||||
- **GitHub**: [Source code and issue tracking](https://github.com/chatwoot/chatwoot)
|
||||
- **Discord**: [Community chat and support](https://discord.gg/cJXdrwS)
|
||||
- **Forum**: [Community discussions and Q&A](https://github.com/chatwoot/chatwoot/discussions)
|
||||
|
||||
---
|
||||
|
||||
<Note>
|
||||
This documentation covers Chatwoot Community Edition (CE). For Enterprise features and support, visit [Chatwoot Enterprise](https://www.chatwoot.com/pricing).
|
||||
</Note>
|
||||
@@ -1,339 +0,0 @@
|
||||
---
|
||||
title: System Requirements
|
||||
description: Hardware, software, and infrastructure requirements for deploying Chatwoot in different environments.
|
||||
sidebarTitle: Requirements
|
||||
---
|
||||
|
||||
Before deploying Chatwoot, ensure your infrastructure meets the minimum requirements for your expected usage. This guide covers requirements for different deployment scenarios and scales.
|
||||
|
||||
## Minimum System Requirements
|
||||
|
||||
### Development Environment
|
||||
|
||||
For local development and testing:
|
||||
|
||||
| Component | Requirement |
|
||||
|-----------|-------------|
|
||||
| **CPU** | 2 cores (2.0 GHz+) |
|
||||
| **RAM** | 4GB |
|
||||
| **Storage** | 20GB available space |
|
||||
| **OS** | Ubuntu 20.04+, macOS 10.15+, Windows 10+ |
|
||||
| **Network** | Broadband internet connection |
|
||||
|
||||
### Small Production (1-10 agents)
|
||||
|
||||
For small teams and low-volume usage:
|
||||
|
||||
| Component | Requirement |
|
||||
|-----------|-------------|
|
||||
| **CPU** | 2 cores (2.4 GHz+) |
|
||||
| **RAM** | 4GB |
|
||||
| **Storage** | 50GB SSD |
|
||||
| **Network** | 100 Mbps bandwidth |
|
||||
| **Concurrent Users** | Up to 100 |
|
||||
|
||||
### Medium Production (10-50 agents)
|
||||
|
||||
For growing teams with moderate usage:
|
||||
|
||||
| Component | Requirement |
|
||||
|-----------|-------------|
|
||||
| **CPU** | 4 cores (2.4 GHz+) |
|
||||
| **RAM** | 8GB |
|
||||
| **Storage** | 100GB SSD |
|
||||
| **Network** | 500 Mbps bandwidth |
|
||||
| **Concurrent Users** | Up to 500 |
|
||||
|
||||
### Large Production (50+ agents)
|
||||
|
||||
For enterprise deployments with high volume:
|
||||
|
||||
| Component | Requirement |
|
||||
|-----------|-------------|
|
||||
| **CPU** | 8+ cores (2.4 GHz+) |
|
||||
| **RAM** | 16GB+ |
|
||||
| **Storage** | 200GB+ SSD |
|
||||
| **Network** | 1 Gbps+ bandwidth |
|
||||
| **Concurrent Users** | 1000+ |
|
||||
|
||||
## Software Requirements
|
||||
|
||||
### Operating System
|
||||
|
||||
**Supported Linux Distributions:**
|
||||
- Ubuntu 20.04 LTS or later (recommended)
|
||||
- Ubuntu 22.04 LTS
|
||||
- Debian 10 or later
|
||||
- CentOS 8 or later
|
||||
- RHEL 8 or later
|
||||
- Amazon Linux 2
|
||||
|
||||
**Container Platforms:**
|
||||
- Docker 20.10+ with Docker Compose 2.0+
|
||||
- Kubernetes 1.20+
|
||||
- OpenShift 4.6+
|
||||
|
||||
### Runtime Dependencies
|
||||
|
||||
| Component | Version | Purpose |
|
||||
|-----------|---------|---------|
|
||||
| **Ruby** | 3.3.3+ | Application runtime |
|
||||
| **Node.js** | 20.x LTS | Frontend build tools |
|
||||
| **PostgreSQL** | 12+ | Primary database |
|
||||
| **Redis** | 6.0+ | Cache and job queue |
|
||||
| **Nginx** | 1.18+ | Reverse proxy |
|
||||
|
||||
### Development Dependencies
|
||||
|
||||
For building from source:
|
||||
|
||||
| Component | Version | Purpose |
|
||||
|-----------|---------|---------|
|
||||
| **Git** | 2.25+ | Source code management |
|
||||
| **Build tools** | Latest | Compiling native extensions |
|
||||
| **ImageMagick** | 7.0+ | Image processing |
|
||||
| **FFmpeg** | 4.0+ | Video/audio processing |
|
||||
|
||||
## Database Requirements
|
||||
|
||||
### PostgreSQL Configuration
|
||||
|
||||
**Minimum Version:** PostgreSQL 12+
|
||||
**Recommended Version:** PostgreSQL 14+
|
||||
|
||||
**Required Extensions:**
|
||||
- `pg_stat_statements` (performance monitoring)
|
||||
- `uuid-ossp` (UUID generation)
|
||||
- `pg_trgm` (full-text search)
|
||||
|
||||
**Configuration Recommendations:**
|
||||
|
||||
```sql
|
||||
-- Memory settings (adjust based on available RAM)
|
||||
shared_buffers = 256MB # 25% of RAM for small instances
|
||||
effective_cache_size = 1GB # 75% of RAM
|
||||
work_mem = 4MB # Per connection
|
||||
maintenance_work_mem = 64MB # For maintenance operations
|
||||
|
||||
-- Connection settings
|
||||
max_connections = 100 # Adjust based on expected load
|
||||
max_prepared_transactions = 100 # For prepared statements
|
||||
|
||||
-- Write-ahead logging
|
||||
wal_buffers = 16MB # WAL buffer size
|
||||
checkpoint_completion_target = 0.9 # Checkpoint target
|
||||
```
|
||||
|
||||
### Redis Configuration
|
||||
|
||||
**Minimum Version:** Redis 6.0+
|
||||
**Recommended Version:** Redis 7.0+
|
||||
|
||||
**Memory Requirements:**
|
||||
- **Small deployment:** 512MB
|
||||
- **Medium deployment:** 2GB
|
||||
- **Large deployment:** 4GB+
|
||||
|
||||
**Configuration Recommendations:**
|
||||
|
||||
```redis
|
||||
# Memory management
|
||||
maxmemory 2gb
|
||||
maxmemory-policy allkeys-lru
|
||||
|
||||
# Persistence (choose one)
|
||||
save 900 1 # RDB snapshots
|
||||
# appendonly yes # AOF logging
|
||||
|
||||
# Security
|
||||
requirepass your_secure_password
|
||||
```
|
||||
|
||||
## Network Requirements
|
||||
|
||||
### Ports
|
||||
|
||||
| Port | Protocol | Purpose | External Access |
|
||||
|------|----------|---------|-----------------|
|
||||
| **80** | HTTP | Web traffic (redirect to HTTPS) | Yes |
|
||||
| **443** | HTTPS | Secure web traffic | Yes |
|
||||
| **3000** | HTTP | Application server (behind proxy) | No |
|
||||
| **5432** | TCP | PostgreSQL database | No |
|
||||
| **6379** | TCP | Redis cache | No |
|
||||
| **22** | SSH | Server administration | Admin only |
|
||||
|
||||
### Firewall Configuration
|
||||
|
||||
**Inbound Rules:**
|
||||
```bash
|
||||
# Allow HTTP and HTTPS
|
||||
ufw allow 80/tcp
|
||||
ufw allow 443/tcp
|
||||
|
||||
# Allow SSH (restrict to admin IPs)
|
||||
ufw allow from YOUR_ADMIN_IP to any port 22
|
||||
|
||||
# Deny all other inbound traffic
|
||||
ufw default deny incoming
|
||||
```
|
||||
|
||||
**Outbound Rules:**
|
||||
```bash
|
||||
# Allow all outbound (for updates, integrations)
|
||||
ufw default allow outgoing
|
||||
|
||||
# Or restrict to specific services
|
||||
ufw allow out 53/udp # DNS
|
||||
ufw allow out 80/tcp # HTTP
|
||||
ufw allow out 443/tcp # HTTPS
|
||||
ufw allow out 587/tcp # SMTP
|
||||
```
|
||||
|
||||
### Bandwidth Estimation
|
||||
|
||||
**Per Agent (monthly):**
|
||||
- **Light usage:** 1-2 GB
|
||||
- **Medium usage:** 3-5 GB
|
||||
- **Heavy usage:** 8-10 GB
|
||||
|
||||
**Per Customer Conversation:**
|
||||
- **Text only:** 10-50 KB
|
||||
- **With images:** 500 KB - 2 MB
|
||||
- **With files:** 1-10 MB
|
||||
|
||||
## Storage Requirements
|
||||
|
||||
### Disk Space Planning
|
||||
|
||||
**Base Installation:** 5-10 GB
|
||||
**Database Growth:** 100 MB - 1 GB per 1000 conversations
|
||||
**File Attachments:** Varies by usage (plan for 10-50 GB)
|
||||
**Logs:** 1-5 GB per month
|
||||
**Backups:** 2x database size + file storage
|
||||
|
||||
### Storage Performance
|
||||
|
||||
| Deployment Size | IOPS | Throughput |
|
||||
|-----------------|------|------------|
|
||||
| **Small** | 1,000 IOPS | 50 MB/s |
|
||||
| **Medium** | 3,000 IOPS | 150 MB/s |
|
||||
| **Large** | 10,000+ IOPS | 500+ MB/s |
|
||||
|
||||
### File Storage Options
|
||||
|
||||
**Local Storage:**
|
||||
- Suitable for small deployments
|
||||
- Requires backup strategy
|
||||
- Limited scalability
|
||||
|
||||
**Object Storage (Recommended):**
|
||||
- AWS S3, Google Cloud Storage, Azure Blob
|
||||
- Unlimited scalability
|
||||
- Built-in redundancy
|
||||
- CDN integration
|
||||
|
||||
## Security Requirements
|
||||
|
||||
### SSL/TLS Certificates
|
||||
|
||||
**Required for Production:**
|
||||
- Valid SSL certificate for your domain
|
||||
- TLS 1.2 or higher
|
||||
- Strong cipher suites
|
||||
|
||||
**Certificate Options:**
|
||||
- Let's Encrypt (free, automated)
|
||||
- Commercial certificates
|
||||
- Wildcard certificates for subdomains
|
||||
|
||||
### Access Control
|
||||
|
||||
**Server Access:**
|
||||
- SSH key-based authentication
|
||||
- Disable password authentication
|
||||
- Regular security updates
|
||||
- Fail2ban or similar intrusion prevention
|
||||
|
||||
**Application Security:**
|
||||
- Strong database passwords
|
||||
- Redis authentication
|
||||
- Regular security updates
|
||||
- Web Application Firewall (optional)
|
||||
|
||||
## Cloud Provider Specifications
|
||||
|
||||
### AWS EC2 Instance Types
|
||||
|
||||
| Use Case | Instance Type | vCPU | RAM | Storage |
|
||||
|----------|---------------|------|-----|---------|
|
||||
| **Development** | t3.medium | 2 | 4 GB | 20 GB gp3 |
|
||||
| **Small Production** | t3.large | 2 | 8 GB | 50 GB gp3 |
|
||||
| **Medium Production** | m5.xlarge | 4 | 16 GB | 100 GB gp3 |
|
||||
| **Large Production** | m5.2xlarge | 8 | 32 GB | 200 GB gp3 |
|
||||
|
||||
### DigitalOcean Droplets
|
||||
|
||||
| Use Case | Droplet Size | vCPU | RAM | Storage |
|
||||
|----------|--------------|------|-----|---------|
|
||||
| **Development** | 2 GB | 1 | 2 GB | 50 GB SSD |
|
||||
| **Small Production** | 4 GB | 2 | 4 GB | 80 GB SSD |
|
||||
| **Medium Production** | 8 GB | 4 | 8 GB | 160 GB SSD |
|
||||
| **Large Production** | 16 GB | 6 | 16 GB | 320 GB SSD |
|
||||
|
||||
### Google Cloud Compute Engine
|
||||
|
||||
| Use Case | Machine Type | vCPU | RAM | Storage |
|
||||
|----------|--------------|------|-----|---------|
|
||||
| **Development** | e2-medium | 2 | 4 GB | 50 GB SSD |
|
||||
| **Small Production** | e2-standard-2 | 2 | 8 GB | 100 GB SSD |
|
||||
| **Medium Production** | e2-standard-4 | 4 | 16 GB | 200 GB SSD |
|
||||
| **Large Production** | e2-standard-8 | 8 | 32 GB | 500 GB SSD |
|
||||
|
||||
## Performance Benchmarks
|
||||
|
||||
### Expected Performance
|
||||
|
||||
| Metric | Small | Medium | Large |
|
||||
|--------|-------|--------|-------|
|
||||
| **Concurrent Users** | 100 | 500 | 1000+ |
|
||||
| **Messages/minute** | 1,000 | 5,000 | 20,000+ |
|
||||
| **Response Time** | <200ms | <300ms | <500ms |
|
||||
| **Uptime** | 99.5% | 99.9% | 99.95% |
|
||||
|
||||
### Load Testing
|
||||
|
||||
Before production deployment, consider load testing:
|
||||
|
||||
```bash
|
||||
# Example using Apache Bench
|
||||
ab -n 1000 -c 10 https://your-chatwoot-domain.com/api/v1/accounts
|
||||
|
||||
# Example using wrk
|
||||
wrk -t12 -c400 -d30s https://your-chatwoot-domain.com/
|
||||
```
|
||||
|
||||
## Monitoring Requirements
|
||||
|
||||
### Essential Metrics
|
||||
|
||||
- **System:** CPU, memory, disk, network
|
||||
- **Application:** Response times, error rates
|
||||
- **Database:** Connection count, query performance
|
||||
- **Redis:** Memory usage, hit rates
|
||||
|
||||
### Recommended Tools
|
||||
|
||||
- **System Monitoring:** Prometheus + Grafana, DataDog, New Relic
|
||||
- **Log Management:** ELK Stack, Fluentd, Splunk
|
||||
- **Uptime Monitoring:** Pingdom, UptimeRobot
|
||||
- **APM:** New Relic, DataDog APM, Scout
|
||||
|
||||
---
|
||||
|
||||
<Warning>
|
||||
These requirements are guidelines. Your actual needs may vary based on usage patterns, integrations, and performance expectations. Monitor your deployment and adjust resources accordingly.
|
||||
</Warning>
|
||||
|
||||
<Note>
|
||||
For high-availability deployments, consider redundancy in all components and implement proper backup and disaster recovery procedures.
|
||||
</Note>
|
||||
Reference in New Issue
Block a user