From dd06979ac95d8b458ecae89b29dcdb6f381b10db Mon Sep 17 00:00:00 2001 From: Raiden Date: Thu, 13 Apr 2023 12:32:19 +0000 Subject: [PATCH 01/10] GITBOOK-21: Fix Ubuntu guide to account for multiple python version, add FAQ page --- SUMMARY.md | 3 +- frequently-asked-questions (1).md | 53 ++++++++++++++++++++ frequently-asked-questions.md | 62 +++++++----------------- installation/local-hosting-vps/ubuntu.md | 28 +++++------ 4 files changed, 87 insertions(+), 59 deletions(-) create mode 100644 frequently-asked-questions (1).md diff --git a/SUMMARY.md b/SUMMARY.md index 2a40184..1e30385 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -21,13 +21,14 @@ * [Plugins](usage-guide/plugins.md) * [Configuration](usage-guide/configuration.md) * [Permissions](usage-guide/permissions.md) +* [Frequently Asked Questions](frequently-asked-questions.md) * [OLD DOCS](old-docs/README.md) * [Installation](installation-1.md) * [Installation (continued)](installation-continued.md) * [Color Names](color-names.md) * [Configuration Variables (Config Vars)](configuration-variables-config-vars.md) * [Configure Modmail and Logviewer](configure-modmail-and-logviewer.md) - * [Frequently Asked Questions](frequently-asked-questions.md) + * [Frequently Asked Questions]() * [Modmail Usage](modmail-usage.md) * [Permissions](permissions.md) * [Plugins](plugins.md) diff --git a/frequently-asked-questions (1).md b/frequently-asked-questions (1).md new file mode 100644 index 0000000..e39b59f --- /dev/null +++ b/frequently-asked-questions (1).md @@ -0,0 +1,53 @@ +# Frequently Asked Questions + +> Last Updated: March 16, 2023 + +#### What is Modmail? + +Modmail is a Discord bot, similar to Reddit's Modmail feature. It serves as a shared inbox for server staff to communicate with their users - and vice versa - in a seamless way. + +#### Can I invite Modmail? + +Unfortunately, due to the nature of the bot, there is not a global invite link. Nonetheless, you can obtain a free copy of Modmail for your server. Follow the official tutorial at [https://github.com/modmail-dev/modmail/wiki/Installation](https://github.com/modmail-dev/modmail/wiki/Installation). However, if you don’t want the hassle of installing and maintaining Modmail, we offer installation, hosting, and other cool perks for [Patrons](https://patreon.com/kyber). + +#### How does Modmail work? + +Modmail uses the Discord API to interact with the platform. When someone sends a DM to the bot, it will create a new thread. Members of the moderation team can help the user and once the conversation ended, you will have access to a beautiful log of it online. + +#### Is Modmail safe? + +Your Modmail bot is safe as long as you don't share your bot's token. If you share your token, a "hacker" can take control over your bot. If you shared your bot token by mistake, regenerate a new token via the Discord Developer Portal. + +#### Where is my data stored? + +All your data including settings, blocked users, logs, installed plugins etc. are stored in your MongoDB database. The bot files only contain the stuff needed to run the bot. This means you can move your bot to a different host and still have your data intact, as long as you use the same MongoDB URI. + +#### Can I request new features? + +Modmail is an open-source project, which means you can easily add or request new features. You can make an issue or submit a pull request to the development branch on the repository. [Check out the contribution guidelines.](https://github.com/modmail-dev/modmail/blob/master/CONTRIBUTING.md) + +#### How do I become a support member? + +To join our support team, join our [Discord server](https://discord.gg/cnUpwrnpYb). One of the more experienced members will hold an interview to check if you fit the requirements. + +#### Can I add commands to the bot? + +You can add commands to the bot using plugins. All currently approved plugins can be found in the `?plugin registry` command. You can also see [this page](https://github.com/modmail-dev/modmail/wiki/Unofficial-List-of-Plugins) for an unofficial list of plugins. + +#### My bot is offline, what do I do? + +Join our [Discord server](https://discord.gg/cnUpwrnpYb) and DM Modmail. One of our support members will assist you and help you fix the issue. + +#### How can I donate the developers? + +You can support the developers on the [Patreon page](https://patreon.com/kyber). You will also receive various rewards for it. + +#### Does anyone get any info when I create my own modmail? + +There is not much information we get about your instance of modmail, The only thing what we recieve is the guild-info, For example: The guildname, The amount of members of the guild, the botname, and the bot-owner. Using this we keep track of how many modmail-instances get created on a monthly/yearly base. ( Only modmail-developers can see this ) + +*** + +#### Answer not found? + +Feel free to join our [Discord server](https://discord.gg/cnUpwrnpYb). People will gladly help you with any questions that you have! diff --git a/frequently-asked-questions.md b/frequently-asked-questions.md index e39b59f..a832ca8 100644 --- a/frequently-asked-questions.md +++ b/frequently-asked-questions.md @@ -1,53 +1,27 @@ -# Frequently Asked Questions - -> Last Updated: March 16, 2023 - -#### What is Modmail? - -Modmail is a Discord bot, similar to Reddit's Modmail feature. It serves as a shared inbox for server staff to communicate with their users - and vice versa - in a seamless way. - -#### Can I invite Modmail? - -Unfortunately, due to the nature of the bot, there is not a global invite link. Nonetheless, you can obtain a free copy of Modmail for your server. Follow the official tutorial at [https://github.com/modmail-dev/modmail/wiki/Installation](https://github.com/modmail-dev/modmail/wiki/Installation). However, if you don’t want the hassle of installing and maintaining Modmail, we offer installation, hosting, and other cool perks for [Patrons](https://patreon.com/kyber). - -#### How does Modmail work? - -Modmail uses the Discord API to interact with the platform. When someone sends a DM to the bot, it will create a new thread. Members of the moderation team can help the user and once the conversation ended, you will have access to a beautiful log of it online. - -#### Is Modmail safe? - -Your Modmail bot is safe as long as you don't share your bot's token. If you share your token, a "hacker" can take control over your bot. If you shared your bot token by mistake, regenerate a new token via the Discord Developer Portal. +--- +description: A list of commonly asked questions or problems related to Modmail. +--- -#### Where is my data stored? - -All your data including settings, blocked users, logs, installed plugins etc. are stored in your MongoDB database. The bot files only contain the stuff needed to run the bot. This means you can move your bot to a different host and still have your data intact, as long as you use the same MongoDB URI. - -#### Can I request new features? - -Modmail is an open-source project, which means you can easily add or request new features. You can make an issue or submit a pull request to the development branch on the repository. [Check out the contribution guidelines.](https://github.com/modmail-dev/modmail/blob/master/CONTRIBUTING.md) - -#### How do I become a support member? - -To join our support team, join our [Discord server](https://discord.gg/cnUpwrnpYb). One of the more experienced members will hold an interview to check if you fit the requirements. - -#### Can I add commands to the bot? - -You can add commands to the bot using plugins. All currently approved plugins can be found in the `?plugin registry` command. You can also see [this page](https://github.com/modmail-dev/modmail/wiki/Unofficial-List-of-Plugins) for an unofficial list of plugins. - -#### My bot is offline, what do I do? +# Frequently Asked Questions -Join our [Discord server](https://discord.gg/cnUpwrnpYb) and DM Modmail. One of our support members will assist you and help you fix the issue. +### I tried installing the dependencies with another Python version and it messed up my Pipfile! How can I get the original Pipfile back? -#### How can I donate the developers? +First remove the broken `Pipfile` and `Pipfile.lock` with: -You can support the developers on the [Patreon page](https://patreon.com/kyber). You will also receive various rewards for it. +```bash +rm Pipfile && rm Pipfile.lock +``` -#### Does anyone get any info when I create my own modmail? +Fetch in the changes from the remote repository: -There is not much information we get about your instance of modmail, The only thing what we recieve is the guild-info, For example: The guildname, The amount of members of the guild, the botname, and the bot-owner. Using this we keep track of how many modmail-instances get created on a monthly/yearly base. ( Only modmail-developers can see this ) +```bash +git fetch origin +``` -*** +And then, fetch the original files with: -#### Answer not found? +```bash +git checkout FETCH_HEAD -- Pipfile && git checkout FETCH_HEAD -- Pipfile.lock +``` -Feel free to join our [Discord server](https://discord.gg/cnUpwrnpYb). People will gladly help you with any questions that you have! +### diff --git a/installation/local-hosting-vps/ubuntu.md b/installation/local-hosting-vps/ubuntu.md index 2104a67..c667b0c 100644 --- a/installation/local-hosting-vps/ubuntu.md +++ b/installation/local-hosting-vps/ubuntu.md @@ -36,17 +36,18 @@ sudo add-apt-repository -y ppa:deadsnakes/ppa Now install the pre-requirements with `apt`, you can copy and run these 3 lines at once: ```bash -sudo apt -y install python3.10 python3.10-dev python3.10-venv python3-pip \ +sudo apt -y install python3.10 python3.10-dev python3.10-venv \ libcairo2-dev libffi-dev g++ \ - git wget nano + git nano ```
Failed to install Python 3.10? -You can manually compile Python instead of adding using the Deadsnakes PPA. Compiling Python may take a while (est. 5-10 minutes). +You can manually compile Python instead of adding using the Deadsnakes PPA. Compiling Python may take a while (est. 5-10 minutes). Copy and run line 2-7 all at once. +{% code lineNumbers="true" %} ```bash sudo apt update && sudo apt upgrade -y # Update and upgrade all packages sudo apt install -y software-properties-common \ @@ -61,31 +62,30 @@ cd Python-3.10.9 ./configure --enable-optimizations make altinstall ``` +{% endcode %} -After following this step, make sure to specify the version when running user-level Python commands later in the guide. - -For example: +
-* `pip install pipenv` to `pip3.10 install pipenv` -* `python bot.py` to `python3.10 bot.py` +After that, ensure `pip` is installed for Python 3.10 with: - +```bash +python3.10 -m ensurepip --upgrade +``` ## Installing Bot -In your home directory, clone and cd into the official Modmail repository with: +Clone and change directory into the Modmail folder with: ```bash -cd ~ git clone https://github.com/modmail-dev/modmail cd modmail ``` -Inside the Modmail folder, Install `pipenv` and the bot dependencies with: +Inside the Modmail folder, Install `pipenv` and its Python packages with: ```bash -pip install pipenv -pipenv install +pip3.10 install pipenv +pipenv install --python 3.10 ``` Create a file named `.env` with `nano` and paste all the environmental variables (secrets) needed to run the bot via right-clicking in the nano editor. Refer to the steps in the [parent Installation page](../#preparing-your-environmental-variables) to find where to obtain these. From 88550edbab8f02e064dd734421da28ef8ad1026d Mon Sep 17 00:00:00 2001 From: Raiden Date: Thu, 13 Apr 2023 15:08:17 +0000 Subject: [PATCH 02/10] GITBOOK-22: Specify python version, move updating guide to its own page, various minor edits --- .../assets/Screenshot 2023-04-13 224748.png | Bin 0 -> 37308 bytes SUMMARY.md | 3 +- installation/community-guides.md | 2 +- installation/local-hosting-vps/almalinux.md | 41 ++++++------- installation/local-hosting-vps/debian.md | 58 ++++++++++-------- installation/local-hosting-vps/docker.md | 4 +- installation/local-hosting-vps/fedora.md | 46 ++++++-------- installation/local-hosting-vps/ubuntu.md | 31 ++++------ installation/local-hosting-vps/windows.md | 27 ++++---- setting-up-auto-restart.md | 44 ++++++------- updating (1).md | 38 ++++++++++++ updating.md | 48 +++++++-------- 12 files changed, 184 insertions(+), 158 deletions(-) create mode 100644 .gitbook/assets/Screenshot 2023-04-13 224748.png create mode 100644 updating (1).md diff --git a/.gitbook/assets/Screenshot 2023-04-13 224748.png b/.gitbook/assets/Screenshot 2023-04-13 224748.png new file mode 100644 index 0000000000000000000000000000000000000000..33fea16dc97323c4404baeca59b7138ff5f60b05 GIT binary patch literal 37308 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 KT-G@yGywn)T$;83 literal 0 HcmV?d00001 diff --git a/SUMMARY.md b/SUMMARY.md index 1e30385..f31376f 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -16,6 +16,7 @@ * [Heroku](installation/heroku.md) * [Community Guides](installation/community-guides.md) * [Setting up auto-restart](setting-up-auto-restart.md) +* [Updating](updating.md) * [Getting Started](getting-started.md) * [Usage](usage-guide/README.md) * [Plugins](usage-guide/plugins.md) @@ -34,5 +35,5 @@ * [Plugins](plugins.md) * [Seperate Server Setup](seperate-server-setup.md) * [The Unofficial List of Plugins](the-unofficial-list-of-plugins.md) - * [Updating](updating.md) + * [Updating]() * [Video Tutorials](video-tutorials.md) diff --git a/installation/community-guides.md b/installation/community-guides.md index 12c48f9..64ce8f4 100644 --- a/installation/community-guides.md +++ b/installation/community-guides.md @@ -12,6 +12,6 @@ Community guides are not verified by the Modmail team, so use them at your own r An online code execution environment. You can host Modmail there for free using certain exploits. The legitimate method costs $7 USD per month. However, regardless if you pay or host for free, hosting on Replit are often unstable and thus not recommended. But for now, this is the only option for those without a payment method for hosting or verification. -## [Northflank](https://blog.project-mei.xyz/2023/4/11/hosting-discord-modmail-with-northflank/) Guide by raidensakura +## [Northflank](https://blog.project-mei.xyz/2023/04/11/hosting-discord-modmail-on-northflank/) Guide by raidensakura Northflank is a Platform as a Service (PaaS) like Railway that offers abilities to run micro-services like bots, schedule jobs that run periodically and databases with a powerful UI, API and CLI. Their panel is a bit more advanced as compared to Railway but comes with the perk of more customization and features. You will need a valid payment method to verify your account, but will unlock a free tier project that's separated from paid resources. They will not charge your card if you go over resource usage as you have limited allocation per service. diff --git a/installation/local-hosting-vps/almalinux.md b/installation/local-hosting-vps/almalinux.md index dbc4298..c129fc3 100644 --- a/installation/local-hosting-vps/almalinux.md +++ b/installation/local-hosting-vps/almalinux.md @@ -4,14 +4,24 @@ description: Deploy Modmail on RHEL / Alma Linux / CentOS server. # Alma Linux +{% hint style="warning" %} +For safety reasons, **DO NOT** install Modmail with a root user. A misbehaving or malicious plugin installed on your Modmail bot can easily access your entire system. If you are unsure how to create a new user on Linux, see [DigitalOcean’s tutorial: How To Create a New Sudo-enabled User](https://www.digitalocean.com/community/tutorials/how-to-create-a-new-sudo-enabled-user-on-ubuntu-20-04-quickstart). +{% endhint %} + Alma Linux 8, 9 and CentOS Stream 8, 9 are based on Red Hat Enterprise Linux (RHEL) 8 and 9 respectively so you can essentially follow this guide if you're running any of the OS mentioned above. ## Prerequisites -* Root access (**`sudo`**). -* Minimum 1GB of RAM -* At least 2GB available disk space. -* Supported releases: Alma Linux 9, Alma Linux 8, CentOS Stream 9, CentOS Stream 8, RHEL 9 and RHEL 8 +1. Root access (**`sudo`**). +2. Minimum 1GB of RAM +3. At least 2GB available disk space. +4. Supported releases: + * Alma Linux 9 + * Alma Linux 8 + * CentOS Stream 9 + * CentOS Stream 8 + * Red Hat Enterprise Linux (RHEL) 9 + * Red Hat Enterprise Linux (RHEL) 8 ## Dependencies @@ -24,7 +34,7 @@ All code blocks should be executed in bash and line by line unless specified oth ### RHEL 9 / Alma Linux 9 / CentOS Stream 9 -Alma Linux 9 have all required packages available in official repositories. Install them with `dnf`: +RHEL 9 and its derivatives have all required packages available in official repositories. Install them with `dnf`: ```bash sudo dnf -y install python39 git @development nano @@ -32,6 +42,8 @@ sudo dnf -y install python39 git @development nano ### RHEL 8 / Alma Linux 8 / CentOS Stream 8.4-8.x +RHEL 8 and its derivatives have all required packages available in official repositories. Install them with `dnf`: + ```bash sudo dnf -y update sudo dnf -y group install development @@ -40,10 +52,9 @@ sudo dnf -y install python39 python39-pip python39-devel nano git ## Installing Bot -In your home directory, clone and cd into the official Modmail repository with: +Clone and change directory into the Modmail folder with: ```bash -cd ~ git clone https://github.com/modmail-dev/modmail cd modmail ``` @@ -51,7 +62,7 @@ cd modmail Inside the Modmail folder, ensure `pip` is installed correctly and is defaulting to Python 3.9 with: ```bash -python3.9 -m ensurepip --default-pip +python3.9 -m ensurepip --upgrade --default-pip ``` And then, install `pipenv` and the bot dependencies with: @@ -81,16 +92,4 @@ After your `.env` file is ready, you can now go ahead and try running your bot w pipenv run bot ``` -If no error shows up, it means your bot is now running correctly. - -## Updating - -Your Modmail is set to auto-update itself by default, but you can also run the `?update` command on your bot manually, replacing `?` with your bot prefix. - -If for some reason your update command isn't working correctly, you can update your bot by going into your modmail folder and pulling the latest changes from GitHub like so: - -```bash -cd modmail && git pull -``` - -Be sure to restart your bot to apply the uupdate. +If no error shows up, it means your bot is now running correctly. You can stop the bot from running with `Ctrl+C` to continue using your terminal. diff --git a/installation/local-hosting-vps/debian.md b/installation/local-hosting-vps/debian.md index c870b72..e2429d0 100644 --- a/installation/local-hosting-vps/debian.md +++ b/installation/local-hosting-vps/debian.md @@ -4,14 +4,22 @@ description: Deploy Modmail on Debian / Raspberry Pi OS. # Debian +{% hint style="warning" %} +For safety reasons, **DO NOT** install Modmail with a root user. A misbehaving or malicious plugin installed on your Modmail bot can easily access your entire system. If you are unsure how to create a new user on Linux, see [DigitalOcean’s tutorial: How To Create a New Sudo-enabled User](https://www.digitalocean.com/community/tutorials/how-to-create-a-new-sudo-enabled-user-on-ubuntu-20-04-quickstart). +{% endhint %} + Raspberry Pi OS 11 Bullseye and Raspberry Pi OS 10 Buster are based on Debian 11 Bullseye and Debian 10 Buster respectively so you can essentially follow this guide if you're running any of the OS mentioned above. ## Prerequisites -* Root access (**`sudo`**). -* Minimum 1GB of RAM -* At least 2GB available disk space. -* Supported releases: Debian 11 Bullseye, Debian 10 Buster, Raspberry Pi OS 11 Bullseye, and Raspberry Pi OS 10 (Legacy) Buster +1. Root access (**`sudo`**). +2. Minimum 1GB of RAM +3. At least 2GB available disk space. +4. Supported releases: + * Debian 11 Bullseye + * Debian 10 Buster + * Raspberry Pi OS 11 Bullseye + * Raspberry Pi OS 10 Buster ## Dependencies @@ -32,6 +40,12 @@ sudo apt update sudo apt -y install python3 python3-dev python3-venv python3-pip libcairo2-dev libffi-dev g++ git wget nano ``` +After that, ensure `pip` is installed for Python 3.9 with: + +``` +python3.9 -m ensurepip --upgrade --default-pip +``` + At the time of writing, this will install Python 3.9 from Debian's repository. ### **Debian 10 Buster /** Raspberry Pi OS 10 Buster @@ -53,30 +67,32 @@ cd Python-3.10.9 sudo make altinstall ``` -After following this step, make sure to specify the version when running user-level Python commands later in the guide. - -For example: +After that, ensure `pip` is installed for Python 3.10 with: -* `pip install pipenv` to `pip3.10 install pipenv` -* `python bot.py` to `python3.10 bot.py` +``` +python3.10 -m ensurepip --upgrade --default-pip +``` ## Installing Bot -In your home directory, clone and cd into the official Modmail repository with: +Clone and change directory into the Modmail folder with: ```bash -cd ~ git clone https://github.com/modmail-dev/modmail cd modmail ``` -Inside the Modmail folder, Install `pipenv` and the bot dependencies with: +Inside the Modmail folder, Install `pipenv` and the bot dependencies with: ```bash -pip install pipenv -pipenv install +pip3.9 install pipenv +pipenv install --python 3.9 ``` +{% hint style="info" %} +Replace `3.9` with `3.10` on the command above if you followed[ Debian 10 Buster](debian.md#debian-10-buster-raspberry-pi-os-10-buster) method previously. +{% endhint %} + Create a file named `.env` with `nano` and paste all the environmental variables (secrets) needed to run the bot via right-clicking in the nano editor. Refer to the steps in the [parent Installation page](../#preparing-your-environmental-variables) to find where to obtain these. ```bash @@ -97,16 +113,4 @@ After your `.env` file is ready, you can now go ahead and try running your bot w pipenv run bot ``` -If no error shows up, it means your bot is now running correctly. - -## Updating - -Your Modmail is set to auto-update itself by default, but you can also run the `?update` command on your bot manually, replacing `?` with your bot prefix. - -If for some reason your update command isn't working correctly, you can update your bot by going into your modmail folder and pulling the latest changes from GitHub like so: - -```bash -cd modmail && git pull -``` - -Be sure to restart your bot to apply the update. +If no error shows up, it means your bot is now running correctly. You can stop the bot from running with `Ctrl+C` to continue using your terminal. diff --git a/installation/local-hosting-vps/docker.md b/installation/local-hosting-vps/docker.md index 60d9a1b..daa30f0 100644 --- a/installation/local-hosting-vps/docker.md +++ b/installation/local-hosting-vps/docker.md @@ -107,9 +107,9 @@ docker run -d --name modmail \ --restart always myname/modmail:latest ``` -## Updating +## Updating on Docker -Auto-update is disabled when running Docker as Docker container state is not persistent across restarts. To update your bot, you will need to run the `docker pull` command in the previous step: [Running the official image for Modmail](docker.md#running-the-official-image-for-modmail) if your image is based from the official repository. After that, you must recreate your container using the `docker rm` and `docker run` command again. +Auto-update is disabled when running Docker as Docker container state is not persistent across restarts. To update your bot, you will need to update the base image by running the `docker pull` command in the previous step: [Running the official image for Modmail](docker.md#running-the-official-image-for-modmail) if your image is based from the official repository. After that, you must recreate your container using the `docker rm` and `docker run` command again. If your image is created locally, simply replace the `docker pull` command with `git pull` and rebuilding your image again. diff --git a/installation/local-hosting-vps/fedora.md b/installation/local-hosting-vps/fedora.md index 9fc9b8c..638c0d6 100644 --- a/installation/local-hosting-vps/fedora.md +++ b/installation/local-hosting-vps/fedora.md @@ -4,12 +4,19 @@ description: Deploy Modmail on a Fedora server. # Fedora +{% hint style="warning" %} +For safety reasons, **DO NOT** install Modmail with a root user. A misbehaving or malicious plugin installed on your Modmail bot can easily access your entire system. If you are unsure how to create a new user on Linux, see [DigitalOcean’s tutorial: How To Create a New Sudo-enabled User](https://www.digitalocean.com/community/tutorials/how-to-create-a-new-sudo-enabled-user-on-ubuntu-20-04-quickstart). +{% endhint %} + ## Prerequisites -* Root access (**`sudo`**). -* Minimum 1GB of RAM -* At least 2GB available disk space. -* Supported releases: Fedora 37, Fedora 36, Fedora 35. +1. Root access (**`sudo`**). +2. Minimum 1GB of RAM +3. At least 2GB available disk space. +4. Supported releases: + * Fedora 37 + * Fedora 36 + * Fedora 35 ## Dependencies @@ -27,26 +34,25 @@ Fedora Linux 35 and above has all required packages available in official reposi sudo dnf -y install python39 git nano g++ gtk3 ``` +After that, ensure `pip` is installed for Python 3.9 with: + +``` +python3.9 -m ensurepip --upgrade --default-pip +``` + ## Installing Bot -In your home directory, clone and cd into the official Modmail repository with: +Clone and change directory into the Modmail folder with: ```bash -cd ~ git clone https://github.com/modmail-dev/modmail cd modmail ``` -Inside the Modmail folder, ensure `pip` is installed correctly and is defaulting to Python 3.9 with: - -```bash -python3.9 -m ensurepip --default-pip -``` - And then, install `pipenv` and the bot dependencies with: ```bash -pip install pipenv +pip3.9 install pipenv pipenv install --python 3.9 ``` @@ -70,17 +76,5 @@ After your `.env` file is ready, you can now go ahead and try running your bot w pipenv run bot ``` -If no error shows up, it means your bot is now running correctly. - -## Updating - -Your Modmail is set to auto-update itself by default, but you can also run the `?update` command on your bot manually, replacing `?` with your bot prefix. - -If for some reason your update command isn't working correctly, you can update your bot by going into your modmail folder and pulling the latest changes from GitHub like so: - -```bash -cd modmail && git pull -``` - -Be sure to restart your bot to apply the update. +If no error shows up, it means your bot is now running correctly. You can stop the bot from running with `Ctrl+C` to continue using your terminal. diff --git a/installation/local-hosting-vps/ubuntu.md b/installation/local-hosting-vps/ubuntu.md index c667b0c..355b2d7 100644 --- a/installation/local-hosting-vps/ubuntu.md +++ b/installation/local-hosting-vps/ubuntu.md @@ -4,12 +4,19 @@ description: Deploy Modmail on an Ubuntu server. # Ubuntu +{% hint style="warning" %} +For safety reasons, **DO NOT** install Modmail with a root user. A misbehaving or malicious plugin installed on your Modmail bot can easily access your entire system. If you are unsure how to create a new user on Linux, see [DigitalOcean’s tutorial: How To Create a New Sudo-enabled User](https://www.digitalocean.com/community/tutorials/how-to-create-a-new-sudo-enabled-user-on-ubuntu-20-04-quickstart). +{% endhint %} + ## Prerequisites -* Root access (**`sudo`**). -* Minimum 1GB of RAM -* At least 2GB available disk space. -* Supported releases: Ubuntu 18.04 LTS, Ubuntu 20.04 LTS, Ubuntu 22.04 LTS. +1. Root access (**`sudo`**). +2. Minimum 1GB of RAM +3. At least 2GB available disk space. +4. Supported releases: + * Ubuntu 18.04 LTS (Bionic Beaver) + * Ubuntu 20.04 LTS (Focal Fossa) + * Ubuntu 22.04 LTS (Jammy Jellyfish) ## Dependencies @@ -69,7 +76,7 @@ make altinstall After that, ensure `pip` is installed for Python 3.10 with: ```bash -python3.10 -m ensurepip --upgrade +python3.10 -m ensurepip --upgrade --default-pip ``` ## Installing Bot @@ -108,16 +115,4 @@ After your `.env` file is ready, you can now go ahead and try running your bot w pipenv run bot ``` -If no error shows up, it means your bot is now running correctly. - -## Updating - -Your Modmail is set to auto-update itself by default, but you can also run the `?update` command on your bot manually, replacing `?` with your bot prefix. - -If for some reason your update command isn't working correctly, you can update your bot by going into your Modmail folder and pulling the latest changes from GitHub like so: - -```bash -cd modmail && git pull -``` - -Be sure to restart your bot to apply the update. +If no error shows up, it means your bot is now running correctly. You can stop the bot from running with `Ctrl+C` to continue using your terminal. diff --git a/installation/local-hosting-vps/windows.md b/installation/local-hosting-vps/windows.md index 9652e9d..398b60f 100644 --- a/installation/local-hosting-vps/windows.md +++ b/installation/local-hosting-vps/windows.md @@ -6,9 +6,11 @@ description: Deploy Modmail on a Windows machine. ## Prerequisites -* Minimum 2GB of RAM**\*** -* At least 2GB available disk space. -* Supported Windows version: Windows 10 or Windows 11. +1. Minimum 2GB of RAM\* +2. At least 2GB available disk space. +3. Supported Windows version: + * Windows 10 + * Windows 11 {% hint style="info" %} Note that while it is possible to run Modmail with even less memory, Windows 10 itself recommend at least 2GB (4GB for Windows 11). This guide assumes the lowest threshold to comfortably run Modmail without possibly running into any resource bottleneck. @@ -40,6 +42,12 @@ choco upgrade git --params "/GitOnlyOnPath /WindowsTerminal" -y choco upgrade python310 -y ``` +After that, ensure `pip` is installed for Python 3.10 with: + +```bash +python3.10 -m ensurepip --upgrade +``` + After the above installation has finished, download and install the **GTK runtime for Windows** by [clicking here](https://github.com/tschoonj/GTK-for-Windows-Runtime-Environment-Installer/releases/latest). ## Installing Bot @@ -55,7 +63,7 @@ git clone https://github.com/modmail-dev/modmail; cd modmail Install Pipenv and project dependencies with: ```powershell -pip install pipenv; pipenv install +pip3.10 install pipenv; pipenv install ``` Create a new file in the modmail folder named `.env` and paste in your environmental variables needed to run Modmail. Refer to the steps in the [parent Installation page](../#preparing-your-environmental-variables) to find where to obtain these. @@ -70,14 +78,3 @@ pipenv run bot If no error shows up, it means that your Modmail is now running correctly. -## Updating - -Your Modmail is set to auto-update itself by default, but you can also run the `?update` command on your bot manually, replacing `?` with your bot prefix. - -If for some reason your update command isn't working correctly, you can update your bot by opening PowerShell or any terminal application in your modmail folder and pulling the latest changes from GitHub like so: - -``` -git pull -``` - -After that, simply restart your bot to apply the latest changes. diff --git a/setting-up-auto-restart.md b/setting-up-auto-restart.md index aea9de1..80eef4e 100644 --- a/setting-up-auto-restart.md +++ b/setting-up-auto-restart.md @@ -1,25 +1,31 @@ # Setting up auto-restart -## Using pm2 on Linux +## Using PM2 on Linux -`pm2` is a process manager intended for Node.js but can also be used with Python applications, such as our Modmail bot and logviewer. To use `pm2`, we will need to install Node.js. +PM2 is a process manager originally intended for Node.js but can also be used with Python applications, such as our Modmail bot and Logviewer. To use `pm2`, we will need to install Node Package Manager (`npm`). -#### Installing `pm2` Using `apt`: +#### Installing `pm2` Using `apt` (Ubuntu, Debian, etc): ```bash sudo apt install npm -y && sudo npm i pm2 -g ``` -#### Installing `pm2` using `dnf`: +#### Installing `pm2` using `dnf` (Fedora, Alma Linux, etc): ```bash sudo dnf -y install npm && sudo npm i pm2 -g ``` -Then, in the Modmail folder, start the Modmail process with: +Then, in the Modmail folder, start the Modmail process in the background with: ``` -sudo pm2 start modmail.sh --name "modmail" +pm2 start modmail.sh --name "modmail" +``` + +You can see the logs of your Modmail process with: + +``` +pm2 logs modmail ``` And then, to make sure that `pm2` stays active and persistent between machine restarts, run the following commands: @@ -30,9 +36,11 @@ pm2 save && pm2 startup ## Using systemd on Linux -To have the bot auto-restart on crash or system reboot, we will be using `systemd` by making a service file for our bot. +`systemd` is a built-in service manager for most Linux systems. It's primary used to manage background applications and services and to make applications auto-restart on crash and run on system startup. -In order to create the service file, you will first need to know three things, your Linux `username`, your Modmail repository `path` and your Pipenv `path`. +We will be using `systemd` for Modmail by making a service file for our bot. + +In order to create the service file, you will first need to know three things, your Linux `username`, your Modmail folder location as `modmail_path` and your Pipenv location as `pipenv_path`. First, your Linux `username` can be fetched with the following command: @@ -40,18 +48,6 @@ First, your Linux `username` can be fetched with the following command: whoami ``` -If you have cloned the Modmail repo as a `root` user, your Modmail repo path should be: - -```bash -/root/modmail -``` - -Otherwise, your path should be: - -```bash -/home/$USER/modmail/ -``` - You can get your `pipenv_path` with: ``` @@ -111,7 +107,11 @@ sudo systemctl stop modmail sudo systemctl disable modmail ``` -## Using `nssm` on Windows +## Using PM2 on Windows + +Todo: [https://github.com/jessety/pm2-installer](https://github.com/jessety/pm2-installer) + +## Using NSSM on Windows To have the bot auto-restart on crash or system reboot, we will be using `nssm` by making a service for our bot application. @@ -150,7 +150,7 @@ cd "C:\Users\Raiden\Downloads\nssm-2.24\win64" ``` {% hint style="info" %} -Wrapping "your folder\directory" on Windows in doublequotes is necessary to make sure spaces in our file path is parsed correctly. +Wrapping "your folder\directory" on Windows in double quotes is necessary to make sure spaces in our file path is parsed correctly. {% endhint %} And then, proceed to create a new service for Modmail using `nssm` with: diff --git a/updating (1).md b/updating (1).md new file mode 100644 index 0000000..e2485ce --- /dev/null +++ b/updating (1).md @@ -0,0 +1,38 @@ +# Updating + +## Updating Modmail + +You can update Modmail on your Heroku account whenever changes are made to the repository. If you want to update while hosting locally (not Heroku), simply type `git pull` in your terminal and install the requirements again with `pipenv install`. + +## Forking the repo + +Before you get started, you must [fork](https://github.com/modmail-dev/modmail/fork) the repo first if you are using Heroku and want to update the bot. + +### Syncing a fork branch from the web UI + +1. On GitHub, navigate to the main page of the forked repository that you want to sync with the upstream repository. +2. Select the Sync fork dropdown. + + ![sync-fork-dropdown](https://user-images.githubusercontent.com/70805800/194696934-5333af5d-165e-4873-b5b7-bd01f0461185.png) +3. Then click Update branch. + + ![update-branch-button](https://user-images.githubusercontent.com/70805800/194696947-68891d50-a624-4901-a03d-e49564852a23.png) + +If the changes from the upstream repository cause conflicts, GitHub will prompt you to create a pull request to resolve the conflicts. + +### I want to enable automatic updates + +1. Create a GitHub account +2. [Fork](https://github.com/modmail-dev/modmail/fork) the repository +3. Add GITHUB\_TOKEN into your configuration variables from https://github.com/settings/tokens with the repo scope ([Guide](https://github.com/modmail-dev/modmail/wiki/Installation-\(cont.\)#4-how-to-obtain-your-github\_token---required-for-the-update-command-)). +4. Link your GitHub account to heroku ![](https://i.imgur.com/qjWraS0.png) +5. Turn on automatic deploys ![](https://i.imgur.com/jgUVl7f.png) +6. Restart the bot + +### I want to update the bot once + +[Click here to create a new pull request to your fork](https://github.com/modmail-dev/modmail/pull/new/master). Select `compare across forks`, make the base repository `yourusername/modmail` and ensure the branch is set to master. Put any title you want and create the pull request. On the page that comes after this, merge the pull request. + +You then want to go to your modmail application in Heroku, connect your modmail fork via the `Deploy` tab and deploy the `master` branch. + +You can turn on auto-deploy for the master branch if you don't want to go through the process of logging into Heroku and deploying the branch every time changes to the repo are made in the future. However, you will have to make a pull request to update your fork every time. diff --git a/updating.md b/updating.md index e2485ce..bfb504f 100644 --- a/updating.md +++ b/updating.md @@ -1,38 +1,36 @@ -# Updating - -## Updating Modmail +--- +description: Guide on how to update the Modmail bot. +--- -You can update Modmail on your Heroku account whenever changes are made to the repository. If you want to update while hosting locally (not Heroku), simply type `git pull` in your terminal and install the requirements again with `pipenv install`. - -## Forking the repo +# Updating -Before you get started, you must [fork](https://github.com/modmail-dev/modmail/fork) the repo first if you are using Heroku and want to update the bot. +Your Modmail is set to auto-update itself by default, but you can also run the `?update` command on your bot manually, replacing `?` with your bot prefix. -### Syncing a fork branch from the web UI +If for some reason your update command isn't working correctly, you can update your bot by going into your Modmail folder and pulling the latest changes from GitHub with the steps below. -1. On GitHub, navigate to the main page of the forked repository that you want to sync with the upstream repository. -2. Select the Sync fork dropdown. +First, determine whether you have the official Modmail repository cloned or a fork by observing the output of the command below: - ![sync-fork-dropdown](https://user-images.githubusercontent.com/70805800/194696934-5333af5d-165e-4873-b5b7-bd01f0461185.png) -3. Then click Update branch. +``` +cat .git/config +``` - ![update-branch-button](https://user-images.githubusercontent.com/70805800/194696947-68891d50-a624-4901-a03d-e49564852a23.png) +If the output shows this exact URL as shown below, -If the changes from the upstream repository cause conflicts, GitHub will prompt you to create a pull request to resolve the conflicts. +``` +[remote "origin"] + url = https://github.com/modmail-dev/modmail.git +``` -### I want to enable automatic updates +you can go ahead and run the command below to pull in the latest changes: -1. Create a GitHub account -2. [Fork](https://github.com/modmail-dev/modmail/fork) the repository -3. Add GITHUB\_TOKEN into your configuration variables from https://github.com/settings/tokens with the repo scope ([Guide](https://github.com/modmail-dev/modmail/wiki/Installation-\(cont.\)#4-how-to-obtain-your-github\_token---required-for-the-update-command-)). -4. Link your GitHub account to heroku ![](https://i.imgur.com/qjWraS0.png) -5. Turn on automatic deploys ![](https://i.imgur.com/jgUVl7f.png) -6. Restart the bot +```bash +git pull +``` -### I want to update the bot once +Else, it means that your repository is a fork and must update (aka sync) it independently. If your repository is hosted on GitHub, click on the button on your repo's GitHub URL as highlighted below: -[Click here to create a new pull request to your fork](https://github.com/modmail-dev/modmail/pull/new/master). Select `compare across forks`, make the base repository `yourusername/modmail` and ensure the branch is set to master. Put any title you want and create the pull request. On the page that comes after this, merge the pull request. +

