From 85348fde743a887efe7a560a557d92f3e04845a3 Mon Sep 17 00:00:00 2001 From: codeEmpress1 Date: Mon, 30 Oct 2023 21:01:25 +0300 Subject: [PATCH] add app deployment guides (#6720) * add app deployment guides * add deploy app link to deployment index page * fix route not showing on side menu --------- Co-authored-by: Carrie Warner (Mattermost) <74422101+cwarnermm@users.noreply.github.com> --- source/guides/configure-app-framework.rst | 10 ++ source/guides/deploy-aws.rst | 157 ++++++++++++++++++++++ source/guides/deploy-http.rst | 8 ++ source/guides/deploy-mattermost-apps.rst | 39 ++++++ source/guides/deploy-mm-aws.png | Bin 0 -> 66932 bytes source/guides/deploy-openfaas.rst | 56 ++++++++ source/guides/deploy-third-party-aws.png | Bin 0 -> 41800 bytes source/guides/deployment.rst | 32 ++--- source/guides/package-aws.rst | 65 +++++++++ 9 files changed, 352 insertions(+), 15 deletions(-) create mode 100644 source/guides/configure-app-framework.rst create mode 100644 source/guides/deploy-aws.rst create mode 100644 source/guides/deploy-http.rst create mode 100644 source/guides/deploy-mattermost-apps.rst create mode 100644 source/guides/deploy-mm-aws.png create mode 100644 source/guides/deploy-openfaas.rst create mode 100644 source/guides/deploy-third-party-aws.png create mode 100644 source/guides/package-aws.rst diff --git a/source/guides/configure-app-framework.rst b/source/guides/configure-app-framework.rst new file mode 100644 index 00000000000..a7c9b3c5f50 --- /dev/null +++ b/source/guides/configure-app-framework.rst @@ -0,0 +1,10 @@ +Configure the Apps Framework +============================ + +The Apps framework includes a built-in slash command, ``/apps settings``, that allows for the configuration of system-wide settings. + +Configuration settings +~~~~~~~~~~~~~~~~~~~~~~~ + +- **Enable Developers Mode**: Enable debugging feature for the Apps Plugin. Disabled by default. +- **Enable HTTP apps**: Allow HTTP apps to be installed. Disabled by default on Cloud servers. diff --git a/source/guides/deploy-aws.rst b/source/guides/deploy-aws.rst new file mode 100644 index 00000000000..33fe3882fd7 --- /dev/null +++ b/source/guides/deploy-aws.rst @@ -0,0 +1,157 @@ +Deploy Apps to AWS +================== + +Deployment in self-managed environments +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +An App designed and bundled for AWS Lambda can be deployed to the customer's own +AWS environment, and then installed on a self-managed ("on-prem") Mattermost +instance. Note that the only AWS-hosted apps available on Mattermost Cloud instances are the ones by Mattermost. + +For details on how to develop and package apps for AWS see `Package / AWS `_. + +There are three steps required to enable AWS applications on a self-managed Mattermost instance. + +1. Initialize the AWS environment +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Set up AWS S3 bucket +^^^^^^^^^^^^^^^^^^^^ + +You will need to create an S3 bucket within AWS or use an existing bucket. + +1. Visit https://s3.console.aws.amazon.com +2. Create a bucket. +3. **Bucket name**: Give your bucket a name, later used in ``MM_APPS_S3_BUCKET`` environment variable. +4. **AWS Region**: + a. Select your region + b. Save the slug value for later, to be used in ``MM_APPS_AWS_REGION`` environment variable (Example: ``us-east-1``) + - Corresponding Lambdas will be deployed in the same region +5. **Block Public Access settings for this bucket** + a. (Optional) Check **Block *all* public access** +6. Select **Create Bucket**. + +Create a privileged IAM user access key and secret +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +You will need an access key and secret so that ``appsctl`` can deploy the app. These credentials can come from creating an IAM user, using a privileged IAM user, or even using the AWS account owners personal access key. Please follow the instructions provided by AWS (https://aws.amazon.com/premiumsupport/knowledge-center/create-access-key/) to complete these steps and save the ``Access key ID`` and ``Secret access key`` values. + +Set AWS_DEPLOY environment variables +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Open a terminal where you installed the Apps plugin and set the following variables to the AWS credentials just created and saved: + +- ``MM_APPS_DEPLOY_AWS_ACCESS_KEY`` +- ``MM_APPS_DEPLOY_AWS_SECRET_KEY`` + +Set the following environment variables based on bucket name and region from Step 1: + +- ``MM_APPS_S3_BUCKET`` +- ``MM_APPS_AWS_REGION`` + +Initialize the AWS resources +^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +The following command will create Mattermost invocation credentials and policy for use with AWS. + +``go run ./cmd/appsctl aws init [flags...]`` + +It will create or update: + +- An IAM user that will be used by the server to invoke the app (``mattermost-apps-invoke``). +- An IAM group that the user belongs to, that will be used by the server to invoke the app (``mattermost-apps-invoke-group``). +- An IAM policy used to control access to the Lambda and S3 resources, used by the invoke group (``mattermost-apps-invoke-policy``). +- An IAM role used to execute app's functions (``mattermost-apps-execute-lambda-role``) with the ``AWSLambdaBasicExecutionRole`` attached to it. + +Optional Flags for the ``appsctl`` command: + +- ``--create-access-key`` create a new access key and print it out. +- ``--create`` create resources that don't yet exist (user, group, role, access policy). +- ``--group`` name the group to invoke function(s), default ``mattermost-apps-invoke-group``. +- ``--policy`` name the policy used to invoke function(s), default ``mattermost-apps-invoke-policy``. +- ``--user`` name the user to invoke the lambda function(s), default ``mattermost-apps-invoke``. + +The output of the command will contain two "Invoke" environment variables. + +2. Enable AWS Upstream for Mattermost Apps +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +To enable AWS Apps installation and use, the Mattermost server must be (re-)started with the following environment variables: + +- ``MM_APPS_AWS_ACCESS_KEY`` An AWS Access Key ID for ``mattermost-apps-invoke`` user. If ``appsctl aws init --create-access-key`` was used, it can be found (once!) in the command's output. +- ``MM_APPS_AWS_SECRET_KEY`` The Secret Key for the access key above. +- ``MM_APPS_AWS_REGION`` The AWS region to use. +- ``MM_APPS_S3_BUCKET`` The name of the AWS bucket for static assets and manifests. + +Restart the Mattermost server to complete your Mattermost and AWS setup. You can now deploy an app to AWS. + +3. Deploy apps to AWS +~~~~~~~~~~~~~~~~~~~~~ + +Deploy an app to AWS +^^^^^^^^^^^^^^^^^^^^ + +To deploy AWS Apps from a bundle use ``appsctl aws deploy {aws-bundle.zip}`` command. It will deploy all necessary resources to AWS, update the invoke policy as needed, and "list" (upload the manifest of) the app in Mattermost server. ``--install`` can be used to automatically install the app once it's deployed. + +Flags: + +- ``--execute-role`` name of the role to use for executing the lambda function, default ``mattermost-apps-execute-lambda-role`` +- ``--install`` install the app onto the Mattermost server once it's been successfully deployed. +- ``--policy`` name of the policy to use to invoke the lambda function, default ``mattermost-apps-invoke-policy``. +- ``--update`` update the lambda function that already exists. + +The command requires that the following environment variables are set: + +- ``MM_SERVICESETTINGS_SITEURL`` must be set to where the Mattermost server APIs can be accessed. +- ``MM_ADMIN_TOKEN`` must be set to access the Mattermost REST APIs. +- ``MM_APPS_AWS_REGION`` must be set to the AWS region where the resources are deployed and accessed. +- ``MM_APPS_S3_BUCKET`` must be the name of the S3 bucket used to store manifests and static assets. +- ``MM_APPS_DEPLOY_AWS_ACCESS_KEY``, ``MM_APPS_DEPLOY_AWS_SECRET_KEY`` are the priviledged credentials used to deploy functions and files to AWS. +- ``MM_APPS_AWS_ACCESS_KEY``, ``MM_APPS_AWS_SECRET_KEY`` are the "unprivileged" credentials used to invoke the functions, used only for the ``appsctl aws test`` command. + +Once deployed, apps can be installed interactively in Mattermost using ``/apps install listed`` command which will show all the deployed apps available for installation in Mattermost. + +Deployed app details +~~~~~~~~~~~~~~~~~~~~ + +AWS Lambda Functions Naming +---------------------------- + +AWS Lambda functions have semantic names, meaning that a function described in the ``manifest.json`` file translates to AWS as ``$appID_$appVersion_$functionName`` to avoid collisions with other apps' or other versions' functions. **appsctl** deploys lambda functions using this naming convention. For example, the name of a ``servicenow`` app's lambda function might be ``com-mattermost-servicenow_0-1-0_go-function``. **appsctl** handles the naming of AWS Lambda functions. The dedicated S3 bucket name is stored in the environment variable: ``MM_APPS_S3_BUCKET``. + +Storage of App Assets and Manifests +------------------------------------ + +The AWS S3 bucket mentioned above is used to store all app static assets and manifest files. + +All files in the static folder of the bundle are considered to be the app's static assets and are stored in the above-mentioned bucket. Stored assets also have semantic keys and are generated using the rule: ``static/$appID_$appVersion/filename``. For example, the ``servicenow`` app's static file key can be accessed at ``"static/com.mattermost.servicenow_0.1.0_app/photo.png"``. + +Storage of Manifest File +------------------------ + +The ``manifest.json`` file of an app is stored in the same S3 bucket with the key: ``manifests/$appID_$appVersion.json``. + +Flow of Deploying Custom Apps to AWS +------------------------------------- + +.. image:: deploy-third-party-aws.png + :width: 800 + +Deployment in Mattermost Cloud +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In order to be deployed in Mattermost Cloud, an app bundle is uploaded to the specific S3 bucket. On a new app release, a bundle is created by GitLab CI and uploaded to S3. The |Mattermost apps cloud deployer|, running as a k8s cron job every hour, detects the S3 upload, and creates appropriate lambda functions, assets, and manifest the same way the **appsclt** does for the third-party accounts. + +The deployer needs lambda function names, asset keys, and the manifest key to deploy the app. It calls the ``aws.GetProvisionDataFromFile(/PATH/TO/THE/APP/BUNDLE)`` from the Apps Plugin to get the deploy data. Same data can be generated using the command: + +``appsctl generate-terraform-data /PATH/TO/YOUR/APP/BUNDLE`` + +Flow of deploying custom apps to AWS +------------------------------------- + +.. image:: deploy-mm-aws.png + :width: 800 + +.. |Mattermost apps cloud deployer| raw:: html + + Mattermost apps cloud deployer \ No newline at end of file diff --git a/source/guides/deploy-http.rst b/source/guides/deploy-http.rst new file mode 100644 index 00000000000..adbecdb699a --- /dev/null +++ b/source/guides/deploy-http.rst @@ -0,0 +1,8 @@ +Deploy HTTP Apps +================ + +External service providers can offer "remote" apps already deployed as HTTP services. + +Internal organization-specific apps can also be developed and run as HTTP services on the existing hosting infrastructure, for example, using ``systemd``. It's important that your internal apps are only reachable by the Mattermost server, and not from the public internet. + +To install an HTTP app, use the ``/apps install http {URL-to-manifest.json}`` command in Mattermost. diff --git a/source/guides/deploy-mattermost-apps.rst b/source/guides/deploy-mattermost-apps.rst new file mode 100644 index 00000000000..b34d3327dbb --- /dev/null +++ b/source/guides/deploy-mattermost-apps.rst @@ -0,0 +1,39 @@ +App deployment +============== + +.. toctree:: + :maxdepth: 1 + :hidden: + :titlesonly: + + Settings + HTTP + AWS + Package Apps for AWS + OpenFaaS + +- In **Mattermost Cloud**, all apps are deployed to the Marketplace by Mattermost staff. They can be installed onto a specific Mattermost instance using the ``/apps install listed`` command. No special configuration is required; the ``/apps install`` command should be enabled and functional by default. + +- **Self-managed Mattermost** installations can use external Apps as HTTP services that have already been deployed, or can deploy App bundles on self-managed hosting or serverless platforms. Currently, `AWS Lambda `_, `OpenFaaS `_, and Kubeless deployments are supported. The `appsctl` command can be used to deploy app bundles to these environments. + + Self-managed customers can also install external `HTTP `_ apps, with no need to deploy them. + + The ``appsctl`` CLI tool is provided to deploy AWS and OpenFaaS apps in self-managed environments. To install ``appsctl``, use the following command: + + .. code-block:: shell + + go install github.com/mattermost/mattermost-plugin-apps/cmd/appsctl@latest + +.. note:: + + If you have a self-hosted Mattermost instance running on AWS EC2, the default Golang version is 1.13.8. + +Because of this, the Golang install command will give an error stating: + +.. code-block:: shell + + can't load package: package github.com/mattermost/mattermost-plugin-apps/cmd/appsctl@latest: cannot use path@version syntax in GOPATH mode + +To fix this, update your Golang version to the latest release and run the command again. When deploying to AWS, the ``appsctl`` binary is present in the ``Home`` directory inside the ``go/bin`` folder. + +To use ``appsctl``, run the following command: ``./go/bin/appsctl`` diff --git a/source/guides/deploy-mm-aws.png b/source/guides/deploy-mm-aws.png new file mode 100644 index 0000000000000000000000000000000000000000..a07aaafa004650e222d4e856811ec5274d0280a0 GIT binary patch literal 66932 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 literal 0 HcmV?d00001 diff --git a/source/guides/deploy-openfaas.rst b/source/guides/deploy-openfaas.rst new file mode 100644 index 00000000000..0c101ef3ac9 --- /dev/null +++ b/source/guides/deploy-openfaas.rst @@ -0,0 +1,56 @@ +Deploy Apps to OpenFaas and faasd +================================= + +OpenFaaS Apps +------------- + +What is OpenFaaS? +~~~~~~~~~~~~~~~~~ + +OpenFaaS makes it relatively simple to deploy both serverless functions and existing code in stateless containers on Kubernetes or directly on Linux hosts, on any public or private cloud. Learn more at |OpenFaas.com|. + +Package an App for OpenFaaS +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +For details on how to develop and package apps for AWS, see |serverless example|. + +Deploy with ``appsctl`` +~~~~~~~~~~~~~~~~~~~~~~~~ + +An App designed and bundled for OpenFaaS can be deployed to the customer's own OpenFaaS or faasd environments, and then installed on a self-managed ("on-prem") Mattermost server, using the ``appsctl openfaas deploy`` command. + +This command requires that |faas-cli| is installed and configured, with credentials sufficiently privileged to deploy functions. + +OpenFaaS requires a |docker registry| to pass the images that it builds to the function instances, so ``docker`` must have been configured, and ``docker login`` done, with sufficient credentials to push to the registry of choice. + +To deploy OpenFaaS Apps use ``appsctl openfaas deploy {openfaas-bundle.zip}`` command. It will deploy all functions in the bundle, and "list" (upload the manifest of) the app in Mattermost server. ``--install`` can be used to automatically install the app once it's deployed. + +**Flags:** + +- ``--docker-registry``: the docker registry name (will be used as a prefix for the image name) to push the function images to. +- ``--install``: install the app onto the Mattermost server once it's been successfully deployed. +- ``--update``: update the function that already exists. + +The command requires that the following environment variables are set: + +- ``MM_SERVICESETTINGS_SITEURL``: must be set to where the Mattermost server APIs can be accessed. +- ``MM_ADMIN_TOKEN``: must be set to access the Mattermost REST APIs. +- ``OPENFAAS_URL``: must be set to the admin (root) URL of the OpenFaaS installation. + +Once deployed, apps can be installed interactively in Mattermost using ``/apps install listed`` command. + +.. |OpenFaas.com| raw:: html + + OpenFaas.com + +.. |serverless example| raw:: html + + serverless example + +.. |faas-cli| raw:: html + + faas-cli + +.. |docker registry| raw:: html + + docker registry \ No newline at end of file diff --git a/source/guides/deploy-third-party-aws.png b/source/guides/deploy-third-party-aws.png new file mode 100644 index 0000000000000000000000000000000000000000..e4d1a30fd71653c801ea0bd7fa246c4764c20905 GIT binary patch literal 41800 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
psW5T~SbFA0 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 O00f?{elF{r5}E)#@1;-x literal 0 HcmV?d00001 diff --git a/source/guides/deployment.rst b/source/guides/deployment.rst index 1162717dbb2..f7ff4d96314 100644 --- a/source/guides/deployment.rst +++ b/source/guides/deployment.rst @@ -11,20 +11,21 @@ Learn how to install, deploy, and scale Mattermost for teams and organizations o :hidden: :titlesonly: - Prepare your Mattermost database - Deploy on Ubuntu - Deploy using Docker - Deploy with a tarball - Deploy using Omnibus - Deploy using Kubernetes - Deploy on Red Hat - Prepare for your Mattermost deployment - Deployment guides - Upgrade Mattermost - Scale Mattermost - Deployment troubleshooting - Changelogs - Additional server installation guides + Prepare your Mattermost database + Deploy on Ubuntu + Deploy using Docker + Deploy with a tarball + Deploy using Omnibus + Deploy using Kubernetes + Deploy on Red Hat + Prepare for your Mattermost deployment + Deployment guides + Deploy Mattermost Apps + Upgrade Mattermost + Scale Mattermost + Deployment troubleshooting + Changelogs + Additional server installation guides .. tip:: @@ -39,7 +40,8 @@ Learn how to install, deploy, and scale Mattermost for teams and organizations o * :doc:`Deploy using Omnibus ` - An entire Mattermost installation on a single server. * :doc:`Deploy using Kubernetes ` - Install using the Mattermost Helm Chart or Operator and simplified updates. * :doc:`Deploy on Red Hat ` - Support for all current Red Hat Enterprise Linux platforms with a tarball. -* :doc:`Deployment guides ` - for administrators who are ready to integrate Mattermost with their organization’s IT infrastructure. +* :doc:`Deployment guides ` - for administrators who are ready to integrate Mattermost with their organization’s IT infrastructure. +* :doc:`Deploy Mattermost Apps ` - Learn how to deploy Mattermost Apps to your server. * :doc:`Prepare for your Mattermost deployment ` - Review software and hardware requirements for Mattermost server, and plan out your Mattermost rollout. * :doc:`Upgrade Mattermost ` - Learn how to stay up to date with the latest features and improvements. * :doc:`Scale Mattermost ` - Learn how to scale and monitor your Mattermost deployment. diff --git a/source/guides/package-aws.rst b/source/guides/package-aws.rst new file mode 100644 index 00000000000..adcfacbeb1d --- /dev/null +++ b/source/guides/package-aws.rst @@ -0,0 +1,65 @@ +Package Apps for AWS Lambda +=========================== + +Developers must prepare apps for deployment to AWS, which includes creating an app bundle and making the app runnable as an AWS Lambda function. + +App Bundle +^^^^^^^^^^ + +An app bundle is a convenient way to deliver an app to the Mattermost ecosystem. It provides a way to organize code and resources needed for an app to run. An app bundle is created by the developer of the app. Mattermost uses app bundles to deploy and install/uninstall apps. + +The app bundle contains a ``manifest.json`` file, a ``static/`` folder (optional), and one or several lambda function bundles. + +- The ``static/`` folder contains all the static files the app needs. For the Mattermost AWS apps, static files are automatically deployed and stored in the dedicated AWS S3 bucket. Apps have unlimited access to them by providing the static file name to the Apps Plugin. For the third-party hosted AWS apps, static files are stored in a different S3 bucket (specified by the third-party). For the HTTP apps, when creating a server, the developer should store the static files in the ``/static/$FILE_NAME`` relative URL. +- The ``manifest.json`` file contains details about the app such as appID, appVersion, appType (HTTP or an AWS app), requested permissions, requested locations, and information about the functions such as function path, name, runtime, and handler. +- Each of the lambda function bundles is a valid and runnable AWS Lambda function, deployed in AWS by the |Mattermost Apps Cloud Deployer|. The AWS Lambda function bundle is a ``.zip`` file which contains scripts or compiled programs and their dependencies. Note that it must be smaller than 50 MB. Exact specification of the bundle varies for different runtimes. For example, one can see more details for ``node.js`` bundles |bundles here|. +Making your app runnable as an AWS Lambda function +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In order for your app to run as an AWS Lambda function, it must use one of the supported languages for AWS Lambda. You can find the list |list here|. + +It's important to design an app in a _stateless_ way, as its lifetime only spans one request. No persistent information should be stored except using the |store API endpoints| provided by the Apps Framework. + +A language library is used to emulate an HTTP to your app. For Go, you might use |aws-lambda-go-api-proxy|. + +Finally, you need to define the AWS function in the manifest of your app by adding ``aws_lambda`` to it, which has the following fields: + +- ``path``: The lambda function with its path being the longest-matching prefix of the call's path which will be invoked for a call. +- ``name``: A human-readable name. +- ``handler``: The name of the handler function. +- ``runtime``: The AWS Lambda runtime to use. + +For a Go app, the manifest snippet would look like this: + +.. code-block:: json + + { + "aws_lambda": [ + { + "path": "/", + "name": "go-function", + "handler": "$YOUR_APP_NAME", + "runtime": "go1.x" + } + ] + } + +.. |Mattermost Apps Cloud Deployer| raw:: html + + Mattermost Apps Cloud Deployer + +.. |bundles here| raw:: html + + here + +.. |list here| raw:: html + + here + +.. |store API endpoints| raw:: html + + store API endpoints + +.. |aws-lambda-go-api-proxy| raw:: html + + aws-lambda-go-api-proxy \ No newline at end of file