diff --git a/templates/zerver/help/import-from-slack.md b/templates/zerver/help/import-from-slack.md index 875f12bd64..43d2d0870f 100644 --- a/templates/zerver/help/import-from-slack.md +++ b/templates/zerver/help/import-from-slack.md @@ -1,149 +1,314 @@ # Import from Slack -Starting with Zulip 1.8, Zulip supports importing data from Slack, -including users, channels, messages, attachments, avatars, custom -emoji, and emoji reactions. +You can import your Slack organization into Zulip. It's a great way to preserve +your organization's history when you migrate from Slack to Zulip, and to make +the transition easy for the members of your organization. -This tool has been used to import Slack workspaces with 10,000 members -and millions of messages. If you're planning on doing an import much -larger than that, or run into performance issues when importing, -[contact us](/help/contact-support) for help. +The import will include your organization's: -**Note:** You can only import a Slack workspace as a new Zulip -organization. In particular, you cannot use this tool to import from Slack -into an existing Zulip organization. +* **Name** and **Logo** +* **Message history**, including attachments and emoji reactions +* **Users**, including names, emails, roles, avatars, time zones, and custom profile fields +* **Channels**, including all user subscriptions +* **Custom emoji** -## Import from Slack - -First, export your data from Slack. - -!!! warn "" - - **Note:** Only Slack owners and admins can export data from Slack. - See Slack's - [guide to data exports](https://get.slack.help/hc/en-us/articles/201658943-Export-data-and-message-history) - for more information. - -#### Get a Slack API token. - -It will be a long string starting with `xoxb-`. It is required to -fetch data that Slack doesn't include in their data exports, like -email addresses. +## Import process overview +To import your Slack organization into Zulip, you will need to take the +following steps, which are described in more detail below: {start_tabs} -1. [Create a new Slack app](https://api.slack.com/apps). +1. [Export your Slack data](/help/import-from-slack#export-your-slack-data). -2. [Add OAuth scopes](https://api.slack.com/authentication/basics#scopes) - to your app. We need the following 'bot token scopes': +2. [Import you Slack data into + Zulip](/help/import-from-slack#import-your-data-into-zulip). + +3. [Clean up](/help/import-from-slack#clean-up-after-the-slack-export) after the Slack export. + +4. [Get your organization started with Zulip](/help/import-from-slack#get-your-organization-started-with-zulip)! + +{end_tabs} + +## Import your organization from Slack into Zulip + +### Export your Slack data + +Slack's [data export +service](https://slack.com/services/export) allows you to +export all public channel messages, **including older messages that may no +longer be searchable** under your Slack plan. + +Unfortunately, Slack [only +allows](https://slack.com/help/articles/201658943-Export-your-workspace-data) +workspaces that are on the **Business+** or **Enterprise Grid** plans +to export private channels and direct messages. Slack's support has +confirmed this policy as of August 2022. + +Owners of **Business+** or **Enterprise Grid** workspaces can [request +special +access](https://slack.com/help/articles/204897248-Guide-to-Slack-import-and-export-tools#options-by-plan) +in order to export private message data. + +{start_tabs} + +1. Make sure that you are an owner or admin of your Slack + workspace. If you are one, the Slack web application will display + that in your profile, in a banner covering the bottom of your + avatar. + +2. [Export your Slack message history](https://my.slack.com/services/export). + You should be able to download a `zip` file with your data a few minutes + after you start the export process. + +3. You will also need to export your workspace's user data and custom emoji. + To do so, start + by [creating a new Slack app](https://api.slack.com/apps). Choose the "From + scratch" creation option. + +4. [Create a + bot user](https://slack.com/help/articles/115005265703-Create-a-bot-for-your-workspace), + following the instructions to add the following OAuth scopes to your bot: - `emoji:read` - `users:read` - `users:read.email` - `team:read` -3. [Install the app](https://api.slack.com/authentication/basics#installing) - to your workspace. You will get an API token that you can now use to fetch - data from your Slack workspace. +5. [Install your new app](https://api.slack.com/authentication/basics#installing) + to your Slack workspace. + +6. You will immediately see a **Bot User OAuth Token**, which is a long + string of numbers and characters starting with `xoxb-`. Copy this token. You + will use it to download user and emoji data from your Slack workspace. {end_tabs} -### Export your Slack data +### Import your data into Zulip -Now, [Export your Slack data](https://my.slack.com/services/export). You will -receive a zip file `slack_data.zip`. +To start using Zulip, you will need to choose between Zulip Cloud and +self-hosting Zulip. For a simple managed solution, with no setup or maintenance +overhead, you can [sign up](/new/) for Zulip Cloud with just a few clicks. +Alternatively, you can [self-host](/self-hosting/) your Zulip organization. See +[here](/help/zulip-cloud-or-self-hosting) to learn more. +!!! warn "" -This step will also generate a different token starting with -`xoxe-`; you don't need it. + **You can only import a Slack workspace as a new Zulip organization.** Slack + workspace history cannot be added into an existing Zulip organization. -### Import into Zulip Cloud +{start_tabs} -Email support@zulip.com with `slack_data.zip`, the Slack API token -generated above, and your desired subdomain. Your imported organization will -be hosted at `.zulipchat.com`. +{tab|zulip-cloud} -If you've already created a test organization at -`.zulipchat.com`, let us know, and we can rename the old -organization first. +#### Import into a Zulip Cloud organization -### Import into a self-hosted Zulip server +If you plan to use Zulip Cloud, we'll take it from here! Please e-mail +[support@zulip.com](mailto:support@zulip.com) with the following information: -First -[install a new Zulip server](https://zulip.readthedocs.io/en/stable/production/install.html), -skipping "Step 3: Create a Zulip organization, and log in" (you'll -create your Zulip organization via the data import tool instead). +1. The subdomain you would like to use for your organization. Your Zulip chat will + be hosted at `.zulipchat.com`. -Copy the `slack_data.zip` file you obtained above onto the Zulip +2. The `zip` file containing your Slack message history export. + +3. Your Slack **Bot User OAuth Token**, which will be a long + string of numbers and characters starting with `xoxb-` + +!!! warn "" + + If the organization already exists, the import process will overwrite all data + that's already there. If needed, we're happy to preserve your data by moving an + organization you've already created to a new subdomain prior to running the import process. + +{tab|self-hosting} + +#### Import into a self-hosted Zulip server + +Zulip's Slack import tool is robust, and has been used to import Slack +workspaces with 10,000 members and millions of messages. If you're planning on +doing an import much larger than that, or run into performance issues when +importing, [contact us](/help/contact-support) for help. + +1. Follow steps + [1](https://zulip.readthedocs.io/en/stable/production/install.html#step-1-download-the-latest-release) + and + [2](https://zulip.readthedocs.io/en/stable/production/install.html#step-2-install-zulip) + of the guide for [installing a new Zulip + server](https://zulip.readthedocs.io/en/stable/production/install.html). + +1. Copy the `zip` file containing your Slack message history export onto your Zulip server, and put it in `/tmp/`. -Log in to a shell on your Zulip server as the `zulip` user. To import with -the most common configuration, run the following commands, replacing -`` with the value generated above. +1. Log in to a shell on your Zulip server as the `zulip` user. -``` -cd /home/zulip/deployments/current -./scripts/stop-server -./manage.py convert_slack_data /tmp/slack_data.zip --token --output /tmp/converted_slack_data -./manage.py import '' /tmp/converted_slack_data -./scripts/start-server -``` +1. To import into an organization hosted on the root domain +(`EXTERNAL_HOST`) of the Zulip installation, run the following commands, replacing +`` with your Slack **Bot User OAuth Token**. -This could take several minutes to run, depending on how much data -you're importing. The server stop/restart is only necessary when -importing on a server with minimal RAM, where an OOM kill might -otherwise occur. + !!! tip "" + The import could take several minutes to run, depending on how much data you're importing. -**Import options** + ``` + cd /home/zulip/deployments/current + ./scripts/stop-server + ./manage.py convert_slack_data /tmp/slack_data.zip --token --output /tmp/converted_slack_data + ./manage.py import '' /tmp/converted_slack_data + ./scripts/start-server + ``` -The commands above create an imported organization on the root domain -(`EXTERNAL_HOST`) of the Zulip installation. You can also import into a -custom subdomain, e.g. if you already have an existing organization on the -root domain. Replace the last line above with the following, after replacing -`` with the desired subdomain. + Alternatively, to import into a custom subdomain, run: -``` -./manage.py import converted_slack_data -``` + ``` + cd /home/zulip/deployments/current + ./scripts/stop-server + ./manage.py convert_slack_data /tmp/slack_data.zip --token --output /tmp/converted_slack_data + ./manage.py import /tmp/converted_slack_data + ./scripts/start-server + ``` -### Remove the Slack app used for export + !!! tip "" + The server stop/restart commands are only necessary when + importing on a server with minimal RAM, where an OOM kill might + otherwise occur. -Once the import is complete, you should delete [the Slack -app](https://api.slack.com/apps) (and thus API token) that you created -in the earlier step. This will prevent the token from being used to -access your Slack instance in the future. +1. Follow [step 4](https://zulip.readthedocs.io/en/stable/production/install.html#step-4-configure-and-use) + of the guide for [installing a new Zulip + server](https://zulip.readthedocs.io/en/stable/production/install.html). -{!import-login.md!} +{end_tabs} -## Caveats +#### Import details -- Slack doesn't export private channels or direct messages unless you pay - for Slack Plus or contact Slack support. See - [Slack's documentation](https://get.slack.help/hc/en-us/articles/204897248-Guide-to-Slack-import-and-export-tools) - for more details. +Whether you are using Zulip Cloud or self-hosting Zulip, here are few notes to keep +in mind about the import process: -- (Slack Plus import) Message edit history is currently not imported. +- Slack does not export workspace settings, so you will need to [configure + the settings for your Zulip organization](/help/customize-organization-settings). + This includes settings like [email + visibility](/help/restrict-visibility-of-email-addresses), + [message editing permissions](/help/configure-message-editing-and-deletion#configure-message-editing-and-deletion_1), + and [how users can join your organization](/help/restrict-account-creation). -- Slack doesn't export user settings or organization settings, so - you'll need to configure these manually. +- Slack does not export user settings, so users in your organization may want to + [customize their account settings](/help/getting-started-with-zulip). -- Import of [user roles](/help/roles-and-permissions): - - Slack's `Workspace Primary Owner` and `Workspace Owner` users - are mapped to Zulip `Organization owner` users. - - Slack's `Workspace Admin` users are mapped to Zulip's `Organization - administrator` users. - - Slack's `Member` users is mapped to Zulip `Member` users. - - Slack's `Single Channel Guest` and `Multi Channel Guest` users - are mapped to Zulip `Guest` users. - - Slack's `Channel creators` have no special permissions in Zulip. +- Slack's user roles are mapped to Zulip's [user + roles](/help/roles-and-permissions) in the following way: -- The "joined #channel_name" messages are not imported. +| Slack role | Zulip role | +|-------------------------|---------------| +| Workspace Primary Owner | Owner | +| Workspace Owner | Owner | +| Workspace Admin | Administrator | +| Member | Member | +| Single Channel Guest | Guest | +| Multi Channel Guest | Guest | +| Channel creator | none | -- Messages in threads are still imported, but they are not explicitly marked as - to be in a thread. +- Messages in threads are imported, but they are not explicitly marked as + being in a thread. -[upgrade-zulip-from-git]: https://zulip.readthedocs.io/en/latest/production/upgrade-or-modify.html#upgrading-from-a-git-repository +- Message edit history and `@user joined #channel_name` messages are not imported. + +## Clean up after the Slack export + +Once your organization has been successfully imported in to Zulip, you should +delete [the Slack app](https://api.slack.com/apps) that you created in order to +[export your Slack data](#export-your-slack-data). This will prevent the OAuth +token from being used to access your Slack workspace in the future. + +## Get your organization started with Zulip + +Once the import process is completed, you will need to: + +{start_tabs} + +1. [Configure the settings for your organization](/help/customize-organization-settings), + which are not exported from Slack. This includes settings like [email + visibility](/help/restrict-visibility-of-email-addresses), [message editing + permissions](/help/configure-message-editing-and-deletion#configure-message-editing-and-deletion_1), + and [how users can join your organization](/help/restrict-account-creation). + +2. All users from your Slack workspace will have accounts in your new Zulip + organization. However, you will need to decide how users will log in for the first time (see below). + +3. Share the URL for your new Zulip organization, and (recommended) the [Getting + started with Zulip guide](/help/getting-started-with-zulip). + +4. Migrate any [integrations](/integrations), which is easy to do with Zulip's + [Slack-compatible incoming webhook](/integrations/doc/slack_incoming). + +{end_tabs} + + +### Decide how users will log in + +When user accounts are imported from Slack, users initially do not have passwords +configured. There are a few options for how users can log in for the first time. + +!!! tip "" + For security reasons, Slack passwords are never exported. + +### Allow users to log in with non-password authentication + +When you create your organization, users will immediately be able to log in with +[authentication methods](/help/configure-authentication-methods) that do not +require a password. Zulip offers a variety of authentication methods, including +Google, GitHub, GitLab, Apple, LDAP and [SAML](/help/saml-authentication). + +### Send password reset emails to all users + +You can send password reset emails to all users in your organization, which +will allow them to set an initial password. + +If you imported your organization into Zulip Cloud, simply e-mail +[support@zulip.com](mailto:support@zulip.com) to request this. + +#### Send password reset emails (self-hosted organization) + +{start_tabs} + +{tab|default-subdomain} + +1. To test the process, start by sending yourself a password reset email by + using the following command: + + ``` + ./manage.py send_password_reset_email -u username@example.com + ``` + +1. When ready, send password reset emails to all users by + using the following command: + + ``` + ./manage.py send_password_reset_email -r '' --all-users + ``` + +{tab|custom-subdomain} + +1. To test the process, start by sending yourself a password reset email by + using the following command: + + ``` + ./manage.py send_password_reset_email -u username@example.com + ``` + +1. When ready, send password reset emails to all users by + using the following command: + + ``` + ./manage.py send_password_reset_email -r --all-users + ``` + +{end_tabs} + +### Manual password resets + +Alternatively, users can reset their own passwords by following the instructions +on your organization's login page. ## Related articles -- [Slack-compatible incoming webhook](/integrations/doc/slack_incoming) +* [Choosing between Zulip Cloud and self-hosting](/help/zulip-cloud-or-self-hosting) +* [Setting up your organization](/help/getting-your-organization-started-with-zulip) +* [Slack-compatible incoming webhook](/integrations/doc/slack_incoming) +* [Getting started with Zulip](/help/getting-started-with-zulip) diff --git a/zerver/lib/markdown/tabbed_sections.py b/zerver/lib/markdown/tabbed_sections.py index 8cb00b8baf..3cbb21a53a 100644 --- a/zerver/lib/markdown/tabbed_sections.py +++ b/zerver/lib/markdown/tabbed_sections.py @@ -77,6 +77,10 @@ TAB_SECTION_LABELS = { "web-public-streams": "Web-public streams", "via-user-profile": "Via the user's profile", "via-organization-settings": "Via organization settings", + "default-subdomain": "Default subdomain", + "custom-subdomain": "Custom subdomain", + "zulip-cloud": "Zulip Cloud", + "self-hosting": "Self hosting", }