-You then want to go to your modmail application in Heroku, connect your modmail fork via the `Deploy` tab and deploy the `master` branch. +Run the `git pull` command above locally after syncing your fork. -You can turn on auto-deploy for the master branch if you don't want to go through the process of logging into Heroku and deploying the branch every time changes to the repo are made in the future. However, you will have to make a pull request to update your fork every time. +And then, be sure to restart your bot to apply the update. From f580a379b4009bdb0742fa3f07b7f2bd45ace4b5 Mon Sep 17 00:00:00 2001 From: Raiden Date: Thu, 13 Apr 2023 15:55:26 +0000 Subject: [PATCH 03/10] GITBOOK-23: Remove version from pip command in favor of --default-pip --- installation/local-hosting-vps/almalinux.md | 2 +- installation/local-hosting-vps/debian.md | 2 +- installation/local-hosting-vps/fedora.md | 2 +- installation/local-hosting-vps/ubuntu.md | 2 +- installation/local-hosting-vps/windows.md | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/installation/local-hosting-vps/almalinux.md b/installation/local-hosting-vps/almalinux.md index c129fc3..c260fa4 100644 --- a/installation/local-hosting-vps/almalinux.md +++ b/installation/local-hosting-vps/almalinux.md @@ -68,7 +68,7 @@ python3.9 -m ensurepip --upgrade --default-pip And then, install `pipenv` and the bot dependencies with: ```bash -pip3.9 install pipenv +pip install pipenv pipenv install --python 3.9 ``` diff --git a/installation/local-hosting-vps/debian.md b/installation/local-hosting-vps/debian.md index e2429d0..882f5c0 100644 --- a/installation/local-hosting-vps/debian.md +++ b/installation/local-hosting-vps/debian.md @@ -85,7 +85,7 @@ cd modmail Inside the Modmail folder, Install `pipenv` and the bot dependencies with: ```bash -pip3.9 install pipenv +pip install pipenv pipenv install --python 3.9 ``` diff --git a/installation/local-hosting-vps/fedora.md b/installation/local-hosting-vps/fedora.md index 638c0d6..210ef8c 100644 --- a/installation/local-hosting-vps/fedora.md +++ b/installation/local-hosting-vps/fedora.md @@ -52,7 +52,7 @@ cd modmail And then, install `pipenv` and the bot dependencies with: ```bash -pip3.9 install pipenv +pip install pipenv pipenv install --python 3.9 ``` diff --git a/installation/local-hosting-vps/ubuntu.md b/installation/local-hosting-vps/ubuntu.md index 355b2d7..8a7407c 100644 --- a/installation/local-hosting-vps/ubuntu.md +++ b/installation/local-hosting-vps/ubuntu.md @@ -91,7 +91,7 @@ cd modmail Inside the Modmail folder, Install `pipenv` and its Python packages with: ```bash -pip3.10 install pipenv +pip install pipenv pipenv install --python 3.10 ``` diff --git a/installation/local-hosting-vps/windows.md b/installation/local-hosting-vps/windows.md index 398b60f..004e0f2 100644 --- a/installation/local-hosting-vps/windows.md +++ b/installation/local-hosting-vps/windows.md @@ -45,7 +45,7 @@ choco upgrade python310 -y After that, ensure `pip` is installed for Python 3.10 with: ```bash -python3.10 -m ensurepip --upgrade +python3.10 -m ensurepip --upgrade --default-pip ``` After the above installation has finished, download and install the **GTK runtime for Windows** by [clicking here](https://github.com/tschoonj/GTK-for-Windows-Runtime-Environment-Installer/releases/latest). @@ -63,7 +63,7 @@ git clone https://github.com/modmail-dev/modmail; cd modmail Install Pipenv and project dependencies with: ```powershell -pip3.10 install pipenv; pipenv install +pip install pipenv; pipenv install ``` Create a new file in the modmail folder named `.env` and paste in your environmental variables needed to run Modmail. Refer to the steps in the [parent Installation page](../#preparing-your-environmental-variables) to find where to obtain these. From c9dc73e242a0815086e63abb75ef8dab3d5758b3 Mon Sep 17 00:00:00 2001 From: Raiden Date: Thu, 13 Apr 2023 18:00:28 +0000 Subject: [PATCH 04/10] GITBOOK-24: Fix a few install commands --- installation/local-hosting-vps/ubuntu.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/installation/local-hosting-vps/ubuntu.md b/installation/local-hosting-vps/ubuntu.md index 8a7407c..63608c2 100644 --- a/installation/local-hosting-vps/ubuntu.md +++ b/installation/local-hosting-vps/ubuntu.md @@ -43,7 +43,7 @@ sudo add-apt-repository -y ppa:deadsnakes/ppa Now install the pre-requirements with `apt`, you can copy and run these 3 lines at once: ```bash -sudo apt -y install python3.10 python3.10-dev python3.10-venv \ +sudo apt -y install python3.10 python3.10-dev python3.10-venv python3-pip \ libcairo2-dev libffi-dev g++ \ git nano ``` From bcb300c9ac03b0a0d7548c00522d880a1457c9ee Mon Sep 17 00:00:00 2001 From: Raiden Date: Thu, 13 Apr 2023 19:37:38 +0000 Subject: [PATCH 05/10] GITBOOK-25: Add pm2 reference --- setting-up-auto-restart.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/setting-up-auto-restart.md b/setting-up-auto-restart.md index 80eef4e..287c1b7 100644 --- a/setting-up-auto-restart.md +++ b/setting-up-auto-restart.md @@ -34,6 +34,16 @@ And then, to make sure that `pm2` stays active and persistent between machine re pm2 save && pm2 startup ``` +Here's some of the other PM2 commands for future reference: + +```bash +pm2 restart modmail +pm2 reload modmail +pm2 stop modmail +pm2 delete modmail +pm2 list +``` + ## Using systemd on Linux `systemd` is a built-in service manager for most Linux systems. It's primary used to manage background applications and services and to make applications auto-restart on crash and run on system startup. From 8a6dcc2960ded7553f96d8c1e622d54cbd824ca8 Mon Sep 17 00:00:00 2001 From: Raiden Date: Fri, 14 Apr 2023 06:52:11 +0000 Subject: [PATCH 06/10] GITBOOK-26: No subject --- ...eka-docker-explanation-hd-png-1221238558.png | Bin 0 -> 25341 bytes installation/local-hosting-vps/docker.md | 2 ++ 2 files changed, 2 insertions(+) create mode 100644 .gitbook/assets/27-272811_containerization-docker-explained-edureka-docker-explanation-hd-png-1221238558.png diff --git a/.gitbook/assets/27-272811_containerization-docker-explained-edureka-docker-explanation-hd-png-1221238558.png b/.gitbook/assets/27-272811_containerization-docker-explained-edureka-docker-explanation-hd-png-1221238558.png new file mode 100644 index 0000000000000000000000000000000000000000..53730352cff49d3ca0d00f7e2e28f6de3a8769c3 GIT binary patch literal 25341 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 literal 0 HcmV?d00001 diff --git a/installation/local-hosting-vps/docker.md b/installation/local-hosting-vps/docker.md index daa30f0..68f65aa 100644 --- a/installation/local-hosting-vps/docker.md +++ b/installation/local-hosting-vps/docker.md @@ -8,6 +8,8 @@ description: Deploy Modmail on Docker. Docker is considered an advanced setup, it is recommended that you understand how Docker works before deciding to use this method. {% endhint %} +

