Deploying bots in production
Usually, work on a bot starts on a laptop.  At some point, you'll want
to deploy your bot in a production environment, so that it'll stay up
regardless of what's happening with your laptop.  There are several
options for doing so:
- The simplest is running zulip-run-botinside ascreensession on
  a server.  This works, but if your server reboots, you'll need to
  manually restart it, so we don't recommend it.
- Using supervisordor a similar tool for managing a production
  process withzulip-run-bot.  This consumes a bit of resources
  (since you need a persistent process running), but otherwise works
  great.
- Using the Zulip Botserver, which is a simple Flask server for
  running a bot in production, and connecting that to Zulip's outgoing
  webhooks feature.  This can be deployed in environments like
  Heroku's free tier without running a persistent process.
Zulip Botserver
The Zulip Botserver is for people who want to
- run bots in production.
- run multiple bots at once.
The Zulip Botserver is a Python (Flask) server that implements Zulip's
outgoing webhooks API.  You can of course write your own servers using
the outgoing webhooks API, but the Botserver is designed to make it
easy for a novice Python programmer to write a new bot and deploy it
in production.
How Botserver works
Zulip Botserver starts a web server that listens to incoming messages
from your main Zulip server. The sequence of events in a successful
Botserver interaction are:
- 
Your bot user is mentioned or receives a direct message: @**My Bot User** hello world 
- 
The Zulip server sends a POST request to your Botserver endpoint URL: {
  "message":{
    "content":"@**My Bot User** hello world",
  },
  "bot_email":"myuserbot-bot@example.com",
  "trigger":"mention",
  "token":"XXXX"
}
This URL is configured in the Zulip web-app in your Bot User's settings. 
- 
The Botserver searches for a bot to handle the message, and executes your
   bot's handle_messagecode.
 
Your bot's code should work just like it does with zulip-run-bot.
Installing the Zulip Botserver
Install the zulip_botserver package:
pip3 install zulip_botserver
Create a bot in your Zulip organization
- Instructions for all platforms
- 
Navigate to the Bots tab of the Personal settings menu, and click
   Add a new bot. 
- 
Set the Bot type to Outgoing webhook. 
- 
Set the endpoint URL to https://<host>:<port>wherehostis the
   hostname of the server you'll be running the Botserver on, andportis
   the port number. The default port is5002.
 
- 
Click Create bot. You should see the new bot user in the
   Active bots panel. 
 
 
 
Running a bot using the Zulip Botserver
- Instructions for all platforms
- 
Create your bot in your Zulip
   organization. 
- 
Download the zuliprcfile for the bot created above from the
   Bots tab of the Personal settings menu, by clicking the download
   () icon under the bot's name.
 
- 
Run the Botserver, where helloworldis the name of the bot you
   want to run:
 zulip-botserver --config-file <path_to_zuliprc> --bot-name=helloworld 
You can specify the port number and various other options; run
zulip-botserver --helpto see how to do this.
 
 
 
 
Congrats, everything is set up! Test your Botserver like you would
test a normal bot.
Running multiple bots using the Zulip Botserver
The Zulip Botserver also supports running multiple bots from a single
Botserver process.
- Instructions for all platforms
- 
Create your bots
   in your Zulip organization. 
- 
Download the botserverrcfile from the Bots tab of the
   Personal settings menu, using the Download config of all active
   outgoing webhook bots in Zulip Botserver format option.
 
- 
Open the botserverrc. It should contain one or more sections that look
   like this:
 [helloworld]
email=foo-bot@hostname
key=dOHHlyqgpt5g0tVuVl6NHxDLlc9eFRX4
site=http://hostname
token=aQVQmSd6j6IHphJ9m1jhgHdbnhl5ZcsY
bot-config-file=~/path/to/helloworld.conf 
Each section contains the configuration for an outgoing webhook bot. 
- 
For each bot, enter the name of the bot you want to run in the square
   brackets [], e.g., the above example applies to thehelloworldbot.
   To run an external bot, enter the path to the bot's python file instead,
   e.g.,[~/Documents/my_bot_script.py].
 
The bot-config-filesetting is needed only for bots that
use a config file.
 
 
- 
Run the Zulip Botserver by passing the botserverrcto it.
 zulip-botserver --config-file <path-to-botserverrc> --hostname <address> --port <port> 
If omitted, hostnamedefaults to127.0.0.1andportto5002.
 
 
 
 
Running Zulip Botserver with supervisord
supervisord is a popular tool for running
services in production.  It helps ensure the service starts on boot,
manages log files, restarts the service if it crashes, etc.  This
section documents how to run the Zulip Botserver using supervisord.
Running the Zulip Botserver with supervisord works almost like
running it manually.
- Instructions for all platforms
- 
Install supervisord via your package manager; e.g., on Debian/Ubuntu: sudo apt-get install supervisor 
- 
Configure supervisord.  supervisord stores its configuration in
    /etc/supervisor/conf.d.
 
- 
Update supervisord to read the configuration file: supervisorctl reread
supervisorctl update 
(or you can use /etc/init.d/supervisord restart, but this is less
disruptive if you're using supervisord for other services as well).
 
- 
Test if your setup is successful: The output should include a line similar to this: 
zulip-botserver                 RUNNING   pid 28154, uptime 0:00:27 
 The standard output of the Botserver will be logged to the path in
your supervisord configuration. 
 
 
 
If you are hosting the Botserver yourself (as opposed to using a
hosting service that provides SSL), we recommend securing your
Botserver with SSL using an nginx or Apache reverse proxy and
Certbot.
Troubleshooting
- 
Make sure the API key you're using is for an outgoing webhook
  bot and you've
  correctly configured the URL for your Botserver. 
- 
Your Botserver needs to be accessible from your Zulip server over
  HTTP(S).  Make sure any firewall allows the connection.  We
  recommend using zulip-run-bot instead for
  development/testing on a laptop or other non-server system.
  If your Zulip server is self-hosted, you can test by running curl
  http://zulipbotserver.example.com:5002from your Zulip server;
  the output should be:
 $ curl http://zulipbotserver.example.com:5002/
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>405 Method Not Allowed</title>
<h1>Method Not Allowed</h1>
<p>The method is not allowed for the requested URL.</p> 
Related articles