Bot Framework without Azure possible?

AzureBotsBotframework

Azure Problem Overview


If i'm building a bot with the Microsoft Bot Framework, do i need to deploy my bot to Azure in order to register my bot HERE in order to configure the channels for the bot? Or can i simply deploy my bot to a normal (for example) IIS Server?

I couldnt find any information on this toppic and i dont want to use Azure.

Azure Solutions


Solution 1 - Azure

Yes, it should be possible to run your bot on IIS or in any other hosting service (including cloud hostings besides Azure) as explained here. You will have to make sure that your bot has an internet-accessible endpoint and a valid HTTPS cert.

Regarding the requirements for the HTTPS cert, I'm copying the info for this thread for your reference:

> The Bot Framework requires that the x.509v3 certificate exposed by > your endpoint be current and valid. Most of the checks for "current > and valid" are standard checks for server certs: the CN must match the > hostname, it must not be expired, it must not be listed in a CRL, it > must have the correct set of EKUs, etc. > > Most importantly, your cert must chain to a root certificate authority > trusted by Microsoft. The latest list of these CAs is available here.

Also, you can register your bot and even enable the channels without deploying to Azure or any other hosting. You can temporarily use ngrok to create a secure tunnel to your localhost environment and test the bot in your email channel before exposing it to other users. BTW, you don't need to Publish your bot in the BotFramework portal, just register it. Publishing is just for those bots that would like to appear in the Bot Directory.

Solution 2 - Azure

You need an account at Azure, but you don't need to host your bot directly at Azure. There are three options when you login to Azure dashboard: Web App Bot, Functions Bot and the Bot Channels Registration. Choose the Bot Channels Registration and type your bot's https URL (where you deployed it) there in settings.

Or if you want to debug your bot directly from the messenger (not emulator) you can download ngrok, then type in command line

ngrok.exe http <your port> -host-header="localhost:<your port>

then enter the ngrok proxy URL (without port) to Bot Channels Registration settings. Within several hours that temporary address will forward to your localhost.

Solution 3 - Azure

Yes the developing a bot is totally possible without using Azure Cloud portal.

  • You just need bot builder SDK for node.js or C#.
  • A code editor like VSCode
  • Testing on the bot emulator provided by Microsoft

But for publishing the bot on channels or web apps you will have to register the Bot with Azure bot service. Check more here: https://thewebspark.com/2018/04/15/is-microsoft-bot-framework-without-azure-possible/

Solution 4 - Azure

Yes your bot is like an API that is consumed by a chat frontend like Facebook Messenger, Skype etc. Check out this medium blog explaining how to host on Heroku https://medium.com/@chinnatiptaemkaeo/create-fb-bot-with-heroku-nodejs-microsoft-bot-framework-687bd2893238

Solution 5 - Azure

It is totally possible.

I ran it 2 ways. 1st - restify service in a docker container - run locally with and ngrok and on AWS

// Create HTTP server.
const server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3978, () => {
    console.log(`\n${server.name} listening to ${server.url}`);
});

async function main(req: WebRequest, context: TurnContext) {
    logger.json("Request ->", req.body);
    try {
        for (const bot of allBots) {
            await bot.run(context);
        }
    } catch (error) {
        logger.error("Error processing request[server.ts]");
        logger.error(error);
    }
}
// Listen for incoming requests.
server.post("/api/messages", (req: WebRequest, res: WebResponse) => {
    adapter.processActivity(req, res, async (context: TurnContext) => {
        await main(req, context);
    });
});

2nd - run on AWS Lambda with Serverless framework. Here is the adapter.

export function lambda(bots: ActivityHandler[]) {
    const handler: Handler = async (event: any, _: Context, callback: Callback) => {
        logger.json("Event to bot framework: ", event);
        const reqWrapper: WebRequest = {
            body: event.body,
            headers: event.headers,
            method: event.method,
            query: event.query,
            on: (_1: string, ..._2: any[]): any => {
                // it needs to be empty
            },
        };
        let statusCode: number;
        const resWrapper: WebResponse = {
            status: (code: number) => {
                statusCode = code;
            },
            send: (body) => {
                callback(null, {statusCode, body});
            },
            end: () => {
                callback(null, { statusCode });
            },
        };

        const adapter = await getAdapter();

        adapter.processActivity(reqWrapper, resWrapper, async (context: TurnContext) => {
            await main(context, bots);
        });
    };
    return handler;
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionReaperView Question on Stackoverflow
Solution 1 - AzureEzequiel JadibView Answer on Stackoverflow
Solution 2 - AzureLiam KernighanView Answer on Stackoverflow
Solution 3 - AzureSarthak SrivastavaView Answer on Stackoverflow
Solution 4 - AzurekmakView Answer on Stackoverflow
Solution 5 - AzureLeoView Answer on Stackoverflow