A simple illustration explaining how Docker works

+ ## Prerequisites * Supported OS for Docker From 10b6ca40a3fa039976944d3f68fbf09a9fe16b3e Mon Sep 17 00:00:00 2001 From: Raiden Date: Tue, 2 May 2023 06:00:20 +0000 Subject: [PATCH 07/10] GITBOOK-28: Fix Windows guide commands --- installation/local-hosting-vps/windows.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/installation/local-hosting-vps/windows.md b/installation/local-hosting-vps/windows.md index 004e0f2..aa19ea1 100644 --- a/installation/local-hosting-vps/windows.md +++ b/installation/local-hosting-vps/windows.md @@ -42,10 +42,11 @@ choco upgrade git --params "/GitOnlyOnPath /WindowsTerminal" -y choco upgrade python310 -y ``` -After that, ensure `pip` is installed for Python 3.10 with: +After that, ensure `pip` and `pipenv` are installed and updated for Python 3.10 with: -```bash -python3.10 -m ensurepip --upgrade --default-pip +```powershell +py -3.10 -m ensurepip --upgrade +py -3.10 -m pip install pipenv ``` After the above installation has finished, download and install the **GTK runtime for Windows** by [clicking here](https://github.com/tschoonj/GTK-for-Windows-Runtime-Environment-Installer/releases/latest). @@ -57,13 +58,14 @@ In any folder location of your choice, `Shift+Right Click` and click on `Open Po In your PowerShell window, run these commands to clone the official Modmail repository locally and `cd` into the folder: ```powershell -git clone https://github.com/modmail-dev/modmail; cd modmail +git clone https://github.com/modmail-dev/modmail +cd modmail ``` -Install Pipenv and project dependencies with: +Install project dependencies inside Modmail's pipenv with: ```powershell -pip install pipenv; pipenv install +py -3.10 -m pipenv install ``` Create a new file in the modmail folder named `.env` and paste in your environmental variables needed to run Modmail. Refer to the steps in the [parent Installation page](../#preparing-your-environmental-variables) to find where to obtain these. @@ -73,7 +75,7 @@ Create a new file in the modmail folder named `.env` and paste in your environme Lastly, in your PowerShell window simply enter the command below to run your Modmail bot: ```powershell -pipenv run bot +py -3.10 -m pipenv run bot ``` If no error shows up, it means that your Modmail is now running correctly. From c2ff1c6161a13682cb79f33eaf2fafcaf469cfc2 Mon Sep 17 00:00:00 2001 From: Raiden Date: Tue, 2 May 2023 06:18:19 +0000 Subject: [PATCH 08/10] GITBOOK-29: Update Ubuntu guide --- installation/local-hosting-vps/ubuntu.md | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/installation/local-hosting-vps/ubuntu.md b/installation/local-hosting-vps/ubuntu.md index 63608c2..5f73513 100644 --- a/installation/local-hosting-vps/ubuntu.md +++ b/installation/local-hosting-vps/ubuntu.md @@ -48,6 +48,12 @@ sudo apt -y install python3.10 python3.10-dev python3.10-venv python3-pip \ git nano ``` +After that, install `pipenv` with: + +```bash +python3.10 -m pip install pipenv +``` +
Failed to install Python 3.10? @@ -73,12 +79,6 @@ make altinstall
-After that, ensure `pip` is installed for Python 3.10 with: - -```bash -python3.10 -m ensurepip --upgrade --default-pip -``` - ## Installing Bot Clone and change directory into the Modmail folder with: @@ -90,10 +90,8 @@ cd modmail Inside the Modmail folder, Install `pipenv` and its Python packages with: -```bash -pip install pipenv -pipenv install --python 3.10 -``` +
python3.10 -m pipenv install --python 3.10
+
Create a file named `.env` with `nano` and paste all the environmental variables (secrets) needed to run the bot via right-clicking in the nano editor. Refer to the steps in the [parent Installation page](../#preparing-your-environmental-variables) to find where to obtain these. @@ -112,7 +110,7 @@ If using the `nano` editor is a bit of a learning curve, you can always FTP into After your `.env` file is ready, you can now go ahead and try running your bot with: ```bash -pipenv run bot +python3.10 -m pipenv run bot ``` If no error shows up, it means your bot is now running correctly. You can stop the bot from running with `Ctrl+C` to continue using your terminal. From ea4d2c284ac3a8dc14af5a718330091a24c3bbe6 Mon Sep 17 00:00:00 2001 From: Raiden Date: Tue, 2 May 2023 06:56:06 +0000 Subject: [PATCH 09/10] GITBOOK-30: Update Debian & Fedora guide --- installation/local-hosting-vps/debian.md | 26 +++++++++++++----------- installation/local-hosting-vps/fedora.md | 20 +++++++++--------- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/installation/local-hosting-vps/debian.md b/installation/local-hosting-vps/debian.md index 882f5c0..9046ff8 100644 --- a/installation/local-hosting-vps/debian.md +++ b/installation/local-hosting-vps/debian.md @@ -40,18 +40,13 @@ sudo apt update sudo apt -y install python3 python3-dev python3-venv python3-pip libcairo2-dev libffi-dev g++ git wget nano ``` -After that, ensure `pip` is installed for Python 3.9 with: - -``` -python3.9 -m ensurepip --upgrade --default-pip -``` - At the time of writing, this will install Python 3.9 from Debian's repository. ### **Debian 10 Buster /** Raspberry Pi OS 10 Buster -You will need to manually compile Python 3.10 from source. Compiling Python may take a while (est. 5-10 minutes). +You will need to manually compile Python 3.10 from source. Compiling Python may take a while (est. 5-10 minutes). Make sure to run line 2-7 all at once. +{% code lineNumbers="true" %} ```bash sudo apt update && sudo apt upgrade -y # Update and upgrade all packages sudo apt install -y software-properties-common \ @@ -66,13 +61,16 @@ cd Python-3.10.9 ./configure --enable-optimizations sudo make altinstall ``` +{% endcode %} -After that, ensure `pip` is installed for Python 3.10 with: +After that, ensure `pip` is installed and updated for Python 3.10 with: ``` -python3.10 -m ensurepip --upgrade --default-pip +python3.10 -m ensurepip --upgrade ``` +Then **log out and log back in** to continue the installation steps. + ## Installing Bot Clone and change directory into the Modmail folder with: @@ -85,8 +83,8 @@ cd modmail Inside the Modmail folder, Install `pipenv` and the bot dependencies with: ```bash -pip install pipenv -pipenv install --python 3.9 +python3.9 -m pip install pipenv +python3.9 -m pipenv install --python 3.9 ``` {% hint style="info" %} @@ -110,7 +108,11 @@ If using the `nano` editor is a bit of a learning curve, you can always FTP into After your `.env` file is ready, you can now go ahead and try running your bot with: ```bash -pipenv run bot +python3.9 -m pipenv run bot ``` +{% hint style="info" %} +Replace `3.9` with `3.10` on the command above if you followed[ Debian 10 Buster](debian.md#debian-10-buster-raspberry-pi-os-10-buster) method previously. +{% endhint %} + If no error shows up, it means your bot is now running correctly. You can stop the bot from running with `Ctrl+C` to continue using your terminal. diff --git a/installation/local-hosting-vps/fedora.md b/installation/local-hosting-vps/fedora.md index 210ef8c..a5a629b 100644 --- a/installation/local-hosting-vps/fedora.md +++ b/installation/local-hosting-vps/fedora.md @@ -14,13 +14,14 @@ For safety reasons, **DO NOT** install Modmail with a root user. A misbehaving o 2. Minimum 1GB of RAM 3. At least 2GB available disk space. 4. Supported releases: + * Fedora 38 * Fedora 37 * Fedora 36 * Fedora 35 ## Dependencies -* Python 3.9 +* Python 3.10 * Tools: `git`, `wget`, `nano` * Additional Modmail requirements: `g++` @@ -31,13 +32,13 @@ All code blocks should be executed in bash and line by line unless specified oth Fedora Linux 35 and above has all required packages available in official repositories. Install them with `dnf`. ```bash -sudo dnf -y install python39 git nano g++ gtk3 +sudo dnf -y install python310 git nano g++ gtk3 ``` -After that, ensure `pip` is installed for Python 3.9 with: +And then, make sure `pip` is installed for Python 3.10 with: -``` -python3.9 -m ensurepip --upgrade --default-pip +```bash +python3.10 -m ensurepip --upgrade ``` ## Installing Bot @@ -51,10 +52,9 @@ cd modmail And then, install `pipenv` and the bot dependencies with: -```bash -pip install pipenv -pipenv install --python 3.9 -``` +
python3.10 -m pip install pipenv
+python3.10 -m pipenv install --python 3.10
+
Create a file named `.env` with `nano` and paste all the environmental variables (secrets) needed to run the bot via right-clicking in the nano editor. Refer to the steps in the [parent Installation page](../#preparing-your-environmental-variables) to find where to obtain these. @@ -73,7 +73,7 @@ If using the `nano` editor is a bit of a learning curve, you can always FTP into After your `.env` file is ready, you can now go ahead and try running your bot with: ```bash -pipenv run bot +python3.10 -m pipenv run bot ``` If no error shows up, it means your bot is now running correctly. You can stop the bot from running with `Ctrl+C` to continue using your terminal. From 0e24be19426b74cf8a4c58b5a0a549a7bcb3c622 Mon Sep 17 00:00:00 2001 From: Raiden Date: Tue, 2 May 2023 07:02:22 +0000 Subject: [PATCH 10/10] GITBOOK-31: Update Alma Linux guide --- installation/local-hosting-vps/almalinux.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/installation/local-hosting-vps/almalinux.md b/installation/local-hosting-vps/almalinux.md index c260fa4..34301e1 100644 --- a/installation/local-hosting-vps/almalinux.md +++ b/installation/local-hosting-vps/almalinux.md @@ -62,14 +62,14 @@ cd modmail Inside the Modmail folder, ensure `pip` is installed correctly and is defaulting to Python 3.9 with: ```bash -python3.9 -m ensurepip --upgrade --default-pip +python3.9 -m ensurepip --upgrade ``` And then, install `pipenv` and the bot dependencies with: ```bash -pip install pipenv -pipenv install --python 3.9 +python3.9 -m pip install pipenv +python3.9 -m pipenv install --python 3.9 ``` Create a file named `.env` with `nano` and paste all the environmental variables (secrets) needed to run the bot via right-clicking in the nano editor. Refer to the steps in the [parent Installation page](../#preparing-your-environmental-variables) to find where to obtain these. @@ -89,7 +89,7 @@ If using the `nano` editor is a bit of a learning curve, you can always FTP into After your `.env` file is ready, you can now go ahead and try running your bot with: ```bash -pipenv run bot +python3.9 -m pipenv run bot ``` If no error shows up, it means your bot is now running correctly. You can stop the bot from running with `Ctrl+C` to continue using your terminal.