mirror of
				https://github.com/lingble/chatwoot.git
				synced 2025-10-30 18:47:51 +00:00 
			
		
		
		
	feat: allow setting up only web/worker deployments for linux (#12004)
## cwctl
-  allow setting up only web/worker deployments for linux
- allow upgrades to a custom branch - experimental
```
Usage Examples:
  # Convert existing full deployment to web-only (for web ASG)
  cwctl --convert web
  # Convert existing full deployment to worker-only (for worker ASG)
   cwctl --convert worker
  # Convert specialized deployment back to full
  cwctl --convert full
  # Fresh installs still work as before
    cwctl -i --web-only    # New web-only install
    cwctl -i --worker-only # New worker-only instal
```
- Upgrading to custom branches is risky, as other dependencies like node
or db might have changed
```
  cwctl --upgrade        # Upgrade to master branch - default
  cwctl -U v4.3.0         # Upgrade to specific release branch 
  cwctl --upgrade feat/new-feature  # Upgrade to feature branch
```
			
			
This commit is contained in:
		| @@ -1 +1 @@ | ||||
| 3.13.0 | ||||
| 4.4.0 | ||||
|   | ||||
| @@ -1 +1 @@ | ||||
| 3.2.0 | ||||
| 3.3.0 | ||||
|   | ||||
							
								
								
									
										6
									
								
								deployment/chatwoot-web.target
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								deployment/chatwoot-web.target
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| [Unit] | ||||
| Description=Chatwoot Web Server | ||||
| Wants=chatwoot-web.1.service | ||||
|  | ||||
| [Install] | ||||
| WantedBy=multi-user.target | ||||
							
								
								
									
										6
									
								
								deployment/chatwoot-worker.target
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								deployment/chatwoot-worker.target
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| [Unit] | ||||
| Description=Chatwoot Background Worker | ||||
| Wants=chatwoot-worker.1.service | ||||
|  | ||||
| [Install] | ||||
| WantedBy=multi-user.target | ||||
| @@ -17,9 +17,9 @@ fi | ||||
|  | ||||
| # Global variables | ||||
| # option --output/-o requires 1 argument | ||||
| LONGOPTS=console,debug,help,install,Install:,logs:,restart,ssl,upgrade,webserver,version | ||||
| OPTIONS=cdhiI:l:rsuwv | ||||
| CWCTL_VERSION="3.2.0" | ||||
| LONGOPTS=console,debug,help,install,Install:,logs:,restart,ssl,upgrade,Upgrade:,webserver,version,web-only,worker-only,convert: | ||||
| OPTIONS=cdhiI:l:rsuU:wvWK | ||||
| CWCTL_VERSION="3.3.0" | ||||
| pg_pass=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 15 ; echo '') | ||||
| CHATWOOT_HUB_URL="https://hub.2.chatwoot.com/events" | ||||
|  | ||||
| @@ -42,7 +42,7 @@ fi | ||||
| # read getopt’s output this way to handle the quoting right: | ||||
| eval set -- "$PARSED" | ||||
|  | ||||
| c=n d=n h=n i=n I=n l=n r=n s=n u=n w=n v=n BRANCH=master SERVICE=web | ||||
| c=n d=n h=n i=n I=n l=n r=n s=n u=n U=n w=n v=n W=n K=n C=n BRANCH=master SERVICE=web DEPLOYMENT_TYPE=full CONVERT_TO="" | ||||
| # Iterate options in order and nicely split until we see -- | ||||
| while true; do | ||||
|     case "$1" in | ||||
| @@ -83,6 +83,12 @@ while true; do | ||||
|             ;; | ||||
|         -u|--upgrade) | ||||
|             u=y | ||||
|             BRANCH="master" | ||||
|             break | ||||
|             ;; | ||||
|         -U|--Upgrade) | ||||
|             U=y | ||||
|             BRANCH="$2" | ||||
|             break | ||||
|             ;; | ||||
|         -w|--webserver) | ||||
| @@ -93,6 +99,36 @@ while true; do | ||||
|             v=y | ||||
|             shift | ||||
|             ;; | ||||
|         -W|--web-only) | ||||
|             W=y | ||||
|             DEPLOYMENT_TYPE=web | ||||
|             shift | ||||
|             ;; | ||||
|         -K|--worker-only) | ||||
|             K=y | ||||
|             DEPLOYMENT_TYPE=worker | ||||
|             shift | ||||
|             ;; | ||||
|         --convert) | ||||
|             C=y | ||||
|             CONVERT_TO="$2" | ||||
|             case "$CONVERT_TO" in | ||||
|                 web) | ||||
|                     DEPLOYMENT_TYPE=web | ||||
|                     ;; | ||||
|                 worker) | ||||
|                     DEPLOYMENT_TYPE=worker | ||||
|                     ;; | ||||
|                 full) | ||||
|                     DEPLOYMENT_TYPE=full | ||||
|                     ;; | ||||
|                 *) | ||||
|                     echo "Invalid conversion type. Use: web, worker, or full" | ||||
|                     exit 3 | ||||
|                     ;; | ||||
|             esac | ||||
|             shift 2 | ||||
|             ;; | ||||
|         --) | ||||
|             shift | ||||
|             break | ||||
| @@ -107,7 +143,7 @@ done | ||||
| # log if debug flag set | ||||
| if [ "$d" == "y" ]; then | ||||
|   echo "console: $c, debug: $d, help: $h, install: $i, Install: $I, BRANCH: $BRANCH, \ | ||||
|   logs: $l, SERVICE: $SERVICE, ssl: $s, upgrade: $u, webserver: $w" | ||||
|   logs: $l, SERVICE: $SERVICE, ssl: $s, upgrade: $u, Upgrade: $U, webserver: $w, web-only: $W, worker-only: $K, convert: $C, convert-to: $CONVERT_TO, deployment-type: $DEPLOYMENT_TYPE" | ||||
| fi | ||||
|  | ||||
| # exit if script is not run as root | ||||
| @@ -379,23 +415,84 @@ EOF | ||||
| ############################################################################## | ||||
| # Setup Chatwoot systemd services and cwctl CLI | ||||
| # Globals: | ||||
| #   None | ||||
| #   DEPLOYMENT_TYPE | ||||
| # Arguments: | ||||
| #   None | ||||
| # Outputs: | ||||
| #   None | ||||
| ############################################################################## | ||||
| function configure_systemd_services() { | ||||
|   # Check if this is a conversion from existing deployment | ||||
|   local existing_full_deployment=false | ||||
|   if [ -f "/etc/systemd/system/chatwoot.target" ]; then | ||||
|     existing_full_deployment=true | ||||
|   fi | ||||
|  | ||||
|   if [ "$DEPLOYMENT_TYPE" == "web" ]; then | ||||
|     echo "Setting up web-only deployment" | ||||
|      | ||||
|     # Stop and disable existing services if converting | ||||
|     if [ "$existing_full_deployment" = true ]; then | ||||
|       echo "Converting from full deployment to web-only" | ||||
|       systemctl stop chatwoot.target || true | ||||
|       systemctl disable chatwoot.target || true | ||||
|       systemctl stop chatwoot-worker.1.service || true | ||||
|       systemctl disable chatwoot-worker.1.service || true | ||||
|     fi | ||||
|      | ||||
|     cp /home/chatwoot/chatwoot/deployment/chatwoot-web.1.service /etc/systemd/system/chatwoot-web.1.service | ||||
|     cp /home/chatwoot/chatwoot/deployment/chatwoot-web.target /etc/systemd/system/chatwoot-web.target | ||||
|      | ||||
|     systemctl daemon-reload | ||||
|     systemctl enable chatwoot-web.target | ||||
|     systemctl start chatwoot-web.target | ||||
|      | ||||
|   elif [ "$DEPLOYMENT_TYPE" == "worker" ]; then | ||||
|     echo "Setting up worker-only deployment" | ||||
|      | ||||
|     # Stop and disable existing services if converting | ||||
|     if [ "$existing_full_deployment" = true ]; then | ||||
|       echo "Converting from full deployment to worker-only" | ||||
|       systemctl stop chatwoot.target || true | ||||
|       systemctl disable chatwoot.target || true | ||||
|       systemctl stop chatwoot-web.1.service || true | ||||
|       systemctl disable chatwoot-web.1.service || true | ||||
|     fi | ||||
|      | ||||
|     cp /home/chatwoot/chatwoot/deployment/chatwoot-worker.1.service /etc/systemd/system/chatwoot-worker.1.service | ||||
|     cp /home/chatwoot/chatwoot/deployment/chatwoot-worker.target /etc/systemd/system/chatwoot-worker.target | ||||
|      | ||||
|     systemctl daemon-reload | ||||
|     systemctl enable chatwoot-worker.target | ||||
|     systemctl start chatwoot-worker.target | ||||
|      | ||||
|   else | ||||
|     echo "Setting up full deployment (web + worker)" | ||||
|      | ||||
|     # Stop existing specialized deployments if converting back to full | ||||
|     if [ -f "/etc/systemd/system/chatwoot-web.target" ]; then | ||||
|       echo "Converting from web-only to full deployment" | ||||
|       systemctl stop chatwoot-web.target || true | ||||
|       systemctl disable chatwoot-web.target || true | ||||
|     fi | ||||
|     if [ -f "/etc/systemd/system/chatwoot-worker.target" ]; then | ||||
|       echo "Converting from worker-only to full deployment" | ||||
|       systemctl stop chatwoot-worker.target || true | ||||
|       systemctl disable chatwoot-worker.target || true | ||||
|     fi | ||||
|      | ||||
|     cp /home/chatwoot/chatwoot/deployment/chatwoot-web.1.service /etc/systemd/system/chatwoot-web.1.service | ||||
|     cp /home/chatwoot/chatwoot/deployment/chatwoot-worker.1.service /etc/systemd/system/chatwoot-worker.1.service | ||||
|     cp /home/chatwoot/chatwoot/deployment/chatwoot.target /etc/systemd/system/chatwoot.target | ||||
|  | ||||
|     systemctl daemon-reload | ||||
|     systemctl enable chatwoot.target | ||||
|     systemctl start chatwoot.target | ||||
|   fi | ||||
|  | ||||
|   cp /home/chatwoot/chatwoot/deployment/chatwoot /etc/sudoers.d/chatwoot | ||||
|   cp /home/chatwoot/chatwoot/deployment/setup_20.04.sh /usr/local/bin/cwctl | ||||
|   chmod +x /usr/local/bin/cwctl | ||||
|  | ||||
|   systemctl enable chatwoot.target | ||||
|   systemctl start chatwoot.target | ||||
| } | ||||
|  | ||||
| ############################################################################## | ||||
| @@ -427,7 +524,15 @@ function setup_ssl() { | ||||
|   cd chatwoot | ||||
|   sed -i "s/http:\/\/0.0.0.0:3000/https:\/\/$domain_name/g" .env | ||||
| EOF | ||||
|    | ||||
|   # Restart the appropriate chatwoot target | ||||
|   if [ -f "/etc/systemd/system/chatwoot-web.target" ]; then | ||||
|     systemctl restart chatwoot-web.target | ||||
|   elif [ -f "/etc/systemd/system/chatwoot-worker.target" ]; then | ||||
|     systemctl restart chatwoot-worker.target | ||||
|   else | ||||
|     systemctl restart chatwoot.target | ||||
|   fi | ||||
| } | ||||
|  | ||||
| ############################################################################## | ||||
| @@ -624,17 +729,27 @@ Usage: cwctl [OPTION]... | ||||
| Install and manage your Chatwoot installation. | ||||
|  | ||||
| Example: cwctl -i master | ||||
| Example: cwctl -i --web-only     (for web server ASG) | ||||
| Example: cwctl -i --worker-only  (for worker ASG) | ||||
| Example: cwctl --convert web     (convert existing to web-only) | ||||
| Example: cwctl --convert worker  (convert existing to worker-only) | ||||
| Example: cwctl --convert full    (convert back to full deployment) | ||||
| Example: cwctl --upgrade         (upgrade to latest master) | ||||
| Example: cwctl -U develop        (upgrade to develop branch) | ||||
| Example: cwctl -l web | ||||
| Example: cwctl --logs worker | ||||
| Example: cwctl --upgrade | ||||
| Example: cwctl -c | ||||
|  | ||||
| Installation/Upgrade: | ||||
|   -i, --install             Install the latest stable version of Chatwoot | ||||
|   -I                        Install Chatwoot from a git branch | ||||
|   -I BRANCH                 Install Chatwoot from a git branch | ||||
|   -u, --upgrade             Upgrade Chatwoot to the latest stable version | ||||
|   -U BRANCH                 Upgrade Chatwoot from a git branch (EXPERIMENTAL) | ||||
|   -s, --ssl                 Fetch and install SSL certificates using LetsEncrypt | ||||
|   -w, --webserver           Install and configure Nginx webserver with SSL | ||||
|   -W, --web-only            Install only the web server (for ASG deployment) | ||||
|   -K, --worker-only         Install only the background worker (for ASG deployment) | ||||
|       --convert TYPE        Convert existing deployment (TYPE: web, worker, full) | ||||
|  | ||||
| Management: | ||||
|   -c, --console             Open ruby console | ||||
| @@ -831,7 +946,31 @@ EOF | ||||
| function upgrade() { | ||||
|   cwctl_upgrade_check | ||||
|   get_cw_version | ||||
|   echo "Upgrading Chatwoot to v$CW_VERSION" | ||||
|   echo "Upgrading Chatwoot to v$CW_VERSION (branch: $BRANCH)" | ||||
|  | ||||
|   # Warning for non-master branch upgrades | ||||
|   if [ "$BRANCH" != "master" ]; then | ||||
|     cat << EOF | ||||
|  | ||||
| ⚠️  WARNING: Branch-specific upgrades are EXPERIMENTAL | ||||
| ⚠️  Switching between different versions/branches may cause: | ||||
|    - Database migration conflicts | ||||
|    - Asset compilation errors | ||||
|    - Configuration incompatibilities | ||||
|    - Data corruption or loss | ||||
|  | ||||
| ⚠️  This is NOT recommended for production environments. | ||||
| ⚠️  Always backup your database before proceeding. | ||||
|  | ||||
| EOF | ||||
|     read -p "Do you understand the risks and want to continue? [y/N]: " user_input | ||||
|     user_input=${user_input:-N} | ||||
|     if [[ ! "$user_input" =~ ^([yY][eE][sS]|[yY])$ ]]; then | ||||
|       echo "Upgrade cancelled." | ||||
|       exit 1 | ||||
|     fi | ||||
|   fi | ||||
|  | ||||
|   sleep 3 | ||||
|  | ||||
|    # Check if CW_VERSION is 4.0 or above | ||||
| @@ -857,8 +996,9 @@ function upgrade() { | ||||
|   # Navigate to the Chatwoot directory | ||||
|   cd chatwoot | ||||
|  | ||||
|   # Pull the latest version of the master branch | ||||
|   git checkout master && git pull | ||||
|   # Pull the latest version of the specified branch | ||||
|   git fetch | ||||
|   git checkout "$BRANCH" && git pull | ||||
|  | ||||
|   # Ensure the ruby version is upto date | ||||
|   # Parse the latest ruby version | ||||
| @@ -878,18 +1018,35 @@ function upgrade() { | ||||
|  | ||||
| EOF | ||||
|  | ||||
|   # Copy the updated targets | ||||
|   # Copy the updated services and targets based on existing deployment | ||||
|   if [ -f "/etc/systemd/system/chatwoot-web.target" ]; then | ||||
|     echo "Updating web-only deployment" | ||||
|     cp /home/chatwoot/chatwoot/deployment/chatwoot-web.1.service /etc/systemd/system/chatwoot-web.1.service | ||||
|     cp /home/chatwoot/chatwoot/deployment/chatwoot-web.target /etc/systemd/system/chatwoot-web.target | ||||
|   elif [ -f "/etc/systemd/system/chatwoot-worker.target" ]; then | ||||
|     echo "Updating worker-only deployment" | ||||
|     cp /home/chatwoot/chatwoot/deployment/chatwoot-worker.1.service /etc/systemd/system/chatwoot-worker.1.service | ||||
|     cp /home/chatwoot/chatwoot/deployment/chatwoot-worker.target /etc/systemd/system/chatwoot-worker.target | ||||
|   else | ||||
|     echo "Updating full deployment" | ||||
|     cp /home/chatwoot/chatwoot/deployment/chatwoot-web.1.service /etc/systemd/system/chatwoot-web.1.service | ||||
|     cp /home/chatwoot/chatwoot/deployment/chatwoot-worker.1.service /etc/systemd/system/chatwoot-worker.1.service | ||||
|     cp /home/chatwoot/chatwoot/deployment/chatwoot.target /etc/systemd/system/chatwoot.target | ||||
|   fi | ||||
|  | ||||
|   cp /home/chatwoot/chatwoot/deployment/chatwoot /etc/sudoers.d/chatwoot | ||||
|   # TODO:(@vn) handle cwctl updates | ||||
|  | ||||
|   systemctl daemon-reload | ||||
|  | ||||
|   # Restart the chatwoot server | ||||
|   # Restart the appropriate chatwoot target | ||||
|   if [ -f "/etc/systemd/system/chatwoot-web.target" ]; then | ||||
|     systemctl restart chatwoot-web.target | ||||
|   elif [ -f "/etc/systemd/system/chatwoot-worker.target" ]; then | ||||
|     systemctl restart chatwoot-worker.target | ||||
|   else | ||||
|     systemctl restart chatwoot.target | ||||
|   fi | ||||
|  | ||||
| } | ||||
|  | ||||
| @@ -903,8 +1060,40 @@ EOF | ||||
| #   None | ||||
| ############################################################################## | ||||
| function restart() { | ||||
|   if [ -f "/etc/systemd/system/chatwoot-web.target" ]; then | ||||
|     systemctl restart chatwoot-web.target | ||||
|     systemctl status chatwoot-web.target | ||||
|   elif [ -f "/etc/systemd/system/chatwoot-worker.target" ]; then | ||||
|     systemctl restart chatwoot-worker.target | ||||
|     systemctl status chatwoot-worker.target | ||||
|   else | ||||
|     systemctl restart chatwoot.target | ||||
|     systemctl status chatwoot.target | ||||
|   fi | ||||
| } | ||||
|  | ||||
| ############################################################################## | ||||
| # Convert existing Chatwoot deployment to different type (--convert) | ||||
| # Globals: | ||||
| #   DEPLOYMENT_TYPE | ||||
| # Arguments: | ||||
| #   None | ||||
| # Outputs: | ||||
| #   None | ||||
| ############################################################################## | ||||
| function convert_deployment() { | ||||
|   echo "Converting Chatwoot deployment to: $DEPLOYMENT_TYPE" | ||||
|    | ||||
|   # Check if Chatwoot is installed | ||||
|   if [ ! -d "/home/chatwoot/chatwoot" ]; then | ||||
|     echo "Chatwoot installation not found. Use --install first." | ||||
|     exit 1 | ||||
|   fi | ||||
|    | ||||
|   # Run the systemd service configuration which handles conversion logic | ||||
|   configure_systemd_services | ||||
|    | ||||
|   echo "Deployment converted successfully to: $DEPLOYMENT_TYPE" | ||||
| } | ||||
|  | ||||
| ############################################################################## | ||||
| @@ -1107,7 +1296,7 @@ function main() { | ||||
|     ssl | ||||
|   fi | ||||
|  | ||||
|   if [ "$u" == "y" ]; then | ||||
|   if [ "$u" == "y" ] || [ "$U" == "y" ]; then | ||||
|     report_event "cwctl" "upgrade"  > /dev/null 2>&1 | ||||
|     upgrade | ||||
|   fi | ||||
| @@ -1122,6 +1311,11 @@ function main() { | ||||
|     version | ||||
|   fi | ||||
|  | ||||
|   if [ "$C" == "y" ]; then | ||||
|     report_event "cwctl" "convert"  > /dev/null 2>&1 | ||||
|     convert_deployment | ||||
|   fi | ||||
|  | ||||
| } | ||||
|  | ||||
| main "$@" | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Vishnu Narayanan
					Vishnu Narayanan