# Ploi

> Ploi is a server management platform that simplifies DevOps for developers. This file contains the complete Ploi documentation and news articles in markdown. A shorter index is available at https://ploi.io/llms.txt.

# Documentation

## Introduction

### Welcome to Ploi

URL: https://ploi.io/documentation/introduction/welcome-to-ploi
Last updated: 2021-05-12

Welcome to Ploi, your personal server manager.

Meet Ploi, the tool that makes a developers life easier. We take all the difficult work out of your hands, so you can focus on doing what you love: developing your application. [ploi.io](https://ploi.io/)

Rapidly deploy any site you like: PHP, HTML and many more. You can use Github, Bitbucket, 1-click-install WordPress or just SFTP. Get started today: [ploi.io](https://ploi.io/)

Easy website deployments? We’ve got your back. Laravel, Opencart, Magento, WordPress or any other framework or system - whatever it is, Ploi will take care of it. Get started for free!

We’re aiming to create a tool that developers love to use. Therefore, we’d love to hear from you! Drop us a message whenever you feel like you’re missing a feature, have a suggestion or have questions about Ploi.

### How is my data saved, and is it safe?

URL: https://ploi.io/documentation/introduction/how-is-my-data-saved-and-is-it-safe
Last updated: 2020-08-24

Each piece of sensitive information is **always** stored encrypted in our database, this can vary from names, passwords and SSH keys (and more). This ensures that data is not readable without a specific application key, there is also currently 1 person that has access to the Ploi database to ensure safety and protection of your data.

We also store a backup of our data twice daily, we might increase this interval simultaneous with the number of data we have.

Besides this Ploi is secured with an LetsEncrypt certificate &amp; Cloudflare SSL certificate, SSL labs verifies our certificate as an **A+** which is quality wise very high. We also only allow HTTPS requests to our domain, so downgrade attacks to HTTP is not possible.

### Is Ploi GDPR compliant?

URL: https://ploi.io/documentation/introduction/is-ploi-gdpr-compliant
Last updated: 2019-02-11

Yes, Ploi.io is fully GDPR compliant and dedicated to it.

You can check more about this subject on our [privacy policy](https://ploi.io/privacy-policy) page.

### How much does Ploi cost?

URL: https://ploi.io/documentation/introduction/how-much-does-ploi-cost
Last updated: 2020-08-24

For this we recommend you visit our [pricing page](https://ploi.io/pricing) to exactly see what the price is monthly and what the features are.

### Ploi IP for whitelisting

URL: https://ploi.io/documentation/introduction/ploi-ip-for-whitelisting
Last updated: 2026-09-09

When using Ploi to manage your servers and deploy applications, you may need to whitelist our IP addresses in your security configurations, firewalls, or other access control systems. This guide provides all the necessary IP addresses you'll need and explains the required ports for proper communication.

Worker server IP addresses
--------------------------

These are the main IP addresses used by Ploi's worker servers to deploy and manage your applications:

- 🇳🇱 \[SERVER\_MAIN\_IP\] - Web server
    
    
    - *IPv6: \[SERVER\_MAIN\_IP\_V6\]*
- 🇳🇱 \[SERVER\_IP\] - Amsterdam worker
    
    
    - *IPv6: \[SERVER\_IP\_V6\]*
- 🇳🇱 \[SERVER\_AMS\_IP\] - Amsterdam worker
    
    
    - *IPv6: \[SERVER\_AMS\_IP\_v6\]*
- 🇩🇪 \[SERVER\_FRANKFURT\_IP\] - Frankfurt worker
    
    
    - *IPv6: \[SERVER\_FRANKFURT\_IP\_V6\]*

Uptime monitoring server IP addresses
-------------------------------------

Ploi's uptime monitoring service uses the following IP addresses to check your site's availability:

- 🇳🇱 Amsterdam: 85.9.214.127
    
    
    - *IPv6: 2a04:3544:1000:1510:445b:ceff:feb7:1f38*
- 🇬🇧 London: 94.237.51.22
    
    
    - *IPv6: 2a04:3541:1000:500:445b:ceff:feb7:51af*
- 🇺🇸 Chicago: 209.50.49.15
    
    
    - *IPv6: 2605:7380:1000:1310:445b:ceff:feb7:74f5*
- 🇸🇬 Singapore: 95.111.198.27
    
    
    - *IPv6: 2a04:3543:1000:2310:445b:ceff:feb7:7d18*

Having monitoring servers in multiple geographic locations allows us to detect region-specific outages and provide more accurate uptime reporting.

Required ports for Ploi access
------------------------------

### SSH access (port 22)

Ploi requires SSH access (port 22) to your servers to perform:

- Initial server provisioning
- Server management operations
- Application deployment
- Script execution
- Package installation and updates
- Service management (restart, stop, start)

If your server uses a custom SSH port instead of the default port 22, you'll need to specify this port in your Ploi server configuration.

How to whitelist Ploi IPs
-------------------------

You can easily do that by going to the network tab in Ploi (in your server) and whitelist the worker IP's listed above.

However, if you'd like to do it manually, you can also do that:

```
sudo ufw allow from [SERVER_MAIN_IP] to any port 22 proto tcpsudo ufw allow from [SERVER_IP] to any port 22 proto tcp# Repeat for all Ploi IPs
```

### Cloud provider security groups

Most cloud platforms (AWS, DigitalOcean, Linode, etc.) allow you to configure security groups or network rules. Add inbound rules for the Ploi IP addresses to ports 22, 80, and 443.

Troubleshooting connection issues
---------------------------------

If Ploi cannot connect to your server after whitelisting:

1. Verify that the correct IP addresses were added to your whitelist
2. Check that port 22 (or your custom SSH port) is open for these IPs
3. Ensure your SSH service is running (`sudo systemctl status sshd`)
4. Check your server's firewall logs for blocked connection attempts
5. Verify network/cloud provider firewall settings

For further assistance with IP whitelisting or connection issues, please contact our support team.

IP changes
----------

We try to prevent adding/changing IP's as much as possible. If we do have an IP change or a new IP, we will be sending you an email in time notifying you about this in time.

### How do I upgrade my subscription?

URL: https://ploi.io/documentation/introduction/how-do-i-upgrade-my-subscription
Last updated: 2020-08-24

**Automatic subscription:**

Visit the [subscription](https://ploi.io/profile/subscription) page and on the right hand side you will see a box where upgrade possibilities are presented to you. If you upgrade to an higher plan we will also display additional costs for the days remaining.



**Manual subscription:**

If you have a manual subscription, you can just renew your license on the newer subscription, Ploi will then automatically upgrade your subscription in the background.

### How do I enable two factor authentication?

URL: https://ploi.io/documentation/introduction/how-do-i-enable-two-factor-authentication
Last updated: 2020-08-24

To keep your account safe you can use our built-in two factor authentication, what you need to install on your phone is [Google Authenticator](https://support.google.com/accounts/answer/1066447).

Next head over to your profile on ploi.io and click the "TwoFactor" tab.
[![](https://ploi.io/storage/SIT5UtJi81fjecZfRiJx5RZuEhHOHgDv64pbXVQI.png)CleanShot 2020-05-18 at 14.53.38.png 159.08 KB](https://ploi.io/storage/SIT5UtJi81fjecZfRiJx5RZuEhHOHgDv64pbXVQI.png)

Click the "Enable TwoFactor Authentication" button and follow the steps together with your phone and application opened. 

### How do I change my subscription to annual?

URL: https://ploi.io/documentation/introduction/how-do-i-change-my-subscription-to-annual
Last updated: 2020-12-21

When you have an active automatic subscription, you will first need to cancel this subscription. Don't worry you can safely cancel this subscription, your plan and expire date will still stay in place.

![](https://ploi.io/storage/WNzRaGnBBEAEoCpTEpfhgQ1IdzTPTLCRlGTLdwSY.png)

After cancelling, you will see the plans again. Select the plan you desire and press "Manual payment":

![](https://ploi.io/storage/tGrc9uOPvkTJDKmhi4583kWFxcntY5D7m380RP7S.png)

In here, you'll be able to select the desired months. When you checkout for a whole year you get a discount.

### How do I enter a discount code?

URL: https://ploi.io/documentation/introduction/how-do-i-enter-a-discount-code
Last updated: 2022-12-06

Currently, you can only enter a discount code when you're not on an automatic subscription. When you have an active automatic subscription, you can safely cancel that (your expiration date and plan will stay in place).

Next, you can select the desired plan and select "Manual payment":[![](https://ploi.io/storage/w7PtXPQFTcJ5Xp9vQqP5b8GMI0hEdAbdBbqyqlvo.png)CleanShot 2022-12-06 at 08.38.49.png 218.71 KB](https://ploi.io/storage/w7PtXPQFTcJ5Xp9vQqP5b8GMI0hEdAbdBbqyqlvo.png)

### How do I apply my VAT number?

URL: https://ploi.io/documentation/introduction/how-do-i-apply-my-vat-number
Last updated: 2021-11-23

For tax reasons, you might want to enter your VAT number to get eligible for exemption of VAT.

You can easily enter your VAT number inside your profile:

![](https://ploi.io/storage/MbVRWF9D9IO6OJs9LfdyhcP7nH5xwxEkOR3cllXt.png)

After adding your VAT number, future invoices will then reflect this change and be updated with the exemption. Old invoices cannot be changed anymore as they are already have been given out and processed.

### I have lost access to my 2FA app

URL: https://ploi.io/documentation/introduction/i-have-lost-access-to-my-2fa-app
Last updated: 2022-01-13

There might come a time that you're switching phones and forgot to move over the authenticator app. This will result in you being locked out of your account.

In this case, there are 2 things you can do.

1. When you enabled 2FA, Ploi gave back backup tokens, if you saved these tokens, you can use each of these tokens once to get access again. After you've gotten access, make sure to disable and enable 2FA again to make it work with your authenticator app again.
2. If you don't have these tokens anymore, get in touch with info@ploi.io from the email address that has been used for your Ploi account. We will then verify, and disable 2FA for your account.

### Ensuring Ploi's Continuity

URL: https://ploi.io/documentation/introduction/ensuring-plois-continuity
Last updated: 2024-10-10

In the spirit of transparency and commitment to our user community, this article outlines the robust continuity plan we have established for Ploi. It is designed to address any uncertainties and provide assurance regarding the sustained operation and development of Ploi, even in the event of the loss of the founder and owner. Our intention is to ensure that the innovative legacy of Ploi endures, continuing to serve developers and businesses around the world effectively.

### A legacy of innovation:

Ploi has embarked on a journey of commitment and innovation, with a focus on delivering top-notch services to our valued users. The collective aspiration of our team is to see the platform's legacy thrive, catering to the diverse needs of developers and businesses globally.

### Robust continuity plan:

To safeguard the resilience and evolution of Ploi, we have crafted a meticulous continuity plan, comprising the following key components:

1\. **Leadership transition:** A competent leadership team, familiar with Ploi's vision and operations, is prepared to assume responsibility and steer the platform toward sustained growth and development.

2\. **Operational resilience:** Automated tasks integral to Ploi’s functionality will persist without interruption. While there might be slight delays in support services and feature developments, we are committed to minimizing any disruptions and upholding the high service standards you expect.

3\. **Financial stability:** Strategic planning and partnerships have been established to secure Ploi’s financial health, ensuring the availability of necessary resources for effective operation and further advancement.

4\. **Community engagement:** The Ploi community is a vital element of our ecosystem. Our commitment to open communication, valuing your input, and fostering a collaborative environment remains steadfast.

5\. **Legal compliances:** We have put in place all necessary legal frameworks to facilitate a smooth transition of ownership and management, in compliance with relevant regulations and guidelines.

### Commitment to transparency:

Your trust in Ploi is invaluable to us, and we are devoted to maintaining transparency throughout any transition. Rest assured, any significant changes or developments will be promptly communicated through our official channels like the publically available [roadmap](https://roadmap.ploi.io).

### Your role in Ploi’s journey:

Our users are the cornerstone of Ploi’s success. We encourage your continued active participation in the community, your feedback, and your contributions to the platform’s growth. Your sustained support and engagement are instrumental in fostering Ploi’s ongoing innovation and excellence.

### In conclusion:

While discussing such eventualities might be uncommon, it underscores our unwavering commitment to Ploi and its user base. We are dedicated to ensuring that Ploi not only perseveres but thrives, fostering a future marked by innovation, reliability, and shared success.

We express our gratitude for your integral role in Ploi’s journey. Together, we will continue to cultivate a platform that stands the test of time, advancing in the ever-evolving world of SaaS.

### How to delete your Ploi account

URL: https://ploi.io/documentation/introduction/how-to-delete-your-ploi-account
Last updated: 2024-06-05

This guide provides step-by-step instructions on how to permanently delete your Ploi account. Deleting your account is irreversible, so please proceed with caution and ensure that you have saved any necessary data before initiating the deletion process.

Steps to delete your account
----------------------------

1\. **Access your profile:**

\- To begin, log in to your Ploi account.

\- Go to the profile edit page and scroll all the way down.

\- Under "Danger zone" you'll find a card to get started with deleting your account

2\. **Delete account:**

\- On this page, you'll need to fulfill a few steps before you can remove your account:

![](/storage/images/90c98ee3-1500-4b98-b8c3-9c29c9ca5202.png)

Important considerations
------------------------

\- **Data backup:** Ensure that you have backed up any necessary data or information from your Ploi account before deletion, as this process is irreversible.

\- **Subscription cancellations:** If you have any active subscriptions or services with Ploi, make sure to cancel them to avoid future charges.

\- **Timeframe:** The account deletion process may not be instantaneous. There may be a short period before your account is completely removed from Ploi's systems.

\- **Confirmation email:** The email to confirm account deletion is a critical step. If you don't receive this email, check your spam folder or contact Ploi support for assistance.

Need help?
----------

If you encounter any issues or have questions about the account deletion process, please reach out to support for assistance.

### How do teams and permissions work?

URL: https://ploi.io/documentation/introduction/how-do-teams-and-permissions-work
Last updated: 2026-06-15

Ploi teams let you collaborate with others — colleagues, clients or contractors — and control exactly what each member can do, per server.

Inviting a member
-----------------

Open your team settings and add a member by their e-mail address. Ploi sends them an invite link that's valid for 24 hours:

- If they already have a Ploi account, accepting the invite adds them to your team.
- If they're new, the link takes them to sign up with that e-mail, and they join your team once registered.

Only the team owner can invite or remove members.

How permissions work
--------------------

Permissions are **granular and per-server**, so a member can have different access on different servers. You can control access to things like managing sites, databases, PHP, SSH, firewall/network rules, cron jobs, queue workers and daemons, Docker, the file explorer, backups and server insights.

- The **team owner** (the account that owns the team) always has full access and bypasses permission checks.
- New members inherit the team's **default permissions**.
- You can grant extra permissions to a specific member on a specific server, disable inherited ones, and even limit them to specific sites.

Managing a member's permissions
-------------------------------

From your team, open the permissions screen for the member and server you want to configure, adjust their granular permissions (and the sites they may access), and save. Changes take effect immediately.

## SSH

### Basic SSH information

URL: https://ploi.io/documentation/ssh/basic-ssh-information
Last updated: 2018-07-18

By default, SSH password authentication is disabled for any server that is provisioned with Ploi. You can authenticate with SSH keys which you can find in our other tutorials on how to use these.

To login into root user, first login with the default **ploi** user, and then type **sudo su**, you will be prompted to enter a password which you received in the e-mail when your server completed installation.

### How do I connect with SSH? (Mac & Linux)

URL: https://ploi.io/documentation/ssh/how-do-i-connect-with-ssh-mac-linux
Last updated: 2020-11-03

You can enter your server with SSH using the default Terminal that MacOS provides, or you can use [iTerm](https://www.iterm2.com/) which is a expanded client with more preference options.

Once you opened your terminal, start by typing: `ssh ploi@{IP}` where you replace **{IP}** with your server IP and press enter. If you get a error like: "Permission denied (Public key)" this most likely means your SSH key is not present in the server. You can add your SSH key by going to your server, clicking the "SSH keys" tab and enter your SSH key.

If login was successful, your screen would look something like this:

![](https://ploi.io/storage/CstzF4UosiGS0LZPrul3mB8QNYZer3uXg7LC5XhX.png)

### How do I connect with SSH? (Windows)

URL: https://ploi.io/documentation/ssh/how-do-i-connect-with-ssh-windows
Last updated: 2023-06-02

In order to connect with a server over SSH you will need to generate a SSH key &amp; private key. [You can follow this tutorial to create these keys.](https://ploi.io/documentation/ssh/how-do-i-create-a-ssh-key-windows)

After you have received your keys, open up PuTTY itself, in the left sidebar scroll to: **Connection -&gt; SSH -&gt; Auth**:

![](https://ploi.io/storage/68/putty.png)

After that go back to the **Session** tab in the sidebar and enter your server's IP address (and in-case if your SSH port is different than 22, enter your correct SSH port).

You are now able to press **Open** and connect to your server. If you get an error similar to: **"Public key denied"** your keys do not match with each other. Check to be sure that your generated SSH key is present in your server.

### How do I login as root user?

URL: https://ploi.io/documentation/ssh/how-do-i-login-as-root-user
Last updated: 2018-07-31

You can login into the root user by first logging into the **ploi** user and then typing `sudo su`, this will prompt you for the sudo password which you received in the e-mail on server completion. By default root login is disabled so you always have to login through the ploi user because of safety precautions.

When you get the password prompt, bear in mind that you will not 'see' yourself typing the password, this is hidden. When done right, your terminal looks something like this:

![](https://ploi.io/storage/8/%5B53b9e66a7e3db7b45f54663429287f7d%5D_Schermafbeelding%2B2018-07-19%2Bom%2B07.23.32.png)

### How do I create a SSH key? (Mac & Linux)

URL: https://ploi.io/documentation/ssh/how-do-i-create-a-ssh-key-mac-linux
Last updated: 2020-04-16

**Important note: Never share your private key with anyone, you rarely even have to touch this key so keep it safe and only for your own eyes.**

Generating a SSH key is not that hard, open up a terminal and type the following: `ssh-keygen` it will now ask you some questions on where to store the SSH key, remember that path or customize it to your needs. You will also get a question on the passphrase, you can either leave this empty or type something random.

Whenever its created (and you can see this by the 'randomart image' that is being displayed after creation) you can copy your key:

```
cat ~/.ssh/id_rsa.pub
```

The above code will get your public key if you have not modified the path that was asked in previous questions, you will now be displayed with the SSH key in your terminal. You could also copy this straight away with:

```
cat ~/.ssh/id_rsa.pub | pbcopy
```

This will ensure the key is copied to your clipboard straight away so you can enter the key into your Ploi profile, or server.

### How do I create a SSH key? (Windows)

URL: https://ploi.io/documentation/ssh/how-do-i-create-a-ssh-key-windows
Last updated: 2021-09-11

You will need PuTTY to generate an SSH key easily and quickly. You can download [PuTTY here](https://www.putty.org/?ref=ploi.io).

After installing, open up PuTTYgen, you can find this application when opening start menu and search for "PuTTYgen".

![](https://ploi.io/storage/11/%5Bf9fb034f089b87f853ca98cbd8b367e3%5D_Image-2018-07-31-at-4.20.15-PM.png)

Make sure the type of key is set on "RSA" and press "Generate", you will be asked to move your mouse a few times over the grey area (this way it renders a unique pair).

![](https://ploi.io/storage/12/Image-2018-07-31-at-4.20.32-PM.png)

After this has been done, you will have a keypair generated. You can save this by pressing "Save private key", save this to a secure file location.

If you need the public key again you can return to PuTTYgen and load the private key back in.

![](https://ploi.io/storage/13/Image-2018-07-31-at-4.21.20-PM.png)

You will then need to copy the public key string displayed in the PuTTYgen window into Ploi to add your new SSH key to your Ploi servers. You need to make sure you use this string because if you use the "Save public key" option it will save it in a different format and will not work with Ploi.

### How do I change my SSH port?

URL: https://ploi.io/documentation/ssh/how-do-i-change-my-ssh-port
Last updated: 2021-09-27

Ploi allows you to manage your server with another port than 22. In this article we will explain how to do this without any troubles.

**Step 1.**

Make sure you portforward your new port, this is really important otherwise you'll lock yourself out the server. So make sure you forward the new port first (SSH is a TCP port).

You can do this by going to your server and select the "Network" tab, under here you can add the new SSH port.

[![](https://ploi.io/storage/VDAzrr0AwS7oxfKVimWZ7ROl4JIKsGY0dJ0bK3U3.png)](https://ploi.io/storage/VDAzrr0AwS7oxfKVimWZ7ROl4JIKsGY0dJ0bK3U3.png)

**Step 2.**

Login to the root user. If you do not know how read this article: [How do I login as root user?](https://ploi.io/documentation/ssh/how-do-i-login-as-root-user)

Change the port in the /etc/ssh/sshd\_config file, you edit this file using nano or vi. Locate this line:

```
# What ports, IPs and protocols we listen for
Port 22
```

Change the port here to the port you desired and forwarded.

Now restart SSH service: service ssh restart.

**Step 3.**

Open up Ploi's control panel, navigate to your server and open up the META tab. In here you find the possibility to change SSH port:

[![](https://ploi.io/storage/9YttLfXfKWXqCIrZopoY9d7QIjRfBGTiMxAvpQ88.png)](https://ploi.io/storage/9YttLfXfKWXqCIrZopoY9d7QIjRfBGTiMxAvpQ88.png)

After this, it is good to test your server connection in the settings tab. This way you're sure the connection is successful.

That's it, your SSH port is now changed and Ploi will keep on functioning!

### Can I safely change PermitRootLogin in the SSH config file?

URL: https://ploi.io/documentation/ssh/can-i-safely-change-permitrootlogin-in-the-ssh-config-file
Last updated: 2026-06-15

We strongly recommend leaving **PermitRootLogin** enabled. Ploi connects to your server as the root user to provision software and run management tasks, so disabling root login over SSH cuts off Ploi's access and your server can no longer be managed from the panel.

If you have security concerns, note that Ploi already hardens root access: password authentication is disabled, so root login is only possible with the SSH key Ploi installed during provisioning — it is key-only, never password-based.

For your own day-to-day access, use the less-privileged **ploi** system user and leave the root login in place for Ploi.

### Disable public key authentication in SSH

URL: https://ploi.io/documentation/ssh/disable-public-key-authentication-in-ssh
Last updated: 2019-06-25

You can disable the public key authentication and allow password authentication (you have received your password in the server installation finished e-mail)

1. Log into SSH
2. Edit the file with your favorite editor: `/etc/ssh/sshd_config`
3. Lookup the variable: PasswordAuthentication and change 'no' to 'yes'
4. Save and close the file
5. Run this command: `service sshd reload`

Now you will be able to SSH into your server without public keys.

## PHP

### Can I change my PHP version?

URL: https://ploi.io/documentation/php/can-i-change-my-php-version
Last updated: 2026-09-29

Yes. A server can have several PHP versions installed next to each other, and every site uses one of them. You can move a site to another installed version at any time, and install, update or remove versions per server. Ploi supports PHP 5.6 up to 8.5.

### Changing the PHP version of a site

Open the site and click the PHP version in the site details in the sidebar. Pick the version you want from the list. The list only shows up when the server has more than one PHP version installed and you are allowed to manage sites. The **PHP version** card in the site's **Settings** does the same.

Both only offer versions that are installed on the server. If the version you need isn't there, install it first, see below.

The switch takes a few seconds. Ploi points the site's NGINX configuration, and that of its tenants, at the PHP-FPM socket of the new version and reloads NGINX. The site keeps running during the switch.

### Check these after switching

- The deploy script. Ploi changes the PHP-FPM reload line, such as `service php8.3-fpm reload`, to the new version. Lines that call a fixed version, such as `php8.3 artisan migrate`, stay as they are. Write `{SITE_PHP}` instead of `php8.3` and `{SITE_COMPOSER}` instead of `composer`, those always use the site's current version.
- Queue workers. Every queue worker has its own PHP version. Click **Edit** on the worker and pick the new version. A worker without a version uses the server's CLI version.
- Cron jobs and daemons you added yourself that call a fixed version, such as `php8.3`.
- Your application. Make sure your code and its Composer packages support the new version before you switch. A staging site is a good place to try it first.

### Sites with their own system user

A site that runs under its own system user has its own PHP-FPM pool for each PHP version. When you switch such a site, Ploi creates a pool for the new version if there isn't one yet and restarts PHP-FPM of that version. That restart breaks off requests that other sites on the same version are handling at that moment.

### Installing and removing PHP versions

Open the server and go to **PHP**. The **PHP version** card lists every version Ploi supports and marks the ones on the server as **Installed**. Click **Install** to add a version. Installing takes a few minutes, runs one version at a time and doesn't change any site. If an installation looks stuck, a **Cancel** button appears. It only resets the status in Ploi, so check the server logs to see what happened on the server.

Each installed version has these options:

- **Set as CLI** picks the version that runs when you type `php` over SSH, and in cron jobs and workers that call plain `php`.
- **Set as default**, under **Edit**, picks the version for sites you create from now on. Existing sites keep their version.
- **Patch** updates the version to its latest patch release, for example from 8.3.10 to 8.3.14.
- **Edit FPM ini**, **Edit CLI ini** and **Edit pool**, under **Edit**, open the configuration files of that version. See [How do I edit the php.ini file?](/documentation/php/how-do-i-edit-the-phpini-file)
- **Uninstall** removes the version. The default version can't be uninstalled. When sites still use the version, Ploi asks whether it may move them to the default version first.

Upload size, memory limit and maximum execution time are set for the whole server in the **PHP settings** card on the same page, see [How can I change the max upload size?](/documentation/php/how-can-i-change-the-max-upload-size)

### Good to know

- On Ubuntu 18.04, PHP 8.2 and newer can't be installed.
- On older servers that run Apache behind NGINX, Apache can only use one PHP version. Switching one site there switches every site on the server.

### How can I change the max upload size?

URL: https://ploi.io/documentation/php/how-can-i-change-the-max-upload-size
Last updated: 2020-08-24

Whenever you use a file input type, it will be limited to whatever is set in your PHP and Nginx config on what the max upload sizes are. You can change these value easily inside Ploi's control panel. Just go to your server, click the "PHP" tab and search for the "Max PHP upload filesize" block. You can change the value here.

[![](https://ploi.io/storage/Qhs0zHoMXbpOsNkA9iMp1n9NEEArNovMvr4bFJej.png)CleanShot 2020-05-18 at 14.57.07.png 39.99 KB](https://ploi.io/storage/Qhs0zHoMXbpOsNkA9iMp1n9NEEArNovMvr4bFJej.png)

### How does OPcache work?

URL: https://ploi.io/documentation/php/how-does-opcache-work
Last updated: 2026-06-15

OPcache is a caching mechanism for PHP code, it will cache compiled PHP code so it is not compiled on each runtime. Ploi automatically installs OPcache for you so you only have to press one button to enable this feature. You can find this button in your server view &gt; PHP tab:

![Enable OPcache](/storage/images/e13f8411-de51-450c-a5be-ba6369509bb2.png "Enable OPcache")

The speed of your website will significantly increase if you have a PHP project, but there is one important thing to remember:

Whenever you enable OPcache, the code is cached and kept cached in the FPM worker. So if you deploy a new version of your website, the changes will **not** come through because the old code is still cached. This means you have to tell the FPM worker to clear its cache.

Clearing the FPM cache is easy: add this line at the end of your deploy script:

```
echo "" | sudo -S service php8.5-fpm reload
```

Change **8.5** to the PHP version you have.

For more information about OPcache, we [refer you to the original PHP website](https://www.php.net/manual/en/book.opcache.php).

### I added new code but changes are not coming through, what did I do wrong?

URL: https://ploi.io/documentation/php/i-added-new-code-but-changes-are-not-coming-through-what-did-i-do-wrong
Last updated: 2026-06-15

This is most likely due to the fact that you have OPCache enabled, which is actually no problem.

You will have to clean the OPCache's cache after new code has been submitted, this is because PHP code is cached in the FPM worker and will not refresh until you say it should.

In case of a deployment, you can either use these lines to refresh the FPM worker (to your deploy script):

```
echo "" | sudo -S service php8.5-fpm reload
```

In case of WordPress or any other PHP application you can reload through Ploi's UI inside the PHP tab, click "Reload PHP worker" then you're all set!

Automatically invalidating OPcache
----------------------------------

It is also possible to automatically invalidate the OPcache based on the **validate\_timestamps** &amp; **revalidate\_freq** setting.

To do this, edit your PHP FPM (which you can do in the panel under the PHP tab) and set the **validate\_timestamps** to **1** (which is true).

Next set the **revalidate\_freq** to any number you want it to check for updates, this number is in seconds. Setting this value to 0 will tell OPcache to check upon every request.

### How do I install imagick?

URL: https://ploi.io/documentation/php/how-do-i-install-imagick
Last updated: 2021-04-28

You can 1-click install PHP Imagick through the PHP tab. When you visit your server you'll see a PHP tab on the left, if you don't, you do not have PHP installed.

Go to that tab and locate the "Manage extensions" button:![](https://ploi.io/storage/ykbzsayprDDr4vPOSqd9jEztLCY3N49kzyr8FjEY.jpg)

In the modal that opens up, check the Imagick checkbox and press "Start installation", Ploi will now start installing Imagick for you.![](https://ploi.io/storage/P33ApUngY51Z3FwasfVBuGGjBnjzpwfE2fctBPly.png)

### How to increase OPcache memory consumption

URL: https://ploi.io/documentation/php/how-to-increase-opcache-memory-consumption
Last updated: 2024-01-15

When enabling OPcache via Ploi, Ploi will automatically set the memory consumption variable to use 512MB. At some point, you might want to increase this limit as your number of sites grow.

Luckily, changing this via Ploi is rather easy. First head over to your server and visit the PHP tab. Next press the menu button for the PHP version you'd like to change and select "Edit FPM".

[![](https://ploi.io/storage/j2tuRdtWibZK2Mb6Chadnv6huABsYwSaXru5CKN0.png)](https://ploi.io/storage/j2tuRdtWibZK2Mb6Chadnv6huABsYwSaXru5CKN0.png)

A modal will open with the PHP configuration, you can use **CTRL + F** or **CMD + F** to search inside this file and search for **opcache** preferably. You will see a variable called **memory\_consumption**, feel free to change this to a number to your liking. Make sure to not go over your available RAM.

![OPcache memory consumption](/storage/images/98426985-0ae8-464d-89e5-129687a2d441.png "OPcache memory consumption")

After you've changed your OPcache memory consumption, make sure to reload the FPM worker by either restarting or reloading it.

### How do I edit the php.ini file?

URL: https://ploi.io/documentation/php/how-do-i-edit-the-phpini-file
Last updated: 2024-05-13

In this FAQ, we'll guide you through the steps to edit the php.ini configuration file for your PHP settings. This file controls various PHP settings on your server, such as memory limits, file upload sizes, and execution times. Adjusting these settings can be crucial for optimizing the performance and security of your applications.

**Select your server**

Identify and click on the server you wish to configure. This will bring you to a specific server dashboard where you can manage all aspects of your server's setup.

**Access the PHP Settings**

Within the server dashboard, locate and click on the **PHP** tab. This tab will show you various PHP-related settings and configurations.

![PHP Tab](/storage/images/205d6d88-b759-42ac-b2fd-327eb6aaab03.png "PHP Tab")

**Edit PHP Configuration**

Find the **Edit** button associated with the desired PHP version. Next a dropdown will open, where you can select **Edit FPM ini** to edit your PHP ini file.

![Select PHP version](/storage/images/978762fe-e04e-4ab2-b4e9-9ef90acc54f6.png "Select PHP version")

**Make Your Changes**

You can now edit your PHP settings directly in the text editor provided. Adjust settings such as `upload_max_filesize`, `post_max_size`, `memory_limit`, and any other relevant directives based on your needs.

![PHP ini contents](/storage/images/40d9eae2-a1d0-4c53-898b-7976d9284b04.png "PHP ini contents")

**Save and Apply Changes**

Once you've made the necessary modifications, click the **Save** button to apply your changes. It may be necessary to restart PHP or the web server for the changes to take effect.

## Database

### How can I connect to my MySQL server?

URL: https://ploi.io/documentation/database/how-can-i-connect-to-my-mysql-server
Last updated: 2024-01-18

You can connect to your MySQL server via SSH, if you have your SSH key uploaded on the server, you don't need to enter a password, besides the SSH user (ploi in this case), and database user name.

There are several apps that make managing your MySQL table with SSH connection, think of [TablePlus](https://tableplus.com/?ref=ploi.io) (mac) or [HeidiSQL](https://www.heidisql.com/) (windows).

You will find an example below here to connect with TablePlus to your MySQL server:

![](https://ploi.io/storage/xSjezYNiQ4nGSw3biL6PChffwPehy5hLgAWCxDa8.png)

Any other client should look similar to this. In mainlines:

- **Host:** 127.0.0.1
- **User:** ploi
- **Password:** -enter your DB password you received-
- **Connection over SSH**
- **Server:** Your server's IP address
- **User:** ploi
- **Password:** -leave empty-
- **Use SSH key**

This example above, assumes you have the SSH key setup on your server so you can leave SSH password empty.

In the MySQL host and SSH Host you fill in the server's IP address where the MySQL server is located.

### My application cannot connect to the MySQL server

URL: https://ploi.io/documentation/database/my-application-cannot-connect-to-the-mysql-server
Last updated: 2026-06-15

If your application can't reach the MySQL/MariaDB server, work through the most common causes below.

**1. Use 127.0.0.1, not localhost**

In your application's configuration (for example Laravel's **.env**), set the database host to **127.0.0.1** instead of **localhost**. On Linux, **localhost** makes MySQL connect over a Unix socket, while **127.0.0.1** forces a normal TCP connection on port 3306, which is usually what you want.

**2. Check your credentials**

Confirm the database name, username and password match what you created in Ploi (Server &gt; Databases). A mismatch is the most common cause of "access denied" errors.

**3. Confirm the user may connect**

Ploi-created users may connect from the server itself. If you connect from another server, you must also allow remote access — see [How do I allow remote access to MySQL or MariaDB](https://ploi.io/documentation/database/how-do-i-allow-remote-access-to-mysql-or-mariadb).

**4. Make sure the database server is running**

SSH into your server and check the service:

```
systemctl status mysql
```

If it isn't running, start it with **systemctl start mysql** and check the logs for why it stopped.

### Where do I get Google Drive folder ID?

URL: https://ploi.io/documentation/database/where-do-i-get-google-drive-folder-id
Last updated: 2022-08-19

To be able to specify where your backups should be stored, Google Drive requires you to enter an ID. (It does not work with 'folder names')

Getting this folder ID is easy, navigate to <https://drive.google.com> and make a folder. After you did this, open up the folder and check the URL:

![](https://ploi.io/storage/39/Image-2019-02-14-at-11.16.51-AM.png)

Grab this ID and enter it inside the 'Folder ID's' inside the modal to specify that the backup has to be put in that folder.

It is also possible to grab the actual folder path, for example, if you have a folder path like Websites &gt; Backups you can use: &#96;/Websites/Backups&#96; as folder ID.

### How do I allow remote access to MySQL or MariaDB

URL: https://ploi.io/documentation/database/how-do-i-allow-remote-access-to-mysql-or-mariadb
Last updated: 2024-10-21

Setting up remote access to a MySQL server on your server can be useful for various reasons, such as managing your database from different locations or connecting applications hosted on separate servers to your database. It allows you to centralize your data storage and perform database administration tasks more efficiently.

Here's a simple guide to set up remote access to a MySQL server on an Ubuntu server, assuming you already have a MySQL server installed:

1\. Configure MySQL server to allow remote connections:

By default, MySQL only listens for local connections. You can edit the database configuration in Ploi by going to the **Manage** tab and by pressing **Edit database configuration**.[![](https://ploi.io/storage/TZTW37R1G3xqSQdozu1FhYYhF5qMAc5GivPJT9xl.png)CleanShot 2023-04-06 at 08.44.59.png 148.63 KB](https://ploi.io/storage/TZTW37R1G3xqSQdozu1FhYYhF5qMAc5GivPJT9xl.png)If you want to do it manually: open the MySQL configuration file (**my.cnf**) in a text editor. The location of this file can vary, but common locations are **/etc/mysql/mysql.conf.d/mysqld.cnf** or **/etc/mysql/my.cnf**.

Find the line with **bind-address** and change its value to **0.0.0.0** to allow connections from any IP address, or set it to a specific IP address to restrict remote access to that address:

```
bind-address = 0.0.0.0
```

Save the file.

2\. Restart MySQL service:

Restart the MySQL service for the changes to take effect, you can do that via the **Service** tab or by running this command in SSH:

```
sudo systemctl restart mysql.service
```

3\. Create a remote user

Now you'll have to create a user that allows remote connections, you can do that by pressing the dropdown in the **Databases** tab behind your database, and press **Users**.

Next, create a fresh user with remote access on, optionally fill in an IP address.

[![](https://ploi.io/storage/TiNUqdDzMdkyEZEr0kR2NiKnoOdYiWRNatvKFmer.png)CleanShot 2023-04-06 at 08.41.17.png 88.96 KB](https://ploi.io/storage/TiNUqdDzMdkyEZEr0kR2NiKnoOdYiWRNatvKFmer.png)4. Update firewall rules

If you have a firewall enabled (e.g., UFW), you will need to allow connections to the MySQL server. By default, MySQL listens on port 3306. To allow incoming connections on this port, you can head over to the **Network** tab and allow the port 3306 there.

If everything is set up correctly, you should now be connected to your MySQL server remotely.

If you're more of a visual learner, we also have a quick video on how to achieve this:

### How do I restore a database backup?

URL: https://ploi.io/documentation/database/how-do-i-restore-a-database-backup
Last updated: 2020-11-03

You can easily restore a backup through our panel. Open up the backups window on the database overview, and click the files button.

![](https://ploi.io/storage/PNsHXlAGx6lIeSzJnufSTGz8vSYTBj2poemYAsYv.png)

Then you'll see the option to "Restore" a backup.

![](https://ploi.io/storage/zmpl215KuFfWuzS09eZoM354ZlHYjmcykMpueX98.png)

Please note that restoring your database might take a while depending on the size of your database. We also recommend to have your application in maintenance mode if possible to prevent any new additional data being added to your database.

### How to add AWS as backup provider

URL: https://ploi.io/documentation/database/how-to-add-aws-as-backup-provider
Last updated: 2026-06-15

To use AWS S3 as a backup destination in Ploi you need an IAM user with an access key/secret pair that can write to your backup bucket. This guide walks through the current AWS console flow.

1. Create the IAM user
----------------------

Sign in to the [AWS IAM console](https://console.aws.amazon.com/iam/), open **Users** in the sidebar and click **Create user**. Give the user a name (for example `ploi-backups`) and continue. AWS no longer asks you to choose "Programmatic access" at this step — you create an access key separately once the user exists.

2. Attach a permissions policy
------------------------------

On the permissions step, choose **Attach policies directly**. For the quickest setup you can attach the built-in **AmazonS3FullAccess** policy, but we recommend a least-privilege policy scoped to just your backup bucket. Choose **Create policy**, switch to the JSON editor and paste the following, replacing `your-bucket-name` with your bucket name:

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": ["s3:ListBucket", "s3:GetBucketLocation"],
            "Resource": "arn:aws:s3:::your-bucket-name"
        },
        {
            "Effect": "Allow",
            "Action": ["s3:PutObject", "s3:GetObject", "s3:DeleteObject"],
            "Resource": "arn:aws:s3:::your-bucket-name/*"
        }
    ]
}
```

Give the policy a name, create it, then attach it to your new user.

3. Create an access key
-----------------------

Open the user you just created, go to the **Security credentials** tab and click **Create access key**. Choose **Third-party service** (or "Application running outside AWS") as the use case, confirm, and create the key.

You'll be shown an **Access key ID** and a **Secret access key**. Copy both now — the secret is only shown once.

4. Add the credentials to Ploi
------------------------------

In Ploi, add AWS as a backup provider and enter the access key, secret key, your bucket name and its region. Your database and file backups can now be stored in S3.

### How do I create DigitalOcean Spaces credentials for database backups?

URL: https://ploi.io/documentation/database/how-do-i-create-digitalocean-spaces-credentials-for-database-backups
Last updated: 2021-05-27

In order for you to create backups with DigitalOcean spaces, you will need the correct credentials to authenticate with it.

We will need 4 variables:

1. Bucket name
2. Endpoint (e.g. https://ams.digitaloceanspaces.com)
3. Spaces access key
4. Spaces secret key

First lets grab the key's, head over to [Applications &amp; API](https://cloud.digitalocean.com/account/api/tokens) inside DigitalOcean and generate a new key for Spaces:

![](https://ploi.io/storage/GdQC4dpOHjagQGz55r3tmUNYtC7bJyfWqO0fgc5b.png)

Save the access key and secret key somewhere safe, we will need these variables to create a backup configuration in your profile.

Next determine what your bucket name and endpoint is. In the sidebar press "Spaces", in there you might already have a bucket or you can create a new one.

Once you created one, you will see the bucket name at the top:

![](https://ploi.io/storage/9i2LEZhmT3PrMhIujfb18BdwRTOVhgdgbljkKf9e.png)

Finally lets grab the endpoint, visit your bucket and press the "Settings", scroll down until you see the Endpoint:

![](https://ploi.io/storage/flEhBSQhcVyYtaSpIiZTeeBuhKomoOXcHrfedM3F.png)

Now you have all 4 variables you need to configure the database backup in your profile. After that you can easily create backups using that configuration for multiple databases.

### How do I configure UpCloud object storage as backup provider?

URL: https://ploi.io/documentation/database/how-do-i-configure-upcloud-object-storage-as-backup-provider
Last updated: 2021-11-16

To configure UpCloud object storage as a backup provider you will have to create this as a backup configuration in your profile, head over [here](https://ploi.io/profile/backup-configurations) to start creating this.

Make sure to fill in the fields illustrated like below:

![](https://ploi.io/storage/C0BYMF8Vv3CJQ1xqwtZwiNEcI8VlCXMumVb3XlaF.png)

You may create new object storage servers with UpCloud [here](https://hub.upcloud.com/object-storage), you will receive the access key, secret key, region name and endpoint when you're creating the bucket.

### How to allow remote access to PostgreSQL

URL: https://ploi.io/documentation/database/how-to-allow-remote-access-to-postgresql
Last updated: 2025-09-05

Setting up remote access to a PostgreSQL server on your server can be useful for various reasons, such as managing your database from different locations or connecting applications hosted on separate servers to your database. It allows you to centralize your data storage and perform database administration tasks more efficiently.

Here's a simple guide to set up remote access to a PostgreSQL server on an Ubuntu server, assuming you already have a PostgreSQL server installed:

1. Configure PostgreSQL server to allow remote connections
----------------------------------------------------------

By default, PostgreSQL only listens for local connections. You need to modify two configuration files to enable remote connections.

### Edit postgresql.conf

You can edit the database configuration in Ploi by going to the **Manage** tab and pressing **Edit database configuration**.

If you want to do it manually: open the PostgreSQL configuration file (postgresql.conf) in a text editor. The location of this file typically is `/etc/postgresql/{version}/main/postgresql.conf` where {version} is your PostgreSQL version (e.g., 14, 15, 16).

Find the line with `listen_addresses` and change its value to `'*'` to allow connections from any IP address, or set it to specific IP addresses to restrict remote access:

```
listen_addresses = '*'

```

If the line is commented (starts with #), uncomment it by removing the # symbol.

Save the file.

### Edit pg\_hba.conf

Next, you need to configure client authentication. Open the pg\_hba.conf file, typically located at `/etc/postgresql/{version}/main/pg_hba.conf`.

Add the following line to allow connections from any IP address (adjust as needed for your security requirements):

```
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all             all             0.0.0.0/0               md5

```

For better security, you can restrict access to specific IP addresses or IP ranges:

```
host    all             all             192.168.1.0/24          md5
host    all             all             10.0.0.5/32             md5

```

The authentication methods can be:

- `md5`: Password-based authentication (encrypted)
- `scram-sha-256`: More secure password authentication (recommended for PostgreSQL 10+)
- `trust`: No authentication (not recommended for remote connections)

Save the file.

2. Restart PostgreSQL service
-----------------------------

Restart the PostgreSQL service for the changes to take effect. You can do this via the **Service** tab in Ploi or by running this command in SSH:

```
sudo systemctl restart postgresql

```

3. Create a remote user and grant privileges
--------------------------------------------

Now you'll need to create a user that can connect remotely. You can do this by pressing the dropdown in the **Databases** tab behind your database, and press **Users**.

Next, create a fresh user with remote access enabled, optionally fill in an IP address for additional security.

Alternatively, you can create a user via the PostgreSQL command line:

```
sudo -u postgres psql

```

Then run:

```
CREATE USER remote_user WITH PASSWORD 'your_secure_password';
GRANT ALL PRIVILEGES ON DATABASE your_database TO remote_user;

```

For more granular permissions:

```
-- Grant specific privileges
GRANT CONNECT ON DATABASE your_database TO remote_user;
GRANT USAGE ON SCHEMA public TO remote_user;
GRANT CREATE ON SCHEMA public TO remote_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO remote_user;

```

Exit PostgreSQL:

```
\q

```

4. Update firewall rules
------------------------

If you have a firewall enabled (e.g., UFW), you will need to allow connections to the PostgreSQL server. By default, PostgreSQL listens on port 5432.

To allow incoming connections on this port, you can head over to the **Network** tab in Ploi and allow port 5432 there.

Alternatively, via command line:

```
sudo ufw allow 5432/tcp

```

For better security, restrict access to specific IP addresses:

```
sudo ufw allow from 192.168.1.100 to any port 5432

```

5. Test the remote connection
-----------------------------

You can test the remote connection using the psql client from another machine:

```
psql -h your_server_ip -U remote_user -d your_database -p 5432

```

Or use a connection string:

```
psql "postgresql://remote_user:your_password@your_server_ip:5432/your_database"

```

Security best practices
-----------------------

1. **Use strong passwords**: Always use complex, unique passwords for database users
2. **Limit IP addresses**: Restrict access to specific IP addresses when possible
3. **Use SSL/TLS**: Configure PostgreSQL to use encrypted connections
4. **Regular updates**: Keep PostgreSQL and your system updated
5. **Monitor access logs**: Regularly check PostgreSQL logs for unauthorized access attempts
6. **Use connection pooling**: For applications, consider using connection pooling to manage connections efficiently
7. **Implement proper user permissions**: Grant only necessary privileges to each user

Troubleshooting
---------------

If you cannot connect remotely, check the following:

1. **PostgreSQL is running**: `sudo systemctl status postgresql`
2. **Configuration is correct**: Verify listen\_addresses in postgresql.conf
3. **Authentication is configured**: Check pg\_hba.conf entries
4. **Firewall allows connections**: Verify port 5432 is open
5. **Network connectivity**: Test with `telnet your_server_ip 5432`
6. **Check PostgreSQL logs**: Located at `/var/log/postgresql/postgresql-{version}-main.log`

If everything is set up correctly, you should now be connected to your PostgreSQL server remotely.

### How do I create a database and database user?

URL: https://ploi.io/documentation/database/how-do-i-create-a-database-and-database-user
Last updated: 2026-06-15

Ploi lets you create databases and database users directly from the panel. Depending on your server type this manages MySQL, MariaDB or PostgreSQL.

Creating a database
-------------------

Open your server and go to the **Databases** section, then add a database. You provide:

- **Name** — the database name (2–64 characters; letters, numbers and underscores).
- **User** (optional) — create a database user at the same time. Leave it empty to create just the database.
- **Password** (optional) — the password for that user. Ploi can generate a strong one for you.
- **Read-only** — if enabled, the user is granted `SELECT` only instead of full privileges.
- **Description** — an optional note.

Ploi creates the database (and user, if provided) on the server and grants the appropriate privileges. Passwords are stored encrypted.

Adding more users
-----------------

A database user can be reused across multiple databases. From the Databases section you can create a new user with a password, or assign an existing user to another database.

For MySQL/MariaDB, users connect from `127.0.0.1` by default. To connect from another machine, create the user with remote access enabled and set the allowed IP — see [How do I allow remote access to MySQL or MariaDB](https://ploi.io/documentation/database/how-do-i-allow-remote-access-to-mysql-or-mariadb) (or the [PostgreSQL guide](https://ploi.io/documentation/database/how-to-allow-remote-access-to-postgresql)).

Connecting from your application
--------------------------------

Use `127.0.0.1` (not `localhost`) as the host in your application's configuration. See [My application cannot connect to the MySQL server](https://ploi.io/documentation/database/my-application-cannot-connect-to-the-mysql-server) if you run into issues.

### How do I clone a database?

URL: https://ploi.io/documentation/database/how-do-i-clone-a-database
Last updated: 2026-09-28

Cloning a database copies it to a new database, on the same server or on another server. Use it to give a staging site its own copy of the production data, or to move a database to a separate database server. The original database stays as it is. Database cloning is available on all paid plans.

### Step by step

1. Open the server and go to **Databases**.
2. Click the three dots next to the database and choose **Clone**.
3. Pick the server to clone to. You can pick the same server or another server or database server, as long as it runs the same database type. A MySQL database can go to MySQL servers, MariaDB to MariaDB and PostgreSQL to PostgreSQL.
4. Enter a name for the new database. It can't exist on the target server yet, and it may only contain letters, numbers and underscores.
5. Optionally, fill in a user and password. Ploi creates that user for the new database. You need both fields for this, a user without a password is skipped.
6. Leave **Clone data** ticked to copy the contents. Untick it if you only need the tables without their rows.
7. Tick **My database is bigger than 4GB** for large databases. See below.
8. Click **Start**.

Both databases show a cloning status until the copy is done.

### Database users

Ploi doesn't copy the users of the original database. Either create one in the clone form, or add one to the new database afterwards. Then update your application's `.env` or configuration file with the new database name, user and password.

### How the copy works

Ploi makes a dump with `mysqldump` or `pg_dump` and imports it into the new database. Writes that happen after the dump started are not in the copy.

To another server, Ploi zips the dump, sends it to the target server with rsync over SSH and imports it there. It removes the dump files from both servers afterwards. For MySQL and MariaDB this dump uses `--single-transaction`, so the tables stay writable and your site keeps running.

On the same server, Ploi pipes the dump straight into the new database. For MySQL and MariaDB, `mysqldump` locks the tables of the original database until it has read them, so writes from your site wait during that time. On a large database behind a busy site, clone at a quiet moment. PostgreSQL does not block writes during a dump.

### Databases over 4GB

The zip step can't handle files over 4GB. Tick **My database is bigger than 4GB** and Ploi sends the dump uncompressed. That transfer takes longer, and the source server needs room for the full dump.

### Requirements for cloning to another server

- Both servers run the same database type.
- The source server has at least 100 MB free, plus room for the dump itself. The clone refuses to start below 100 MB.
- The source server can reach the SSH port of the target server. If a firewall at your hosting provider or on the target server blocks that, the transfer fails.
- rsync is installed on both servers. Ploi installs it when it is missing.

When the versions differ, for example MySQL 8.4 on the source and 8.0 on the target, Ploi imports the dump as is and notes the difference in the log. Most dumps import fine, but a feature the older version doesn't know stops the import.

### If something goes wrong

When a clone fails, Ploi emails the server owner with the error, and the server logs contain the full output of the dump and import. The new database may already exist on the target server by then, so delete it before you try again with the same name.

### Cloning a whole site

For a WordPress site you can clone the files and the database together, and Ploi updates `wp-config.php` and the URLs for you. See [How do I clone a site?](/documentation/domains/how-do-i-clone-a-site)

### How do I set up database and file backups?

URL: https://ploi.io/documentation/database/how-do-i-set-up-database-and-file-backups
Last updated: 2026-09-29

Ploi can back up your databases and site files on a schedule and upload the archive to storage you choose, such as S3, Google Drive or an SFTP server. Setting it up takes two steps. First you add a backup configuration, which is where the backups go. Then you create a backup for one or more databases or sites that uses it. Backups are part of the Pro and Unlimited plans. On a team, the plan of the team owner counts.

### 1. Add a backup configuration

Open your profile and go to **Backup configurations**. Pick a type, give it a label and fill in the credentials. Ploi stores them encrypted. These types are available:

- AWS S3, DigitalOcean Spaces and Custom S3. Custom S3 works for any S3 compatible storage, such as UpCloud, Wasabi or a MinIO storage server. You need an access key, a secret and a bucket, and for Spaces and Custom S3 also the endpoint. For Spaces that is the region endpoint without the bucket name, for example `https://fra1.digitaloceanspaces.com`.
- Dropbox and Google Drive. Link the account under **Integrations** in your profile first.
- SFTP, with an SSH key or a password, and FTP.
- Rclone, for any other storage rclone supports. You fill in the rclone flags and the remote destination, for example `:b2:mybucket/path`.
- Local, which keeps the archive on the server itself. That doesn't help when you lose the server, so use it next to a remote backup, not instead of one.

Step by step guides for some providers: [AWS](/documentation/database/how-to-add-aws-as-backup-provider), [DigitalOcean Spaces](/documentation/database/how-do-i-create-digitalocean-spaces-credentials-for-database-backups), [UpCloud](/documentation/database/how-do-i-configure-upcloud-object-storage-as-backup-provider), [MinIO](/documentation/storage-server/how-do-i-backup-to-my-minio-storage-server) and [the Google Drive folder ID](/documentation/database/where-do-i-get-google-drive-folder-id).

To use the same credentials with another bucket, click **Duplicate** on the configuration. You enter the new bucket, or the new remote for rclone, and Ploi copies the type and credentials over.

A configuration is shared by every backup that uses it. Changing its type changes it for all of those backups, and deleting the configuration deletes those backups too. The files already on your storage stay there.

On a team, backups always use the backup configurations of the team owner.

### 2. Create a backup

Click **Backups** in the sidebar. The page has a **Databases** tab and a **Sites** tab. Click **Create database backup** for databases, or create a site file backup from the Sites tab. The form asks for:

- The server and the backup configuration.
- The databases or sites to back up. You can select several at once. **Select all without backups** picks everything that doesn't have a backup yet.
- The interval. Database backups can run every night, every 10 to 60 minutes, every 2, 4, 8, 12 or 24 hours, weekly or monthly. File backups run every hour at most. Monthly means every 43,800 minutes, so the date moves a little each month.
- The start time of the first run, in the timezone of your profile. Every next run is the start time plus the interval.
- **Keep amount of backups**. With 7, Ploi deletes the oldest file on the storage when there are more than 7. With 0 it keeps every file.
- For a site, the path to back up. It starts as the site directory and you can narrow it to a folder inside it.

Optional settings are a path on the storage, tables to exclude for databases, folders and files to exclude for sites, such as `storage/*` or `node_modules/*`, a ZIP password, a custom file name, ZIP or TAR compression and whether to delete the local archive when the upload fails.

Click **Create**, or **Create and run** to make the first backup right away. That extra run doesn't change the schedule.

For FTP and Rclone, the create form doesn't show **Keep amount of backups**. Create the backup first and set it with **Edit**.

### What happens during a backup

Ploi checks every five minutes which backups are due, so a backup starts up to a few minutes after its scheduled time. A run that takes longer than 60 minutes is stopped.

For a database, Ploi makes a dump with `mysqldump` or `pg_dump` in `/home/ploi/.ploi` on the server. MySQL and MariaDB dumps use `--single-transaction`, so the tables stay writable during the backup. For a site, Ploi archives the files as the site's system user in that user's home directory. On a site with zero downtime deployment, the archive contains the deploy directory with its releases. Ploi then uploads the archive and removes it from the server.

Because the archive is built on the server first, the server needs enough free disk space to hold it.

### Good to know

- A file backup stops when the site's system user can't read some of the files. The error lists up to ten of those paths. Make them readable for the site user, for example with **Reset permissions** on the site's **Manage** page, and run the backup again.
- A ZIP password can't contain `&`, `@` or `$`, and you can't change it after you create the backup. Use **Request ZIP password** in the edit screen to get it by e-mail. TAR archives don't support a password, so pick ZIP when you need one.
- With a custom file name, every run uploads a file with that same name, so each backup replaces the previous one. Leave **Keep amount of backups** at 0 when you use a custom name.

### Failures and notifications

When a backup fails, the table shows **Failed** with the number of attempts. Click it to read the error. Ploi e-mails the server owner about the failure. After 5 failed runs in a row, Ploi pauses the backup. Fix the cause, then switch **Pause** off again, which also resets the attempt counter. A backup that waits in the queue for more than an hour is marked as stuck and paused as well.

To get messages in Slack, Discord or another channel, click **Notifications** on the backup. Pick a notification channel and an event: before the backup, after the backup or when it fails. When you add a channel for failed backups, it replaces the e-mail.

### Managing backups

Every backup in the table has **Run**, **Pause**, **Edit**, **Notifications** and **Delete**. You can filter the tables by server, status, backup configuration and interval. Deleting a backup removes the schedule in Ploi. The files on your storage stay where they are.

Database backups also have **Files**, which lists the stored backups and lets you restore one, see [How do I restore a database backup?](/documentation/database/how-do-i-restore-a-database-backup) Restoring from the panel isn't available for FTP and SFTP backups. Site file backups can't be restored from the panel, download the archive from your storage and extract it on the server.

### When a payment fails

When the payment for your subscription fails three times, Ploi stops starting automatic backups. Nothing is deleted. The backups start again on their own once the payment goes through.

## Server

### Can I see server logs?

URL: https://ploi.io/documentation/server/can-i-see-server-logs
Last updated: 2020-11-03

Yes, you can see all the logs in Ploi. Everything you do with Ploi, will be logged into the 'logs' page from your server. This will make debugging easier and quicker.

You can find the logs inside the left sidebar when you visit your server in Ploi.

![](https://ploi.io/storage/DRUPvUrhpSewL5YYfevGxVHgaVXTsppjlp1RDPwh.png)

### How can I use SFTP?

URL: https://ploi.io/documentation/server/how-can-i-use-sftp
Last updated: 2022-03-03

By default, no FTP server is installed. But you can use SFTP which comes standard with the SSH protocol, you do not have to install anything on your server.

To connect to SFTP, you could either use the terminal or a FTP client. We recommend using [Coda 2](https://panic.com/coda/) or [Filezilla](https://filezilla-project.org/).

Normally, you would not have to enter a password because you authenticate with your SSH key. This can be done with any FTP client basically, you can authenticate with your SSH key file.

### How do I update/upgrade packages on my server?

URL: https://ploi.io/documentation/server/how-do-i-updateupgrade-packages-on-my-server
Last updated: 2021-07-27

**Note:** In order to use the commands written down here you will need to [login as root user](https://ploi.io/documentation/ssh/how-do-i-login-as-root-user).

When you install your server with Ploi, it will automatically be setup to install security updates automatically. However, package updates are not automatically applied.

You can use our automatic update system which is visible under the "Manage" tab, or you can do this manually.

To do this manually run `apt update && apt upgrade`

Running this command is safe and cannot harm anything generally speaking. It is possible that Ploi is still telling you that there are still updates, in order to clear those you will need to run the command below here.

If you want to update all the kernel files as well: `apt update && apt dist-upgrade`, if there are any packages eligible for upgrade then your server will display these.

**Important:** Running `apt dist-upgrade` can be a dangerous command. There is a chance you will get asked questions about changed configuration files. If you want to stay in the safe zone select the option to keep the current installed one.

If you have a server that is still telling you that there are updates to be done, and Ploi's update system has run, that means that there are kernel updates to be done (which can be run with the command above: `apt update && apt dist-upgrade`)

Please note that Ploi will get the total number of updates each night, so there could be a difference in what you see in our UI and your server. You can force to update this number however by pressing the "Test connection" button and wait a while.

This is an example image of a server that has just run its updates, but there are still kernel updates left:

![](https://ploi.io/storage/Y8UZI0KrL9TlWn5NmkTVT1KXI0TBlwGAKcm7mYQk.png)

### How do I group servers?

URL: https://ploi.io/documentation/server/how-do-i-group-servers
Last updated: 2021-07-05

It is possible to create Projects in Ploi and assign servers to those projects so you can separate them easily.

On the left press Projects and create a new project. You also have the ability to assign servers to that project right away.

![](https://ploi.io/storage/qebkO5KnN3L4cZcByrQr6yKCsEhWMaEfgylyw8KQ.png)

The servers overview will also automatically group your servers into the right groups under each other sorted by alphabet group name.

When deleting a project your attached servers will still exist, it will just detach from the created project.

### How do I enable fail2ban on my server?

URL: https://ploi.io/documentation/server/how-do-i-enable-fail2ban-on-my-server
Last updated: 2018-10-18

The fail2ban software is installed by default on your server when provisioned with Ploi, it is not enabled because we leave this up to the user to configure. (It is not started either to save resources)

This guide is about enabling fail2ban and configuring it correctly with the UFW firewall.

First of, verify that there is a `ufw.conf` file present inside the `/etc/fail2ban/action.d` directory. If there is, continue with this tutorial.

We have to start configuring fail2ban to use the ufw firewall, start by copying the `jail.conf` file to the `jail.local` file:

```
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

```

Open up the `/etc/fail2ban/jail.local` file in your favorite editor (nano or vim) and find the `banaction` directive. Change the value to shown:

```
banaction = ufw
```

Next execute these commands to enable the fail2ban service:

```
sudo systemctl enable fail2ban && systemctl start fail2ban
```

To check if the service is running, execute the following command:

```
service fail2ban status
```

### Where do I find my logs from queue's & cronjobs?

URL: https://ploi.io/documentation/server/where-do-i-find-my-logs-from-queues-cronjobs
Last updated: 2021-05-14

All the output that comes from daemons, queue's and logs are outputted to this folder:

```
/home/ploi/.ploi
```

You can find the respectively logs by identifying them by the ID thats in the name of the file. For example you will be able to find these logs if you have any daemons, queue's or cronjobs setup:

- worker-{id}.log - *Workers are daemons and queue's*
- scheduled-{id}.log - *Schedules are the cronjobs and their output*

The ID will match the one in your panel so you will know which log file to monitor/check.

### How do I migrate from Runcloud?

URL: https://ploi.io/documentation/server/how-do-i-migrate-from-runcloud
Last updated: 2026-09-22

Ploi can take over a server that RunCloud provisioned. It connects over SSH, installs its own stack next to RunCloud's and moves your web apps onto it. You keep the server, the IP address and your files. RunCloud runs its own NGINX, Apache and PHP builds under `/RunCloud/Packages`, with apps under `/home/<user>/webapps`, so the import replaces that stack rather than only registering it. Your apps go offline only for the short moment Ploi switches serving over to its own NGINX, about a minute. The import is in beta, so make a snapshot at your provider before your first one.

![](https://ploi.io/storage/HwR55aRDPf7apSUIidLXNXsZzQL6uGpzdwCmwGgu.png)

### Before you start

- You need root access over SSH.
- The server runs Ubuntu 22.04, 24.04 or 26.04, or Debian 12 or 13, and is not managed by Ploi yet.
- The server uses RunCloud's **NGINX** or **NGINX + Apache2 Hybrid** web stack. **OpenLiteSpeed servers cannot be imported**, the scan will refuse them.
- Each app you want to import needs a real domain, not just the server IP.
- Leave the server connected in RunCloud until the import is done. Disconnecting is an optional last step.

### Step by step

1. In Ploi, open **Servers**, click **Create server** and pick **Import server**.
2. Choose RunCloud and fill in a name, the IP address and the SSH port.
3. Run the command Ploi shows you as root on the server. It only adds Ploi's SSH key to `/root/.ssh/authorized_keys`.
4. Click **Verify connection &amp; scan**. The scan is read-only and takes under a minute.
5. Review the apps and databases that were found, tick the sites you want and choose whether to disconnect from RunCloud at the end.
6. Start the import and follow the progress on the building page.

### What Ploi changes

Because RunCloud uses its own stack, the import installs Ploi's native stack and moves your apps onto it. Everything that can be installed while RunCloud keeps serving is done first, then Ploi switches serving over in one short step.

- Ploi adds a **ploi** user and installs its own NGINX, a PHP-FPM build for each version your apps use, certbot, supervisor and its base cronjobs.
- Each app moves from `/home/<user>/webapps/<app>` to Ploi's `/home/<user>/<domain>` layout and keeps its PHP version and web directory. Its RunCloud system user becomes a Ploi system user, with the SSH key it already has.
- Ploi generates an NGINX vhost and a PHP-FPM pool for each site from its own template, checks the configuration with `nginx -t`, then stops RunCloud's NGINX, Apache and PHP-FPM and reloads its own NGINX so the sites serve through Ploi.
- Databases and database users are registered. MySQL only stores password hashes, so use **reset password** in Ploi when you need one and update the application's configuration.
- The cron jobs RunCloud scheduled are taken over and shown in the panel, with their app paths rewritten to the new location so they keep working.
- RunCloud's own services are stopped, not removed, so the move can be reversed.

### A note on .htaccess

On the NGINX + Apache stack RunCloud serves apps through NGINX in front of Apache, which reads `.htaccess` files. Ploi is NGINX only. Laravel and WordPress work through the NGINX rules Ploi generates, but if an app relies on custom `.htaccess` rules you will need to translate those into the site's NGINX configuration in Ploi afterwards. Apps on RunCloud's Native NGINX stack are not affected.

### Certificates

RunCloud's Let's Encrypt certificates are registered so Ploi can warn you before they expire, but RunCloud stops renewing them once the server leaves it. Request a new Let's Encrypt certificate from the site's SSL tab in Ploi, and Ploi renews it from then on. A site without a certificate serves over plain HTTP until you issue one.

### Deployments

RunCloud keeps deployment settings in its own panel, so there is nothing on the server to take over. Each imported site receives Ploi's default deploy script. Set up the repository and deploy steps per site in Ploi, and enable zero downtime deployments if you want them.

### Disconnecting from RunCloud

With the disconnect option on, the last step stops and disables RunCloud's agent so it no longer manages the server. Its packages stay installed so the move can be reversed. Remove the server from your RunCloud dashboard to finish disconnecting. With the option off, RunCloud keeps managing the server until you do. Cancel your RunCloud subscription only after the import has finished and you have verified the sites.

### If something goes wrong

Every step writes to the server logs. If a site's NGINX configuration does not pass `nginx -t`, or a PHP-FPM socket is missing, the import stops and the server shows as failed, so nothing is left half-switched. You can retry the import from the server, and every step skips what an earlier run already did. Send us the server ID through support if you need a hand.

### How do I migrate from Serverpilot?

URL: https://ploi.io/documentation/server/how-do-i-migrate-from-serverpilot
Last updated: 2026-09-08

Ploi can take over a server that ServerPilot provisioned. It connects over SSH, installs its own stack next to ServerPilot's and moves your apps onto it. You keep the server, the IP address and your files. ServerPilot runs a different setup than Ploi (its own NGINX, Apache and PHP under `/opt/sp`, with apps under `/srv/users`), so the import replaces that stack rather than only registering it. Your apps go offline only for the short moment Ploi switches serving over to its own NGINX, about a minute.

![](https://ploi.io/storage/kVliEnaaRzJbXc7z4ngNeOBTybYaT1wOyuHdBCWJ.png)

### Before you start

- You need root access over SSH.
- The server runs Ubuntu 22.04, 24.04 or 26.04, or Debian 12 or 13, and is not managed by Ploi yet.
- Each app you want to import needs a real domain, not just the server IP. Attach the domain in ServerPilot first, an app that only answers on the IP cannot be imported.
- Leave the server connected in ServerPilot until the import is done. Disconnecting is an optional last step.

### Step by step

1. In Ploi, open **Servers**, click **Create server** and pick **Import server**.
2. Choose ServerPilot and fill in a name, the IP address and the SSH port.
3. Run the command Ploi shows you as root on the server. It only adds Ploi's SSH key to `/root/.ssh/authorized_keys`.
4. Click **Verify connection &amp; scan**. The scan is read-only and takes under a minute.
5. Review the apps and databases that were found, tick the sites you want and choose whether to disconnect from ServerPilot at the end.
6. Start the import and follow the progress on the building page.

### What Ploi changes

Because ServerPilot uses its own stack, the import installs Ploi's native stack and moves your apps onto it. Everything that can be installed while ServerPilot keeps serving is done first, then Ploi switches serving over in one short step.

- Ploi adds a **ploi** user and installs its own NGINX, a PHP-FPM build for each version your apps use, certbot, supervisor and its base cronjobs.
- Each app moves from `/srv/users/<user>/apps/<app>` to Ploi's `/home/<user>/<domain>` layout and keeps its PHP version. Its ServerPilot user becomes a Ploi system user, with the SSH key it already has.
- Ploi generates an NGINX vhost and a PHP-FPM pool for each site from its own template, checks the configuration with `nginx -t`, then stops ServerPilot's NGINX, Apache and PHP-FPM and reloads its own NGINX so the sites serve through Ploi.
- Databases and database users are registered. MySQL only stores password hashes, so use **reset password** in Ploi when you need one and update the application's configuration.
- The cron jobs your users scheduled themselves (with `crontab -e`) are taken over and shown in the panel. Their app paths are rewritten from the old `/srv/users` location to the new one so they keep working.
- ServerPilot's own services are stopped, not removed, so the move can be reversed.

### A note on .htaccess

ServerPilot serves apps through NGINX in front of Apache, which reads `.htaccess` files. Ploi is NGINX only. Laravel and WordPress work through the NGINX rules Ploi generates, but if an app relies on custom `.htaccess` rules you will need to translate those into the site's NGINX configuration in Ploi afterwards.

### Certificates

ServerPilot's AutoSSL certificates are registered so Ploi can warn you before they expire, but ServerPilot stops renewing them once the server leaves it. Request a new Let's Encrypt certificate from the site's SSL tab in Ploi, and Ploi renews it from then on. A site without a certificate serves over plain HTTP until you issue one.

### Deployments

ServerPilot keeps deployment settings in its own panel, so there is nothing on the server to take over. Each imported site receives Ploi's default deploy script. Set up the repository and deploy steps per site in Ploi, and enable zero downtime deployments if you want them.

### Disconnecting from ServerPilot

With the disconnect option on, the last step stops and disables ServerPilot's agent so it no longer manages the server. Its packages stay installed so the move can be reversed. Remove the server from your ServerPilot dashboard to finish disconnecting. With the option off, ServerPilot keeps managing the server until you do. Cancel your ServerPilot subscription only after the import has finished and you have verified the sites.

### If something goes wrong

Every step writes to the server logs. If a site's NGINX configuration does not pass `nginx -t`, the import stops and the server shows as failed, so nothing is left half-switched. You can retry the import from the server, and every step skips what an earlier run already did. Send us the server ID through support if you need a hand.

### How do I hide server version for more security in NGINX?

URL: https://ploi.io/documentation/server/how-do-i-hide-server-version-for-more-security-in-nginx
Last updated: 2022-01-13

For security reasons, you might want to hide your server version (*For example "nginx/1.10.3 (Ubuntu)*) in the header response and in error pages.

Ploi servers already have this automatic setup, so if you have a Ploi provisioned server you will not have to follow this guide.

To achieve this just change this code in the **/etc/nginx/nginx.conf** file:

```
# server_tokens off;
```

To this:

```
server_tokens off;
```

You can also run this 1-line command to easily do it at once:

```
sed -i "s/# server_tokens.*/server_tokens off;/" /etc/nginx/nginx.conf && service nginx reload
```

After this make sure you restart NGINX and reload your webpage to see if the server version is present in the site's headers.

### How do I delete my server?

URL: https://ploi.io/documentation/server/how-do-i-delete-my-server
Last updated: 2021-12-06

You can delete your server by visiting the 'Settings' tab inside your server and pressing 'Delete server'. You will be prompted with a confirmation window where you will have to type your server's name to verify you want it deleted.

![](https://ploi.io/storage/LIQrdavHlED72ovpP47UTntDWPIfTBlcqBi4NWyC.png)

When your server was created via a server provider integration, it will also get removed from the server provider. If you've used the custom server option to create the server, the server will not be removed with your server provider.

### How do I setup HSTS in NGINX?

URL: https://ploi.io/documentation/server/how-do-i-setup-hsts-in-nginx
Last updated: 2021-04-23

HTTP Strict Transport Security is meant to protect your website against protocol downgrade attacks. (HTTP over HTTPS requests)

This will declare to use HTTPS only, this will also require you to have a valid SSL certificate at all times. If you do not have a certificate or it is expired, people will not be able to visit your website. (As your webserver is telling people to require SSL by HSTS which is not present/valid)

To do this, we will be adding the following header to your site configuration file:

```
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
```

In SSH (or by "Edit NGINX Configuration" inside the "Manage" tab on site level) add this inside the server{} block. E.g.:

```
server {

  server_name example.com

  # Add HSTS header
  add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
  
}
```

**Be sure to have an SSL certificate setup, otherwise you will encounter errors and visitors will not be able to visit your website.﻿**

After this has been setup, we recommend you submit your website hostname to this website: <https://hstspreload.org/>

This is a preload submission list for Chrome, where other known browsers also work with (like FireFox, Internet Explorer, Opera, Safari).

### Change swap size in Ubuntu

URL: https://ploi.io/documentation/server/change-swap-size-in-ubuntu
Last updated: 2025-03-13

What is swap and why resize it?
-------------------------------

Swap is a designated portion of your hard drive that acts as an extension of your system's RAM. When your physical memory (RAM) fills up, the operating system moves less-used memory pages to swap space, freeing up physical RAM for active processes. Essentially, swap provides a safety net to prevent out-of-memory errors, albeit at the cost of slower performance compared to RAM.

### Common reasons to resize swap:

- **Insufficient swap space**: If your system is running out of memory during peak usage
- **Over-allocation**: If you've allocated too much disk space to swap that could be better used elsewhere
- **Performance tuning**: Adjusting swap to match your system's workload patterns
- **Preventing OOM (Out Of Memory) kills**: Particularly important for database servers or memory-intensive applications

### Recommended swap sizes:

System RAM

Recommended Swap Size

Swap Size (with Hibernation)

2GB or less

2x RAM

3x RAM

2GB to 8GB

Equal to RAM

2x RAM

8GB to 64GB

At least 4GB

1.5x RAM

64GB or more

At least 4GB

Hibernation not typically used

Prerequisites
-------------

Before modifying your swap configuration, ensure you have:

- **Root or sudo privileges**: All commands in this guide require elevated permissions
- **Sufficient free disk space**: Verify available space with `df -h`
- **Backup of critical data**: System-level changes always carry some risk
- **Understanding of current swap usage**: Check with these commands:

```
# Show current swap files/partitions and their sizes
sudo swapon --show

# View memory and swap usage
free -h

# Check if swap is being actively used
vmstat 1 5

```

Step-by-Step process to resize swap
-----------------------------------

### 1. Prepare your system

Before disabling swap, check if your system has enough free RAM to handle the current swap usage:

```
# Check current memory usage
free -h

```

If swap is heavily used, consider closing memory-intensive applications first or performing this operation during a maintenance window.

### 2. Turn off all running swap processes

```
sudo swapoff -a

```

This command disables all swap spaces defined in `/etc/fstab` and currently active. It may take some time to complete as the system moves data from swap back to RAM.

### 3. Resize the swap file

For this example, we'll create a 4GB swap file (adjust the size to your needs):

```
# Remove the old swap file if it exists
sudo rm /swapfile

# Create a new swap file with desired size (4G in this example)
sudo fallocate -l 4G /swapfile

# Alternative method if fallocate fails:
# sudo dd if=/dev/zero of=/swapfile bs=1G count=4

```

> **Note**: Replace `4G` with your desired swap size (e.g., `2G` for 2GB, `8G` for 8GB).

### 4. Set proper permissions and ownership

Swap files should be readable and writable only by root for security:

```
# Set correct permissions (only root can read/write)
sudo chmod 600 /swapfile

# Verify permissions
ls -lh /swapfile

```

### 5. Set up the swap area

```
# Format the file as swap
sudo mkswap /swapfile

```

You should see output confirming the swap file creation.

### 6. Activate the swap file

```
# Enable the swap file
sudo swapon /swapfile

# Verify the swap is active
sudo swapon --show
free -h

```

### 7. Make the changes persistent across reboots

To ensure your swap file is automatically activated after system restart, you need to update the `/etc/fstab` file:

```
# First, backup the fstab file
sudo cp /etc/fstab /etc/fstab.bak

# Check if swap entry already exists
grep -q "swapfile" /etc/fstab || echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

```

Optimizing swap performance
---------------------------

### Adjusting swappiness

Swappiness is a kernel parameter that influences how aggressively the system uses swap space. Values range from 0 to 100:

- **Lower values** (e.g., 10): The system will try to avoid swapping as much as possible
- **Higher values** (e.g., 60): The system will swap out memory pages more aggressively

```
# Check current swappiness value
cat /proc/sys/vm/swappiness

# Temporarily change swappiness (until reboot)
sudo sysctl vm.swappiness=10

# Make the change permanent (add to /etc/sysctl.conf)
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf

```

### Adjusting cache pressure

Cache pressure determines how aggressively the kernel reclaims memory used for caching filesystem data:

```
# Check current cache pressure
cat /proc/sys/vm/vfs_cache_pressure

# Set a more balanced value (100 is default)
sudo sysctl vm.vfs_cache_pressure=50

# Make permanent
echo 'vm.vfs_cache_pressure=50' | sudo tee -a /etc/sysctl.conf

```

Troubleshooting common issues
-----------------------------

### Swap file not activating after reboot

If your swap doesn't activate after reboot:

1. Check `/etc/fstab` for correct syntax:
    
    ```
    cat /etc/fstab
    
    ```
2. Manually try to enable the swap:
    
    ```
    sudo swapon /swapfile
    
    ```
3. Look for errors in system logs:
    
    ```
    sudo dmesg | grep -i swap
    sudo journalctl -xe
    
    ```

### "Operation not permitted" error

If you see this error when trying to create or enable swap:

1. Check if you're using a filesystem that supports swap files (most do, but some like NFS don't)
2. Verify you have proper permissions and are using sudo

### Performance issues

If your system becomes sluggish after configuring swap:

1. Consider reducing swappiness to a lower value (10-30)
2. Check if your swap is on an SSD for better performance
3. Monitor swap usage with `htop` or `free -h` to see if your system is swap-thrashing

Performance considerations
--------------------------

- **SSD vs HDD**: Swap on an SSD will be significantly faster than on a traditional hard drive
- **Separate partition**: For heavy swap usage, consider using a dedicated partition instead of a file
- **Multiple swap files**: For very large systems, multiple swap files on different physical disks can improve performance

Monitoring swap usage
---------------------

To effectively monitor swap usage over time:

```
# Install sysstat package for monitoring tools
sudo apt install sysstat

# Monitor swap usage every 5 seconds
vmstat 5

# Get detailed memory and swap statistics
free -h

# For graphical monitoring, consider installing and using htop
sudo apt install htop
htop

```

Conclusion
----------

Properly configured swap space is an important part of system memory management in Ubuntu. While it's not a replacement for physical RAM, it provides a safety buffer against memory exhaustion and helps prevent application crashes during periods of high memory demand.

For production environments on Ploi, regularly monitor your swap usage patterns to determine if you need to adjust the swap size or consider upgrading your server's RAM for better performance.

### NGINX 413 request entity too large error

URL: https://ploi.io/documentation/server/nginx-413-request-entity-too-large-error
Last updated: 2020-11-03

Whenever you receive a "413 - Request entity too large" error this usually has to do with the upload file size which you are trying to upload.

You can easily change the max file upload size in the ploi panel by going to your server and press the PHP tab. In here you will be able to change the max upload value:

![](https://ploi.io/storage/9RxaLOQEF7iHH7NSjR9xYPV16kmWH9c8xCQRqP85.png)

### How do I migrate from Laravel Forge?

URL: https://ploi.io/documentation/server/how-do-i-migrate-from-laravel-forge
Last updated: 2026-09-09

Ploi can take over a server that Laravel Forge provisioned. It connects over SSH, scans what is there and registers it in the panel. You keep the server, the IP address and the files, and your sites stay online while it runs. On a small server this takes about two minutes.

![](https://ploi.io/storage/69Ozb7KUXxDMhfM39zyzXRktm8QBAE8cklKCK1MQ.png)

### Before you start

- You need root access over SSH. As the **forge** user, `sudo -i` gets you there.
- The server runs Ubuntu 22.04, 24.04 or 26.04, or Debian 12 or 13, and is not managed by Ploi yet.
- Leave the server connected in Forge until the import is done. Disconnecting is an optional last step.

### Step by step

1. In Ploi, open **Servers**, click **Create server** and pick **Import server**.
2. Choose Laravel Forge and fill in a name, the IP address and the SSH port.
3. Run the command Ploi shows you as root on the server. It only adds Ploi's SSH key to `/root/.ssh/authorized_keys`.
4. Click **Verify connection &amp; scan**. The scan is read-only and takes under a minute.
5. Review what was found, tick the sites you want and choose whether to disconnect from Forge at the end.
6. Start the import and follow the progress on the building page.

### What Ploi changes

Ploi adds a **ploi** user, installs certbot (Forge does not install it) and supervisor if it is missing, and adds its own renewal and composer cronjobs. The webserver, PHP, the database server, the firewall and sshd are left as they are.

- The forge user and isolated site users become Ploi system users. Ploi appends its key to their `authorized_keys`, nothing else changes about them.
- Sites keep their directory, user and PHP version. Their NGINX configuration is regenerated from Ploi's template after an `nginx -t` check, so certificates, redirects and the other NGINX features in Ploi work. The Forge configuration stays in the site's NGINX history and in `/root/ploi-import-backup`. NGINX runs as the ploi user afterwards and sites of the forge user get their own PHP-FPM pool.
- Certificates, databases, database users, supervisor daemons, cron entries, ufw rules and git remotes are registered. Daemons restart once, cron entries move to Ploi's scheduler so nothing runs twice.
- Database users have no password in Ploi, because MySQL only stores hashes. Use **reset password** when you need one and update the application's `.env`.

### Certificates

Forge stops renewing Let's Encrypt certificates once the server leaves Forge. The ones it already issued keep working until they expire. Before that date, request a new Let's Encrypt certificate from the site's SSL tab in Ploi. Ploi renews it from then on.

### Deployments

Git remotes are linked as custom repositories on the branch the checkout is on, so `git pull` works with the deploy key that is already on the server. Connect your GitHub, GitLab or Bitbucket account on the site for commit details and push to deploy through your provider. Sites with Forge's zero downtime layout (`releases` plus a `current` symlink) are marked in the site log. Enable zero downtime deployments in Ploi on those sites before you deploy.

### Disconnecting from Forge

With the disconnect option on, the last step removes Forge's SSH key from root and the site users, its certificate renewal scripts and its cleanup cronjob. The sudoers rules that let the forge user reload PHP-FPM, NGINX and supervisor stay, deploy scripts may use them. With the option off, Forge keeps its access until you archive the server there. Cancel your Forge subscription only after the import has finished.

### If something goes wrong

Every step writes to the server logs. A site whose new NGINX configuration fails `nginx -t` keeps its Forge configuration and is marked in its site log, the rest continues. If the import stops, the server shows as failed. Send us the server ID through support or get in touch over Discord. Migrations are a managed feature, and we monitor them closely so we're able to help you quickly.

### How do I install PHPRedis on my server?

URL: https://ploi.io/documentation/server/how-do-i-install-phpredis-on-my-server
Last updated: 2026-06-15

The easiest way to install the PHPRedis extension is through the package manager. Ploi uses the Sury PHP repository, which ships a prebuilt Redis extension for each PHP version. [Login as the root user](https://ploi.io/documentation/ssh/how-do-i-login-as-root-user) and run:

```
apt install -y php8.5-redis
systemctl restart php8.5-fpm.service
```

Replace **8.5** with your PHP version. Verify the extension is loaded with:

```
php -m | grep redis
```

Installing via PECL (fallback)
------------------------------

If a prebuilt package isn't available for your PHP version, you can compile the extension with PECL instead:

**1. Install the build tools:**

```
apt install -y php-pear php8.5-dev
```

**2. Install the Redis extension:**

```
printf "no\n" | pecl install redis
```

**3. Enable it for both FPM and CLI:**

```
echo "extension=redis.so" > /etc/php/8.5/mods-available/redis.ini
ln -sf /etc/php/8.5/mods-available/redis.ini /etc/php/8.5/fpm/conf.d/20-redis.ini
ln -sf /etc/php/8.5/mods-available/redis.ini /etc/php/8.5/cli/conf.d/20-redis.ini
```

**4. Restart PHP-FPM:**

```
systemctl restart php8.5-fpm.service
```

Again, replace **8.5** with the PHP version you use.

### How do I install PM2 on a Ubuntu server?

URL: https://ploi.io/documentation/server/how-do-i-install-pm2-on-a-ubuntu-server
Last updated: 2020-01-02

PM2 is a process management system to keep certain processes a live. This could be either a script you have created or a socket server for example.

How do you install PM2 on a ubuntu server? Very easy, run this command:

```
npm install pm2@latest -g
```

**Note:** You need to have npm installed before you can run this command. You can also use yarn to install PM2.

And thats it! You are now ready to start using PM2 to run your processes.

Lets say you have a bash script called **socket.sh** to run a socket server. You can start script and keep it alive by running:

```
pm2 start socket.sh
```

You will now get a list right away of the running processes that PM2 is keeping alive for you. ([There is a lot of configuration parameters you can send too](https://pm2.keymetrics.io/docs/usage/quick-start/))

### How to upgrade NGINX to the latest stable version

URL: https://ploi.io/documentation/server/how-to-upgrade-nginx-to-the-latest-stable-version
Last updated: 2020-11-16

In this tutorial we will explain how to upgrade your NGINX version to the latest stable version

**Note:** all these commands have to be run as root user, please be sure you are logged in as root user.

Start by adding the NGINX stable repository:

```
add-apt-repository ppa:nginx/stable
```

Next update the packages list:

```
apt update
```

And finally run the actual package updates:

```
apt dist-upgrade
```

This command "dist-upgrade" might raise some questions on config changes, you can keep your current files by just pressing "enter", this is the most safest option to do so.

Next verify your NGINX version:

```
nginx -v
```

And also restart NGINX to be sure it is OK:

```
service nginx restart
```

### How do I run a daemon with my script?

URL: https://ploi.io/documentation/server/how-do-i-run-a-daemon-with-my-script
Last updated: 2020-10-27

In order for you to run a script as daemon you can easily create a bash file and run that. Let's take Laravel Echo Server in this example.

Create a new script called **socket.sh** and enter these contents:

```
#!/usr/bin/env bash

laravel-echo-server start
```

Then you can run that script in your daemons tab, just enter the path like: /home/ploi/domain.com/socket.sh:

[![](https://ploi.io/storage/9oc1FOicqH2HtLzConIS3LQEVegNG2eHh3zs6Xhi.png)](https://ploi.io/storage/9oc1FOicqH2HtLzConIS3LQEVegNG2eHh3zs6Xhi.png)

### How do I install a FTP server on Ubuntu?

URL: https://ploi.io/documentation/server/how-do-i-install-a-ftp-server-on-ubuntu
Last updated: 2021-04-09

While we do recommend [to use SFTP](https://ploi.io/documentation/server/how-can-i-use-sftp) instead of FTP, there might be use-cases you want to install a FTP server yourself.

When you do want to install a FTP server, we recommend to use the [VSFTPD software](https://en.wikipedia.org/wiki/Vsftpd).

Make sure when you start with this guide, you are [logged in as a root user](https://ploi.io/documentation/ssh/how-do-i-login-as-root-user).

Run these commands:

```
apt update
apt -y install vsftpd
systemctl start vsftp
systemctl enable vsftpd
mv /etc/vsftpd.conf /etc/vsftpd.conf.orig
```

Next edit **/etc/vsftpd.conf**

```
nano /etc/vsftpd.conf
```

And put these contents:

```
listen=NO
listen_ipv6=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
chroot_local_user=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=NO
pasv_enable=Yes
pasv_min_port=4242
pasv_max_port=4243
allow_writeable_chroot=YES
```

After that, we'll have to configure the firewall to allow the FTP protocol and directory listing.

Allow these ports:

- 21 TCP
- 4242:4243 TCP

Now this is all done, restart the FTP server for the last time and try it out.

```
service vsftpd restart
```

### How to install WordPress CLI

URL: https://ploi.io/documentation/server/how-to-install-wordpress-cli
Last updated: 2021-05-15

WordPress CLI is the command-line interface for WordPress. You can update plugins, configure multisite installations and much more, without using a web browser.

Installing WordPress CLI in your Ubuntu server isn't that hard.

Start by downloading the script:

```
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
```

To check everything is working run the following command:

```
php wp-cli.phar --info
```

To make the command globally available we'll have to move the .phar script to the /usr/local/bin folder.

Run the following commands to make this available:

```
chmod +x wp-cli.phar
sudo mv wp-cli.phar /usr/local/bin/wp
```

Now you can run this command anywhere you are in the server:

```
wp --info
```

Updating the CLI
----------------

Run the following command to update the CLI script:

```
wp cli update
```

Or run the installation script again, this will also update you to the latest version.

### I lost my server login credentials

URL: https://ploi.io/documentation/server/i-lost-my-server-login-credentials
Last updated: 2025-05-12

Sometimes you might of already removed the email that contained the login credentials, or you clicked away the popup where you can retrieve these details.

In these cases, we cannot provide the password for you, we only hold the password for one moment, which is either;

- When we email you your credentials or;
- When you retrieve the password in the panel

After these moments, we remove any trace of the password for security reasons.

In order for you to reset the password, you'll have to go to your server provider and boot a server rescue console.

Here is a list of the most common server providers with a link on how to reset your password:

- [DigitalOcean](https://docs.digitalocean.com/support/how-do-i-reset-my-droplets-root-password/)
- [UpCloud](https://upcloud.com/docs/guides/reset-root-password-cloud-server/)
- [Linode](https://www.linode.com/docs/guides/reset-the-root-password-on-your-linode/)
- [Hetzner](https://docs.hetzner.com/cloud/servers/getting-started/rescue-system)
- [Vultr](https://docs.vultr.com/boot-into-single-user-mode-reset-root-password)

These kinds of articles should also be available for the server provider you're using.

### How do I transfer a server to another account?

URL: https://ploi.io/documentation/server/how-do-i-transfer-a-server-to-another-account
Last updated: 2021-06-14

Sometimes it might be necessary to transfer a server to another account. Luckily Ploi makes this really easy for you.

In your server, head over to the **Settings** tab and scroll all the way down until you see **Danger zone**.

![](https://ploi.io/storage/KMG4W3JQycUU6x4nbMjaGZkeVCm3X3D3LFv3j685.png)

In here enter the email address of the receiving user and your account password for security reasons.

After that the receiving user will receive an email to complete the transfer, this link is valid for 60 minutes after initial request.

### How can I use htaccess with NGINX?

URL: https://ploi.io/documentation/server/how-can-i-use-htaccess-with-nginx
Last updated: 2021-08-18

The short answer here is: you can't. NGINX does not provide native htaccess support. However, that doesn't mean it isn't possible at all.

It is possible to convert htaccess rules to NGINX rules so you can still get the same behavior. There are numerous tools out there that can easily convert something like this:

```
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !=/favicon.ico
RewriteRule ^ index.php [L]
```

Into valid NGINX rules, a few of those tools summed up:

- [https://winginx.com/en/htaccess](https://winginx.com/en/htaccess/?ref=ploi.io)
- [https://www.getpagespeed.com/apache-to-nginx](https://www.getpagespeed.com/apache-to-nginx/?ref=ploi.io)

NGINX even wrote a [blog article](https://www.nginx.com/blog/converting-apache-to-nginx-rewrite-rules/) about converting the htaccess rules to NGINX rules.

Considering the above htaccess example, most tools will convert them into something like this:

```
server {
    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }
}
```

### How do I upgrade my Node.js version?

URL: https://ploi.io/documentation/server/how-do-i-upgrade-my-nodejs-version
Last updated: 2026-06-15

Node.js releases move fast and older versions reach end-of-life quickly, so it's a good idea to keep your server on a current LTS release. This guide upgrades the system-wide Node.js version installed through NodeSource.

Start by logging into [SSH](https://ploi.io/documentation/ssh) and [login as the root user](https://ploi.io/documentation/ssh/how-do-i-login-as-root-user).

Run the following commands, replacing **22** with the major version you want (use a current LTS release such as 22 or 24):

```
curl -fsSL https://deb.nodesource.com/setup_22.x | bash -
apt install -y nodejs
```

NodeSource replaces any previously installed Node.js version, so this upgrades an existing install in place.

Verify the active version:

```
node -v
```

If you use a process manager such as PM2, restart your apps so they pick up the new Node.js binary.

### How does server insights work?

URL: https://ploi.io/documentation/server/how-does-server-insights-work
Last updated: 2026-01-13

Server insights is a great feature by Ploi that allows you to get help with optimizations. A good example could be the **max\_children** being reached for PHP. Ploi will help you discover these errors and help you fix these.

![](https://ploi.io/storage/i17FWlc6NoPMHww9iJgRVp4pGIPox03djsGQ2Yip.png)

Ploi will check obvious log files, service statuses, and more to determine whether there are optimizations possible for your server. You can visit the insights on server level, on the left-hand side press "Insights".

Currently, it will check for these optimizations:

- PHP max\_children reached, per PHP version and per pool
- Check sites that are running an outdated PHP version
- Check if supervisor is running without using it
- Check if Node could use an LTS update
- Check if the system clock is in sync
- Check if the load average is high for a longer period of time
- Check if the MySQL/MariaDB binlogs are growing and filling up your disk space
- Check if you have a large number of package and/or security updates available
- Check if the NGINX worker\_connections variable is being hit
- Check if the OPcache is full, if it is, you can restart FPM workers and change values on-demand
- Check if OPcache is disabled, then recommends to enable it
- Check if sites are using and end of life PHP version
- Check if the max connections is reached for a database service (MySQL, MariaDB &amp; PostgreSQL)
- Check if the innodb buffer pool is filling up
- Check if there are any SSL renewal failures by reading the letsencrypt.log file
- Check if there are any open CVE's for your sites (pro plan or higher required)

Ploi will also allow you to automatically fix these optimizations, so you don't have to worry about difficult configurations.

If there are no optimizations listed you have either not run them yet, or there is no optimization available. You can force-run the insights by pressing the "Refresh" button at the top right.

### How do I update PM2?

URL: https://ploi.io/documentation/server/how-do-i-update-pm2
Last updated: 2021-11-04

PM2 is a beautiful advanced process manager for NodeJS specifically. When using the 1-click integration with Ploi, you can select to either use PM2 or supervisor.

If you've selected PM2, Ploi will then install this process manager for you. At some point, the PM2 service can be updated.

This is rather easy, to update your PM2 service run the following command as the **root** user:

```
npm install pm2@latest -g
pm2 update
```

The update process should look like this after:

```
Be sure to have the latest version by doing `npm install pm2@latest -g` before doing this procedure.


>>>> In-memory PM2 is out-of-date, do:
>>>> $ pm2 update
In memory PM2 version: 5.1.1
Local PM2 version: 5.1.2
[PM2][WARN] No process found
[PM2] [v] All Applications Stopped
[PM2] [v] PM2 Daemon Stopped
[PM2] Spawning PM2 daemon with pm2_home=/home/ploi/.pm2
[PM2] Restoring processes located in /home/ploi/.pm2/dump.pm2
>>>>>>>>>> PM2 updated
```

### Disk space tips

URL: https://ploi.io/documentation/server/disk-space-tips
Last updated: 2022-01-28

At times, your server may fill up with logs, user-uploaded images, or other data. This can fill up your disk fast, and as a result that makes your server act up really weird. Services are acting out, unable to write data because of a full disk.

In this article, we'll write a few tips on how to manage your disk and find big files.

Use "ncdu"
----------

This package makes it easy to navigate around directories on your server. It might be that ncdu isn't installed yet on your server. You can install it by running this command as root user:

```
apt install -y ncdu
```

Next, navigate to the "/" path and run ncdu:

```
cd / && ncdu
```

This will now scan your server, this can take a while. Just let it process and finish, once it is done you'll be presented with a list of directories that are sorted from biggest to smallest:

![](https://ploi.io/storage/P12geoW3BhbXjlW76s6mCvU4tqQuF7M4JGCHcpGx.png)

Navigating is rather easy, use the arrow keys, and enter key to go into directories and go back, to go back, use the arrow keys to go to the top where you see "/..", press enter on that line and you'll go back one directory.

You can now search for big files and delete them. To delete them, navigate with your arrow keys and press "d", this will give you a prompt if you want to confirm the deletion. To go out of ncdu, press the "q" key.

Find files bigger than {x}MB
----------------------------

It is also possible to run a command that will find files on your server that are bigger than the amount you put in.

For example, to find files that are bigger than 20MB you run the following command:

```
find . -type f -size +20000k -exec ls -lh {} \; | awk '{ print $9 ": " $5 }'
```

This will scan in the directory you're in, so if you need to scan the whole server, navigate to the root first:

```
cd / && find . -type f -size +200000k -exec ls -lh {} \; | awk '{ print $9 ": " $5 }'
```

Good ol' du
-----------

This is also available by default, good old "du" which works for simple cases. Run the following command to get a list sorted by size of big directories:

```
du -hsx * | sort -rh | head -10
```

Which produces:

```
root@royal-reef:/# du -hsx * | sort -rh | head -10
2.2G	usr
1.6G	var
1.2G	lib
1.1G	swapfile
990M	home
218M	boot
45M	root
16M	bin
15M	sbin
9.6M	etc
```

To get a list of big files in side the default /home/ploi folder for example:

```
du -hsx /home/ploi/* | sort -rh | head -10
```

This will produce:

```
root@royal-reef:/# du -hsx /home/ploi/* | sort -rh | head -10
474M	/home/ploi/ploi.shop
270M	/home/ploi/ploi.io
```

Using df to list all disk sizes and usage
-----------------------------------------

For most people, a very common command which is "df", allows you to list the disks and their usage. It is as easy as running:

```
df -h
```

Which will produce something in the lines of:

```
root@royal-reef:/# df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            461M     0  461M   0% /dev
tmpfs            99M  1.1M   98M   2% /run
/dev/vda1        24G  7.1G   16G  32% /
tmpfs           493M     0  493M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           493M     0  493M   0% /sys/fs/cgroup
/dev/loop0      100M  100M     0 100% /snap/core/11993
/dev/loop1       62M   62M     0 100% /snap/core20/1270
/dev/loop2       44M   44M     0 100% /snap/certbot/1670
/dev/loop3      111M  111M     0 100% /snap/core/12603
/dev/loop4       62M   62M     0 100% /snap/core20/1328
tmpfs            99M     0   99M   0% /run/user/1000
```

### How to make PM2 start on boot

URL: https://ploi.io/documentation/server/how-to-make-pm2-start-on-boot
Last updated: 2022-02-01

By default, the PM2 service will not start the services that you are running on boot. This requires an additional step, luckily this step is very easy.

First, run every service you want with PM2 so you're sure all the services you want to be started up on reboot, are started.

Next, run the following command:

```
pm2 startup
```

This will give the output like following:

```
[PM2] Init System found: systemd
[PM2] To setup the Startup Script, copy/paste the following command:
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u ploi --hp /home/ploi
```

Next, run that sudo command in your terminal (this will ask for your sudo password):

```
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u ploi --hp /home/ploi
```

After this, PM2's services that have been spawned will be started again upon reboot.

### Can I safely resize/upgrade my server?

URL: https://ploi.io/documentation/server/can-i-safely-resizeupgrade-my-server
Last updated: 2022-03-29

At some point, you're going to want to upgrade your server. Either because you're running out of storage or memory.

Either way, it is completely safe to upgrade your server without breaking the connection with Ploi.

The only thing that could happen is that when the scheduled connection test or manual test is executed, it might tell you that the server is unavailable. You will always be able to test the connection again to restore the views to the original overviews.

### Can I migrate existing servers from other providers?

URL: https://ploi.io/documentation/server/can-i-migrate-existing-servers-from-other-providers
Last updated: 2026-09-28

That depends on who set the server up.

### Servers provisioned by Laravel Forge

Yes. Ploi can take over a Forge server as it is: same machine, same IP address, sites stay online. Ploi connects over SSH, scans the server and registers the sites, users, certificates, databases, daemons, cronjobs and firewall rules it finds. You start it from **Servers**, **Create server**, **Import server**. The steps, what changes on the server and what to do about certificates are in [How do I migrate from Laravel Forge?](/documentation/server/how-do-i-migrate-from-laravel-forge).

### Servers from ServerPilot or RunCloud

Yes. Both platforms run their own builds of NGINX, Apache and PHP, so the import installs Ploi's stack next to theirs and moves your apps onto it, rather than only registering them. Your apps go offline only for the short moment Ploi switches serving over to its own NGINX, about a minute. You start it the same way, from **Servers**, **Create server**, **Import server**. See [How do I migrate from ServerPilot?](/documentation/server/how-do-i-migrate-from-serverpilot) and [How do I migrate from RunCloud?](/documentation/server/how-do-i-migrate-from-runcloud) for the steps and details. RunCloud servers on the NGINX or NGINX + Apache stack are supported; OpenLiteSpeed is not.

### Servers you set up yourself or with another panel

No. Ploi does not know what is installed, how it is configured or which directory layout is used, and guessing wrong would break your sites. Create a fresh server in Ploi instead, add the sites there and move the files over with git, SFTP or [rsync](https://ploi.io/documentation/domains/how-do-i-migrate-my-old-sites-over-with-rsync). Databases move with a dump and import.

### How do I install a custom server?

URL: https://ploi.io/documentation/server/how-do-i-install-a-custom-server
Last updated: 2022-05-16

It is possible with Ploi to use any other server provider then our native integrations. As long as your server provider can install a Ubuntu OS you're all set.

To start, first, create the server with your server provider. After that's done, ensure the created server has a root user and log in as root user.

Next, go to the [server creation screen](https://ploi.io/panel/servers/create) and press "Custom server", it will now show you a command you'll have to run as root user:

[![](https://ploi.io/storage/x5VllzfiwJhaNTf7Jxv9q34zIR8XYL4xlBr0UwxJ.png)CleanShot 2022-05-16 at 07.43.29@2x.png 265.67 KB](https://ploi.io/storage/x5VllzfiwJhaNTf7Jxv9q34zIR8XYL4xlBr0UwxJ.png)Press the "Copy" button at the top of that textarea to completely copy over the command ensuring you didn't make any copy errors, like this:[![](https://ploi.io/storage/tPAEBwximKAGX5x3pjVEzi468851QHODfzU9CZeB.png)CleanShot 2022-05-16 at 07.45.23@2x.png 486.34 KB](https://ploi.io/storage/tPAEBwximKAGX5x3pjVEzi468851QHODfzU9CZeB.png)Now follow the rest of the guide by filling in the IP address and such. **We recommend logging out of the SSH session you've earlier used to ensure you can't break down the installation when Ploi is running.**

### Available server types

URL: https://ploi.io/documentation/server/available-server-types
Last updated: 2025-05-26

We offer a variety of server types, to make your infrastructure optimized and set up for what's meant for. In this article, we'll explain what server types are available and what software gets installed with them.

Webserver (server)
------------------

The server type is the default server type that Ploi offers and always had.

**Installed software:**

- NGINX
- Database (software selectable, e.g. MySQL, MariaDB, PostgreSQL)
- Redis
- Memcached
- Certbot
- Composer
- PHP (version selectable)
- NPM
- UFW firewall
- Supervisor
- Fail2ban

Load balancer
-------------

Load balance your traffic over several webservers to distribute traffic. Our panel makes this a piece of cake for you to configure.

**Installed software:**

- HaProxy load balancing software
- Certbot
- UFW firewall

Database server
---------------

A separate database server is more scalable in the future. That's why you can install database-specific optimized servers for your applications.

**Installed software:**

- Database (software selectable, e.g. MySQL, MariaDB, PostgreSQL)
- UFW firewall

Redis server
------------

Need a caching solution for your applications or want to store data to be fetched later temporarily? Set up a scalable Redis server easily and manage settings through our panel.

**Installed software:**

- Redis server
- UFW firewall

Valkey server
-------------

Need a caching solution for your applications or want to store data to be fetched later temporarily? Set up a scalable Valkey server easily and manage settings through our panel.

**Installed software:**

- Valkey server
- UFW firewall

Storage server
--------------

Serve your own storage server, powered by the S3 compatible Minio software. You're able to store and host your own files without a sweat safely.

**Installed software:**

- Minio S3 storage software
- Certbot
- UFW firewall

Worker server
-------------

The worker server is meant for running PHP background tasks, such as queues.

**Installed software:**

- PHP
- Supervisor

MeiliSearch server
------------------

Eager to increase and speed up the search results from your website? Create a MeiliSearch server that makes searching documents real easy and quick.

**Installed software:**

- MeiliSearch software
- Certbot
- UFW firewall

Elasticsearch server
--------------------

Search petabytes of data stored on object stores like S3 in minutes. Easily 1-click create an Elasticsearch server with Ploi and be on your way.

**Installed software:**

- Elasticsearch software
- Certbot
- UFW firewall

Docker server
-------------

When you want to easily manage Docker containers you can 1-click install this server type.

**Installed software:**

- Docker
- Supervisor
- UFW firewall

Plain server
------------

A plain server? Yes. This server is a clean server, without web server for example, but it is easily manageable via Ploi. It is up to you what you want to install on this server.

**Installed software:**

- UFW firewall
- Supervisor

### How to install multiple servers behind 1 IP address?

URL: https://ploi.io/documentation/server/how-to-install-multiple-servers-behind-1-ip-address
Last updated: 2022-07-22

When you run some kind of virtualization software like Proxmox or OpenVZ you might want to manage multiple servers behind 1 IP address, with Ploi, this is possible.

First, make sure you have installed 2 or more servers in your virtualization software. Next, make sure they run on different SSH ports, it is good to know that Ploi does not allow you to install your server on these ports as they are the most known reserved ports:

```
21 // FTP
23 // Telnet
25 // SMTP
53 // DNS
67 // DHCHP
80 // Webserver (NGINX)
143 // IMAP
443 // SSL
465 // SMTP
587 // SMTP
```

Now let's start by creating your server. Head over to the server installation screen and press "Custom server". Fill in the details as you would normally, and take a close look at the SSH port that might be different in your case.

Ploi will try to connect to your server once you press start installation, and if it fails it will tell you that. While the first server is being installed, repeat the same steps for the second server.

**Example first server:**[![](https://ploi.io/storage/SMqHAWExm89pLgm1V1zVafGg9G8yncWSTWJ7twD1.png)CleanShot 2022-07-22 at 12.26.21.png 346.4 KB](https://ploi.io/storage/SMqHAWExm89pLgm1V1zVafGg9G8yncWSTWJ7twD1.png)**Second server:**[![](https://ploi.io/storage/3plrftP1vd9qnq0nGK1NIWRCwglHY0ENjhWDTQvE.png)CleanShot 2022-07-22 at 12.27.57.png 349.12 KB](https://ploi.io/storage/3plrftP1vd9qnq0nGK1NIWRCwglHY0ENjhWDTQvE.png)

### How do I disable IPv6 on Ubuntu?

URL: https://ploi.io/documentation/server/how-do-i-disable-ipv6-on-ubuntu
Last updated: 2026-06-15

At some point, you're going to want to disable IPv6 as it might be conflicting with the services you run on that server. Doing this is fairly easy in Ubuntu.

First of all, run this command to verify if IPv6 is currently available on your server:

```
ip a
```

[![](https://ploi.io/storage/mOcAvKwyPYpAjAWSgxvGzEKe4vGjomAhJ9OuuAAo.png)CleanShot 2023-01-03 at 19.54.15.png 1007.47 KB](https://ploi.io/storage/mOcAvKwyPYpAjAWSgxvGzEKe4vGjomAhJ9OuuAAo.png)If you see an IPv6 address there, then IPv6 is enabled for your server. We'll continue on how to disable this.

You can either disable it for the time the server is booted or permanently. We'll start with the temporary one first.

SSH into your server and run the following commands:

```
sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1
sudo sysctl -w net.ipv6.conf.lo.disable_ipv6=1
```

Next, run again:

```
ip a
```

The IP address from the previous screenshot should be gone now.

If you want to permanently disable IPv6, edit the **/etc/sysctl.conf** file (as root, or use sudo). Scroll all the way down, and paste these lines:

```
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
net.ipv6.conf.lo.disable_ipv6=1
```

To make the changes come through, run the following command:

```
sudo sysctl -p
```

Now, IPv6 will always be disabled, even when you restart the server.

### How to install puppeteer on Ubuntu

URL: https://ploi.io/documentation/server/how-to-install-puppeteer-on-ubuntu
Last updated: 2026-06-15

Puppeteer is a Node.js library from the Chrome team that lets you control a headless Chrome/Chromium browser — handy for web scraping, automating forms, generating PDFs and more.

Modern Puppeteer downloads its own compatible Chromium build automatically, so you mainly need Node.js and the system libraries Chromium depends on. [Login as the root user](https://ploi.io/documentation/ssh/how-do-i-login-as-root-user) and follow the steps below.

1. Make sure Node.js is installed
---------------------------------

Check your Node.js version:

```
node -v
```

If Node.js isn't installed (or is outdated), install a current LTS release through NodeSource — see [How do I upgrade my Node.js version?](https://ploi.io/documentation/server/how-do-i-upgrade-my-nodejs-version). Avoid the `nodejs` package from Ubuntu's default repositories, as it is usually several versions behind.

2. Install Chromium's system dependencies
-----------------------------------------

Chromium needs a set of shared libraries to run. Install them with:

```
apt update
apt install -y ca-certificates fonts-liberation libasound2t64 libatk-bridge2.0-0 libatk1.0-0 libcairo2 libcups2 libdbus-1-3 libdrm2 libgbm1 libglib2.0-0 libgtk-3-0 libnspr4 libnss3 libpango-1.0-0 libx11-6 libxcb1 libxcomposite1 libxdamage1 libxext6 libxfixes3 libxkbcommon0 libxrandr2 xdg-utils
```

On Ubuntu 22.04 the audio library is named `libasound2` instead of `libasound2t64`; adjust that one package name if apt reports it can't be found.

3. Install Puppeteer
--------------------

Install Puppeteer inside your project so it pins a matching Chromium build:

```
cd /home/ploi/your-project
npm install puppeteer
```

Puppeteer downloads its own Chromium during installation, so you do not need to install the `chromium-browser` package separately.

4. Verify
---------

Run a quick one-liner with Node to confirm Chromium launches:

```
node -e "const p=require('puppeteer');(async()=>{const b=await p.launch({headless:'new'});console.log(await b.version());await b.close();})()"
```

If it prints a Chrome version, Puppeteer is working.

### Disable bin logs for MySQL on Ubuntu

URL: https://ploi.io/documentation/server/disable-bin-logs-for-mysql-on-ubuntu
Last updated: 2023-02-24

Bin logs in MySQL are used for various purposes, including point-in-time recovery, replication, and auditing. However, in some cases, you may want to disable bin logs to reduce disk usage or improve database performance. Here's a step-by-step guide to disabling bin logs in MySQL:

1\. Open your MySQL configuration file. Depending on your system, the location of this file may vary. For example, on Ubuntu, the configuration file is typically located at **/etc/mysql/mysql.conf.d/mysqld.cnf**.

2\. Look for the **\[mysqld\]** section in the configuration file. This section contains the configuration options for the MySQL server.

3\. Add the following line to the **\[mysqld\]** section to disable bin logs:

```
skip-log-bin
```

4\. Save the configuration file and restart the MySQL server to apply the changes. On Ubuntu, you can restart the MySQL server using the following command:

```
sudo service mysql restart
```

5\. Verify that bin logging is disabled by connecting to the MySQL server and running the following command:

```
SHOW VARIABLES LIKE 'log_bin';
```

If bin logging is disabled, the output of this command should be:

```
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | OFF   |
+---------------+-------+
1 row in set (0.00 sec)
```

If bin logging is still enabled, make sure that you have edited the correct configuration file and restarted the MySQL server.

That's it! Bin logging is now disabled in MySQL, and the server will no longer write binary log files. However, keep in mind that disabling bin logging may have consequences, such as making point-in-time recovery and replication more difficult or impossible. Therefore, it's important to carefully consider whether disabling bin logging is the right choice for your use case.

### How to install AWS CLI in Ubuntu

URL: https://ploi.io/documentation/server/how-to-install-aws-cli-in-ubuntu
Last updated: 2023-07-18

The AWS CLI (Command Line Interface) is a unified tool to manage your Amazon Web Services directly from your terminal. It provides a consistent interface for interacting with all parts of AWS, enabling automation through scripts and easing the management of resources.

Installation Steps:

**Step 1: Update Your System**

Start by updating your system's package database with the following commands:

```
sudo apt-get update -y
sudo apt-get upgrade -y
```

**Step 2: Install Python**

AWS CLI is a Python application, and AWS CLI version 2 requires Python 3.6 or later. Install Python and its package manager pip:

`sudo apt-get install python3 python3-pip -y`

Confirm that Python is installed and that it's the correct version:

`python3 --version`

**Step 3: Install the AWS CLI**

Now you can install the AWS CLI using pip:

`pip3 install awscli --upgrade --user`

**Step 4: Add the AWS CLI Executable to Your Command Line Path**

Add the directory containing the AWS CLI program to your PATH environment variable. The location of the AWS CLI installation is `~/.local/bin`.

`export PATH=~/.local/bin:$PATH`

To ensure the PATH persists for future sessions, append the export command to the end of the `~/.bashrc` or `~/.bash_profile` file.

`echo 'export PATH=~/.local/bin:$PATH' >> ~/.bashrc`

Load the updated profile into your current environment:

`source ~/.bashrc`

**Step 5: Verify the AWS CLI Installation**

Verify that AWS CLI is installed correctly:

`aws --version`

You should see the version of your AWS CLI if the installation was successful. Now, your AWS CLI is installed and ready for use. To fully utilize it, remember to configure it with your AWS credentials.

### Why does my Ubuntu server need a reboot?

URL: https://ploi.io/documentation/server/why-does-my-ubuntu-server-need-a-reboot
Last updated: 2023-08-09

Why a Reboot is Required for an Ubuntu Server
---------------------------------------------

Rebooting a system essentially means restarting the computer. It's a process that's sometimes required on an Ubuntu server for various reasons. Here are the main reasons why you might need to reboot an Ubuntu server.

1\. **Kernel Updates**

The kernel is the core of the operating system and handles communication between the computer's hardware and software. Updating the kernel to a newer version can provide performance enhancements, security fixes, and support for new hardware.

\- **Reason for Reboot**: A reboot is necessary to load the new kernel version. Without rebooting, the system continues to run the old kernel, and the benefits of the update won't be applied.

2\. **Software Upgrades**

Some software packages and system libraries require restarting services or even the entire system to fully implement changes.

\- **Reason for Reboot**: Rebooting ensures that all processes are using the updated files. Without a restart, some processes might still be using the old versions of libraries or other files, leading to inconsistencies or errors.

3\. **Driver Installation**

New or updated drivers might need to be loaded to add support for hardware or improve existing hardware support.

\- **Reason for Reboot**: A reboot ensures that the system unloads the old driver and loads the new one, allowing the hardware to function correctly with the updated driver.

4\. **System Troubleshooting**

Sometimes servers may encounter issues like memory leaks, zombie processes, or other misbehaviors that are hard to resolve manually.

\- **Reason for Reboot**: A reboot can be a quick way to clean the system and reset it to a known good state.

5\. **Filesystem Checks and Maintenance**

Occasionally, a server might require filesystem checks and maintenance, especially after an unexpected shutdown or power failure.

\- **Reason for Reboot**: A reboot might be necessary to perform these checks and repairs during startup.

6\. **Changing System Configuration**

Some system-level changes, such as modifying networking settings, might require a reboot to take effect.

\- **Reason for Reboot**: Ensures that all components of the system are aligned with the new configuration.

Conclusion

While rebooting a server can lead to downtime and should be planned and executed carefully, it is sometimes a necessary process. Understanding the reasons for a reboot can help you plan it more effectively, minimize disruption, and make sure the server is running efficiently and securely.

Always remember to follow best practices when performing a reboot, such as notifying users in advance, scheduling the reboot during off-peak hours, and making sure to have recent backups in case of unexpected issues. Utilizing tools like `unattended-upgrades` and `needrestart` in Ubuntu can also help manage reboots and restarts in an automated and efficient way.

### How to Debug 502 Bad Gateway errors

URL: https://ploi.io/documentation/server/how-to-debug-502-bad-gateway-errors
Last updated: 2026-06-15

A 502 Bad Gateway error indicates that one server on the internet received an invalid response from another server. When you're working with a stack involving NGINX as a reverse proxy for a backend written in PHP or NodeJS, diagnosing and fixing a 502 error can involve several steps.

Here is a guide to help you debug 502 Bad Gateway errors for PHP or NodeJS apps running behind an NGINX reverse proxy on an Ubuntu system.

Preliminary Steps
-----------------

1\. **Check Error Logs**: Always start by checking the error logs.

\- NGINX: `/var/log/nginx/error.log`

\- PHP-FPM: `/var/log/php8.5-fpm.log` (File paths might differ based on PHP version)

\- NodeJS: check where you're outputting logs in your application.

2\. **Confirm Status**: Make sure your backend service (NodeJS or PHP-FPM for PHP apps) is running. You can do this with commands like `systemctl status php8.5-fpm` or `pm2 status` for NodeJS apps.

3\. **Test Local Access**: Try to access the app directly via [localhost](http://localhost) to bypass the NGINX proxy. This will help you understand if the problem lies with NGINX or your backend.

Debugging PHP (with PHP-FPM) and NGINX
--------------------------------------

### Common Issues and Solutions

#### 1. PHP-FPM Service is Down

**Error Sample in NGINX log**

```
2023/08/28 09:41:52 [error] 10151#10151: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.0.1, server: localhost, request: "GET /index.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "www.example.com"
```

**Solution**: Restart PHP-FPM service.

```
sudo systemctl restart php8.5-fpm
```

#### 2. Incorrect `fastcgi_pass` in NGINX Configuration

**Error Sample in NGINX log**

```
upstream sent too big header while reading response header from upstream
```

**Solution**: Open the NGINX configuration file for the site and ensure the `fastcgi_pass` directive points to the right location (usually `127.0.0.1:9000` or `/var/run/php/php8.5-fpm.sock`).

```
location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
}
```

#### 3. PHP-FPM Pool Configuration Error

**Error Sample in PHP-FPM log**

```
WARNING: [pool www] server reached max_children setting (5), consider raising it
```

**Solution**: Edit the PHP-FPM pool configuration usually found in `/etc/php/8.5/fpm/pool.d/www.conf`. Increase the value of `max_children`.

```
; In /etc/php/8.5/fpm/pool.d/www.conf
max_children = 20
```

Debugging NodeJS and NGINX
--------------------------

### Common Issues and Solutions

#### 1. NodeJS App Crashed

**Error Sample in NGINX log**

```
connect() failed (111: Connection refused) while connecting to upstream
```

**Solution**: Check the NodeJS app logs for any uncaught exceptions or other errors. Restart your app.

```
pm2 restart <your-app-name>
```

#### 2. Incorrect `proxy_pass` in NGINX Configuration

**Error Sample in NGINX log**

```
no resolver defined to resolve localhost
```

**Solution**: Ensure the `proxy_pass` is correct in the NGINX configuration file.

```
location / {
    proxy_pass http://localhost:3000;
}
```

#### 3. Port Mismatch

**Error Sample in NGINX log**

```
upstream prematurely closed connection while reading response header from upstream
```

**Solution**: Make sure that the port specified in `proxy_pass` matches the port on which your NodeJS app is running.

### Additional Tips

1\. **Check Firewall**: Ensure that the firewall is not blocking the ports used by NGINX or your backend.

2\. **Test Configuration**: Always test your NGINX configuration before applying changes with `nginx -t`.

By systematically going through these checks and solutions, you should be able to identify the cause of most 502 Bad Gateway errors related to PHP or NodeJS apps running behind an NGINX reverse proxy on Ubuntu.

### How to install Bun package manager

URL: https://ploi.io/documentation/server/how-to-install-bun-package-manager
Last updated: 2026-06-15

Bun is a fast all-in-one JavaScript runtime, bundler, test runner and package manager. It is a drop-in alternative to Node.js and npm and does **not** require Node.js to be installed. This guide installs Bun on an Ubuntu server.

Prerequisites
-------------

- An Ubuntu server
- Basic knowledge of the command-line interface

1. Install Bun
--------------

The recommended way to install Bun is with the official install script. [Connect over SSH](https://ploi.io/documentation/ssh) as the **ploi** user and run:

```
curl -fsSL https://bun.sh/install | bash
```

The installer places Bun in `~/.bun` and adds it to your `PATH` in your shell profile. The installer needs `unzip`; if you get an "unzip not found" error, install it first with `sudo apt install -y unzip` and re-run the command.

2. Load Bun into your current shell
-----------------------------------

Open a new SSH session, or reload your profile:

```
source ~/.bashrc
```

3. Verify the installation
--------------------------

```
bun --version
```

This should print the installed Bun version, confirming the installation was successful.

You can now use Bun to install packages (`bun install`), run scripts (`bun run`) and execute files directly (`bun index.ts`).

For more details, see the official [Bun documentation](https://bun.sh/docs).

### How do I upgrade Ubuntu?

URL: https://ploi.io/documentation/server/how-do-i-upgrade-ubuntu
Last updated: 2026-06-15

Upgrading your Ubuntu server can be essential for several reasons, such as accessing newer software versions, improved security features and enhanced performance. An updated operating system ensures you benefit from the latest improvements and stay compatible with current software requirements.

However, upgrading your Ubuntu version requires a basic understanding of SSH and command-line operations. If you're not comfortable with these concepts, it's safer to provision a fresh server with the desired Ubuntu version and migrate your applications. This reduces the risk of system conflicts and data loss.

Pre-upgrade preparation
-----------------------

1\. **Back up your data**: securely back up all critical data, including website files, databases and configuration settings.

2\. **Update your current system**:

```
sudo apt update
sudo apt upgrade
sudo apt dist-upgrade
```

3\. **Install update-manager-core**:

```
sudo apt install update-manager-core
```

Upgrade process
---------------

4\. **Configure release upgrades**: edit `/etc/update-manager/release-upgrades` and set `Prompt` to `lts` or `normal`:

```
sudo nano /etc/update-manager/release-upgrades
```

5\. **Start the upgrade**:

```
sudo do-release-upgrade
```

Follow the on-screen prompts carefully.

6\. **Monitor the upgrade**: respond to any prompts regarding package changes or confirmations.

- **Respond to prompts carefully**: during the upgrade you'll encounter prompts about package changes or configuration file updates.
- **Preserve custom configurations**: if prompted about modified configuration files, it's usually best to keep your current version, so your custom settings aren't overwritten. Choosing the package maintainer's version could reset configurations to defaults and affect your applications or server setup.
- **Note changes**: if you're unsure about a particular file, note its path and review it after the upgrade.

Post-upgrade steps
------------------

7\. **Reboot and verify**:

```
sudo reboot
lsb_release -a
```

8\. **Restore configurations**: reapply any settings from your backup if necessary.

9\. **Check your Ploi settings**: make sure your Ploi panel settings still match the new server configuration.

10\. **Test your applications**: ensure everything works as expected on the new OS version.

Important considerations
------------------------

- **Downtime**: the upgrade involves some downtime for your services.
- **Compatibility checks**: verify your applications are compatible with the new OS version before proceeding.
- **Professional assistance**: if you're unsure about the process, seek help from a qualified system administrator.

If you're not comfortable with SSH and server management, provisioning a new server with the desired Ubuntu version and migrating your applications is often the safer and more efficient option.

### Why can't I backup my whole server?

URL: https://ploi.io/documentation/server/why-cant-i-backup-my-whole-server
Last updated: 2024-03-10

In the ever-evolving landscape of Software as a Service (SaaS), data protection and recovery are paramount. It's crucial to understand the limitations and challenges of backing up whole servers. This article delves into why whole server backups are not only impractical but also why server provider snapshots are a superior solution for safeguarding your data.

**Understanding the Limitations of Whole Server Backups**

1\. **Complexity and Resource Intensity**: Backing up an entire server is a resource-intensive process. It involves duplicating every bit of data, system settings, and applications. This complexity can lead to extended downtime and potential data inconsistencies.

2\. **Storage Requirements**: The sheer volume of data involved in a whole server backup demands massive storage capacity. This is not only expensive but also inefficient, especially for SaaS platforms where data changes frequently.

3\. **Restoration Challenges**: Restoring from a whole server backup can be a time-consuming and challenging process. In the event of a server failure, the restoration process might be slow, impacting your service availability.

**Advantages of Server Provider Snapshots**

1\. **Efficiency**: Server provider snapshots are designed to capture the state of a server at a specific point in time. These snapshots are incremental, meaning they only save changes made since the last snapshot. This approach is far more efficient in terms of storage and processing power.

2\. **Faster Recovery**: In case of server failure, snapshots allow for quicker recovery. Since snapshots store the server's state, they can be used to restore a server to its previous state much faster than traditional whole-server backups.

3\. **Integration with Cloud Infrastructure**: Most server providers offer snapshot functionalities that are deeply integrated with their cloud infrastructure. This integration provides a seamless backup and recovery process, reducing the administrative burden on your team.

4\. **Cost-Effectiveness**: Snapshots are generally more cost-effective than whole server backups. Since they require less storage space and are quicker to create, they reduce both direct and indirect costs associated with data backup and recovery.

**Recommendation for SaaS Platforms**

For SaaS platforms like [ploi.io](https://ploi.io), leveraging the snapshot capabilities offered by your server provider is a strategic choice. It aligns with the need for agile, efficient, and reliable data protection mechanisms. By adopting this approach, you can ensure minimal service disruption, faster recovery times, and a more streamlined data protection process.

In conclusion, while the idea of a complete server backup might seem comprehensive, it's neither practical nor efficient in the modern SaaS landscape. Server provider snapshots offer a more viable and efficient solution, aligning with the needs of dynamic and data-intensive platforms like [ploi.io](https://ploi.io). By embracing this approach, you can safeguard your data while ensuring your service remains resilient and responsive to the needs of your users.

### How to Install FFmpeg on Ubuntu

URL: https://ploi.io/documentation/server/how-to-install-ffmpeg-on-ubuntu
Last updated: 2026-06-15

In this guide, we'll walk you through the steps to install FFmpeg on your Ubuntu server. FFmpeg is a powerful multimedia framework that allows you to manage audio and video files in various formats. It's particularly useful for video conversions, streaming, and processing.

Pre-requisites
--------------

- A server managed by Ploi.
- SSH access to your server.
- Basic knowledge of command-line operations.

Step-by-step guide
------------------

### 1. SSH into your server

Connect to your server via SSH:

```
ssh user@your_server_ip
```

Replace `user` with your username and `your_server_ip` with your server's IP address.

### 2. Update your server

Update your server's package list:

```
sudo apt update && sudo apt upgrade -y
```

### 3. Install FFmpeg

```
sudo apt install ffmpeg -y
```

### 4. Verify the installation

```
ffmpeg -version
```

### 5. Using FFmpeg

Convert and process audio and video files. For example:

```
ffmpeg -i input.mp4 output.avi
```

Replace `input.mp4` with your source file and `output.avi` with the desired output file.

Integrating with Laravel packages
---------------------------------

### Using spatie/laravel-medialibrary

After installing FFmpeg, you can use it with [Spatie's Laravel MediaLibrary](https://github.com/spatie/laravel-medialibrary) for handling media in a Laravel application. This package can leverage FFmpeg to convert videos to different formats or generate thumbnails.

### Using protonemedia/laravel-ffmpeg

For more advanced video processing in Laravel, integrate FFmpeg with [ProtoneMedia's Laravel FFmpeg](https://github.com/protonemedia/laravel-ffmpeg). This package provides a fluent interface to FFmpeg and allows for complex video and audio processing directly within a Laravel application.

### How do I fix the "Too many open files" error?

URL: https://ploi.io/documentation/server/how-do-i-fix-the-too-many-open-files-error
Last updated: 2024-03-11

The "Too many open files (os error 24)" error in Ubuntu is an indication that a process is trying to open more files than the system limit allows. This can be due to your system's file descriptor limit being set too low for your needs. Here's a step-by-step guide to diagnose and fix this issue:

1. Check Current Limits
-----------------------

First, you need to understand your current limits. There are two types of limits you can check: the limit for the shell session and the global system limit.

\- **Shell Session Limit**: Run `ulimit -n` to see the maximum number of open file descriptors for the current shell session.

\- **System-wide Limit**: Check the system-wide limit by examining the contents of `/proc/sys/fs/file-max` with `cat /proc/sys/fs/file-max`.

2. Increase the Limit Temporarily
---------------------------------

To temporarily increase the limit for your current shell session, you can use the `ulimit` command. For example, to set the limit to 4096, you can do:

```
ulimit -n 4096
```

3. Increase the Limit Permanently
---------------------------------

To permanently increase the number of open files limit, you'll need to edit system configuration files:

\- **Edit Limits for Specific User**: Edit `/etc/security/limits.conf` and add the following lines, replacing `username` with your actual username:

```
username soft nofile 4096
username hard nofile 10000
```

Here, `soft` is the limit that the user can increase up to the `hard` limit using `ulimit` without requiring root privileges.

\- **Edit System-wide Limits**: For a global change, edit `/etc/sysctl.conf` and add:

```
fs.file-max = 100000
```

 After editing `/etc/sysctl.conf`, apply the changes with `sudo sysctl -p`.

4. Verify the Changes
---------------------

After making changes, either log out and log back in (for changes in `/etc/security/limits.conf`) or reboot your system (for changes in `/etc/sysctl.conf`). Then, verify that the changes have been applied:

\- For user-specific limits, open a new terminal and run `ulimit -n`.

\- For system-wide limits, check with `cat /proc/sys/fs/file-max`.

5. Adjusting Open File Limit for Systemd Services
-------------------------------------------------

If you're running a service that's managed by systemd and it's the one running into the "Too many open files" error, you might need to adjust limits for the service unit:

\- Edit the service unit file (usually located in `/etc/systemd/system/` or a similar directory). Add or modify the `[Service]` section to include:

```
  LimitNOFILE=10000
```

\- After editing, reload systemd configuration with `sudo systemctl daemon-reload` and restart the service.

Troubleshooting
---------------

\- If you continue to experience problems, ensure that your application or service is not leaking file descriptors by improperly handling file operations.

\- Consider using tools like `lsof` to list open files and identify where the file descriptors are being consumed.

By following these steps, you should be able to resolve the "Too many open files (os error 24)" error on Ubuntu. If the problem persists, it might be worth investigating the specific applications you're running for potential bugs or misconfigurations that could be leading to excessive open file descriptors.

### Setting up HTTP/3 with NGINX on Ubuntu

URL: https://ploi.io/documentation/server/setting-up-http3-with-nginx-on-ubuntu
Last updated: 2026-06-15

Why HTTP/3?
-----------

HTTP/3 is a significant improvement in web protocol technology, offering:

- Improved performance on unreliable networks
- Reduced latency through connection migration
- Better multiplexing without head-of-line blocking
- Enhanced mobile performance
- Improved security by default (QUIC is encrypted by design)

Enabling HTTP/3 in Ploi (recommended)
-------------------------------------

The easiest and safest way to enable HTTP/3 is the 1-click option in Ploi — no manual NGINX changes required. There are a few requirements:

- Your OS must be Ubuntu 24.04 or newer.
- NGINX must be version 1.25 or newer.
- Your server must have been created after **May 2024**. Servers created before that won't be able to use the automatic HTTP/3 option.

When Ploi detects that your server is supported, it shows an HTTP/3 checkbox you can simply enable:

![HTTP/3 Ploi](/storage/images/b77fce7f-d27e-4052-82b9-5f9ded1efcad.png "HTTP/3 Ploi")

Do I need a new SSL certificate?
--------------------------------

No. You can keep your existing certificate. HTTP/3 uses QUIC, which still relies on TLS 1.3, so any valid SSL/TLS certificate that works for HTTPS works for HTTP/3 too — the requirements are the same as for HTTP/2 and regular HTTPS. Just make sure your certificate is valid (not expired), properly installed and trusted by browsers.

Verifying HTTP/3
----------------

Using curl:

```
curl --http3 https://example.com
```

Or in Chrome DevTools: open DevTools (F12), go to the Network tab, and look for "h3" in the Protocol column.

Advanced: enabling HTTP/3 manually
----------------------------------

**Warning:** the steps below install NGINX from the official nginx.org repository, which replaces the NGINX that Ploi manages. This can conflict with Ploi's configuration and break your stack — only do this if you understand the consequences and manage NGINX yourself. For almost all users, the 1-click option above is the right choice.

1\. Add the NGINX repository:

```
sudo apt update
sudo apt install curl gnupg2 ca-certificates lsb-release ubuntu-keyring
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/mainline/ubuntu `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
```

2\. Install NGINX and verify the version (should be 1.25.0 or higher):

```
sudo apt update
sudo apt install nginx
nginx -v
```

3\. In your site configuration (for example `/etc/nginx/conf.d/example.com.conf`), enable HTTP/3:

```
server {
    listen 443 ssl http3 reuseport;
    listen [::]:443 ssl http3 reuseport;
    listen 443 ssl;
    listen [::]:443 ssl;

    server_name example.com;

    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;

    # Enable HTTP/3
    add_header Alt-Svc 'h3=":443"; ma=86400';

    # SSL configuration
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers off;

    location / {
        root /var/www/html;
        index index.html;
    }
}
```

4\. Test the configuration and reload NGINX:

```
sudo nginx -t
sudo systemctl reload nginx
```

5\. Open the firewall port. HTTP/3 runs over UDP on port 443, while most servers only have TCP/443 open. Make sure both are allowed:

- TCP port 443 (regular HTTPS fallback)
- UDP port 443 (HTTP/3 / QUIC)

Troubleshooting
---------------

- Check the NGINX error log: `tail -f /var/log/nginx/error.log`
- Ensure UDP port 443 is open in your firewall.
- Verify NGINX is running: `systemctl status nginx`

### I think my server got hacked, what do I do?

URL: https://ploi.io/documentation/server/i-think-my-server-got-hacked-what-do-i-do
Last updated: 2024-12-02

If you suspect your server has been compromised, you're in the right place. Server security incidents require immediate attention, but with a systematic approach, we can help you assess the situation, contain any potential breach, and restore your server to a secure state.

How do I know if I'm actually hacked?
-------------------------------------

First, let's check if your server is really hacked. Here are some common signs:

- Your website looks different or has been defaced
- Your site is suddenly really slow
- Google has marked your site as "suspicious" or "hacked"
- You're seeing weird files or folders you didn't create
- Your server resources (CPU/RAM) are super high for no reason
- Your users are complaining about redirects to strange sites
- You're getting reports about spam being sent from your server

Okay, I'm pretty sure I'm hacked - what now?
--------------------------------------------

### 1. Don't panic, but act quick

First things first - we need to stop the attack from spreading and prevent any more damage. Here's what to do right away:

1. **Take Your Site Offline**
    
    
    - Disable your sites, maybe turn of your complete server
    - This might feel scary, but it's better than letting the hackers continue doing damage
2. **Change ALL Your Passwords**
    
    
    - WordPress admin password
    - Database passwords
    - FTP passwords
    - Server user passwords
    - Any other services connected to your site

### 2. Find out what happened

Now let's figure out what the hackers did:

- Check your WordPress files for recent changes
- Look at your access logs for suspicious IPs
- Check for weird new admin users in WordPress
- Look for strange new files (especially PHP files)

### 3. Clean up time

Here's how to clean things up:

**If you're running WordPress:**

1. Download a fresh copy of WordPress
2. Back up your wp-content folder and database
3. Scan your theme and plugin files for weird or unreadable code
4. Check your database for suspicious admin users
5. Install a security plugin like Wordfence or Sucuri

**For any server:**

1. Check for unauthorized SSH keys
2. Remove any suspicious cron jobs
3. Scan for malware using maldet or ClamAV
4. Check all your PHP files for weird or unreadable code

### 4. Make your server secure again

Let's prevent this from happening again:

1. **Update everything**
    
    
    - WordPress core
    - All plugins
    - All themes
    - PHP version
    - Server software
2. **Lock things down**
    
    
    - Add a firewall
    - Set up proper file permissions
    - Use strong passwords
    - Enable two-factor authentication
    - Keep regular backups
    - Install a security plugin

Quick reference: "Is this suspicious?"
--------------------------------------

Here's a quick list of things that should raise red flags:

- Files with names like eval.php, base64.php, etc.
- Files containing weird encoded strings
- Unknown admin users in WordPress
- Files modified at strange hours
- Unexpected outbound network connections
- Files in your uploads folder ending in .php

Remember: When in doubt, ask for help! It's better to be cautious than to ignore potential security issues.

Stay safe out there! 🛡️

### How to reinstall Ploi on your server

URL: https://ploi.io/documentation/server/how-to-reinstall-ploi-on-your-server
Last updated: 2025-04-16

This guide walks you through the process of reinstalling Ploi on your server while maintaining the same IP address.

Prerequisites
-------------

- Access to your server provider's control panel
- Administrative access to your Ploi dashboard
- SSH access to your server

Step 1: Reinstall the Server with Your Provider
-----------------------------------------------

To maintain the same IP address, you'll need to reinstall the server through your provider rather than creating a new one:

1. Log in to your server provider's control panel (DigitalOcean, Linode, Vultr, etc.)
2. Locate your existing server in the dashboard
3. Look for the "Rebuild," "Reinstall," or "Reset" option (terminology varies by provider)
4. Select the same operating system that was previously installed or choose one supported by Ploi
5. Confirm the reinstallation process
6. Wait for the server to finish rebuilding (this typically takes a few minutes)

> **Note:** This process will erase all data on your server. Make sure you have backups of your sites and databases before proceeding.

Step 2: Install Ploi via the Custom Option
------------------------------------------

Once your server has been reinstalled by your provider, you'll need to set up Ploi using the custom installation option:

1. Log in to your Ploi dashboard
2. Click on "Servers" in the left sidebar
3. Click the "Create Server" button
4. Select "Custom" from the server provider options
5. Fill in the server details:
    
    
    - Server Name: Enter a descriptive name
    - IP Address: Enter your existing IP address
    - SSH Port: Usually 22 (unless you've configured a different port)
6. Click "Add Server" to proceed

For detailed instructions on custom server installation, please refer to the official Ploi documentation at <https://ploi.io/documentation/server/how-do-i-install-a-custom-server>

Step 3: Wait for Installation
-----------------------------

Ploi will now connect to your server and install all required components:

1. The installation process typically takes 5-10 minutes
2. You can monitor the progress in the Ploi dashboard
3. Once complete, your server will show as "Active" in the dashboard

Post-Installation Steps
-----------------------

After reinstalling Ploi on your server, you'll need to:

1. Restore your sites from backups
2. Reconfigure any custom server settings
3. Reapply SSL certificates
4. Update DNS records if necessary

### How do I make my existing Ubuntu server IPv6 ready?

URL: https://ploi.io/documentation/server/how-do-i-make-my-existing-ubuntu-server-ipv6-ready
Last updated: 2025-05-08

Making your Ubuntu server IPv6 ready in Ploi involves several configuration steps to ensure proper connectivity. Here's how to do it:

First, verify that your server's network interface supports IPv6. Log in to your server via SSH and run:

```
ip -6 addr

```

If you don't see any IPv6 addresses listed (besides the localhost ::1), you'll need to enable IPv6 in your network configuration.

Usually, this is a matter of adding IPv6 via your server provider; the network configuration will be done automatically, if not, get in touch with your server provider to get the IPv6 address added to your server.

Changing to IPv6 in Ploi server settings
----------------------------------------

Now that you have an IPv6 address, you can update the IP address in Ploi to use the IPv6 address. This is not a requirement!

If you still have an IPv4 address on your server, it is completely fine to keep using that. Make sure, that when you're using IP whitelisting for Ploi's workers, to update your firewalls to reflect their IPv6 addresses too: <https://ploi.io/documentation/introduction/ploi-ip-for-whitelisting>

You can update your server IP address in the server settings:

![](/storage/images/21350707-bcde-4b4e-ac48-e1e3ea935c7e.png)

Then save, and scroll down so you can test the connection. After that, you should be set when it comes to the server connection and Ploi.

Updating NGINX configurations
-----------------------------

For a while, Ploi has already created the NGINX configurations with IPv6 support, you can use this part to check whether your sites are IPv6 ready. If you've recently made a server with Ploi, then it's assumed your NGINX configurations are already up to date.

Finally, configure your services to listen on IPv6. For NGINX in Ploi, this is handled automatically, but you can verify by checking your server block configuration:

```
sudo nano /etc/nginx/sites-available/your-site

```

Ensure it contains (if you have SSL, this might be commented out, leave that as it is):

```
listen 80;
listen [::]:80;
```

And for SSL connections:

```
listen 443 ssl http2;
listen [::]:443 ssl http2;
```

If those lines are commented out, leave them as they are. Also important: check other `*.conf` files to see whether they need updating, such as `ssl-redirect.conf` or `redirect.conf` .

Test the configuration:

```
sudo nginx -T
```

If configuration is OK, then restart Nginx to apply any changes:

```
sudo systemctl restart nginx

```

After completing these steps, your Ubuntu server (and sites) should be ready to handle IPv6 traffic through Ploi.

### How do I create a cron job?

URL: https://ploi.io/documentation/server/how-do-i-create-a-cron-job
Last updated: 2026-06-15

Ploi makes it easy to schedule recurring commands on your server with cron jobs — no need to edit the crontab by hand.

Creating a cron job
-------------------

Open your server and go to the **Cron jobs** section, then add a new job. You provide:

- **Command** — the command to run (for example `php8.5 /home/ploi/example.com/artisan schedule:run`).
- **User** — the system user the command runs as, usually `ploi` (or `root` if it needs elevated access).
- **Frequency** — pick a preset (every minute, hourly, nightly at 2 AM, weekly, monthly) or choose **custom** and enter your own cron expression.
- **Description** — an optional note so you remember what the job is for.

Ploi installs the job into the server's `/etc/crontab` for you and writes its output to a per-job log you can view from the panel.

The Laravel scheduler
---------------------

If you run a Laravel application, you only need a single cron job running every minute — Laravel handles the rest from your app's schedule:

```
php8.5 /home/ploi/example.com/artisan schedule:run
```

Set the frequency to **every minute**, and adjust the PHP version and path to match your site.

Custom schedules
----------------

For full control, choose the custom frequency and enter a standard five-field cron expression (`minute hour day month day-of-week`). For example, `0 3 * * *` runs daily at 3 AM. The special `@reboot` value is also supported to run a command at boot.

You can pause, resume, edit or delete a cron job at any time from the same section.

### How do I manage firewall rules?

URL: https://ploi.io/documentation/server/how-do-i-manage-firewall-rules
Last updated: 2026-06-15

Every Ploi server is protected by a UFW firewall. You manage which ports are open from the panel under the **Network** rules section — no need to run `ufw` by hand.

Default rules
-------------

When a server is provisioned, Ploi opens the ports the server type needs. For a standard web server that's SSH (22), HTTP (80) and HTTPS (443). Other server types open their relevant ports (for example a storage server opens the MinIO ports).

Adding a rule
-------------

Open your server, go to the **Network** rules section and add a rule. You provide:

- **Name** — a label for the rule.
- **Port** — a single port or a range (1–65535).
- **Type** — `TCP` or `UDP`.
- **Rule type** — **allow** or **deny**.
- **From IP address** (optional) — restrict the rule to one or more IPs/CIDR ranges (comma-separated). Leave empty to apply to any source.

Ploi applies the rule to UFW for you — for example, opening UDP 443 for HTTP/3, or allowing only your office IP to a custom port.

Good to know
------------

- When you allow a rule on the SSH port, Ploi automatically keeps its own management IPs allowed so you don't lock the panel out.
- To restrict a port to several IP addresses, add them comma-separated — Ploi creates the rules safely one after another.
- You can delete a rule from the same section and Ploi removes it from UFW.

### How do scripts work?

URL: https://ploi.io/documentation/server/how-do-scripts-work
Last updated: 2026-09-29

Scripts are bash scripts you save once in Ploi and run on one or more of your servers. You can start them by hand, on a schedule, or when a server boots or shuts down. Scripts are part of every paid plan. Running them on a schedule needs the Pro or Unlimited plan, running them on boot or shutdown needs the Unlimited plan.

### Creating a script

Click **Scripts** in the sidebar, then **Create script**. Give the script a label, choose the user it runs as and write the script in the editor. The user is `ploi` or `root`. Be careful with root, a mistake in a root script can break the server.

- A script can be up to 7,500 characters.
- Nobody is there to answer prompts, so every command has to run without asking for input. Ploi won't save a script with an `apt install`, `apt update` or `apt upgrade` line that lacks `-y`. Other commands that wait for input make the script hang until it times out.
- Ploi runs the script with bash, so a shebang line has no effect.
- There are no placeholders. Ploi runs the script exactly as you wrote it.

Scripts belong to your account. In a team you see your own scripts and run them on the servers of the team you are working in.

Tick **Use this script as default deploy script for new sites** to make a script the deploy script of every site you install a repository on from then on.

### Running a script

Click **Run** next to the script, select the servers and click **Run script**. The output of each server streams live on that page. Ploi uploads the script over SSH, runs it and deletes the file afterwards.

- A run can take up to 200 seconds. Work that takes longer belongs in a daemon or a [cron job](/documentation/server/how-do-i-create-a-cron-job) on the server.
- Starting the same script on the same server again within a minute does nothing, so a double click doesn't run it twice.
- Every run leaves an entry with the output in the server's **Logs**. When the script exits with an error, the entry says "Script &lt;label&gt; exited with status" followed by the exit code.
- Ploi doesn't send an e-mail or notification when a script fails. Check the server logs.

### Running a script on a schedule

Click **Schedule** next to the script. Enter a cron expression or pick a preset such as **Every hour** or **Daily at 03:00**, select the servers and click **Add schedule**. A script can have more than one schedule.

Cron expressions run in UTC. `0 3 * * *` runs at 03:00 UTC, which is 05:00 in Amsterdam during summer time. The **Next run** and **Last run** times in the list are shown in your browser's timezone.

The schedules run from Ploi, which connects to the server over SSH at each moment. Ploi skips servers that aren't active. When Ploi misses a moment, it runs the script once within the next ten minutes, never several times in a row to catch up. You can pause, resume, edit and delete each schedule. The results show up in the server logs, like a manual run.

A task that has to run even when Ploi can't reach the server is better off as a [cron job](/documentation/server/how-do-i-create-a-cron-job) on the server itself.

### Running a script when a server boots or shuts down

Actions run a script when something happens on a server. There are two triggers, **Server has booted** and **Server is shutting down**. Click **Actions** next to the script, pick the trigger and the servers, set a delay if you need one and click **Add action**.

Ploi installs a small systemd unit on each selected server. When the trigger fires, the unit lets Ploi know, and Ploi runs the script over SSH after the delay. The list shows per server whether the unit is installed. When Ploi can't reach a server, the status says **Failed**. Hover over it to see why.

- The boot trigger waits until the network and SSH are up. When your script depends on other services, such as MySQL or a queue worker, add a delay so they have time to start. The delay can be up to two hours.
- The shutdown trigger only fires on a clean shutdown. A hard reset or power loss skips it. Ploi runs the script after the server has reported the shutdown, so the server may already be gone by then. Keep shutdown scripts short and don't give them a delay.
- A paused action keeps its unit on the server, but Ploi ignores the trigger.
- A script with actions can't be deleted. Delete its actions first, Ploi then removes the systemd units from the servers.

### API

Scripts, schedules and actions are also available in the API, which can also run a one-off script on a server without saving it first. See the [scripts API documentation](https://developers.ploi.io/scripts/run-one-off-script).

## SSL

### How do I request a Let's Encrypt certificate?

URL: https://ploi.io/documentation/ssl/how-do-i-request-a-letsencrypt-certificate
Last updated: 2025-05-04

This is very easy, first, make sure your website is working with your server. Point the A records (for IPv4) and AAAA records (optionally, for IPv6) to your server for your domain, then you can go to your website in Ploi and select "SSL" on the left-hand side.

By default, Let's Encrypt is selected in the dropdown, you will be prompted for which domains you want to request, usually, this is pre-filled so you can just click "Save" to get the certificate from LetsEncrypt.

![](/storage/images/e5612c30-45fa-4639-aab7-e9ed2c3efb60.png)

If this process fails, we will detect this and send you an e-mail about it containing the error, Ploi will also automatically open up a modal with the error. 95% of the cases that a certificate is failed to be requested is due to the fact that the DNS record is not been set up correctly on your server.

Ploi also sets up your server for automatic renewals, you will find this specific cronjob in the **/etc/crontab** file.

Using IPv6 with Let's Encrypt certificates
------------------------------------------

Let's Encrypt fully supports IPv6 for domain validation and accessing the ACME API. When validating domains with both IPv4 (A records) and IPv6 (AAAA records), Let's Encrypt will prefer using the IPv6 address first.

To ensure successful certificate issuance when using IPv6:

1. Make sure your IPv6 configuration is correct and the server with the AAAA record can respond to the Let's Encrypt validation challenges.
2. If your IPv6 address points to a different server than your IPv4 address, ensure both servers are properly configured to respond to Let's Encrypt's validation challenges.
3. If you're experiencing validation issues with IPv6, verify that your webserver is correctly configured and accessible via IPv6.

**Note:** Unlike our previous requirement to remove AAAA records before requesting a certificate, Ploi now officially supports IPv6 for certificate issuance. This allows you to maintain both IPv4 and IPv6 addresses while still obtaining Let's Encrypt certificates.

Cloudflare users
----------------

You are not able to request an SSL certificate if you have the proxy on (orange cloud should be gray). You can disable this and then wait 15 minutes, after that request a new SSL certificate. Once that completes you can re-enable the proxy. After that, you can always leave the proxy on, even for renewals this is no problem.

**Note:** If you're using DNS provider to request a certificate, you can leave the proxy on (orange cloud).

Troubleshooting IPv6 certificate issues
---------------------------------------

If you experience validation issues with your certificate while using IPv6:

1. Verify that your IPv6 address is correctly pointing to your server
2. Ensure your firewall allows incoming connections over IPv6
3. Check that your web server is properly configured to handle IPv6 requests
4. Confirm that your domain's AAAA records match the actual IPv6 address used by your server

If problems persist, you can temporarily disable IPv6 by removing the AAAA records, request your certificate, and then re-add your IPv6 records once the certificate is issued.

### Upgrading TLS version to 1.3

URL: https://ploi.io/documentation/ssl/upgrading-tls-version-to-13
Last updated: 2020-01-13

TLS 1.3 provides a new way to encrypt the connection between the client and server, not only is this more secure, but way faster. This guide will show you how to update your current site to allow TLS1.3

**Note**: If you created your server after **13 January 2020** you will not have to do this on a server provisioned by ploi.io, this has been done automatically.

First, we will have to tell the main nginx.config file to define the specific TLS versions, you can run this command (run this command as root):

```
sed -i "s/ssl_protocols.*/ssl_protocols TLSv1.2 TLSv1.3;/" /etc/nginx/nginx.conf
```

Next edit your site NGINX configuration file, generally you can find this at **/etc/nginx/sites-available/example.com.conf**, remove the  **ssl\_protocols ..** part and replace it with this:

```
ssl_protocols TLSv1.2 TLSv1.3;
```

After this, restart NGINX:

```
service nginx restart
```

Next verify your TLS version via the inspector of your browser (generally called "Security" tab):

 ![](https://ploi.io/storage/81/Screen-Shot-2020-01-13-12-58-20.07.png)

### How do I request an LetsEncrypt wildcard certificate?

URL: https://ploi.io/documentation/ssl/how-do-i-request-an-letsencrypt-wildcard-certificate
Last updated: 2024-04-02

In order for you to be able to request a wildcard LetsEncrypt certificate you will need to use any of the supported DNS providers. At the time of writing, this is **Cloudflare, Vultr, Linode, Hetzner &amp; DigitalOcean**.

You can link any of these DNS providers inside your profile under the [Integrations](https://ploi.io/profile/integrations) tab. Of course, you can also manually enter these details when requesting a wildcard SSL certificate.

To request a wildcard Let's Encrypt certificate you will have to request the certificate wild the wildcard character: `*`

An example of how you can achieve this: `domain.com,*.domain.com`

### My Let's Encrypt certificate is not renewing automatically

URL: https://ploi.io/documentation/ssl/my-lets-encrypt-certificate-is-not-renewing-automatically
Last updated: 2022-09-14

Once you install a server with Ploi, Ploi will make sure to set up to automatically renew your certificates via the system crontab.

When you see or receive a notification that your certificate is expiring, something might be wrong with the domain set up after you've requested the certificate.

To investigate, we'll start by looking at the renewal logs which 99% of the time will tell us what is going on.

To start, head over to your server in Ploi and press the logs tab, next select **\[Certbot\] Renew log (/home/ploi/.ploi/certbot-renew.log)** in the dropdown:[![](https://ploi.io/storage/tNUJfOc1yuZ4fNhrqWR0JSc0G0YLDAC6mfTbOTd4.png)CleanShot 2022-09-14 at 09.26.40.png 354.25 KB](https://ploi.io/storage/tNUJfOc1yuZ4fNhrqWR0JSc0G0YLDAC6mfTbOTd4.png)These log contents could already tell you what is going wrong, for example, if you've added basic auth a 401 error will occur and Certbot won't be able to renew, you would find this inside the log contents.

If you need to get a more detailed error, you may consult the Let's Encrypt general log: [![](https://ploi.io/storage/v4kTs96ZEhiSxThve8S4qQtRPsE6XAaSOsNIZYUa.png)CleanShot 2022-09-14 at 09.28.20.png 514.57 KB](https://ploi.io/storage/v4kTs96ZEhiSxThve8S4qQtRPsE6XAaSOsNIZYUa.png)This General log should show a much more verbose output of what Certbot is trying to do, and why it is failing.

### How do I request a ZeroSSL certificate?

URL: https://ploi.io/documentation/ssl/how-do-i-request-a-zerossl-certificate
Last updated: 2024-10-29

To start, you'll need a ZeroSSL account which you can create [here](https://app.zerossl.com/signup?ref=ploi.io) (ZeroSSL is completely free, you are not required to take a subscription). Then in the "developers" tab, grab your API key:

![](/storage/images/d93c7553-766a-455c-ad00-5bacd5f4c817.png)

Then, make sure your website is working with your server. Point the A records to your server for your domain, after that, you can go to your website in Ploi and select "SSL" on the left-hand side.

Now in the dropdown, select "ZeroSSL" and fill in the next fields.

![](/storage/images/7e47c2ff-3eeb-4568-9d6c-8d31d851d5bc.png)

If this process fails, we will detect this and send you an e-mail about it containing the error. 95% of the cases that a certificate is failed to be requested is due to the fact that the DNS record is not been set up correctly on your server.

Ploi also sets up your server for automatic renewals, you will find this specific cronjob in the **/etc/crontab** file.

**Cloudflare users:** You are not able to request an SSL certificate if you have the proxy on (orange cloud should be gray). You can disable this and then wait 15 minutes**,** after that request a new SSL certificate. Once that completes you can re-enable the proxy. After that, you can always leave the proxy on, even for renewals this is no problem.

**Please note:** If you have IPv6 set up for your domain, you will not be able to request a certificate. Please remove any AAAA records before you request a new certificate.

### How do I use multiple SSL certificates on a site?

URL: https://ploi.io/documentation/ssl/how-do-i-use-multiple-ssl-certificates-on-a-site
Last updated: 2026-09-29

A site can hold more than one SSL certificate, but only one serves traffic at a time. That certificate has the **Active** badge in the certificate list. The others stay installed next to it, each with its own files on the server, and you switch between them with **Activate**. This lets you prepare a replacement before you take the old certificate out, without downtime.

### Where to find it

Open the site and click **SSL** in the sidebar. You add certificates in the **New certificate** card. The list below it shows every certificate with its type, its domains, the path of the certificate file and the number of days until it expires.

### Adding another certificate

You add it the same way as the first one, as a [Let's Encrypt](/documentation/ssl/how-do-i-request-a-letsencrypt-certificate) or [ZeroSSL](/documentation/ssl/how-do-i-request-a-zerossl-certificate) certificate, or as an existing certificate you paste in. When the site already has an active certificate, Ploi installs the new one and leaves the site on the current certificate. The log then says the certificate was installed but not activated. When the site has no active certificate, the new one becomes active right away.

You can request a Let's Encrypt or ZeroSSL certificate for exactly the same domains as an existing one. Every certificate gets its own files, so they never overwrite each other.

### Switching to another certificate

Click **Activate** next to the certificate you want to use. Ploi first checks that its certificate and key files are on the server, and stops without touching anything if they are missing. It then points the site's NGINX configuration at the new files, writes the HTTP to HTTPS and www redirects again and reloads NGINX. The switch takes a few seconds. A reload lets NGINX finish open connections, so visitors don't notice it.

The button only shows for certificates that have finished installing. Signing requests and certificates requested through a load balancer can't be activated.

### When this is useful

- **Replacing an uploaded certificate before it expires.** Paste the new one with **Install existing certificate**, activate it, then delete the old one.
- **Moving from a custom certificate to Let's Encrypt.** Request the Let's Encrypt certificate, wait until it has installed, then activate it.
- **Covering new domain aliases.** Request a new certificate, use **Add aliases** to put the aliases in the domain field, activate it and delete the old certificate.
- **Changing how the certificate is validated.** Request the same domains again through a DNS provider instead of HTTP validation, or with ZeroSSL instead of Let's Encrypt, and activate the new one.

### Renewal

Let's Encrypt certificates renew automatically, whether they are active or not. Every server runs `certbot renew` once a day between 01:00 and 07:00. Certbot renews each certificate that expires within 30 days and Ploi reloads NGINX afterwards. Delete the certificates you no longer use, otherwise they keep renewing.

Certificates you pasted in yourself don't renew. Ploi checks their expiry date every day and shows it in the list, so replace them in time with the steps above.

### HTTP/3

HTTP/3 belongs to the certificate, not to the site. You switch it on with **Use HTTP/3** when you request a Let's Encrypt or ZeroSSL certificate, and you can't change it later. Activating a certificate without HTTP/3 turns HTTP/3 off for the site, so tick **Use HTTP/3** on the replacement if you want to keep it. Pasted certificates can't use HTTP/3. More about the requirements is in [Setting up HTTP/3 with NGINX on Ubuntu](/documentation/server/setting-up-http3-with-nginx-on-ubuntu).

### Deleting a certificate

You can delete any certificate that isn't active. Ploi revokes a Let's Encrypt certificate before it removes it. To delete the active certificate while the site has others, activate one of the others first. When you delete the last certificate of a site, Ploi removes the HTTPS configuration and the site serves plain HTTP again.

### Tenants

[Tenants](/documentation/domains/how-does-the-tenants-feature-work-for-sites) work the same way. Every tenant has its own certificates with one of them active. Open **Tenants** in the site sidebar and expand **Certificates** on the tenant to activate or delete one. Ploi doesn't start a new request for a tenant while another request for that tenant is still running.

You can also switch certificates through the API with the [activate certificate](https://developers.ploi.io/certificates/activate-certificate) endpoint.

## Deployment

### How do I deploy?

URL: https://ploi.io/documentation/deployment/how-do-i-deploy
Last updated: 2024-01-18

**In case you have a WordPress website, this article does not apply to you.**

Deploying with Ploi is easy, there are several methods to deploy. The easiest one is through our panel:[![](https://ploi.io/storage/9lkv1d79wpXAGtqyz4e1WgYSm2D3VUGersUd5WAF.png)](https://ploi.io/storage/9lkv1d79wpXAGtqyz4e1WgYSm2D3VUGersUd5WAF.png)

This will start up the deploy script you have and start running it.

You can also use the webhook URL inside the site Repository tab:[![](https://ploi.io/storage/OwZhKjfI4jAZMPJHNC7XsL8cPjAgC4MqbM3vbbpg.png)](https://ploi.io/storage/OwZhKjfI4jAZMPJHNC7XsL8cPjAgC4MqbM3vbbpg.png)

The third option is to use our API, we have a full-fledged API where you can trigger the deployment on your website.

For more information on the API, you can find our [extensive documentation here](https://developers.ploi.io).

### How does Zero Downtime Deployment work?

URL: https://ploi.io/documentation/deployment/how-does-zero-downtime-deployment-work
Last updated: 2019-08-07

**This article only applies for users that have a plan which allows Zero Downtime Deployment feature. For more information check our[ pricing page.](https://ploi.io/pricing)**

Zero Downtime Deployment makes it possible to deploy without any downtime (of course, this could depend on your deploy script). It will create a folder named '{site\_domain}-deploy' and create timestamp based folders inside it.

The system keeps 3 versions:

- Oldest version
- Recent version
- Current version

The current version, is linked with a system link to the web directory folder. If you want to hold the storage folder in 1 place, you can create a storage folder inside the '{site\_domain}-deploy' folder, and symlink this to your current version. It is also to possible to leave this as it is, it will just copy all your files.

Once you enable Zero Time Deployment, it will not directly change directories, this will only happen once you deploy your application.

### How to install WordPress

URL: https://ploi.io/documentation/deployment/how-to-install-wordpress
Last updated: 2020-10-27

Installing WordPres on your server is very easy within Ploi. First make sure you create your domain and open it in the Ploi panel.

Next click "WordPress" to open up the 1-click installer:

[![](https://ploi.io/storage/UYNaSn5XhFlMfHcenbvgB42XemTd3c3inOgQ6nAg.png)](https://ploi.io/storage/UYNaSn5XhFlMfHcenbvgB42XemTd3c3inOgQ6nAg.png)

Select a created database, or let Ploi generate one for you and press "Install WordPress", you will be prompted with a loading notification.

Once finished, you will see that WordPress has successfully been installed:

[![](https://ploi.io/storage/WdgpdjI3eyhjffHjb51PPmMR1Njs234KTcRszqvT.png)](https://ploi.io/storage/WdgpdjI3eyhjffHjb51PPmMR1Njs234KTcRszqvT.png)

### How to send emails in WordPress with Mailgun

URL: https://ploi.io/documentation/deployment/how-to-send-emails-in-wordpress-with-mailgun
Last updated: 2026-06-15

Sending e-mails is easy; getting them reliably delivered is another story. Here's how to send e-mail from WordPress through Mailgun.

1. Create a Mailgun account
---------------------------

Head over to [mailgun.com](https://www.mailgun.com/) and create an account. Mailgun is a paid service with a limited free trial — check their current pricing page for up-to-date limits and rates.

2. Add and verify your sending domain
-------------------------------------

In Mailgun, add your sending domain (for example `mg.yourdomain.com`). Mailgun will give you a set of DNS records to add at your DNS provider — typically a TXT record for SPF, a TXT record for DKIM, MX records, and a CNAME for open/click tracking. Add these records and wait for Mailgun to verify the domain. Delivery won't work correctly until the domain shows as verified.

3. Install and configure the WordPress plugin
---------------------------------------------

Install the official [Mailgun for WordPress plugin](https://wordpress.org/plugins/mailgun/), then go to **Settings &gt; Mailgun** and enter your Mailgun domain and API key. Save, and use the plugin's **Test** button to send a test e-mail and confirm everything is configured correctly.

### How do I update WordPress?

URL: https://ploi.io/documentation/deployment/how-do-i-update-wordpress
Last updated: 2020-10-27

Keeping your WordPress installation up-to-date is plays a vital role in maintaining your site's security. Most updates just fixes bugs and adds features, but any other updates are highly regarding security updates which are highly recommended to run.

To update your WordPress installation login and visit the administration dashboard.

On the left you will see a 'Updates' tab, when there are updates available you will see a orange badge indicating that there are updates waiting for you.

![](https://ploi.io/storage/55/Screen-Shot-2019-04-08-18-49-36.png)

**Note:** We really recommend you backup your installation/database before upgrading. If anything fails, you cannot revert back that easily.

**Note:** If you are using OPCache, it might be that WordPress keeps telling you there are updates. You will have to flush the PHP-FPM worker so changes come through.

### How can I install a Github repository from an organization?

URL: https://ploi.io/documentation/deployment/how-can-i-install-a-github-repository-from-an-organization
Last updated: 2021-09-07

To be able to clone and pull from repositories that are inside an organization you will have to allow the Ploi Github application access to that organization.

Head over to [Github Applications](https://github.com/settings/applications) and press "Ploi", at the bottom you will see a list for all the organizations you are linked with. Next to the name there is a "Grant" button which you will have to press to allow access.

![](https://ploi.io/storage/WUJ7aFYEi9AZilg2jdSOtu0E5kzw4dIAOCLYt9SM.png)

### How do I enable Zero Downtime deployment?

URL: https://ploi.io/documentation/deployment/how-do-i-enable-zero-downtime-deployment
Last updated: 2020-10-27

You can enable zero downtime deployment inside site level under the Settings tab. You will find a checkbox at the bottom to enable it, we have also added explanation for you to read if you are unsure how Zero Downtime deployments work.

[![](https://ploi.io/storage/W12FF1CQFvyTImBXggF6aZBsp8YoBFCLupeUOMOL.png)](https://ploi.io/storage/W12FF1CQFvyTImBXggF6aZBsp8YoBFCLupeUOMOL.png)

### How can I keep multiple sites in sync?

URL: https://ploi.io/documentation/deployment/how-can-i-keep-multiple-sites-in-sync
Last updated: 2020-10-27

It is possible that you require code to be in sync, for example if you are using load balancing technique and you have 2 of the same sites &amp; repository installed. You do not want to come across a situation that 1 is behind with code.

Thats why we've added synchronized deployments, you can find this under the repository tab:

[![](https://ploi.io/storage/XWCHt5XlSmqAXYcWLSylUkuXXHzjjYVoiVPloFCS.png)](https://ploi.io/storage/XWCHt5XlSmqAXYcWLSylUkuXXHzjjYVoiVPloFCS.png)

If you press this a modal will open with all the sites that contain a repository, so you can keep these in sync:

[![](https://ploi.io/storage/1wRMfizyVZViETEHpl5qdsekenVYtlWu5r4nltP1.png)](https://ploi.io/storage/1wRMfizyVZViETEHpl5qdsekenVYtlWu5r4nltP1.png)

Select all the sites you need to be deployed once the main site is deployed and the rest will be done automatically for you.

### My deployment is stuck

URL: https://ploi.io/documentation/deployment/my-deployment-is-stuck
Last updated: 2020-10-27

The most important thing with this is to figure out why it is stuck. Most of the times this is because there is an interactive command that is asking for verification.

A good example is if you run "php artisan migrate" without the --force flag. This will trigger an interactive question "Are you sure?" which the Ploi system does not read.

If you've figured out why it is deploying forever (stuck) you can reset the deployment status inside the repository tab and try it again.

[![](https://ploi.io/storage/4BPcoNyZlgIYHda8cyLVExtfrzxdzA5k96EgP1eZ.png)](https://ploi.io/storage/4BPcoNyZlgIYHda8cyLVExtfrzxdzA5k96EgP1eZ.png)

### How to trigger deployments via GitHub actions

URL: https://ploi.io/documentation/deployment/how-to-trigger-deployments-via-github-actions
Last updated: 2021-05-11

In order to trigger deployments from your GitHub actions, we'll need to do a call to the deploy webhook URL in order for Ploi to know your application has to be deployed.

Recommended way
---------------

[Glenn](https://github.com/Glennmen) has created an excellent GitHub action that's available on the marketplace for you to use.

<https://github.com/Glennmen/ploi-deploy-action>

This action allows you to deploy in 2 ways, the webhook that's provided by Ploi in the repository tab, or via the API.

Glenn has also made sure there's a few examples available for you to have a flying start:

<https://github.com/Glennmen/ploi-deploy-action/tree/master/examples>

Alternative ways
----------------

To do a call from your GitHub action, we'll need an additional plugin from the GitHub market place. You have a few options for this, we'll list the tested options here:

- <https://github.com/marketplace/actions/http-request-action>
- <https://github.com/marketplace/actions/github-action-for-curl>

With these plugins, you'll be able to send cURL calls to the Ploi deploy webhook URL. To get this deploy webhook URL, visit your site in ploi.io and press the repository tab. Next scroll down until you see the Deploy Webhook URL card:

![](https://ploi.io/storage/HgvCpW4JWIWn9Ul3oQQKsDvSJJNF0ZtuyIbjVqiW.png)

Copy this URL and enter this part inside your GitHub action file (this example uses the first plugin listed above):

```
jobs:
    deployment:
        - name: Deploy To Ploi
            uses: fjogeleit/http-request-action@master
            with:
                url: 'https://ploi.io/webhooks/servers/1/sites/1/deploy?token=xxx'
                method: 'POST'
```

Make sure to replace the URL with your deploy webhook URL.

### How to skip a deployment via commit message?

URL: https://ploi.io/documentation/deployment/how-to-skip-a-deployment-via-commit-message
Last updated: 2022-01-06

You can use the **{COMMIT\_MESSAGE}** deploy script variable to do some magic inside your deploy script. For example, skipping deployments can be done easily with this.

An example to skip a deployment:

```
if [[ {COMMIT_MESSAGE} =~ "skip-deployment" ]]; then
    echo "Skipping deployment upon commit message request."
    exit 0
fi
```

You can even step it up a notch, flush the FastCGI cache when you add a specific word in the commit message:

```
if [[ {COMMIT_MESSAGE} =~ "flush-fastcgi" ]]; then
    {FLUSH_FASTCGI_CACHE}
fi
```

Additionally, you might have setup notifications that you do not want to notify in this case. We have a deploy script variable for that as well. Use the deploy script variable **{DO\_NOT\_NOTIFY}** inside your if statement to skip notifications.

An example:

```
if [[ {COMMIT_MESSAGE} =~ "skip-deployment" ]]; then
    echo "Skipping deployment upon commit message request."
    {DO_NOT_NOTIFY}
    exit 0
fi
```

Make sure to put the **{DO\_NOT\_NOTIFY}** variable **before** you exit the script.

### How do I install Statamic?

URL: https://ploi.io/documentation/deployment/how-do-i-install-statamic
Last updated: 2021-04-15

Statamic is a beautiful CMS powered by Laravel and is very easy to install with Ploi.

You have 4 options to install your Statamic project:

1. Using your own Git repository and by installing it just like you're used to.
2. Using our 1-click installer without any integration, it just installs and you're set to go
3. Using our 1-click installer with the repository integration, this allows you to setup Statamic &amp; create a repository on the fly
4. Using (S)FTP, however this is a very ugly solution.

**Using our 1-click installers is as simple as it sounds.**

The first way is without any integration is as simple as:

![](https://ploi.io/storage/K4eQpLvprFLDRN1ZQzIBjW1w0f5hcs6AilVU7kGE.png)

The second way is more advanced and recommended because it is way more maintainable. This is because it installs the repository with the provider you select. This allows you to easily pull down the repository directly to your local environment and start building right away.

![](https://ploi.io/storage/e5nZA2exGwzqWUlnak0J2UAB9EHaPxtATG9U6Jbx.png)

### How to install WordPress multisite

URL: https://ploi.io/documentation/deployment/how-to-install-wordpress-multisite
Last updated: 2021-06-03

WordPress multisite is a great way to manage multiple sites from 1 panel. Luckily, WordPress makes this very easy.

In this article we'll be covering how to set this up with **sub-directories** and **domain aliases**.

First create a site and install WordPress on that. Next run through the installer wizard and make sure your WordPress site is up and running.

After this we need to add the domain alias, luckily you can easily do this via the Ploi UI inside the Manage tab on site level:

![](https://ploi.io/storage/5qwkKSn2IreWLzmUnYShvlgx7OGuR3k1MBTiyy0w.png)

Next we are going to edit 2 files, the **wp-config.php** and the NGINX configuration.

First edit the **wp-config.php** file which you can do through the Ploi panel and add this line:

```
define( 'WP_ALLOW_MULTISITE', true );
/* That's all, stop editing! Happy publishing. */
```

Make sure that you add the line just before:

```
/* That's all, stop editing! Happy publishing. */
```

Next edit your NGINX configuration of your site and add this inside the **server{}** block:

```
if (!-e $request_filename) {
    rewrite /wp-admin$ $scheme://$host$request_uri/ permanent;
    rewrite ^(/[^/]+)?(/wp-.*) $2 last;
    rewrite ^(/[^/]+)?(/.*\.php) $2 last;
}
```

Now head over to your WordPress installation and login as administrator. In the sidebar go to **Tools &gt; Network Setup**.

Select **Sub-directories**, enter the title and email address and press **Install**.

![](https://ploi.io/storage/4dQJUQEGBxh2TUPUJtwVTfLSGiIqD7LoQc3r9MgC.png)

Once installed, you will see additional configuration you need to add to your **wp-config.php** file. This looks like this:

![](https://ploi.io/storage/dvoVbHGAwqgemLnHmiu269ANJ3oWuk7pgVu4Wmkw.png)

Earlier, we already added the **WP\_ALLOW\_MULTISITE** directive to your **wp-config.php** file, you can add the configuration presented below that directive, but make sure it is above this:

```
/* That's all, stop editing! Happy publishing. */
```

The new configuration that you may have to add looks like this (except the domain might be different):

```
define('MULTISITE', true);
define('SUBDOMAIN_INSTALL', false);
define('DOMAIN_CURRENT_SITE', 'wp1.examplehosting.com');
define('PATH_CURRENT_SITE', '/');
define('SITE_ID_CURRENT_SITE', 1);
define('BLOG_ID_CURRENT_SITE', 1);
```

So in total it will look like this:

```
define( 'WP_ALLOW_MULTISITE', true );
define('MULTISITE', true);
define('SUBDOMAIN_INSTALL', false);
define('DOMAIN_CURRENT_SITE', 'wp1.examplehosting.com');
define('PATH_CURRENT_SITE', '/');
define('SITE_ID_CURRENT_SITE', 1);
define('BLOG_ID_CURRENT_SITE', 1);
/* That's all, stop editing! Happy publishing. */
```

You've already complete step 2 automatically before in this guide so you can start by logging in again, your installation will also ask you to do this.

Now let's start adding the second site and set that up.

![](https://ploi.io/storage/J9Ux2QyBWCDNVE2kciw8WSyhMxO3jk5YvhhQSsHz.png)

At the top, select **My Sites -&gt; Network Admin -&gt; Sites**, in here you'll see a list of your current site, only one should be listed.

Press **Add New** and fill in the details. We recommend to choose a folder name that reflects your second site's name. For now we are going to use **wp2** in this example:

![](https://ploi.io/storage/XEtp54tJIaY7yBdoWPLYGhWF7dgM34U0agc30GWA.png)

Press **Add Site**, and go back to the sites overview:

![](https://ploi.io/storage/PsHTuf0TIpBXk3m7wPpdXSehFtbouIgXYKvIZNeV.png)

Edit the second site you have just and edit the **Site Address (URL)** to reflect your **domain alias**:

![](https://ploi.io/storage/AON6xQkenj0D5YMp91cWt04asnyfl8a21g950GJ8.png)

And that's it! You now have a multisite WordPress installation setup.

### Composer installation tips

URL: https://ploi.io/documentation/deployment/composer-installation-tips
Last updated: 2021-12-09

This guide will illustrate a few nice things to have when running **composer install** in your deploy script.

1. Add --no-dev to your composer install line
---------------------------------------------

This will improve security massively and save resources on your server. Besides that, the installation will take less time as it does not have to install any development packages (that are probably being used for local development anyway).

```
composer install --no-dev
```

2. Add --optimize-autoloader to your composer install line
----------------------------------------------------------

Convert PSR-0/4 autoloading to classmap to get a faster autoloader. This is recommended especially for production but can take a bit of time to run so it is currently not done by default.

```
composer install --optimize-autoloader
```

3. Always commit your composer.lock file
----------------------------------------

The composer.lock file is used for your server to know which package versions it should install. This generally means your tests have run locally before you run composer install on your server to make sure all new packages are compatible with your application.

4. Regularly check outdated packages
------------------------------------

Composer is able to tell you whether there's patch, minor or major updates available. This can assist you in securing your application even further.

Run this command to check for outdated packages:

```
composer outdated --direct
```

5. Add --no-interaction if your using a deployment tool
-------------------------------------------------------

If you're using a deployment tool like Ploi, chances are interactive questions will not get read by the platform. To avoid getting asked questions you can add the following line to your composer install command:

```
composer install --no-interaction
```

### How to deploy Soketi

URL: https://ploi.io/documentation/deployment/how-to-deploy-soketi
Last updated: 2026-06-15

**Note:** Soketi is no longer actively maintained — its repository has been archived upstream. For new projects we recommend [Laravel Reverb](https://ploi.io/documentation/laravel/how-do-i-set-up-the-laravel-reverb-server), which Ploi supports natively. This guide remains for existing Soketi installations.

Soketi is a simple, fast and resilient open-source WebSockets server. This article was originally written by its creator, [Alex Renoki](https://twitter.com/rennokki).

Installation
------------

Soketi runs on Ubuntu without issues, so any Ploi-managed Ubuntu server can run it. Make sure your application server is set up first.

Installing via the Marketplace
------------------------------

Assuming your application is already deployed, you can use the Ploi Marketplace script for Soketi. Clicking "Copy Over" copies the script into your "Scripts" section, where you can run it on your servers with one click.

![](https://ploi.io/storage/UecDca5ULTqbK8XtzVJklfiPxugfPD8iV01vzln1.png)

Manual installation
-------------------

If you prefer to install it manually over SSH, install Soketi globally with npm:

```
npm install -g @soketi/soketi@latest
```

In some cases the script cannot run as the ploi user, so you may need root access to install the package globally.

Setting up Supervisor
---------------------

Verify Soketi is installed:

```
soketi --help
```

Next, set up a Daemon (a supervisord process) so Soketi keeps running in the background and restarts if it crashes or the server reboots. From the server view, open the "Daemons" section and set the command to:

```
soketi start
```

![](https://ploi.io/storage/MOc0BxXLmMORURqMDZcZn9KFKDUoO3izadZOlu97.png)

You can confirm the process is running by checking its logs:

![](https://ploi.io/storage/wciRaMDR6wbhlJzQmpYpfy58YEm7uxu694rwYcXz.png)

Opening the port to the internet
--------------------------------

Finally, open Soketi's port to the internet. By default Soketi runs on port `6001`, so add a TCP firewall rule for it:

![](https://ploi.io/storage/hbjhwoZIJw9TAF0eE3LdDBOl9Zrs9I6N5XyhVdU6.png)

Accessing `[server-ip]:6001` should return an `OK` response from the server.

Connecting to Soketi
--------------------

With Soketi installed and running on your Ploi server, the next steps are connecting your [frontend application](https://docs.soketi.app/getting-started/client-configuration) and broadcasting events from your [backend application](https://docs.soketi.app/getting-started/backend-configuration). 📡

### How do I attach a self-hosted GitLab server?

URL: https://ploi.io/documentation/deployment/how-do-i-attach-a-self-hosted-gitlab-server
Last updated: 2022-09-20

In Ploi, it is possible to have multiple source control provider accounts, including GitLab self-hosted.

To add your self-hosted GitLab server, head over to Source Control in your profile: <https://ploi.io/profile/source-control> and press the "Link self-hosted GitLab" button.

[![](https://ploi.io/storage/cB3ibg5sn5oDeQBCOkFDJTcDdwDDIbHXGNz19qLA.png)CleanShot 2022-09-20 at 10.48.48.png 72.21 KB](https://ploi.io/storage/cB3ibg5sn5oDeQBCOkFDJTcDdwDDIbHXGNz19qLA.png)In this window you'll be able to enter the following details:

- Label (to recognize your source control provider)
- Endpoint (the URL to your panel, like: https://gitlab.example.com)
- Token (the token to authorize with your self-hosted GitLab panel)

To grab the token, you'll need to create one. In your self-hosted GitLab panel head over to your profile:[![](https://ploi.io/storage/kewTRGb46e1dYjfhQjkH94zwRIGhTeNSwilpnSVt.png)CleanShot 2022-09-20 at 10.38.03.png 195.53 KB](https://ploi.io/storage/kewTRGb46e1dYjfhQjkH94zwRIGhTeNSwilpnSVt.png)Next press "Access tokens" on the left and create your token:[![](https://ploi.io/storage/G7VuWD76uczfS0hdqZCyiq0vf4B692DXuw2UyCI7.png)CleanShot 2022-09-20 at 10.38.32.png 558.05 KB](https://ploi.io/storage/G7VuWD76uczfS0hdqZCyiq0vf4B692DXuw2UyCI7.png)We advise to give the following scopes:

- api
- read\_api
- read\_user
- read\_repository
- write\_repository

### How do I update all URL's inside a WordPress database using WP-CLI?

URL: https://ploi.io/documentation/deployment/how-do-i-update-all-urls-inside-a-wordpress-database-using-wp-cli
Last updated: 2023-03-09

Updating URLs in a WordPress database can be a daunting task, especially if you have a large number of posts, pages, and media files. However, with the help of the wp-cli command-line interface, this process can be simplified and made more efficient.

In Ploi, it's possible to easily 1-click install the WP-CLI from the panel, inside the Manage tab on server level:

[![](https://ploi.io/storage/DwUNZMle2KxOUTkXJGSD2yDFK0lxMl7E0roxtsMJ.png)CleanShot 2023-03-09 at 13.28.20.png 146.79 KB](https://ploi.io/storage/DwUNZMle2KxOUTkXJGSD2yDFK0lxMl7E0roxtsMJ.png) Here's a step-by-step guide on how to update all the URLs in your WordPress database using wp-cli:

1.  Backup your WordPress database, before making any changes to your WordPress database, it is essential to back it up. You can do this with Ploi if you have the correct subscription, or use a client like TablePlus or phpMyAdmin.

2\. Navigate to the root directory of your WordPress installation using the cd command. For example, if your WordPress site is located in the **/home/ploi/myblog.com/public** directory, you would type:

```
cd /home/ploi/myblog.com/public
```

3\. Open the wp-cli interface, simply type **wp** followed by the command you want to run. For example, to see a list of available commands, you would type:

```
wp help
```

4\. Update the URLs in your WordPress database, you'll need to run two wp-cli commands. The first command updates the site URL:

```
wp search-replace 'https://myblog.com' 'https://mysuperblog.com' --skip-columns=guid
```

In this command, replace **https://myblog.com** with your site's old URL and **https://mysuperblog.com** with your site's new URL. The **--skip-columns=guid** argument tells wp-cli to skip updating the GUID column, which contains the permanent link to each post or page.

The second command updates the home URL:

```
wp option update home 'https://mysuperblog.com'
wp option update siteurl 'https://mysuperblog.com'
```

This command updates the home URL stored in the options table of your WordPress database.

5\. Once the commands have finished running, verify that the URLs have been updated by visiting your WordPress site and checking that all links and images are working correctly.

That's it! By following these steps, you can update all the URLs in your WordPress database quickly and easily using wp-cli. Remember to always back up your database before making any changes.

### Installing a global auth.json for Composer

URL: https://ploi.io/documentation/deployment/installing-a-global-authjson-for-composer
Last updated: 2023-03-28

This guide will walk you through the process of installing a global auth.json file for Composer on an Ubuntu server. This file will be used to authorize access to private repositories, making it more convenient to manage private packages and repositories.

Prerequisites
-------------

Before proceeding, ensure that you have the following installed on your Ubuntu server:

1. Ubuntu 20.04 or later
2. Composer (Visit <https://getcomposer.org/download/> for installation instructions)

Step 1: Create the global auth.json file
----------------------------------------

First, we need to create a global auth.json file in the Composer's configuration directory.

1. Open your terminal.
2. Run the following command to create the Composer configuration directory, if it doesn't already exist:
3. ```
    mkdir -p ~/.config/composer 
    ```
4. Navigate to the newly created directory:
5. ```
    cd ~/.config/composer 
    ```
6. Create the auth.json file using your preferred text editor, for example:
7. ```
    nano auth.json 
    ```

Step 2: Configure the auth.json file
------------------------------------

Now, we will configure the auth.json file with the necessary repository credentials. The file should follow the JSON format, containing a "http-basic" object and a "github-oauth" object if you are using both types of repositories.

Here's an example of an auth.json file:

```
{
  "http-basic": {
    "repo.example.com": {
      "username": "your-username",
      "password": "your-password"
    }
  },
  "github-oauth": {
    "github.com": "your-github-token"
  }
}
```

Replace the placeholders with your own credentials:

1. For "http-basic" authentication, replace **repo.example.com** with the domain of your private repository, and enter your username and password.
2. For "github-oauth" authentication, replace **your-github-token** with your personal GitHub access token.

Save and close the auth.json file. If you used **nano**, press **Ctrl + X**, then **Y**, and then **Enter**.

Step 3: Set the correct permissions
-----------------------------------

To ensure that only the owner can read and write to the auth.json file, set the appropriate permissions by running:

```
chmod 600 ~/.config/composer/auth.json 
```

Step 4: Verify the configuration
--------------------------------

To verify that your auth.json file is correctly configured, run the following command:

```
composer config --global --list 
```

You should see the global config settings, including the path to your auth.json file.

You have successfully installed and configured a global auth.json file for Composer on your server. This will allow you to authorize access to private repositories with ease. Remember to keep your auth.json file secure, as it contains sensitive credentials.

### How to use the deploy webhook URL?

URL: https://ploi.io/documentation/deployment/how-to-use-the-deploy-webhook-url
Last updated: 2026-06-15

The deploy webhook URL is a great way to automate your deployments. Either via GitHub Actions or another CI system, with the deploy webhook URL you can deploy whenever you want.

You can find the deploy webhook URL in your site, in the **Repository** tab, look for the **Deploy webhook URL** card. In there you can easily copy the deploy webhook URL or refresh the token, in case you think it got exposed or needs swapping.

The deploy URL requires a `POST` or `OPTIONS` method and the URL structure looks like this: `https://ploi.io/webhooks/servers/1/sites/1/deploy?token=bVKlWN.....&direct=true`

Additionally, you may pass in variables as query parameters or a JSON body that'll be available inside your deploy script.

### Example URL via query parameters

`https://ploi.io/webhooks/servers/1/sites/1/deploy?token=xOUr...&direct=true&variables[tag]=v1.0.0&variables[branch]=staging`

### Example URL with JSON body

`https://ploi.io/webhooks/servers/1/sites/1/deploy?token=xOUr...&direct=true`

JSON body:

```
{
    "variables": {
        "tag": "v1.0.0",
        "branch": "staging"
    }
}
```

In both examples, the variables `$TAG` and `$BRANCH` will be available inside your deploy script:

```
cd /home/ploi/ploi.io

echo $TAG
echo $BRANCH
```

Output:

```
v1.0.0
staging
```

### How do I manage WordPress from Ploi?

URL: https://ploi.io/documentation/deployment/how-do-i-manage-wordpress-from-ploi
Last updated: 2026-09-29

Every site with the WordPress project type gets a WordPress page in Ploi. From there you manage plugins and themes, run a search and replace on the database, turn on debugging and run WP-CLI commands, without logging in to WordPress or connecting over SSH.

### Getting the WordPress page

A site installed with the [WordPress 1-click installer](/documentation/deployment/how-to-install-wordpress) has the WordPress project type already. For an existing site, open **Settings** and set **Project type** to **WordPress** under **Project details**. The site sidebar then shows **WordPress**, **Repositories** and **View admin**, which opens `/wp-admin`.

### WP-CLI

The WordPress page does its work through WP-CLI. When the server doesn't have it yet, click **Install WP-CLI** on the WordPress page, or **Install WordPress CLI** in the **Services** card on the server's **Manage** page. Ploi installs it as `/usr/local/bin/wp`. Commands run as the site's system user.

The panel waits up to 60 seconds for each command. A command that takes longer keeps running on the server, but its result won't show in the panel.

The **WP-CLI** tab runs any WP-CLI command you type. Leave out `wp`, Ploi adds it.

### The overview

For WordPress sites installed with the 1-click installer, the site page shows a **WordPress overview**. It lists the WordPress version, the number of posts, pages, comments and users, active plugins, the theme and the updates that are available. Ploi caches these numbers for 24 hours. Click **Refresh** to load them again.

### Plugins and themes

The **Plugins** tab lists every plugin with its status, version and available update. You can activate, deactivate, update or delete a plugin, or select several and do it in bulk. Deleting runs the plugin's own uninstall routine, which can also remove its data from the database. Must-use plugins are always on and can't be changed here.

The **Themes** tab lets you activate, update and delete themes, and update or delete several at once. The active theme can't be deleted.

To install a plugin or theme, enter its slug from WordPress.org, for example `wordpress-seo` for Yoast SEO, and click **Install**. With **Activate** ticked it is switched on right away. Plugins and themes that aren't on WordPress.org, such as premium ones, can't be installed this way. Upload those in WordPress, or install them from Git as described below.

### Updating WordPress itself

The overview shows when a new WordPress version is out, but Ploi has no button to update WordPress itself. Update from the WordPress dashboard, see [How do I update WordPress?](/documentation/deployment/how-do-i-update-wordpress), or run `core update` on the **WP-CLI** tab. Make a backup of the database first.

### Search and replace

The **Search &amp; replace** tab replaces text in all tables with the WordPress table prefix, for example after moving the site to a new domain. It runs `wp search-replace`, which also handles serialized data. **Dry run** is on by default and only shows what would change. Untick it and click **Apply changes** to change the database. The tool replaces exactly what you enter, so if the database has both `http://` and `https://` links to the old domain, run it for each of them. More background is in [How do I update all URLs inside a WordPress database using WP-CLI?](/documentation/deployment/how-do-i-update-all-urls-inside-a-wordpress-database-using-wp-cli)

### Debugging

The **WP\_DEBUG** card on the **General** tab turns debug mode on and off. With debug mode on, WordPress writes errors to `wp-debug.log` in the site directory and doesn't show them to visitors. Under **Debug log**, click **Load** to see the last 500 lines. Turn debug mode off when you're done, the log keeps growing while it is on.

### Configuration, cron and XML-RPC

- **Edit wp-config.php** on the General tab opens the configuration file in an editor. Ploi looks for it in the web directory and then in the site root. If yours lives somewhere else, set **Configuration file location** in the site settings.
- WordPress runs its scheduled tasks only when someone visits the site. The **Cronjob** card replaces that with a real cron job that runs every 1 to 15 minutes. Ploi adds `DISABLE_WP_CRON` to `wp-config.php` and removes it again when you delete the cron job. See also [Run WordPress cron manually](/documentation/optimisations/run-wordpress-cron-manually).
- **Block XML-RPC** blocks requests to `xmlrpc.php`, a common target for password guessing attacks. Leave it open only when something needs it, such as Jetpack.

### Plugins and themes from Git

The **Repositories** page clones a Git repository into the WordPress installation as a plugin or theme. Use it for your own plugins and themes, or for premium ones you keep in Git. Enter the target directory relative to the site root, for example `public/wp-content/themes/my-theme`, choose the provider, repository and branch, and click **Install repository**. GitHub, GitLab, Bitbucket and Forgejo work through your linked account. For any other Git server, pick a custom repository and add the SSH key Ploi shows to your Git account.

Every repository has its own deploy script and deployment history. **Deploy** pulls the latest changes of one repository, **Deploy all** deploys them all. To deploy on every push, open **Edit** on the repository and turn on Quick Deploy. Pushes to other branches are ignored, and a commit message with `[deploy skip]` skips the deploy. Quick Deploy isn't available for custom repositories. Deleting a repository also deletes its files from the target directory.

### Bedrock

Ploi supports sites built on Roots Bedrock. It detects the layout by itself in most cases. If it doesn't, pick **Roots Bedrock** under **Installation layout** on the General tab and click **Save**. On a Bedrock site a few things work differently:

- Composer manages the plugins and themes. Changes made on the Plugins and Themes tabs aren't in your `composer.json`, so your next deploy undoes them. Add plugins and themes through Composer instead.
- Ploi can't toggle WP\_DEBUG. Set it in the file for your environment in `config/environments/`.
- The cron job setting writes `DISABLE_WP_CRON` to the `.env` file in the project root.

### Copying a WordPress site

To copy a WordPress site to another server or domain, database included, see [How do I clone a site?](/documentation/domains/how-do-i-clone-a-site)

## Domains

### How do I connect my domain to my server?

URL: https://ploi.io/documentation/domains/how-do-i-connect-my-domain-to-my-server
Last updated: 2025-05-04

In order for your domain to work, you will have to create a DNS record that points to your server.

Create 2 records:

- A record with your domain name (e.g., **mydomain.com**) to your server IP
- A record with **www** as the name to your server IP

Example first record:

![](https://ploi.io/storage/16/Image-2018-08-01-at-1.52.23-PM.png)

Example second record:

![](https://ploi.io/storage/17/Image-2018-08-01-at-1.57.02-PM.png)

These screenshots are taken from the Cloudflare panel, so your panel might look different, but the fields are the same.

If you do not have the option to select 'Automatic TTL', then enter a value of 300.

When you're using IPv6 as well, then you'll have to add the same records but with the type **AAAA** and the IPv6 address of the server.

**This change can take up to 24 hours to come through (these days its really quick though) so be patient!**

### Using server IP as domain

URL: https://ploi.io/documentation/domains/using-server-ip-as-domain
Last updated: 2020-06-02

It is possible to use your server's IP address to display your website. Just follow these easy steps:

1. Create your website with any domain name (example.com would work fine)
2. Go to that site in Ploi and open up the 'manage' tab.
3. Click edit NGINX configuration
4. Find the variable server\_name and change that from example.com to your server IP address:

[![](https://ploi.io/storage/EVKfISSvcZ01BAi2mFtcjpR6379Ommmc0Kv0rWIU.png)CleanShot 2020-06-02 at 11.31.15.png 148.69 KB](https://ploi.io/storage/EVKfISSvcZ01BAi2mFtcjpR6379Ommmc0Kv0rWIU.png)

Make sure you restart or reload NGINX after saving (you can use the checkbox) so changes come through.

Now when you visit your server's IP address in your browser you will see this site.

### How do I make my domain listen under "www."?

URL: https://ploi.io/documentation/domains/how-do-i-make-my-domain-listen-under-www
Last updated: 2021-09-23

To make your domain listen on **www.example.com** instead of **example.com** you have to do the following steps.

Before we continue, we can start off with advising you that you can also create the domain in Ploi prefixed with www already, Ploi is smart enough to detect this and setup all the configuration properly. For example, if you have a domain called **examplehosting.com** and you want to have it forced to **www.examplehosting.com**, just create it as that domain. Ploi will automatically detect this and setup the non-www to be redirected to the www version.

If you have an already existing domain in your server follow these steps:

(Make sure you replace **example.com** with your own domain)

1. Change the `server_name` variable inside your NGINX config. You can find this config file in this path (or you can use our UI to edit): **/etc/nginx/sites-available/example.com**
2. (Optional): If you have SSL enabled, you will have to edit the redirect too. Open up this file: **/etc/nginx/ploi/example.com/before/ssl-redirect.conf** and edit these lines:

```
server_name example.com
```

***TO***

```
server_name www.example.com
```

And

```
return 301 https://example.com$request_uri;
```

***TO***

```
return 301 https://www.$host$request_uri;
```

3\. After this, save these files and restart NGINX.

### How do I opt out of the Google FLoC network?

URL: https://ploi.io/documentation/domains/how-do-i-opt-out-of-the-google-floc-network
Last updated: 2026-06-15

FLoC (Federated Learning of Cohorts) was an experimental tracking mechanism Google trialled in Chrome. **Google discontinued FLoC in 2022** and replaced it with the Topics API, so the old opt-out is no longer necessary.

Historically you could opt out by sending a `Permissions-Policy: interest-cohort=()` response header. Because FLoC has been removed from Chrome, this header now does nothing — it is harmless if you already have it, but there is no need to add it to new sites.

The newer Topics API cannot be disabled with a single response header the way FLoC could; it is governed by the user's browser settings and the Privacy Sandbox. For general privacy and security hardening, focus on a solid Content-Security-Policy and the standard security headers instead.

### How do I set my own default template?

URL: https://ploi.io/documentation/domains/how-do-i-set-my-own-default-template
Last updated: 2021-06-25

It is possible to replace the default template that Ploi gives you for each newly created site. In this article we will show you how easy this is.

Start by [logging in via SSH](https://ploi.io/documentation/ssh/how-do-i-connect-with-ssh-mac-linux) into your server as the **ploi** user.

Next decide whether you want to use HTML or PHP, if there is a HTML file this will be used first.

Run this command to create an empty HTML file:

```
touch /home/ploi/.ploi/default-template.html
```

If you want to use PHP, run this command:

```
touch /home/ploi/.ploi/default-template.php
```

Now you can edit this file and any HTML or PHP code. You may also do all these actions via your favorite SFTP application.

We also provide a few variables for you that you can use inside this template that will get replaced.

- **{DOMAIN}** - returns the actual domain, e.g: example.com
- **{DOMAIN\_CREATION\_DATE}** - returns the creation date of the domain
- **{YEAR}** - returns the current year, useful for copyright footers

An example template:

```
<!doctype html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <meta name="viewport"
        content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
   <meta http-equiv="X-UA-Compatible" content="ie=edge">
   <title>Welcome to my site {DOMAIN}</title>
</head>
<body>
  Hi! You've just landed on {DOMAIN}, this was created on {DOMAIN_CREATION_DATE}.
  
  <br />
  
  Copyright (c) {YEAR}
</body>
</html>
```

After this just create a fresh domain and view your own template.

When you do not configure this, Ploi will upload the basic template by default.

### How do I migrate my old sites over with rsync?

URL: https://ploi.io/documentation/domains/how-do-i-migrate-my-old-sites-over-with-rsync
Last updated: 2021-06-26

Whether you're coming from an old host, or your wanting to move all your sites to a new server, migration sounds hard but really isn't that hard.

In this guide, we'll describe you how to easily manage this with **rsync**.

We'll start with your **old server**, we're going to need to find the public key to be added to your **new server**. Log into SSH into your **old server** as the user that runs the websites.

Run this command to get that:

```
cat ~/.ssh/id_rsa.pub
```

This should give you a key like:

```
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD4SNuSYi5uaLNVjEGMbE2....
```

Grab that key, and add that key to your **new server** via the **authorized\_hosts** file inside **~/.ssh/authorized\_hosts**, with Ploi you can easily add this key via the UI:

![](https://ploi.io/storage/jRywThtY4SwSf3trmJZgMoQqJoVMLdOQBCKqWYhl.png)

Now make sure the **new server** has the domain already created that you want to migrate over. It is also advised the folder in the **new server** is empty for that domain

And then we're going to run the command on the **old server** to rsync everything over:

```
cd /home/ploi/domain.com

rsync -rt * ploi@12.34.56.78:/home/ploi/domain.com
```

The flags mean the following:

- **r** means recursive, we want each subdirectories &amp; files as well
- **﻿t** means preserve modification times

The wildcard **\*** means grab anything in the folder we cd'ed into.

More information on the flags for rsync can be found [here](https://linux.die.net/man/1/rsync).

### How do I create a site in my server?

URL: https://ploi.io/documentation/domains/how-do-i-create-a-site-in-my-server
Last updated: 2021-12-20

Start by heading over to your server in Ploi, on the left-hand side you will see the tab "Sites". In this tab, you will see a form to fill in to create your site. Fill in your domain address and press "Add site" to create your website.

![](https://ploi.io/storage/l8RVmKvmqVHCavyn9ieCVsHWdCTKziixxicZ5W6q.png)

Optionally, you may open the "Advanced settings" dropdown to get more settings before creating your site.

These settings are:

- Web directory - defines where your index.php or index.html is.
- Project directory - defines where your actual project is, this could be somewhere else from your index.php
- Project type - defines what kind of application you're running, for example in case of Laravel or NodeJS, you get a few niceties extra.
- Webserver template - defines what kind of webserver template you want to use (you can set these up in your profile).
- Create system user - defines whether to use website isolation by creating its own system user.
- Create staging site - enables the staging to production site feature.

### How do I delete my site?

URL: https://ploi.io/documentation/domains/how-do-i-delete-my-site
Last updated: 2021-12-20

Start by heading over to your site in the Ploi panel. On the left-hand side you will see the "Settings" tab, click that, and scroll all the way down.

You will see a card with the title "Danger zone", in there you'll be able to delete your site.

By pressing delete, you will first get a confirmation window and input to verify you want to delete your site, as this is a destructive action.

![](https://ploi.io/storage/rxcXCtgd3AiERIX2675IFoWsZPSceXO3LvDvTk4J.png)

### How does the tenants feature work for sites?

URL: https://ploi.io/documentation/domains/how-does-the-tenants-feature-work-for-sites
Last updated: 2025-03-05

Consider the tenants feature as domain aliases on steroids. They are almost the same as domain aliases where you have:

```
server_name domain.com anotherdomain.com example.com

```

You will have a full NGINX config per tenant included in the original main domain, that looks like this:

```
include /etc/nginx/ploi/domain.com/tenants/*;


server {
    listen 80;
    listen [::]:80;


    root /home/ploi/domain.com/public;
    server_name anotherdomain.com;


    include /etc/nginx/ssl/anotherdomain.com;


    index index.php index.html;


    charset utf-8;


    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }


    access_log off;
    error_log  /var/log/nginx/anotherdomain.com-error.log error;


    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }


    error_page 404 /index.php;


    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/run/php/php8.0-fpm.sock;
        fastcgi_buffers 16 16k;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }


    location ~ /\.(?!well-known).* {
        deny all;
    }
}

```

In the above case, you have the main domain called **domain.com** and the tenant **anotherdomain.com.**

As you can see, the tenant itself is a complete NGINX configuration on its own offering a few extra possibilities:

- Each tenant has the ability to get its own custom NGINX configuration more easily
- Each tenant has its own certificate, and you will not reach the 100 domains per certificate limit in Let's Encrypt
- Each tenant (domain) is shielded in the certificate, as you're not able to see what other tenants are present
- If a certificate expires (because of a DNS change from a tenant for example), other tenants are not affected and will continue to work

How to create a tenant?
-----------------------

Creating tenants is rather easy. When you head over to your site in Ploi, go to the **Manage** tab and press the **Tenants** button.

![](/storage/images/a751e0c8-1a56-40ce-a3a2-ba182a761b02.png)

Then after that, you can start creating tenants (sites) just like you normally do:

![](/storage/images/d6d92f4c-1335-4a9d-bb97-2db07829dde1.png)

The tenants created here, will always point to the same root of the main site, in this case ploi.io.

### How do I configure Laravel Horizon statistics in Ploi

URL: https://ploi.io/documentation/domains/how-do-i-configure-laravel-horizon-statistics-in-ploi
Last updated: 2025-11-27

In Ploi, it is possible to show the Laravel Horizon statistics and failed jobs for your application. This makes it easy and fast to see what is going on in your Laravel Horizon installation.

Not only that, but it also allows you to interact with the Ploi API to get your Horizon data so you can use these details in your own software.

![](https://ploi.io/storage/xOJfxHJPg45ooNOPlFupP2riHqAFp9jG0WA9rlFa.png)

Setting this up requires a few tweaks to your HorizonServiceProvider.php and **config/cors.php** file.

First, let's start with the **cors.php** file, make sure to include **horizon/\***:

```
return [
 
    'paths' => ['horizon/*'],

    // ...];

```

Next, consider the following code in this file **app/Providers/HorizonServiceProvider.php**:

```
protected function gate(){
  Gate::define('viewHorizon', function ($user) {
    return in_array($user->email, [
      //    ]);
  });
}

```

We're going to make some adjustments to make it work so you can connect remotely. Change this code to this:

```
protected function gate(){
  Gate::define('viewHorizon', function ($user = null) {
    if(request()->bearerToken() && request()->bearerToken() === config('services.horizon.token')){
       return true;
    }

    // Continue with your own original logic here  });
}

```

**Take note:** The **$user** variable inside the function closure is now made nullable.

Next in your **config/services.php** file add the following block:

```
'horizon' => [
    'token' => env('HORIZON_TOKEN')
]

```

And fill in the **HORIZON\_TOKEN** inside your **.env** file, you can make this any random token you'd like, as long as you save it because we'll need to enter this token inside Ploi.

Next, we're going to configure your site inside Ploi to make it all work and come together.

Head over to your site in Ploi and visit the Laravel, then the settings tab. In here, fill in the endpoint and the authorization token you've entered earlier:

![](https://ploi.io/storage/YftzUaUXOAPqVX4Ub007ow5ctRepJQkknzTjN7n4.png)

After this, the Horizon tab will pop up and you'll be able to view your statistics. We'll also display a Laravel Horizon card below the deployments card in the General tab so you have quick and easy access to the latest statistics.

If you want, you can also integrate this into your own project by using the Ploi API. We've created an endpoint to gather these statistics. More information on that here: <https://developers.ploi.io/sites/laravel-horizon-statistics>

### How do I create a subdomain?

URL: https://ploi.io/documentation/domains/how-do-i-create-a-subdomain
Last updated: 2026-06-15

Creating a subdomain works exactly like creating a normal site — there's nothing special to it. A subdomain such as `app.example.com` is simply another site in Ploi.

Steps
-----

1. On your server, create a new site and enter the full subdomain (for example `app.example.com`) as the domain.
2. At your DNS provider, add an **A record** for the subdomain pointing to your server's IP address. If your DNS is connected to Ploi, this record can be created for you automatically.
3. Deploy your site and, if you want HTTPS, request an SSL certificate just like you would for any other site.

That's it — the subdomain is now served as its own site.

![Creating a subdomain as a site](https://ploi.io/storage/HioxfPZsi02phjo2g9bFrmrd8GEhb8CuoqsMqkoz.png)

### How do I enable the access log in NGINX?

URL: https://ploi.io/documentation/domains/how-do-i-enable-the-access-log-in-nginx
Last updated: 2022-10-13

By default, the access log in NGINX is disabled if you install a new site on your server. Luckily, enabling the access log is rather easy.

Head over to your site and the Manage tab, there you'll see an **Edit NGINX configuration** button, press this.[![](https://ploi.io/storage/fbvHWyUvBD2zxn6JhECU8fuuxU4VGz3TUINhYIdl.png)CleanShot 2022-10-11 at 09.50.15.png 364.98 KB](https://ploi.io/storage/fbvHWyUvBD2zxn6JhECU8fuuxU4VGz3TUINhYIdl.png)Next scroll until you see the line:

```
access_log off;
```

Change that line to:

```
access_log /home/ploi/my-domain.com-access.log;
```

Obviously, you may also change this location to your liking, just be sure to check up on your disk space regularly because access log can fill up your disk space quite quickly.

### How does the testing domains work?

URL: https://ploi.io/documentation/domains/how-does-the-testing-domains-work
Last updated: 2025-10-21

The Testing Domain feature in Ploi allows you to test your sites on a temporary Ploi-provided domain before going live with your own domain. This is particularly useful when you want to verify your site configuration, test SSL functionality, or preview your site before pointing your DNS records to Ploi.

What is a testing domain?
-------------------------

A testing domain is a randomly-generated, temporary domain name provided by Ploi (e.g., `beautiful-alpaca-abc123defgh.ploi.sh`) that points directly to your site on your server. When enabled, your site becomes accessible via both your main domain and the testing domain.

### Key features

- **Automatic DNS configuration**: Ploi automatically creates and manages the DNS records
- **HTTPS enabled**: Testing domains come with SSL/HTTPS support out of the box
- **Temporary access**: Perfect for testing before your main domain DNS is pointed to Ploi
- **One-Click toggle**: Enable or disable with a single click

Requirements
------------

Before you can use the testing domain feature, make sure you meet these requirements:

1. **Active subscription**: You must have a paid Ploi subscription (not available on the free plan)
2. **No existing SSL certificate**: The testing domain cannot be enabled if your site already has an SSL certificate installed

How to use testing domains
--------------------------

![](https://ploi.io/storage/PQB7aq4hOrtyKqW2i1UPvZYfwE5UwVWl59WlX6QF.png)

### Enabling a testing domain

1. Navigate to your site in the Ploi panel
2. Go to the **Settings** tab
3. Scroll to the **Testing Domain** section
4. Click the **Enable test domain** button
5. Accept the terms of service in the confirmation modal
6. Wait 5-10 minutes for DNS propagation

Once enabled, you'll see the testing domain URL displayed with a link to visit your site.

### Accessing your testing domain

After enabling:

1. The testing domain will appear in your site's settings
2. You can click the external link icon next to the domain to visit your site
3. The testing domain is also accessible from the site navigation menu

### Disabling a testing domain

1. Navigate to your site's **Settings** tab
2. Scroll to the **Testing Domain** section
3. Click the **Disable test domain** button
4. The testing domain will be removed and DNS records will be cleaned up automatically

Important considerations
------------------------

### WordPress sites

If you're using WordPress, you'll need to update your site URL in the WordPress database to match the testing domain. WordPress stores the site URL in the database (`wp_options` table), and this must match the domain you're accessing the site from.

**Options:**

- Use a WordPress plugin like "WP Migrate DB" to update URLs
- Manually update the `siteurl` and `home` values in `wp_options`
- Use WP-CLI: `wp search-replace 'old-domain.com' 'testing-domain.ploi.test'`

### DNS propagation

After enabling a testing domain, DNS changes may take **5-10 minutes** to propagate globally. If you can't access your testing domain immediately, wait a few minutes and try again.

### Rate limiting

The testing domain toggle endpoint is rate-limited to **1 request per minute**. If you see an error when trying to enable/disable, wait a minute before trying again.

### Domain aliases

When a testing domain is enabled, it's automatically added to your site's domain aliases. This means your web server (Nginx) is configured to serve your site content for both your main domain and the testing domain.

Troubleshooting
---------------

### Testing domain not working

**DNS hasn't propagated yet**

- Wait 5-10 minutes after enabling
- Try accessing from a different network or device
- Use a DNS checker tool to verify the A record exists

**Certificate errors**

- Testing domains use Cloudflare's SSL, which should work automatically
- Clear your browser cache and try again
- Try accessing in an incognito/private browsing window

### Can't enable testing domain

**"Not a valid subscription" error**

- Verify you're on a paid Ploi plan
- Contact support if you believe this is an error

**Button is disabled**

- Check if your site already has an SSL certificate installed
- Testing domains cannot be enabled on sites with existing SSL certificates

**Rate limit error (429)**

- Wait at least 1 minute between enable/disable attempts
- Only one request per minute is allowed

### WordPress site not loading correctly

**Redirecting to main domain**

- Update WordPress site URL in the database
- Check your `.htaccess` file for hardcoded domain redirects
- Verify no redirect rules in your WordPress configuration

Best practices
--------------

1. **Use Testing Domains Early**: Enable a testing domain as soon as you create your site to test configurations before DNS changes
2. **Disable When Not Needed**: Disable testing domains when you're done testing to keep your site configuration clean
3. **Document the URL**: If sharing with team members or clients, save the testing domain URL as it's randomly generated
4. **Test Thoroughly**: Use the testing domain to verify all functionality before switching your main domain to Ploi

Security &amp; privacy
----------------------

- Testing domains use HTTPS automatically via Cloudflare
- Testing domains are publicly accessible - anyone with the URL can access your site
- Don't use testing domains for production traffic - they're meant for temporary testing only
- Testing domains are tied to your account and only you can enable/disable them

---

Summary
-------

The testing domain feature is a powerful tool that simplifies the process of testing and deploying sites on Ploi. By providing automatic DNS configuration, HTTPS support, and seamless integration with your site, testing domains help you confidently deploy and test your applications before going live.

For any questions or issues with testing domains, please contact Ploi support.

### How to install phpMyAdmin?

URL: https://ploi.io/documentation/domains/how-to-install-phpmyadmin
Last updated: 2026-06-15

This guide covers installing phpMyAdmin using Ploi's 1-click installer and manual installation on Ubuntu servers.

Installation via Ploi (Recommended)
-----------------------------------

### Prerequisites

- A server provisioned through Ploi
- MySQL or MariaDB installed on the server (phpMyAdmin is not available for PostgreSQL)
- An existing site where you want to install phpMyAdmin

### Step-by-Step installation

1. **Navigate to your site**
    
    
    - Go to your server in the Ploi dashboard
    - Select the site where you want to install phpMyAdmin
2. **Select phpMyAdmin**
    
    
    - Find **phpMyAdmin** in the installers list
    - Click on the phpMyAdmin card
3. **Install**
    
    
    - Click the **"Install phpMyAdmin"** button
    - The installation status will show "phpMyAdmin is currently installing, please hold on"
    - Wait for the installation to complete (typically 1-2 minutes)
4. **Access phpMyAdmin**
    
    
    - Once installed, a phpMyAdmin panel will appear showing your domain
    - Click **"Open phpMyAdmin"** to access the interface
    - Log in using your database credentials

![](https://ploi.io/storage/boynfissxZRpCvCpe13YIYXwBlSZPVYAs77Ji6RU.png)

### Adding SSL (Recommended)

After installation, you can secure phpMyAdmin with SSL:

1. Navigate to your server's **Services** section
2. Find phpMyAdmin in the services list
3. Click **"Install SSL"**
4. Ploi will automatically provision a Let's Encrypt certificate

### Uninstalling

To remove phpMyAdmin:

1. Navigate to your site in Ploi
2. Find the phpMyAdmin section
3. Click the **"Uninstall"** button
4. Confirm the uninstallation

---

Manual installation on Ubuntu
-----------------------------

This section covers manual installation on Ubuntu servers with Nginx and PHP already configured.

### Prerequisites

- Ubuntu 20.04/22.04/24.04
- Nginx installed and running
- PHP 8.x with FPM installed
- MySQL or MariaDB installed
- Root or sudo access

### Step 1: Install required PHP extensions

```
sudo apt update
sudo apt install -y php-mbstring php-zip php-gd php-json php-curl

```

### Step 2: Download phpMyAdmin

```
cd /tmp
wget https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.tar.gz
sudo mkdir -p /usr/share/phpmyadmin
sudo tar -xzf phpMyAdmin-5.2.1-all-languages.tar.gz -C /usr/share/phpmyadmin --strip-components=1

```

### Step 3: Configure phpMyAdmin

```
# Create temp directory for sessions
sudo mkdir -p /usr/share/phpmyadmin/tmp
sudo chmod 777 /usr/share/phpmyadmin/tmp

# Create configuration file
sudo cp /usr/share/phpmyadmin/config.sample.inc.php /usr/share/phpmyadmin/config.inc.php

# Generate a random blowfish secret (32 characters)
BLOWFISH_SECRET=$(openssl rand -base64 32 | tr -dc 'a-zA-Z0-9' | head -c 32)

# Update the configuration
sudo sed -i "s/\$cfg\['blowfish_secret'\] = '';/\$cfg['blowfish_secret'] = '$BLOWFISH_SECRET';/" /usr/share/phpmyadmin/config.inc.php
sudo sed -i "s/\$cfg\['Servers'\]\[\$i\]\['host'\] = 'localhost';/\$cfg['Servers'][\$i]['host'] = '127.0.0.1';/" /usr/share/phpmyadmin/config.inc.php

```

### Step 4: Create symlink

```
sudo ln -sf /usr/share/phpmyadmin /var/www/html/phpmyadmin

```

### Step 5: Configure nginx

Create a new Nginx configuration file:

```
sudo nano /etc/nginx/sites-available/phpmyadmin

```

Add the following configuration (replace `your-domain.com` with your actual domain and adjust PHP version as needed):

```
server {
    listen 80;
    listen [::]:80;

    server_name your-domain.com;
    root /var/www/html;

    index index.php index.html;

    location /phpmyadmin {
        alias /usr/share/phpmyadmin;
        index index.php;

        location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/var/run/php/php8.5-fpm.sock;
            fastcgi_param SCRIPT_FILENAME $request_filename;
        }
    }

    location ~ /\.ht {
        deny all;
    }
}

```

Enable the site and reload Nginx:

```
sudo ln -sf /etc/nginx/sites-available/phpmyadmin /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

```

### Step 6: Set permissions

```
sudo chown -R www-data:www-data /usr/share/phpmyadmin

```

### Step 7: Access phpMyAdmin

Open your browser and navigate to:

```
http://your-domain.com/phpmyadmin

```

Log in using your MySQL/MariaDB credentials.

### Optional: Add SSL with Certbot

```
# Install Certbot if not already installed
sudo apt install -y certbot python3-certbot-nginx

# Obtain SSL certificate
sudo certbot --nginx -d your-domain.com --non-interactive --agree-tos -m your-email@example.com

```

---

Security considerations
-----------------------

phpMyAdmin exposes your database management interface to the web. Consider these security measures:

### Recommended alternatives

For better security, consider using desktop database clients that connect via SSH tunnel:

- **TablePlus** (macOS, Windows, Linux)
- **Sequel Pro / Sequel Ace** (macOS)
- **DBeaver** (Cross-platform)
- **MySQL Workbench** (Cross-platform)

### If you must use phpMyAdmin

1. **Always use HTTPS** - Install an SSL certificate
2. **Restrict access by IP** - Add IP restrictions in Nginx:
    
    ```
    location /phpmyadmin {
        allow 123.456.789.0;  # Your IP
        deny all;
        # ... rest of config
    }
    
    ```
3. **Use strong database passwords** - Ensure all database users have strong, unique passwords
4. **Keep phpMyAdmin updated** - Regularly update to the latest version
5. **Consider HTTP Basic Auth** - Add an additional authentication layer:
    
    ```
    sudo apt install apache2-utils
    sudo htpasswd -c /etc/nginx/.htpasswd admin
    
    ```
    
    Then add to Nginx config:
    
    ```
    auth_basic "Restricted Access";
    auth_basic_user_file /etc/nginx/.htpasswd;
    
    ```

### How do I clone a site?

URL: https://ploi.io/documentation/domains/how-do-i-clone-a-site
Last updated: 2026-09-28

Cloning copies a site to another server, or to the same server under a different domain. Ploi creates the new site, copies all files and takes along the settings it manages. The clone runs in the background and the panel notifies you when it is done. How long it takes depends on the size of the site's files. Site cloning is available on the Pro and Unlimited plans.

### Step by step

1. Open the site and go to **Manage**.
2. Click **Clone site**.
3. Enter the domain for the copy. The field starts with the current domain, which works when you clone to another server. On the same server you need a different domain.
4. Pick the server to clone to. The list shows your active servers, including the one the site is on now.
5. On a WordPress site, tick the database option if you want a copy of the database as well. See WordPress sites below.
6. If the site has a staging site linked to it, tick the staging option to clone both. See Staging and production below.
7. Click **Start cloning process**.

The target server can't already have a site with that domain. Delete that site first or pick another domain.

### What Ploi copies

- Every file in the site directory, so `.env`, `vendor`, `node_modules` and uploaded files come along. On a site with zero downtime deployment, Ploi copies the release that is live at that moment.
- The PHP version, web directory, project root, project type, system user and the zero downtime deployment setting.
- The repository settings and the deploy script. Ploi replaces the old domain with the new one in the deploy script.
- Domain aliases, tenants, active redirects and the site's cronjobs.
- The system user. If the site runs under a user other than `ploi` and the target server doesn't have that user yet, Ploi creates it.

### What Ploi does not copy

- SSL certificates. Request a new one from the site's SSL tab once the domain points to the target server.
- Changes you made to the site's NGINX configuration yourself. The new site gets Ploi's default configuration, so add your own rules again by hand.
- Databases, unless it is a WordPress site and you ticked the database option. Clone other databases separately, see [How do I clone a database?](/documentation/database/how-do-i-clone-a-database)
- Daemons and queue workers. Set those up again on the target server.
- DNS records. Your domain keeps pointing where it points now.

### After the clone

The copied `.env` still holds the values of the original site. On a Laravel site, or any application with its own configuration file, check at least the database credentials and `APP_URL`. If you skip this, the copy keeps reading from and writing to the original database. Then point the domain to the new server and request an SSL certificate.

### WordPress sites

On a WordPress site the clone page offers to copy the database too. With that option ticked, Ploi:

- creates a new database and database user on the target server, with a random password
- copies the contents of the original database into it
- writes the new credentials into `wp-config.php`, or into `.env` on a Bedrock site
- runs `wp search-replace` to change the old domain into the new one, for plain, `http://` and `https://` URLs

The search-replace needs WP-CLI on the target server. Without it the database still contains the old domain, and you can run the replacement yourself afterwards, see [How do I update all URLs inside a WordPress database using WP-CLI?](/documentation/deployment/how-do-i-update-all-urls-inside-a-wordpress-database-using-wp-cli)

To find the database, Ploi uses the database linked to the site. If there is none, it reads `DB_NAME` from `wp-config.php` and looks for a database with that name on the server's Databases page. When neither works, Ploi clones the files only and writes the reason to the server logs. Make sure the database shows up under **Databases** on the server and clone again.

### Staging and production

When the site has a staging site linked to it, you can clone both at once and Ploi keeps them linked on the target server. You enter the domain for the site you are cloning and Ploi derives the other one. Clone the production site as `example.com` and the staging copy becomes `staging.example.com`. Clone the staging site as `staging.example.com` and the production copy becomes `example.com`. Ploi recognises `staging.`, `stage.`, `test.`, `dev.` and `development.` as staging prefixes.

### If something goes wrong

The files go from the source server straight to the target server over SSH. They don't pass through Ploi, so the source server has to reach the SSH port of the target server. If a firewall blocks that connection, on the target server or at your hosting provider, the clone stops before it creates anything. The server logs of the source server then name the connection that failed. Allow the source server's IP address on the target's SSH port and clone again.

Ploi installs rsync on both servers when it is missing. When the transfer fails anyway, the server logs of the source server contain the rsync output. A transfer that stops without any error usually means the source server ran out of memory, so check its memory usage before you try again.

You can also start a clone through the API, see [Clone site](https://developers.ploi.io/sites/clone-site) in the API documentation.

## Laravel

### How do I make my Laravel app production ready?

URL: https://ploi.io/documentation/laravel/how-do-i-make-my-laravel-app-production-ready
Last updated: 2024-01-18

When you want to deploy your Laravel app to a live environment, you want to ensure no one can see any debug message as this may contain information about your application that you do not want to spread.

First, ensure your **APP\_DEBUG** is set to false inside your .env file. Also, change the **APP\_ENV** from local to production. This makes sure your user won't be able to read any debug messages when an error is thrown.

If you're using third-party packages to debug your application make sure you disable them, or only make them available for yourself (by checking IP or whatever).

For example, if you're using the [Debugbar package](https://github.com/barryvdh/laravel-debugbar) make sure you mark **DEBUGBAR\_ENABLED** to false so the bar will not show itself.

### How do I run Laravel Horizon?

URL: https://ploi.io/documentation/laravel/how-do-i-run-laravel-horizon
Last updated: 2021-05-18

Ploi makes it a breeze to run Laravel Horizon. You can use the 'Daemons' tab in server level to configure this.

Use this command to run Laravel Horizon:

```
php /home/ploi/my-app.com/artisan horizon
```

1 process is enough as Laravel Horizon is able to spawn multiple supervisor workers. ([More at the Laravel Documentation](https://laravel.com/docs/horizon))

Take the following screenshot as an example:

[![](https://ploi.io/storage/O71cA24NOehptG4boWMyS26PHIzOmqlKcKx6rw5P.png)](https://ploi.io/storage/O71cA24NOehptG4boWMyS26PHIzOmqlKcKx6rw5P.png)

 This will spawn a supervisor configuration file like this:

```
[program:worker-628]
command=php /home/ploi/my-app.com/artisan horizon
process_name=%(program_name)s_%(process_num)02d
autostart=true
autorestart=true
user=ploi
redirect_stderr=true
numprocs=1
stdout_logfile=/home/ploi/.ploi/worker-628.log
```

Once code changes, you will have to reload the horizon process. To do this you will have to add this into your deploy script at the end:

```
php artisan horizon:terminate
```

### How do I setup a Laravel Octane server?

URL: https://ploi.io/documentation/laravel/how-do-i-setup-a-laravel-octane-server
Last updated: 2021-04-23

Laravel Octane is a high powered application server specially designed for Laravel applications. You can either use Swoole or Roadrunner to run this application server with.

Running Laravel Octane in Ploi is a breeze. Head over to your site with Laravel Octane installed, if you do not have Laravel Octane installed yet in your project [head over here](https://github.com/laravel/octane) to get started with that first. Your sites project type has to be set to "Laravel" to be able to do this, you can do that in the Settings tab.

Next press the Laravel tab and then the Octane tab:

![](https://ploi.io/storage/ltzFlqWXpsEniVH2bsBDXCEbIXlbVfknPHtxihYZ.png)

You'll see a few options here that you can configure to your likings. Save this and press the "Spawn server" button.

This will spawn the daemon required to run your site on.

![](https://ploi.io/storage/b2x1ixLgqIp25R5sXvaEpAuEN7y5CbjH0G4dXSDa.png)

Good things to know about this process:

- When spawning a server, it will completely change your NGINX configuration to make it compatible with the Octane server
- It will not use PHP FPM, its completely based on PHP CLI
- It requires PHP 8.0 or higher
- If you use SSL, make sure to set OCTANE\_HTTPS to true in your .env file

### How do I set up the Laravel Reverb server?

URL: https://ploi.io/documentation/laravel/how-do-i-set-up-the-laravel-reverb-server
Last updated: 2024-03-15

Laravel Reverb is a high performance websocket service for your Laravel application.

Running Laravel Reverb in Ploi is a breeze. Head over to your site with Laravel Reverb installed, if you do not have Laravel Reverb installed yet in your project [head over here](https://github.com/laravel/reverb) to get started with that first. Your sites project type has to be set to "Laravel" to be able to do this, you can do that in the Settings tab.

Next press the Laravel tab and then the Reverb tab:

![Laravel Reverb](/storage/images/fa7effc9-f0d8-4334-896c-834e4749d27d.png "Laravel Reverb")

You'll see a few options here that you can configure to your liking. Save this and press the "Spawn server" button.

This will spawn the daemon required to the socket server.

![Laravel Reverb Details](/storage/images/80238147-df09-4998-9682-264530db0712.png "Laravel Reverb Details")

### How do I set up a queue worker?

URL: https://ploi.io/documentation/laravel/how-do-i-set-up-a-queue-worker
Last updated: 2026-06-15

Queue workers process your application's queued jobs in the background. Ploi runs them under Supervisor, so they start automatically and restart if they crash or the server reboots.

Creating a queue worker
-----------------------

Open your site and go to the **Queue** section, then add a worker. The most important settings are:

- **Connection** — the queue connection to process (for example `redis` or `database`), matching your app's `config/queue.php`.
- **Queue** — the queue name(s) to work, e.g. `default`.
- **Processes** — how many worker processes to run in parallel (1–100).
- **Timeout, sleep, tries, backoff, memory** — these map directly to the `queue:work` options, so you can tune how long a job may run, how long to wait when the queue is empty, retry counts and the memory limit.

Behind the scenes Ploi runs `php artisan queue:work` with your chosen options as the site's user, and writes each worker's output to a per-worker log you can view in the panel.

Restarting workers after a deploy
---------------------------------

Workers keep the old code in memory, so after deploying new code you should restart them. Add this to the end of your deploy script:

```
php8.5 /home/ploi/example.com/artisan queue:restart
```

You can also restart, pause, edit or delete a worker from the Queue section at any time.

Running a custom background process
-----------------------------------

If you need a long-running process that isn't a Laravel queue worker (for example a Node.js service), use the **Daemons** section on the server instead, where you can supply any command, the number of processes, the system user and a working directory.

## DNS

### How do I attach Cloudflare DNS to my account?

URL: https://ploi.io/documentation/dns/how-do-i-attach-cloudflare-dns-to-my-account
Last updated: 2024-10-29

**Note: Each key that you save with us, is saved encrypted for security reasons.**

You will first need to get your [API key from Cloudflare](https://dash.cloudflare.com/profile/api-tokens) and create a new token.

![Cloudflare API tokens](/storage/images/ff5e712d-97c4-40c3-ab54-7d0e8fcb7440.png)Use the **Edit zone DNS** template for your API key:

![Edit zone DNS](/storage/images/b6a8196f-afdd-4d20-91fe-c6b7d7fc36d6.png)

Then, we advise having all zones included so that Ploi can always try to set up DNS management for you whenever you create a new domain. Also make sure to have the Cache Purge permission so you can clear the Cloudflare cache from the Ploi panel.

![All zones](/storage/images/a8cac977-f437-4644-828a-dda9d254c0ff.png)

Enter this key inside your profile, under the [Integrations](https://ploi.io/profile/integrations) tab in your profile. When entering this key, we will automatically verify to see if your key is valid.

After adding your key, you can start adding keys to the domains you own in Ploi. Select a domain in Cloudflare and grab the 'Zone ID', this is displayed on the dashboard of the domain.

Once you have the Zone ID, you can go to your domain in Ploi and go to the 'Settings' tab inside your domain. You will find the possibility to add the Zone ID there. After you have done that, DNS management is available in the 'DNS' tab on the left side.

![](https://ploi.io/storage/1NJfbwl5RslR6wQS0qoNLqYJR6L9qtIb3XEHBK2A.png)

### How do I flush my DNS cache (mac)?

URL: https://ploi.io/documentation/dns/how-do-i-flush-my-dns-cache-mac
Last updated: 2020-04-11

Sometimes you will find yourself in a situation where you want to force clear your DNS on your mac computer so your newly created A record or CNAME for example comes through faster.

To do this, simply open up your terminal (you can use spotlight or launchpad to search for the terminal) and run this command:

```
sudo killall -HUP mDNSResponder
```

When running this it will probably prompt you for your password, fill in this password and press **enter**. (You will not see yourself typing the password, it is hidden)

 ![](https://ploi.io/storage/117/Screen-Shot-2020-04-11-13-21-45.png)

### How do I attach Hetzner DNS to my account?

URL: https://ploi.io/documentation/dns/how-do-i-attach-hetzner-dns-to-my-account
Last updated: 2024-07-16

In order for you to manage DNS with Hetzner, you will have to save your Hetzner DNS API key to your Ploi account.

Head over to [dns.hetzner.com](https://dns.hetzner.com/) and log in. After that, press the user icon at the top right, and click on "API Tokens":

![](https://ploi.io/storage/RCFq5mMyMvaaotwCTyO9OKB6CjSJENyTGKJO4wqd.png)

In here, enter a "Token name" and press "Create access token":

![](https://ploi.io/storage/hyuXiVV35g7FHSWC1eXIvUDcCTT93O3UsKFetlOU.png)

You will now be presented with a modal containing your API key:

![](https://ploi.io/storage/1osxODAZsQGvNJUbGIqz1PbfbuCsRixXq1peRgBU.png)

Copy this token and go to your Ploi profile to [Integrations](https://ploi.io/profile/integrations), scroll down until you see DNS providers, and enter the token there.

You will now be able to attach your sites to your Hetzner DNS API key and manage DNS records. To do this, head over to your site in Ploi and press the "Settings" tab, next scroll until you see "DNS Settings" and enter the right provider, and the domain name. Now a DNS tab will show up and you'll be able to manage DNS records directly from Ploi.

### How do I attach Vultr DNS to my account?

URL: https://ploi.io/documentation/dns/how-do-i-attach-vultr-dns-to-my-account
Last updated: 2024-07-16

In order for you to manage DNS with Vultr, you will have to save your Vultr API key to your Ploi account.

Head over to [my.vultr.com/settings/#settingsapi](https://my.vultr.com/settings/#settingsapi) and log in. After that, press the copy button to copy your API key.

![](/storage/images/db8d29d8-a3ab-4fd5-9e9d-c12fc6bfa451.png)

Copy this token and go to your Ploi profile to [Integrations](https://ploi.io/profile/integrations), scroll down until you see DNS providers, and enter the token there.

You will now be able to attach your sites to your Vultr DNS API key and manage DNS records. To do this, head over to your site in Ploi and press the "Settings" tab, next scroll until you see "DNS Settings" and enter the right provider, and the domain name. Now a DNS tab will show up and you'll be able to manage DNS records directly from Ploi.

### How do I attach Linode DNS to my account?

URL: https://ploi.io/documentation/dns/how-do-i-attach-linode-dns-to-my-account
Last updated: 2024-07-16

In order for you to manage DNS with Linode, you will have to save your Linode API key to your Ploi account.

Head over to <https://cloud.linode.com/linodes> and log in. After that, press your name at the top right and click on "API Tokens":

![](/storage/images/712ee596-3ec6-4c44-aa54-ed65e993f0e4.png)

Next press "Create a Personal Access Token", fill in a token Label, select the desired expiry for the token, and select "No access" for all, then select "Read/Write for domains:

![](/storage/images/be6b6ca9-7ae6-406b-a04d-19f8cc8b97e3.png)

You will now be presented with a modal containing your API key:

![](/storage/images/1bc25f23-58fc-4656-88ee-6c9e7f6c1ff0.png)

Copy this token and go to your Ploi profile to [Integrations](https://ploi.io/profile/integrations), scroll down until you see DNS providers, and enter the token there.

You will now be able to attach your sites to your Linode API key and manage DNS records. To do this, head over to your site in Ploi and press the "Settings" tab, next scroll until you see "DNS Settings" and enter the right provider, and the domain name. Now a DNS tab will show up and you'll be able to manage DNS records directly from Ploi.

### How do I attach Bunny DNS to my account?

URL: https://ploi.io/documentation/dns/how-do-i-attach-bunny-dns-to-my-account
Last updated: 2024-07-16

In order for you to manage DNS with Bunny, you will have to save your Bunny API key to your Ploi account.

Head over to [dash.bunny.net](https://dash.bunny.net/account/api-key) and log in. After that, you'll see the copy button to copy your API key right away:

![](/storage/images/1c03e182-4cd9-460a-91e2-e2a5f5d12e16.png)

Copy this token and go to your Ploi profile to [Integrations](https://ploi.io/profile/integrations), scroll down until you see DNS providers, and enter the token there.

You will now be able to attach your sites to your Bunny API key and manage DNS records. To do this, head over to your site in Ploi and press the "Settings" tab, next scroll until you see "DNS Settings" and enter the right provider, and the domain name. Now a DNS tab will show up and you'll be able to manage DNS records directly from Ploi.

### How do I attach DigitalOcean DNS to my account?

URL: https://ploi.io/documentation/dns/how-do-i-attach-digitalocean-dns-to-my-account
Last updated: 2024-07-16

In order for you to manage DNS with DigitalOcean, you will have to save your DigitalOcean API key to your Ploi account.

Head over to [cloud.digitalocean.com](https://cloud.digitalocean.com/account/api/tokens) and log in. After that, press the "Generate New Token" button:

![](/storage/images/08c65041-f640-4bd0-b863-1cb2738813ef.png)

Next fill in a token name, set the desired expiration and select "Custom scopes". Then select the scopes below, you only need to have the "Domain" scope added:

![](/storage/images/b958548c-e88d-4bb1-804a-b9745867d1b8.png)

![](/storage/images/e31608ec-ee58-479f-a83f-14374faf6937.png)

Press "Generate token" and you'll be presented with your token:

![](/storage/images/fa4c9345-0903-48be-8d9d-7421fceea994.png)

Copy this token and go to your Ploi profile to [Integrations](https://ploi.io/profile/integrations), scroll down until you see DNS providers, and enter the token there.

You will now be able to attach your sites to your DigitalOcean API key and manage DNS records. To do this, head over to your site in Ploi and press the "Settings" tab, next scroll until you see "DNS Settings" and enter the right provider, and the domain name. Now a DNS tab will show up and you'll be able to manage DNS records directly from Ploi.

## Notifications

### How do I create a Google Chat webhook?

URL: https://ploi.io/documentation/notifications/how-do-i-create-a-google-chat-webhook
Last updated: 2022-11-02

To create a Google Chat notification webhook, make sure you're logged into your g-suite account instead of your personal e-mail. Personal e-mail addresses cannot create webhooks in their spaces.

Start by heading over to [https://chat.google.com/ ](https://chat.google.com/)and make sure you're logged into your g-suite account. Make sure you have a space created, if you do, click that space and press the arrow down and press "Manage webhooks":

[![](https://ploi.io/storage/SF81wHHBFZrg196fMhzUCq4CKXvv1SbZzlQcpSPk.png)CleanShot 2022-11-02 at 10.36.23.png 147.77 KB](https://ploi.io/storage/SF81wHHBFZrg196fMhzUCq4CKXvv1SbZzlQcpSPk.png)This will open up a new modal where you can create the webhook:[![](https://ploi.io/storage/w0AV7N3UniKa0Zx75Lxu6o875oUykh3kJCxkrBQT.png)CleanShot 2022-11-02 at 10.39.57.png 92.67 KB](https://ploi.io/storage/w0AV7N3UniKa0Zx75Lxu6o875oUykh3kJCxkrBQT.png)Inside the avatar field, you can fill in an avatar you'd like to be displayed, we offer a default one for you if you like: **https://ploi.io/ploi-192x192.png**

After creation, you'll get the URL by clicking the copy button:

[![](https://ploi.io/storage/jryKZ1scmOmk8Op02KrjYMlZ2p1MclEcg2lwNmWb.png)CleanShot 2022-11-02 at 10.41.22.png 99.07 KB](https://ploi.io/storage/jryKZ1scmOmk8Op02KrjYMlZ2p1MclEcg2lwNmWb.png)After grabbing this URL you'll be able to enter this inside your Ploi profile under <https://ploi.io/profile/channels>:[![](https://ploi.io/storage/qvar4bSMDOXea2AGpSmpwBXsgnE5IOyLAwQ518yB.png)CleanShot 2022-11-02 at 10.48.29.png 53.61 KB](https://ploi.io/storage/qvar4bSMDOXea2AGpSmpwBXsgnE5IOyLAwQ518yB.png)

### How do notifications work?

URL: https://ploi.io/documentation/notifications/how-do-notifications-work
Last updated: 2026-09-29

Ploi can tell you about deployments, backups, server problems and more in the places you already look, such as Slack, Discord, Telegram or your phone. It takes two steps. First you create a notification channel in your profile. Then you attach the channel to the events you care about on a server, site or backup.

### 1. Create a notification channel

Open your profile and go to **Notification channels**. Pick a type, give the channel a label and fill in what the type needs:

- Slack: an incoming webhook URL, starting with `https://hooks.slack.com/services`. Optionally a channel to post in.
- Discord: a webhook URL of the Discord channel, starting with `https://discord.com/api/webhooks`.
- Microsoft Teams: a webhook URL of the Teams channel.
- Google Chat: a webhook URL of the space, see [How do I create a Google Chat webhook?](/documentation/notifications/how-do-i-create-a-google-chat-webhook)
- Rocket.Chat: the URL of your Rocket.Chat server, a token and a channel.
- Telegram: link your Telegram account under **Integrations** in your profile first. The messages go to that account.
- Pushover: your Pushover user key, in the **Token** field.
- E-mail address: any address, for example a shared inbox.
- Mobile App: a phone with the Ploi app on which you allowed push notifications.
- Browser push: notifications in your browser, see below.

Click **Send test** next to a channel in the list to check that it works. You can send one test per channel per minute.

### Browser push

A Browser push channel shows notifications on your computer or phone, also when the panel isn't open. Pick Browser push, click **Create** and allow notifications when your browser asks. The channel only covers the browser and device you create it in, so create one channel per browser. On iPhone and iPad, add ploi.io to your home screen first and create the channel from there. If you blocked notifications for ploi.io earlier, allow them again in your browser's site settings.

A browser can end its push subscription, for example when you clear its data. Ploi then e-mails you and the list marks the channel as expired. Delete it and create a new channel in that browser.

### 2. Attach the channel to events

A channel does nothing until you attach it. Where you do that depends on the event:

- Deployments: open the site and go to **Notifications**. Pick the event, **Deployment started**, **Deployment completed** or **Deployment failed**, and a channel. A failed deployment is also sent to the channels for completed deployments, and a channel attached to both gets it once. Channels for completed deployments also hear about rollbacks and staging to production syncs. Deployment notifications need a paid plan.
- Uptime: open the site, go to **Monitor** and click **Channels** on the monitor. Ploi checks the site every five minutes and notifies you from the second failed check in a row. After ten failed checks it turns the monitor off. There is no message when the site is back up.
- Server load: open the server, go to **Monitor** and add a notification with limits for disk, RAM and CPU usage. With **Only notify when sustained for**, Ploi waits until the usage has stayed above the limit for 10 to 60 minutes, so a short peak doesn't wake you up. Tick the recovery option to also hear when usage drops back below the limit. Server monitoring has to be installed on the server.
- Services: on the server's **Services** page, open the service status notifications. Ploi notifies you once when a service stops.
- Insights: on the server's **Insights** page, open the **Notifications** tab and choose the priorities you want to hear about.
- Automatic updates: on the server's **Manage** page, in the **Updates** tab.
- SSH logins: on the server's **Manage** page, under **SSH login notifications**. Ploi installs a hook on the server and sends a message for every successful login. This needs the Pro plan or higher.
- Backups: click **Notifications** on the backup and choose before the backup, after it or when it fails. See [How do I set up database and file backups?](/documentation/database/how-do-i-set-up-database-and-file-backups)

For your own integrations, the site's **Notifications** page also has two webhook URLs. Ploi sends a POST request with JSON to them when a deployment starts and when it finishes.

### Assigning channels in bulk

To attach a channel to many servers and sites at once, click **Bulk assign notifications** on the Notification channels page. Pick the channel, tick the notification types and the servers and sites, and click **Assign notifications**. Ploi skips what is already attached. For deployments, bulk assign attaches the **Deployment completed** event, which also covers failed deployments. Add **Deployment started** on the site itself if you want it. The server list only shows servers you own. Servers that don't have SSH login notifications or monitoring installed are greyed out for those types.

### Messages Ploi always e-mails

Some messages go to your e-mail address whatever channels you set up. Examples are a server that fails to build or can't be reached, a failed Let's Encrypt request, a failed database clone, a failing health check and a deployment that couldn't start. Failed backups are e-mailed too, unless the backup has a channel for failed backups.

### When a channel stops working

Ploi sends every message once and doesn't retry. When a channel fails, for example because someone deleted the webhook in Slack, Ploi e-mails you the error. Update the webhook with **Edit** and check it with **Send test**. Deleting a channel removes it from every server, site and backup it was attached to.

### Teams

Notification channels belong to your account, not to the team, and you can only attach your own. A message goes to the channel no matter who caused the event. When you attach your Slack channel to a team site, deployments by your teammates end up in your Slack as well.

## Server providers

### Add UpCloud as server provider

URL: https://ploi.io/documentation/server-providers/add-upcloud-as-server-provider
Last updated: 2023-07-15

To add UpCloud as a server provider to enable easy server creation in Ploi, you will have to create a new member inside your account. They are called 'People' at the navigation of the UpCloud panel.

![](https://ploi.io/storage/24/Image-2018-12-06-at-1.24.28-PM.png)

Add a new member by pressing "+ Add", this screen will allow you to create a new user and specify some additional options.

**Note:** if you want to be extra secure, make sure you only allow the worker IPs from Ploi which you can find [here](https://ploi.io/documentation/introduction/ploi-ip-for-whitelisting).

After this has been done you can go back to Ploi.io and add it as a server provider in your [profile](https://ploi.io/profile?#v-server-providers). Just enter the username and password and you're all set!

**TIP:** Sign up with UpCloud with our promo code to get 25$ on your UpCloud account: <https://upcloud.com/signup/?promo=ploi>

### Add DigitalOcean as server provider

URL: https://ploi.io/documentation/server-providers/add-digitalocean-as-server-provider
Last updated: 2025-07-03

You will need to create an API token inside your DigitalOcean account, this is fairly easy.

Start by logging in to digitalocean.com and go to "API" in the left sidebar ([or click here](https://cloud.digitalocean.com/account/api/tokens/new)). Make sure you press "Tokens" and then "Generate New Token".

![DigitalOcean API token](/storage/images/e8cd6c1d-2508-4935-8b10-b40d6d7a6ee3.png "DigitalOcean API token")

Next, when creating a token you can select **Custom Scopes**, **Read Only,** and **Full Access**. Full Access is optional, it ensures Ploi will be able to manage your server fully, however, if you would like to be explicit you can choose Custom Scopes and select these scopes:

- account -&gt; read
- droplet -&gt; create
- droplet -&gt; read
- droplet -&gt; delete
- ssh\_key -&gt; create
- ssh\_key -&gt; read
- tag -&gt; create

After creating you'll be presented with the API key, which you can enter in your Ploi profile.

### Add Vultr as server provider

URL: https://ploi.io/documentation/server-providers/add-vultr-as-server-provider
Last updated: 2025-09-23

Adding Vultr as server provider is fairly easy, head over to vultr.com and login to your account.

Next click on "Account" and press the tab "API", then in the "Name" field, enter a name for your API key, set an expiration date and press "Add Key", you will be presented with your API key **once**, make sure to save it.

![](https://ploi.io/storage/rGeC3ohrBmXT3jdoMSz89xqegSj6IkPtMXLnCzee.png)

**Note:** if you want to be extra secure, make sure you only allow the worker IPs from Ploi which you can find [here](https://ploi.io/documentation/introduction/ploi-ip-for-whitelisting).

Copy this API key to your clipboard and then you can go back to Ploi.io and add it as a server provider in your [profile](https://ploi.io/profile?#v-server-providers). Just enter the API key and you're all set!

### Add Linode as server provider

URL: https://ploi.io/documentation/server-providers/add-linode-as-server-provider
Last updated: 2020-10-16

Head over to <https://cloud.linode.com/dashboard> (and login if required).

Press your profile (top right) and head over to your profile. Then press "API Tokens" and add a new personal token. Make sure you give it the **Read &amp; Write** permissions otherwise Ploi will not be able to create your server.

![](https://ploi.io/storage/29/Image-2019-01-07-at-12.59.26-PM.png)

### Add Hetzner as server provider

URL: https://ploi.io/documentation/server-providers/add-hetzner-as-server-provider
Last updated: 2023-03-10

Hetzner has another way to use API keys, there is no global API key. You will have to create a project and request a token for that project to create the server in. Make sure you create a new Project first in your account.

Next access this project, and go to "Security" on the left. Next, navigate to the "API TOKENS" tab and generate a new token.

[![](https://ploi.io/storage/m10cTVwAovFYTMkKUJ3YT90lZQsh5toGp0QiW3zR.png)CleanShot 2023-03-10 at 14.34.13.png 109.08 KB](https://ploi.io/storage/m10cTVwAovFYTMkKUJ3YT90lZQsh5toGp0QiW3zR.png)**EXTRA:** If you want extra security you can allow our [worker IP's](https://ploi.io/documentation/introduction/ploi-ip-for-whitelisting) (make sure to add all of them).

### Add AWS (Amazon) as server provider

URL: https://ploi.io/documentation/server-providers/add-aws-amazon-as-server-provider
Last updated: 2020-01-04

To add AWS support to your account you will have to create a secret/key pair that you can enter in Ploi's system.

First, head over to <https://console.aws.amazon.com/iam/home#/security_credentials> and press "Access keys" tab. The below image will illustrate how this looks.

 ![](https://ploi.io/storage/79/Screen-Shot-2020-01-03-22-09-14.png)

Create a new access key and head over to your profile in Ploi and enter the access key &amp; secret. You can also enter these details when creating a server.

### Add Katapult as server provider

URL: https://ploi.io/documentation/server-providers/add-katapult-as-server-provider
Last updated: 2022-02-01

To add Katapult as a server provider you will have to gather 2 keys:

- API key
- Organization ID

Start by [logging into the Katapult dashboard](https://my.katapult.io/), next press "My settings" at the top right. Now press "API access" in the left sidebar as illustrated here:

![](https://ploi.io/storage/VgrpwKCODXcShg9h8vdxuDduoMfFAIJ5K1v9qxKC.png)

Give your API key a recognizable name, optionally you can also add the [Ploi worker IP address](https://ploi.io/documentation/introduction/ploi-ip-for-whitelisting) to the "Authorized IP addresses" field for extra security and create the key.

Now for the scopes, you could add the "Full access to all APIs" scope so you're sure it'll always work. However, if you want to be explicit, these are the scopes Ploi needs:

- Core: Manage virtual machines
- Core: Start &amp; stop virtual machines
- Core: View organizations
- Core: Read-only access to disk templates

After you've created the API key, it will only be displayed once to you. So make sure you save this API key somewhere or directly enter it into your profile on Ploi.

Now after you've got your API key, you will also need to grab your organization ID. At the top, make sure you've selected the correct "Organization" you want to provision servers for. Press "Settings" on the top, and grab your Organization ID:

![](https://ploi.io/storage/mlKuuAtlnCenokkWctb2rBM9WdKkU5cRmloqM3ZZ.png)

You are now ready to start creating servers with Katapult!

### Add Hostinger as server provider

URL: https://ploi.io/documentation/server-providers/add-hostinger-as-server-provider
Last updated: 2025-04-23

Adding Hostinger as server provider is fairly easy, head over to hostinger.com and login to your account.

Next, click on the avatar at the top right, and then press "Security" and go to the "API" tab, or [click this quick link](https://hpanel.hostinger.com/profile/api).

In here, you can create a fresh API key:

![](/storage/images/fd1ea5ef-a424-477b-91fc-b5ec207798f1.png)

After creation you'll be presented with the API key, copy this key to your clipboard, and then you can go back to Ploi.io and add it as a server provider in your [profile](https://ploi.io/profile/server-providers). Just enter the API key and you're all set!

**Important:** You will need to have an active payment method in your Hostinger account before you can add the API key to Ploi.

## Optimisations

### Run WordPress cron manually

URL: https://ploi.io/documentation/optimisations/run-wordpress-cron-manually
Last updated: 2022-03-21

Each time a user runs your WordPress application by visiting it, or viewing posts/blogs WordPress goes to work to see if there are any jobs open to run them.

For a starting or smaller WordPress website this is no problem, but it is not optimized at all: let's change this.

First, we will need to tell WordPress that we don't want the users to be responsible to check if there are jobs open to be processed. (What we explained above)

We do so by adding this line of code to the **wp-config.php** file:

`define('DISABLE_WP_CRON', true);`

Now add your own cronjob to execute the WordPress cron script to run so about every 5 or 10 minutes, this should be enough (if it's not, then lower it):

`php /home/ploi/{domain}/public/wp-cron.php`

Make sure to replace `{domain}` it with your own domain as it displays in your site overview.

That's it, your WordPress installation will now make sure your users are not responsible for executing the WordPress cron/jobs.

### How do I secure my WordPress installation?

URL: https://ploi.io/documentation/optimisations/how-do-i-secure-my-wordpress-installation
Last updated: 2019-07-09

WordPress is a CMS that has been around for a very long time, for that reason there is also a lot of people that want to do harm and infect your WordPress site. This guide will walk you through some basic steps to protect your WordPress from being infected.

The start is a good protected server, preferably with a firewall &amp; fail2ban setup. Make sure no one has access to your passwords or SSH keys which would be able to get into your installation.

To protect WordPress itself as installation, we recommend the following plugins:

**1. Anti-Malware Security and Brute-Force Firewall** - [Link](https://nl.wordpress.org/plugins/gotmls/?ref=ploi.io)

This plugin will scan your WordPress installation for any malware, or suspicious scripts. It will make calls to the core server of the plugin where they store the known backdoors to keep you informed.

**2. WP Limit Login Attempts** - [Link](https://nl.wordpress.org/plugins/wp-limit-login-attempts/?ref=ploi.io)

This is basically a plugin to prevent brute forcing to your WordPress installation. It will verify each login with a captcha code and an inbuilt mechanism to slow down brute forces.

These plugins are no guarantee that your installation will be safe and sound. There are still possibilities new backdoors are created which will not be patched fast enough. Be sure to check your WordPress weekly so you are sure its still good.

### How to optimize WordPress

URL: https://ploi.io/documentation/optimisations/how-to-optimize-wordpress
Last updated: 2020-10-16

You don't want your users to be waiting for your website to be fully loaded longer that 3 seconds, it will result in a lower conversion rate and high bounce rate (the percentage your users leave after an number of seconds).

Thats why we want to lay out some methods for you to optimize your WordPress installation so you are sure you've did everything to make it run as fast as you can.

1. Choose quality hosting
-------------------------

There's a lot of hosting and cloud providers out there, especially with shared hosting you should be real careful. As a customer you cannot see how many users you are sharing the webhosting with, thats why we personally recommend to use your own server so you know you are the only one using it whilst at the same time having a unique IP address.

The providers you see on our partners page are quality hosting providers, with these guys you are assured to have decent hosting.

2. Use OPCache
--------------

OPCache is an amazing piece of software, what it basically does is cache PHP code in the FPM worker so it does not have to recompile each time a user loads your website.

[More on OPCache here](https://ploi.io/documentation/php/how-does-opcache-work)

3. Install caching plugins
--------------------------

WordPress has a very easy and fast way to install plugins. With that theres a big plugin marketplace where you can get a lot of optimization plugins.

We've summed up a few caching plugins we recommend:

1. [WP Rocket - Caching plugin for WordPress](https://wp-rocket.me/) (Paid)
2. [W3 Total Cache - Web Performance Optimization for WordPress](https://wordpress.org/plugins/w3-total-cache/) (Free)
3. [Comet Cache](https://wordpress.org/plugins/comet-cache/) (Free + paid)
4. [WP Super Cache](https://wordpress.org/plugins/wp-super-cache/) (Free)
5. [Flying Pages](https://wordpress.org/plugins/flying-pages/) (Free)

4. Optimize your images
-----------------------

Another thing is you might not even know is how big your images are, so optimizing them might be a good choice. There are actually a number of free tools that do this for you.

- [TinyPNG](https://tinypng.com/)
- [ImageOptim](https://imageoptim.com/)
- [Kraken Optimizer](https://kraken.io/)

Also don't forget about the size and compression, these are important things that is forgotten a lot. For example, if you don't need transparency use .jpg format and no .png, this reduces file size a lot.

5. Cache your assets (CSS, JS, images) in your webserver
--------------------------------------------------------

If you are using **NGINX** as webserver you can add the following code inside your `server {}` block which is present inside your virtual host file:

```
# assets, media
location ~* \.(?:css(\.map)?|js(\.map)?|jpe?g|png|gif|ico|cur|heic|webp|tiff?|mp3|m4a|aac|ogg|midi?|wav|mp4|mov|webm|mpe?g|avi|ogv|flv|wmv)$ {
    expires 7d;
    access_log off;
}

# svg, fonts
location ~* \.(?:svgz?|ttf|ttc|otf|eot|woff2?)$ {
    add_header Access-Control-Allow-Origin "*";
    expires 7d;
    access_log off;
}
```

If you are using **Apache2** you can use the following block to be added to your virtual host config file:

```
<ifmodule mod_expires.c="">
    ExpiresActive on

    ExpiresByType image/jpg "access plus 60 days"
    ExpiresByType image/png "access plus 60 days"
    ExpiresByType image/js "access plus 60 days"
    ExpiresByType image/jpeg "access plus 60 days"
    ExpiresByType text/css "access plus 1 days"
</ifmodule>
```

Make sure that when you added these changes you restart your webserver properly.

6. Choose plugins wisely
------------------------

For each plugin that you add new code is added as well which has to compile, which results in more load time. Make sure that each plugin you install is absolutely required and being used. You'd be better off removing unused plugins than leaving them in there without it doing anything.

7. Tools
--------

To know how your site is performing a number of tools might give you more insight about speeds and optimization.

- <https://ohdear.app>
- <https://www.pingdom.com/>
- <https://developers.google.com/speed/pagespeed/insights/>
- <https://bulkresizephotos.com/>

## Load balancing

### Introduction to Load Balancing

URL: https://ploi.io/documentation/load-balancing/introduction-to-load-balancing
Last updated: 2020-06-25

Load balancing is a very nice and clean way to distribute the traffic (&amp; load) over several servers. We make setting up your load balancing infrastructure as easy as possible.

We've created a video demonstrating on how easy it actually is.

### What are the benefits of load balancing?

URL: https://ploi.io/documentation/load-balancing/what-are-the-benefits-of-load-balancing
Last updated: 2019-03-13

The biggest benefits of Load Balancing is being able to provide a high quality uptime domain.

If one webserver falls our or has maintenance, your website will still stay alive because of the other webserver attached to it. Geographically it is also a better choice if your website is international.

### How do I create a load balancer?

URL: https://ploi.io/documentation/load-balancing/how-do-i-create-a-load-balancer
Last updated: 2021-05-14

Creating a Load Balancer with Ploi is really easy.

Login to your account and press "Servers" -&gt; "Create" in the left sidebar. Then select your favorite provider or select custom server and select "Load Balancer" where it asks you for server type:

![](https://ploi.io/storage/HOXQp0kLUDnG7rW46GFQsxJi5A734v14zTIYFPhq.png)

After you filled in the rest of the details, press "Create server" and you're all set!

### How do I request a Let's Encrypt certificate for a load balancer?

URL: https://ploi.io/documentation/load-balancing/how-do-i-request-a-lets-encrypt-certificate-for-a-load-balancer
Last updated: 2026-06-15

Before you can request a Let's Encrypt certificate for your load balancer, the domain must already point to the load balancer. Let's Encrypt validates that you control the domain, so the request will fail if DNS still points elsewhere.

Steps
-----

1. At your DNS provider, point the domain's **A record** to your load balancer's IP address and wait for it to propagate.
2. In Ploi, open your load balancer and go to the certificate (SSL) section.
3. Request a **Let's Encrypt** certificate for the domain.

Ploi validates the certificate using an HTTP-01 challenge on port **8888** of the load balancer, so make sure that port isn't blocked by an external firewall. Once issued, the certificate is installed on the load balancer (HAProxy) and Ploi sets up automatic renewal for you.

For more background on Let's Encrypt certificates, see [How do I request a Let's Encrypt certificate?](https://ploi.io/documentation/ssl/how-do-i-request-a-letsencrypt-certificate)

## E-mail

### How do I send e-mails?

URL: https://ploi.io/documentation/email/how-do-i-send-e-mails
Last updated: 2024-02-29

By default Ploi installs sendmail, but this is not configured.

You can however use sendmail, it is most likely that your e-mails will end up in the user's spam folder or even not get delivered at all. There are a lot of articles around to configure a mail server properly but it is a very intensive and long-time taking job to set this up. Besides that, it is hard to say if you will be able to build up a good reputation from the address you are sending from and get your own guarantee that e-mails will get delivered.

Therefore we have created this article to give you suggestions and help you out with e-mailing.

**Recommended services to send e-mails**

1. Postmark - <https://postmarkapp.com/>
2. Mailgun - <https://www.mailgun.com>
3. Sparkpost - [https://www.sparkpost.com](https://www.sparkpost.com/)
4. Custom web hosting package with e-mailing (for example DirectAdmin has mailing built-in which you could use)

We can also recommend GSuite from Google, this is however a paid solution but you have quality software for e-mailing and high guarantee that your e-mails will get delivered properly. <https://gsuite.google.com/>

### Tools to test your sending reputation with a email server

URL: https://ploi.io/documentation/email/tools-to-test-your-sending-reputation-with-a-email-server
Last updated: 2024-03-12

Reputation is one of the most important things when having your own mail server. Providers have no trouble blacklisting you because of emails potentially containing spam, or even when sending a lot of emails is one of the reasons to get blocked.

To help you build your reputation, here's a list of tools you can use to test your current deliverability score:

- <https://www.senderscore.org/>
- <https://www.barracudacentral.org/lookups>
- <https://www.mail-tester.com/>
- <https://glockapps.com/spam-testing/>
- <https://postmaster.google.com/>

When you do have the suspicion of emails not getting delivered, it is good to check the blacklists. Here's a list of the most common checkers.

- <https://mxtoolbox.com/blacklists.aspx>
- <https://www.ultratools.com/tools/spamDBLookup>
- <https://www.debouncer.com/blacklistlookup>

### How to improve email deliverability

URL: https://ploi.io/documentation/email/how-to-improve-email-deliverability
Last updated: 2024-03-12

Let's face it, your emails are useless when they don't make it to the users inbox. That's why you'll have to think about IP/hostname reputation. This guide shows you a few tips to get you started quickly and making sure you can avoid blacklists and spam complaints.

1. Don't send too much at the start
-----------------------------------

When you start sending a lot of emails right after installation you'll most likely experience to be blacklisted very quickly. You'll have to build trust with ISP's to know your emails are **valid** and not spam.

2. Keep checking your reputation
--------------------------------

[In this article](https://ploi.io/documentation/email-server/tools-to-test-your-sending-reputation-with-a-email-server) we show you a few tools to determine what your current sender score is. If it is too low, you'll end up with emails not getting delivered, or reaching the spam folder, which is not what you want. Make sure to keep on checking the blacklists to see wether your IP is still valid to send with.

3. Create the proper DNS records
--------------------------------

When installing a server with Ploi, we give you DNS records to setup. Don't forget to do this, it is very important so ISP's can verify your the origin sender and built trustworthiness.

4. Use a proper "name" in your email
------------------------------------

When sending emails, you always have a sender with an email and a name. Using a proper name will reduce spam complaints and make sure users will engage with the emails as well. Each time a user opens up a email your server's IP will start to build trust with the ISP.

## Storage server

### How can I use the storage server with Laravel?

URL: https://ploi.io/documentation/storage-server/how-can-i-use-the-storage-server-with-laravel
Last updated: 2019-11-14

First of all install a new storage server, you can select this when pressing "Create server" under "Type", you will be able to select "Storage server" there.

Next in your Laravel application, add the Amazon S3 driver:

`composer require league/flysystem-aws-s3-v3`

Next we have to configure a new filesystem driver inside the config file: `config/filesystems.php`, open this file in your favorite IDE.

Look up the **disks** array in this file and add the following block to that array:

```
'minio' => [
    'driver' => 's3',
    'endpoint' => env('MINIO_ENDPOINT', 'http://127.0.0.1:9000'),
    'use_path_style_endpoint' => true,
    'key' => env('MINIO_KEY'),
    'secret' => env('MINIO_SECRET'),
    'region' => env('MINIO_REGION'),
    'bucket' => env('MINIO_BUCKET'),
],
```

Then we have to add those values to our **.env** file:

```
FILESYSTEM_CLOUD=minio
MINIO_ENDPOINT=http://127.0.0.1:9000
MINIO_KEY=YOUR-ACCESS-KEY
MINIO_SECRET=YOUR-SECRET-KEY
MINIO_REGION=us-east-1
MINIO_BUCKET=test
```

The value for `MINIO_REGION` can be anything you want as this is not used for MinIO. 
The value for `MINIO_BUCKET` is the name of the bucket you have created in the storage server.

You are now ready to start using your storage server, here is an example to get all files from your storage:

```
Route::get('storage', function(){
    return Storage::disk('minio')->files();
});
```

More information about the Laravel storage system can be found in their [documentation](https://laravel.com/docs/master/filesystem).

### How can I use the storage server with WordPress?

URL: https://ploi.io/documentation/storage-server/how-can-i-use-the-storage-server-with-wordpress
Last updated: 2019-11-14

By default WordPress does not support S3 (unless not until future versions), so we will need to add a plugin that adds support for that.

We personally recommend [Media Cloud](https://wordpress.org/plugins/ilab-media-tools?ref=ploi.io) because it supports MinIO out of the box, install this plugin to continue with this guide.

After installation head over to the Media Cloud tab on the left, and right away enable "Cloud Storage" and press save. Once saved press "Settings" below the title.

 ![](https://ploi.io/storage/75/Screen-Shot-2019-11-14-13-24-28.png)

When you are on the settings page change these settings:

**Storage Provider:** Set to MinIO

**Access key:** Enter your access key

**Secret:** Enter your secret key

**Bucket:** Enter your bucket name you've created

**Region:** Leave on automatic

**Custom endpoint:** Enter endpoint for your server, by default this is: http://{SERVER\_IP}:9000

 ![](https://ploi.io/storage/76/Screen-Shot-2019-11-14-13-27-58.png)

All that settings that are left are up to you to configure as these are personal preferences. Now each image you will upload will be stored on your storage server!

### How do I use my own domain for the storage system?

URL: https://ploi.io/documentation/storage-server/how-do-i-use-my-own-domain-for-the-storage-system
Last updated: 2019-11-14

You can use your own domain when using the storage server instead of the default IP address, this also allows you to enable SSL.

Visit your storage server in the panel and fill in the field "Hostname" to your domain (Like: **storage.example.com**).

Make sure you have setup the records to point to that server to be able to visit the record and use it in your applications.

### How do I backup to my Minio storage server?

URL: https://ploi.io/documentation/storage-server/how-do-i-backup-to-my-minio-storage-server
Last updated: 2021-05-31

Since you can create your own S3 server on Ploi with the Minio software it would be great if you can also backup to this server. And you easily can!

Head over to your profile and select [Backup configurations](https://ploi.io/profile/backup-configurations), then select the "Custom S3" driver:

![](https://ploi.io/storage/C2PynvxSlWYpkSWE83qqdK4lQHHDQec4MM1pvMTt.png)

Next enter the following credentials:

- Label: To recognize your configuration when setting this up
- Access key: The access key from your Minio server
- Access secret: The secret key from your Minio server
- Bucket name: The name of the bucket you created in your Minio server
- Endpoint: The HTTP endpoint of your server, this could be for example: http://95.179.138.125:9000

Now save the backup configuration, Ploi will directly verify if it can connect to your S3 server so you know whether it works or not.

After you've done this, you can now easily select this backup configuration when creating a backup.

### How do I login into my storage server?

URL: https://ploi.io/documentation/storage-server/how-do-i-login-into-my-storage-server
Last updated: 2022-02-01

Minio itself provides a beautiful interface for you to interact with. You can easily login into the web interface with the credentials provided by Minio. You can grab these from the Ploi panel by pressing the "Get passwords" button:

![](https://ploi.io/storage/ueoOZLqcUkUgcsdmmudV3TkhzB5pzJ6uGrSPSxvS.png)

Next head over to your Minio console, you will find a link for that above in your server view.

In the Minio login screen, you'll see the "Username" and "Password" field, enter your Key for the Username, and the Secret for the Password:

![](https://ploi.io/storage/Z4PWwFdPmzno7Pqb80sfWYaPmy7yOlZ34cQRts23.png)

Next press login, and you'll be greeted with the Minio Dashboard:

![](https://ploi.io/storage/iYTU8nbi5b42LzF0SxArCvBlt6c4TWkxtM4BWTu2.png)

## Status pages

### How do status pages work?

URL: https://ploi.io/documentation/status-pages/how-do-status-pages-work
Last updated: 2026-06-15

Status pages let you publish a clean public page showing the health of your servers and sites — ideal for keeping your users informed during incidents and maintenance.

You'll find **Status pages** in the sidebar. If you don't see it, your current subscription doesn't include the feature — status pages are available on the **Unlimited** plan.

Creating a status page
----------------------

From the Status pages section, create a new page with a name, slug and description. You can then:

- Attach the servers and sites you want to display, and set their order and labels.
- Show live statistics for attached resources — CPU, RAM, disk and load average — plus SSL certificate status for sites.
- Publish incidents (manual or scheduled) to report outages and maintenance.

Appearance and access
---------------------

- Customize the theme — colors, logo and branding.
- Set a refresh interval (5, 10, 15, 30 or 60 minutes).
- Restrict access with a password or by allowed IP addresses, and optionally disable search-engine indexing.
- Use a Ploi subdomain or your own custom domain — see [How do I use my own domain?](https://ploi.io/documentation/status-pages/how-do-i-use-my-own-domain)

### How do I use my own domain?

URL: https://ploi.io/documentation/status-pages/how-do-i-use-my-own-domain
Last updated: 2021-05-14

We offer the ability to run the status page completely on your own domain (see example) which is very easy to setup. We will handle all the SSL certificate hassle and will also always force SSL for you, you do not have to do anything about this.

Once you have created your status page, you are also able to fill in a 'Domain name'. The only thing you have to do is fill in the domain name you desire like: **status.domain.com** and then create a **CNAME** record to **status-page.ploi.app**.

Example in the status page form:

![](https://ploi.io/storage/Vz8W3Kc7VJxgMwtdx2CLwlf88qsdXhDx3BotKxAu.png)

The DNS record for the domain **domain.com** should look like this:

![](https://ploi.io/storage/77/Screen-Shot-2019-12-17-11-50-09.86.png)

Next visit that domain which might take some time as SSL is being setup, just be patient and wait until your status page is displayed.

## Staging sites

### How do I create a staging site?

URL: https://ploi.io/documentation/staging-sites/how-do-i-create-a-staging-site
Last updated: 2020-02-27

You can easily create a staging site by just checking the box "Create Staging Site" when you open "Advanced options" while creating a domain. It is not possible to make an existing domain a staging domain, if you want to enjoy this feature you will have to delete your old site, and then setup a new domain with the staging feature enabled.

 ![](https://ploi.io/storage/98/Screen-Shot-2020-02-26-09-18-05.91.png)

Once you've created a staging site, you will see 2 new sites in the list:

 ![](https://ploi.io/storage/99/Screen-Shot-2020-02-26-09-21-22.14.png)

The **example.com** is indicating it is being staged by the **staging.example.com** site.

### Automatic DNS record creation

URL: https://ploi.io/documentation/staging-sites/automatic-dns-record-creation
Last updated: 2020-11-03

It is possible to automatically create a correct DNS record for your domain, if you have Cloudflare enabled in your account and if that domain exists in your Cloudflare account.

All you have to do is fill in your Cloudflare email address &amp; API key at your profile page: <https://ploi.io/profile/integrations>

Next once you create a site, with staging, it will automatically create the DNS record for you pointing to the correct server.

### How do I deploy staging to production?

URL: https://ploi.io/documentation/staging-sites/how-do-i-deploy-staging-to-production
Last updated: 2020-02-26

So now the time has come to deploy staging, to production. There are a few things to consider about before doing this.

The first thing you have to consider is what files you do not want to be moved over. For example, if you have a folder where uploads are stored, then you probably do not want it to be synced over to production (as the uploads could differentiate).

The second thing is the configuration file to connect to your database, and other variables. It would be wise to add these to the exclusion list so these will be skipped upon deploying to production. You can add exclusion files to the "Production" tab inside the staging site.

 ![](https://ploi.io/storage/100/Screen-Shot-2020-02-26-09-45-25.54.png)

Next, once you're all set to deploy to production you can head over to the staging site and visit the "Production" tab, on the right hand side you will see a button "Deploy to production" which will deploy to the production site.

![](https://ploi.io/storage/101/Screen-Shot-2020-02-26-09-50-02.png)

### How do I run a script after deployment to production?

URL: https://ploi.io/documentation/staging-sites/how-do-i-run-a-script-after-deployment-to-production
Last updated: 2020-02-26

You can run a script for the production site after deployment from staging has completed. This can be handy if you need additional tasks to be done after deployment.

Head over to your production site, there you will be able to write down a deploy script that will be ran after deployment from staging to production.

![](https://ploi.io/storage/102/Screen-Shot-2020-02-26-11-13-35.png)

## Redis server

### How do I connect with an external redis server?

URL: https://ploi.io/documentation/redis-server/how-do-i-connect-with-an-external-redis-server
Last updated: 2020-11-03

In order for you to connect to a separate, remote redis server we have to change some configuration values.

By default, your redis server is listening on this address:

```
0.0.0.0 ::1
```

This is normal, you can leave this as it is. It means that the redis service is listening on all connections. This also brings a dangerous fact: it allows everyone to connect to your redis server (if the firewall allows this).

By default, the port 6379 (the default redis port) is closed. You have 2 options to protect the redis server.

**Note:** If you're using AWS, you will also have to edit the security rules group inside AWS itself, to open up port 6379.

Allow from explicit IP address
------------------------------

Allow the port 6379 inside the firewall with an explicit IP address where the connection comes from:

![](https://ploi.io/storage/qcjZvefcKTyDPjQG6sRGwWOPU9EnLUc1Xfz6eXq2.png)

Using a password
----------------

Of course in this case you will also have to open up port 6379, which is also possible with an explicit IP address. Set a password inside the redis configuration, you can do this by editing the **/etc/redis/redis.conf** file.

You can specify a password using the **requirepass** key inside the configuration file. It is recommended to use a long string random string, an example:

```
requirepass VT0rZuyWBPd5UL5M3TGR
```

Next test if you can connect to your redis server with a remote application. A Laravel example inside the .env file could look like this:

```
REDIS_HOST=120.204.227.47
REDIS_PASSWORD=VT0rZuyWBPd5UL5M3TGR
REDIS_PORT=6379
```

We also have a sample installation for you to test if you're able to connect to your redis server remotely. You can clone this project from here: <https://github.com/ploi-deploy/laravel-redis-example>

## Email server

### How to install a email server?

URL: https://ploi.io/documentation/email-server/how-to-install-a-email-server
Last updated: 2024-03-12

**As of November 2023, Ploi will no longer support the WildDuck email server type. This server type is being discontinued to focus on more sustainable solutions.**

**Current users can continue using it, but no further updates or support will be provided.**

The email server type in Ploi uses the WildDuck email software to make emailing easy and fast. You can create a email server by going to the create server page and selecting the "Email server" type in the dropdown.![](https://ploi.io/storage/aMLMbazepPHKVWoRxw0VcfftObcpyhxUODaG20gG.png)

You will be asked to enter 2 additional fields: domain and hostname.

- Domain - the domain that is used to end the email with. For example, if you have a domain called examplehosting.com, that's what you fill in here.
- Hostname - where the web panel should be available on, what the users should setup for mail clients

After installation has started, you will have to wait for Ploi to get the servers IP address (in case of a provider server, not a custom server). Once Ploi has gathered the IP address, it will notify you to create specific DNS records. When you've done this, you can go to the server and start the actual installation. Ploi will verify these DNS records upon installation.

Once installation has finished, you will be presented with a few additional DNS records that need to be created. You will receive these in your e-mail and they are always visible in the panel.

## Docker server

### How to install a Docker server?

URL: https://ploi.io/documentation/docker/how-to-install-a-docker-server
Last updated: 2026-06-15

The Docker server type in Ploi makes managing your Docker containers a breeze. Instead of the traditional web stack (PHP, NGINX, MySQL), a Docker server is provisioned with Docker CE, the Docker CLI, containerd and the Docker Compose plugin ready to go, with the `ploi` user added to the `docker` group so it can run containers.

Creating a Docker server
------------------------

Go to the create-server page and select the **Docker server** type in the dropdown, then create the server as you normally would.

![Selecting the Docker server type](https://ploi.io/storage/A9eZfvARC3nFYU9ax3fIFNMeYQDYofQBzwPoVs3K.png)

Managing containers
-------------------

Once the server is ready, you can manage everything from the Ploi panel:

- Create and delete containers from a Docker Compose file.
- Start and stop containers — Ploi runs `docker compose up` / `docker compose down` for you.
- View container logs directly in the panel.
- Edit a container's deploy script and configuration.
- Proxy a domain to a container, so a site points at the container's port.

You also have full SSH access to the server, so you can manage Docker manually with the `docker` and `docker compose` commands whenever you need to.

## Mobile App

## Support

### How do I use markdown markup?

URL: https://ploi.io/documentation/support/how-do-i-use-markdown-markup
Last updated: 2026-06-15

Markdown is a simple way to format text that looks great on any device. Here's how to use it in Ploi's support platform:

Basic formatting
----------------

- **Bold**: use `**double asterisks**` around text.
- *Italic*: use `*single asterisks*` around text.
- Strikethrough: use `~~double tildes~~` around text.

Headers
-------

Create headers by using `#` symbols:

```
# Main header (H1)
## Sub-header (H2)
### Smaller header (H3)
```

Lists
-----

Unordered list:

- Use a dash `-` or asterisk `*`
- For each list item

Ordered list:

1. Use numbers
2. For each item

Links
-----

Create a link like this: `[Ploi](https://ploi.io)`

Code
----

For inline code, use single backticks: `` `code here` ``

For code blocks, use triple backticks:

```
function example() {
    return "Hello, Ploi!";
}
```

Quotes
------

Use a `>` symbol for quotes.

Horizontal rule
---------------

Use three dashes `---` for a horizontal line.

Remember, Markdown is designed to be easy to write and read.

# News

## The Forgejo update 🚀

URL: https://ploi.io/news/the-forgejo-update
Published: 2026-10-20

Ploi has worked with GitHub, GitLab and Bitbucket for years. Code on Codeberg or on a Forgejo server you run yourself had to go in as a custom repository, with the deploy key and the webhook set up by hand. Starting today, Forgejo is a source control provider next to the other three, and it works the same way they do.

Linking your Forgejo account
----------------------------

Open your profile, go to **Source control** and click **Link Forgejo account**. Forgejo has no central place where we could register an OAuth app, since every instance is separate. You link it with a personal access token instead. Create one in Forgejo under **Settings › Applications** with the `read:user` and `write:repository` permissions. Ploi needs the write permission to add the quick deploy webhook.

The instance URL starts out as Codeberg. Running your own instance? Fill in its URL instead. Gitea has the same API, so a Gitea server links the same way. You can link more than one account, for example Codeberg next to your company's own server, and a label keeps them apart. Ploi checks the token against the instance when you save, so a typo shows up right away.

![](https://ploi.io/storage/0LgJgKpKax1C3XXVSSFY3vnSWjNsSnZsboxdEd7C.png)

What you can do with it
-----------------------

- Install a Forgejo repository on a site, an application or a WordPress site. You pick from a list of your repositories and their branches, including repositories of organisations you're a member of.
- Deploy, zero downtime deployments included. Ploi pulls with the token of the linked account.
- Turn on quick deploy. Ploi adds a push webhook to the repository and deploys when you push to the branch.
- See the latest commits from Forgejo in the panel.
- Install Forgejo repositories through the API and the MCP server.

This one came from the [roadmap](https://roadmap.ploi.io/projects/3-panel-requests/items/1392-codebergforgejo-source-control-provider). Thanks to everyone who asked for it.

RunCloud joins the server import
--------------------------------

Two days after the last update, RunCloud joined Laravel Forge and ServerPilot in the server import. It works like the ServerPilot import. RunCloud runs its own NGINX, Apache and PHP builds under `/RunCloud/Packages`, so Ploi installs its own stack next to it, moves each app from `/home/<user>/webapps` into Ploi's layout and then switches serving over. Your apps are offline for that switch, about a minute.

The import handles RunCloud's NGINX and NGINX + Apache stacks. It refuses OpenLiteSpeed servers. The RunCloud import is in beta, so take a snapshot at your provider before your first one. Read [how to migrate from RunCloud](https://ploi.io/documentation/server/how-do-i-migrate-from-runcloud) for the full walkthrough.

Bitbucket moves SSH to ssh.bitbucket.org
----------------------------------------

On 12 November 2026, Bitbucket Cloud stops accepting SSH connections on `bitbucket.org`. Git over SSH moves to `ssh.bitbucket.org`, and `bitbucket.org` only serves HTTPS from then on. The host keys stay the same, but a server checks them per hostname. A server that only knows `bitbucket.org` refuses `ssh.bitbucket.org` with "Host key verification failed".

Ploi now adds `ssh.bitbucket.org` to `known_hosts` on new servers and for new system users, and we're adding it to your existing servers too. If you linked Bitbucket in your profile, there's nothing for you to do. Ploi clones and deploys those repositories over HTTPS with a token, and this change doesn't touch that.

Do you deploy a Bitbucket repository as a custom repository over SSH, or pull private Composer or npm packages from Bitbucket over SSH? Then change `git@bitbucket.org:` to `git@ssh.bitbucket.org:` before 12 November. For a custom repository you change the URL on the site's **Repository** page. For packages, update the URLs in `composer.json` or `package.json` and refresh the lock file.

Coming soon: site commands
--------------------------

Every site is about to get a **Commands** tab. You type a command, Ploi runs it in the site's directory as the site's system user, and you see the output while it runs. `php` and `composer` use the site's own PHP version, so `php artisan migrate` or `composer install` runs on the version the site is served with. No SSH session needed.

![](https://ploi.io/storage/oq8oHY43EQO9xHZuB6I8LSeMTYrskL1qghw78pzQ.png)

The arrow up key brings back earlier commands. The history keeps the last 50 runs per site with their output, and you can search it and run a command again from there. A stop button ends a command along with everything it started. Commands can't ask for input and stop after 10 minutes, so daemons are still the place for anything that runs longer. On a team, the new **Run commands** permission decides who gets to use it.

We're testing it now and will release it soon. It started as a request on the roadmap, like Forgejo.

Changelog
---------

Here's everything else that shipped since the last update.

### Added

- Forgejo as a source control provider, for Codeberg, self-hosted Forgejo and Gitea.
- RunCloud server import, in beta.
- Browser push as a notification channel. Notifications show up on your computer or phone, also when the panel isn't open. See [how notifications work](https://ploi.io/documentation/notifications/how-do-notifications-work).
- Restore a database backup into a new database instead of over the current one. You pick a name and optionally a user, and the current database stays as it is.
- Remove a server from Ploi but keep it at your provider. Tick the option in the delete confirmation and the server keeps running there.
- Switch a site's PHP version from the site sidebar. Click the PHP version and pick one of the versions installed on the server.
- Download Google Drive database backups from the backup files list. Team members can download them too, without access to that Drive.
- `ploi.si` as a testing domain.
- API endpoints to attach and detach notification channels on database and file backups, and `GET /api/user/notification-channels` to look up the channel IDs.
- A `site_id` field when you create a cronjob through the API, so the cronjob shows up under that site.
- An [RSS feed](https://ploi.io/news.rss) for these news posts, and **Copy for LLMs** and **View as Markdown** buttons on news and documentation articles.

### Improved

- New servers and system users trust `ssh.bitbucket.org`, where Bitbucket moves Git over SSH on 12 November.

- The Laravel scheduler cronjob runs with the site's PHP version instead of the server's default `php`. When you change a site's PHP version, cronjobs pinned to the old version move along, the WordPress cron included.
- A failed SFTP file backup now tells you which system user and key the server tried and where to add it. File backups connect as the site's system user, which has a different key than the one database backups use.
- Site clones check up front whether the source server can reach the target over SSH, instead of failing halfway.
- Certbot installs retry longer and route around the Snap Store CDN when it stalls, which broke server builds on 22 September.
- New servers check the signature of Oracle's MySQL repository. Before, they skipped that check.
- WP-CLI commands get 60 seconds. A large search and replace that runs longer now says so instead of returning an empty result.
- Creating a custom server through the API accepts the same input as the panel, such as a hostname, or a second server on the same IP with a different SSH port.
- Stacked modals no longer blur the modal underneath, which made the panel slow on some computers.

### Fixed

- After Ubuntu's curl security update of 12 October, deployments and clones of private repositories failed with "could not read Username". Ploi now also sends the token as a header, which the update leaves alone. The next deployment fixes the remote on existing sites, so there is nothing you need to do.
- Restoring a MySQL backup on a MariaDB server failed with "Access denied for user 'root'@'localhost'". Ploi also reported a failed restore as completed. It now marks the restore as failed and points you to the server log.
- File backups of busy sites failed when a file changed while tar read it, such as a log the site was writing to.
- Google Drive backups failed for users who log in to Ploi with Google, even when Drive was linked through another Google account.
- S3 backups no longer put your access key and secret on the command line, where other users on the server could read them while a backup ran.
- Backups to Scaleway larger than about 5 GB failed, because Scaleway accepts at most 1,000 upload parts.
- Team members got an error when they saved a site's file backup. Ploi now checks local backup paths as the site's system user, so you hear about a folder only root can write to when you create the backup.
- Zero downtime deployments with OPcache enabled reloaded PHP-FPM an extra time, which cut off requests in flight and caused 502 errors.
- Small servers without swap, such as EC2 instances, could run out of memory while installing MySQL. Ploi now creates the swap file before it installs anything else.
- New Ubuntu 26.04 servers on Linode failed in the base packages step because of a GRUB setting in Linode's image.
- Creating a server on one of Vultr's new VX1 plans works, and those plans have their own groups in the plan picker.
- DigitalOcean server creation sometimes failed with "invalid key identifiers". Ploi now retries a few seconds later.
- Providers you added after attaching providers to your personal team didn't show up when you created a server. Personal teams no longer limit the providers you see. Shared teams still do.
- Team members with a permission on one server didn't see its menu item, PHP for example, while the page itself did open.
- A duplicate FastCGI timeout setting could leave NGINX stopped after a PHP upgrade. Ploi now only reloads NGINX after `nginx -t` passes.
- Sites with a project directory, such as Deployer's `/current`, got tenant vhosts and certificates that pointed at the wrong path.
- Test domains on IPv6-only servers get an AAAA record now. Enabling one used to fail without an error.
- The file explorer removed the final newline, leading whitespace and a BOM from every file you saved. It now saves files byte for byte, and the refresh button reloads the folder instead of showing a cached listing.
- Disabling the WordPress cron no longer mixes line endings in a `wp-config.php` that uses Windows line endings.
- WordPress repository deploys ran variables like `{RELOAD_PHP_FPM}` as literal text.
- New WordPress installs get 64 character keys and salts, like the ones WordPress generates itself.
- Switching a site from GitHub or Bitbucket to a custom repository left the server on the old remote.
- You can now disable two-factor authentication with a backup code.
- Passkeys you added with a hardware security key such as a YubiKey ended up in Ploi but not on the key, so logging in with them failed.
- Output that isn't valid UTF-8, common in NGINX and application logs, no longer breaks the server log list, the API or the log viewers.
- Surge, the projects API and copying custom commands or marketplace deploy scripts skipped sites that a team member created.
- Bulk assigning notification channels listed no site file backups.
- Ploi now escapes the values you pass to Docker Compose and the log viewers before they reach the server.
- Database backups created through the API now save and return the excluded tables.
- Ploi sometimes marked valid VAT numbers as invalid when the EU's VIES service was busy.
- The ServerPilot import installs every PHP version your apps use, PHP 5.6 to 7.3 included. The Forge import no longer merges two Supervisor daemons into one.

That's it for this round. Does Forgejo or Gitea trip over something in your setup? Contact support and we'll look into it. Missing a feature? Drop it on the [roadmap](https://roadmap.ploi.io).

## The server import update

URL: https://ploi.io/news/the-server-import-update
Published: 2026-09-15

Switching server panels always meant a migration. A new server, files copied over, databases exported and imported, DNS moved, and a nervous evening somewhere in between. Starting today, you can skip all of that.

Ploi can now take over a server that [**Laravel Forge**](https://ploi.io/documentation/server/how-do-i-migrate-from-laravel-forge) or [**ServerPilot**](https://ploi.io/documentation/server/how-do-i-migrate-from-serverpilot) set up. You keep the same machine and the same IP address, so there is no DNS change and no moment where visitors land on the wrong server.

![Server import modal](https://ploi.io/storage/0kgoiPyAkiiahjk5ARLEXrPPNVVOl9uF6tXO9ZL6.png)

How it works
------------

Open Servers, click **Create server,** and pick **Import server**. Choose where the server comes from, fill in its IP address, and run the command we show you as root. That command only adds Ploi's SSH key.

Ploi then scans the server. The scan only reads and changes nothing. You get an overview of what it found, tick the sites you want to bring over, and start the import. Every step shows up live while it runs, and on a small server the whole thing takes a few minutes.

Coming from Laravel Forge
-------------------------

A Forge server already looks a lot like a Ploi server, so most of this import is Ploi registering what is already there. It handles the older Forge layout as well as the one Forge switched to in October 2025.

- Sites keep their directory, system user, and PHP version. The Forge user and isolated site users become Ploi system users, with the SSH keys they already have.
- Certificates Forge issued keep working. Ploi rewrites the NGINX config into its own layout, checks it with `nginx -t` first, and reloads NGINX instead of restarting it. From then on, renewals run through Ploi.
- MySQL and PostgreSQL databases and their users show up in the panel. Ploi never reads passwords from the server, so your applications keep their current credentials and you set a new password from Ploi when you need one.
- Supervisor daemons, cronjobs and firewall rules move into the panel, and you manage them from there.
- Ploi links the git remotes as repositories, so you can deploy right away with the deploy key that is already on the server.
- Sites on Forge's zero-downtime deployments get converted to a regular site directory. The old releases stay on disk until you remove them.

Forge keeps deploy scripts in its own panel, out of reach for a scan. If you paste a Forge API token in the wizard, Ploi fetches each site's deploy script and translates the `$FORGE_` variables to Ploi's own. We use the token for that one run and then throw it away.

The last step can remove Forge's access key and renewal scripts from the server. It is off by default, in case you want to keep Forge around for a while. When you are done there, archive the server in Forge instead of deleting it. Deleting a server in Forge can also destroy it at your provider.

Coming from ServerPilot
-----------------------

ServerPilot is a different story. It runs its own NGINX, Apache, and PHP stack from `/opt/sp` and keeps apps under `/srv/users`. Registering that as it is would leave you with a server Ploi can't really manage, so this import installs Ploi's stack and moves your apps onto it.

- Ploi installs its stack next to ServerPilot's while ServerPilot keeps serving your apps.
- Each app moves from `/srv/users` to `/home` and keeps its PHP version. Its ServerPilot user becomes a Ploi system user.
- Databases and database users show up in the panel. The cronjobs your users added come along, with their paths rewritten to the new location.
- Ploi then switches serving over to its own NGINX. Your apps are offline for that switch, about a minute.
- The optional last step stops the ServerPilot agent. Its packages stay installed so you can go back, and this step is off by default too.

One thing to check afterwards. ServerPilot puts Apache behind NGINX, which is why `.htaccess` files work there. Ploi runs NGINX only, so if an app relies on custom `.htaccess` rules, those need translating to NGINX.

When the import is done
-----------------------

You get an email with what still needs your attention, such as deploy scripts to copy over or an NGINX config Ploi could not convert. If a step fails along the way, the server page has a **Retry import** button. The import is safe to run again and won't take anything over twice.

Want the full walkthrough first? Read [how to migrate from Laravel Forge](https://ploi.io/documentation/server/how-do-i-migrate-from-laravel-forge) or [how to migrate from ServerPilot](https://ploi.io/documentation/server/how-do-i-migrate-from-serverpilot).

Changelog
---------

A lot more shipped since the last update. The highlights:

### Added

- Import servers from [Laravel Forge](https://ploi.io/documentation/server/how-do-i-migrate-from-laravel-forge) and [ServerPilot](https://ploi.io/documentation/server/how-do-i-migrate-from-serverpilot).
- Roots Bedrock support for WordPress sites. Plugins, themes, WP-CLI, cronjobs and cloning now find WordPress in `web/wp`, and Ploi detects the layout for you.
- Server monitoring notifications can wait until a threshold breach lasts a while, for example CPU over 80% for more than 60 minutes. Short spikes from bots and scrapers no longer send an alert every time.
- Your own label for a team name. Only you see it, which helps when you're a member of someone else's team with a confusing name.
- The source control overview marks Bitbucket and GitLab links that need re-linking, so you no longer find out through a failed deployment.
- An [API endpoint](https://developers.ploi.io/certificates/download-certificate) to download a site's certificate chain. The private key is never returned.
- A reminder email for server imports that were set up but never started.

### Improved

- We rebuilt the connection debugger. It runs from the same Ploi servers that connect to yours and checks DNS, the TCP connection, the SSH banner, and a real key login one by one, so you can see exactly where the connection breaks.
- The page of an unreachable server shows how long it has been down, the last SSH error, and every Ploi IP address to allow through your firewall.
- New servers default to Ubuntu 26.04.
- The database picker on the create server screen groups versions per engine.
- Backup schedules are picked and shown in your own timezone.
- Site pages load faster; the deployment list now loads after the rest of the page.

### Fixed

- Bitbucket kept asking you to re-link. Bitbucket hands out a new refresh token on every refresh since May 2026, and we now store it.
- Picking MySQL 9 installed MySQL 8.4. It now installs the 9.7 LTS series.
- File backups now fail instead of reporting success when folders are missing from the archive, and they clean up their temporary archives.
- Cloning a WordPress site with the database option ticked now actually clones the database.
- Site clones install rsync when it is missing, and clones to the same server no longer fail with "Permission denied (publickey)".
- With HTTP/3 enabled, the site itself now listens on QUIC as well.
- Scheduled scripts no longer skip a run when the runner starts late, and scheduled server updates no longer get skipped when their exact minute is missed.
- Team invites are claimed when the invited person registers directly instead of through the invite link.
- The open updates insight closes once the updates are installed.
- The uptime percentage on the site monitor card is now calculated correctly.
- Cronjobs are never written for a system user that does not exist.
- Creating a server through the API now respects `ip_type`.
- New servers no longer install the postfix MTA-STS resolver, which could crash-loop on Ubuntu 26.04. On an existing server you can remove it with `apt-get purge -y postfix-mta-sts-resolver`.

### Removed

- Ubuntu 22.04 for new servers. Existing 22.04 servers keep working, and 22.04 has LTS support until April 2027.
- MySQL 8.0, MariaDB 11.2, and PostgreSQL 13 and older for new servers, as these versions are past end of life. Existing servers keep running them.

That's it for this round. Missing a feature? Drop it on the [roadmap](https://roadmap.ploi.io).

## The SSL and tenant update

URL: https://ploi.io/news/the-ssl-and-tenant-update
Published: 2026-08-19

This one has been brewing for a while. SSL certificates and tenants just received their biggest overhaul since we launched them, and they got it together, because the two belong together.

If you run a multi-tenant setup on Ploi (looking at you, **tenancyforlaravel** folks), this update is for you. And even if you never touch tenants, your SSL management just got a lot more flexible.

Hold multiple certificates per site
-----------------------------------

A site is no longer limited to a single SSL certificate. You can now install certificates next to each other, Let's Encrypt next to ZeroSSL next to an uploaded certificate, and swap between them with a single **Activate** click.

Requesting a new certificate no longer touches your live configuration until you activate it, so replacing a certificate is now a zero-risk operation: the old one stays installed and can be re-activated at any time.

Every certificate keeps its own files on the server, expiry dates are read per certificate (not just the one being served), and requests that die halfway no longer strand a certificate in limbo. The API grew along with it: certificate responses now expose the active state, and there is a new activate endpoint.

Tenants are now a first-class feature
-------------------------------------

Tenants used to hide behind a button on the Manage tab. No more: they have their own place in the site menu, and the overview got a full redesign. Every tenant now shows a live status while it is being installed or removed, the list is paginated and searchable (some of you run *hundreds* of tenants on a single site, we see you), and a small view button takes you straight to the tenant's domain.

![](https://ploi.io/storage/9pF9wEAlSSQOBxfqKaeOE8vYjMo7io9ztCX1tGOF.png)

Every tenant gets the full certificate toolkit
----------------------------------------------

The real headline: everything described above also works **per tenant**. Each tenant can hold multiple certificates, and each row expands into its own certificate list with activate, force-renew, download and delete actions.

ZeroSSL, uploaded custom certificates and HTTP/3 are now available for tenants too, giving them full parity with your main domain.

We also closed two long-standing requests along the way: requesting a tenant certificate can now include the www variant with a single checkbox (and the www redirect is only configured when the certificate actually covers it), and changing a site's system user now correctly rewrites all tenant configurations.

Under the hood
--------------

To make all of this possible we migrated every tenant on the platform, over **13,000** of them, from loose settings into real, first-class records. The migration ran fully automatic with zero downtime, and it unlocks the roadmap for what is next: think bulk operations and richer per-tenant insights.

Changelog
---------

As always, plenty more shipped since the last update. The highlights:

### Added

- Multiple SSL certificates per site, with an activate selector in the panel and a new activate endpoint on the API.
- Tenants: own section in the site menu, live install/remove status, search and pagination, and a view button.
- Multiple certificates per tenant with activate, force-renew, download and delete, including ZeroSSL, uploaded certificates and HTTP/3.
- Tenant certificates can include the www variant via a checkbox, and support DNS provider validation on the API.
- Ploi MCP server with OAuth and 60 curated tools, so AI assistants can manage your servers, plus a connected applications overview on the API keys page.
- Log in with Google.
- Wildcard subdomains option when creating a site.
- Multiple uptime monitors per site on distinct paths.
- Backups: create-and-run in one go, duplicate configurations (with bucket/remote override), pick an exact backup time, and filter backup tables by server.
- Scripts API: trigger one-off runs and run scripts as any system user.
- API: zero-downtime deployment activation, quick-deploy status on site and repository endpoints, and a status attribute on the deploy ping response.
- Synced sites and applications deploy automatically after the primary deployment completes.
- A dedicated "Deployment failed" notification event.
- Dashboard favorites are now per user instead of per team.
- Redesigned API keys page with permission presets.
- Granular team permissions with parent inheritance, covering full server and site management.
- AWS Calgary region (ca-west-1).
- An email notification when a server build fails.
- Firewall rules are now synchronized from the server's actual ufw ruleset.

### Improved

- A broad panel design pass: modernized layout, redesigned context sidebar, the server manage page organized into tabs, and a refreshed create-server screen with an advanced settings modal.
- Heavy pages now load instantly with skeleton placeholders while data streams in.
- Mobile performance: menus and animations are smooth again on phones.
- The server insights refresh button can be used every 5 minutes instead of once per hour.
- CPU cores and memory are visible in the server sidebar.
- Paused cronjobs and daemons show a warning indicator.
- UpCloud regions are fetched live instead of from a static list.
- Server update counts no longer include Ubuntu phased updates, so the number you see is the number that installs.

### Fixed

- Tenant certificates no longer duplicate when certbot reports "not yet due for renewal".
- Changing a site's system user or domain now rewrites the tenant webserver configurations, and domain renames are atomic.
- The www subdomain and tenant SSL no longer conflict, and a www variant can even be its own tenant now.
- Certificate expiry dates are read from each certificate's own files, and interrupted certificate requests clean up after themselves.
- Firewall rule changes are serialized per server, fixing rare silent rule loss, and IPv6 CIDR rules are no longer inserted at position 1.
- Cronjob entries are written literally, so shell characters in commands are never expanded on save.
- The default PHP-FPM pool socket is locked down from isolated site users.
- Cloudflare DNS now fetches all pages of records instead of only the first.
- Bitbucket integration updated for their 2026 API changes, with clear errors instead of empty commit lists.
- Server provisioning recovers from interrupted package installs, and certbot can no longer hang a server build.
- Uninstalling the default PHP version now promotes the remaining version to default.
- Backups: silent SFTP upload failures are surfaced, custom-named archives work again, and nightly backups keep their configured time.
- Live deployment logs stream through Redis, making them faster and lighter on busy servers.
- Site cloning detects silent transfer failures and handles zero-downtime symlinks correctly.

That's it for this round. As always: found something off, or missing a feature you need? Let us know through support or drop it on the [roadmap](https://roadmap.ploi.io). Two items in this very update started as roadmap requests.

## Ubuntu 26.04 is now available!

URL: https://ploi.io/news/ubuntu-2604-is-now-available
Published: 2026-06-08

Ubuntu 26.04 support has finally arrived! All providers have been updated, tested, and checked to see whether 26.04 would be stable enough, and it is!

Ubuntu 26.04 isn’t selected by default yet, usually, we wait 1 or 2 weeks to get rid of all the possible bugs that were introduced. After this, we’ll default to 26.04 but for now, you have to switch it to 26.04 manually when you create a server.

![](https://ploi.io/storage/NQ74jmZAisGLoZVfI92PPzKZjOWAmQF2WjNmAae0.png)

**Should I upgrade?**

"If it ain’t broke, don’t fix it", in other words, no, we don’t advise upgrading **existing** servers. (And also good to know that Ubuntu 24.04, for example, still has security support up until **May 2029**)

You can view all the release cycles, end of support, and more details about your OS here: [**https://ubuntu.com/about/release-cycle**](https://ubuntu.com/about/release-cycle)

From our perspective, we can’t recommend upgrading from an older Ubuntu version to a newer version within your existing server. The best is to provision a fresh server and migrate sites/data over slowly if you absolutely have to or want to.

This ensures you have a fresh server, all services run with the latest updates, and you do not have to migrate/upgrade/update any packages to make it work.

If you absolutely must upgrade, you can follow this [guide](https://ploi.io/documentation/server/how-do-i-upgrade-ubuntu) to have a head start.

**Added**

- Ubuntu 26.04 support across all providers.
- Debian 13 support with native MariaDB installs.

 **Improved**

- Server insights can now be refreshed every 5 minutes (down from hourly) and run as a unique job per server.
- Offer the Valkey log instead of the Redis log when Valkey is installed.
- General provisioning robustness with quieter, automatic retries on connection failures.

 **Fixed**

- Firewall: creating a rule per comma-separated IP instead of one broken rule, no longer losing rules, cleaning up stale ufw rules, whitelisting Ploi IPs on SSH rules, and never denying your own IP.
- ssh-keyscans made best-effort; removed the dead JetBrains Space integration.
- SSL: always re-upload Hetzner DNS hook scripts so older servers get the new Console API.
- Billing: cancel-pending Stripe subscriptions can be resumed instead of dead-ending, and chargeback emails render again.
- Katapult: complexity-compliant root passwords and real create errors surfaced.
- Panel: repaired crashing close buttons in local modals and the raw log modal border.

## The Debian update 💻

URL: https://ploi.io/news/the-debian-update
Published: 2026-06-01

Ubuntu has been the only way onto a Ploi server since day one. Not anymore. Starting today, every Ploi user can spin up a brand-new server on **Debian 12** or **Debian 13**.

If you've been wanting the rock-solid, no-surprises stability that Debian is famous for — especially for long-lived boxes you'd rather not babysit — you can now pick it straight from the dropdown when you create a server.

![](https://ploi.io/storage/nxvQahDVuSDsqp6J7RWZncXgj1qEk7HiaRY8orRC.png)

Pick your distro when you create a server
-----------------------------------------

The server creation flow now groups operating systems by distribution. Ubuntu and Debian sit side by side, each with their supported releases, so choosing the base for your next server is a single click.

- **Debian 12 (Bookworm)** and **Debian 13 (Trixie)** are both available right out of the gate.
- **Grouped, clearer dropdown** — OS versions are organised per distro instead of one long flat list.
- **Works the same everywhere** — sites, PHP, databases, queue workers, cron, SSL and everything else behave exactly as they do on Ubuntu.

Try it
------

If you're already on Ploi, head to [**Create server**](https://ploi.io/panel/servers/create), open the OS dropdown, and you'll find Debian waiting under its own group. Everything you already know about running sites on Ploi applies — it's the same panel, the same workflow, just on a different base.

If you're not on Ploi yet and Debian is your distro of choice, now's a great moment to give it a spin.

Ubuntu 26
---------

Yes, we've heard you! Ubuntu 26 is coming as well, most server providers have been holding off on supporting so it's rather difficult for us to add it while they don't support it yet. But it seems their all starting to add them slowly so we expect Ubuntu 26 to be released this or next month!

### Added

- Debian 12 and Debian 13 are now available to everyone when creating a server
- Script schedules and actions API endpoints, with plan gating
- Valkey now shows up on the Services tab when it's installed
- Script actions can now wait for SSH to come back up after a boot, with an optional per-action delay before your script runs
- Changing your account password now signs you out of all your other active sessions

### Improved

- Backup rotation is now idempotent when the remote file is already gone, and per-job paths are isolated to stop concurrent backups racing each other
- The backup default filename now includes the backup ID to prevent remote collisions
- Hostname validation now accepts IDN and Punycode domains
- UpCloud STARTER plans now use the standard storage tier
- Auto-responder emails are now suppressed globally via a single mail listener
- Global search is smoother — it now remembers your recent results, supports keyboard shortcuts, no longer flickers as you type, and we dropped the laggy modal backdrop blur
- Git account selectors now show a clearer account label
- More robust VAT number validation when entering your billing details
- The login screen now keeps your email filled in after a failed sign-in attempt

### Fixed

- Resolved a missing AMI error for AWS EC2 in opt-in regions
- HAProxy SSL renewal now uses the correct certbot arguments and a safer schedule
- Live deploy output keeps its newlines again — deploy line batches are no longer trimmed
- Pending SEPA subscriptions are granted provisional access while they settle
- Clone-database UI is now correctly gated to WordPress projects
- Debian servers on Hetzner now fall back to `deb.debian.org` when the Hetzner mirror is unavailable
- Docker applications now open their Docker management page instead of a generic application page
- Cron commands containing quotes or special characters are now escaped correctly
- The hidden Let's Encrypt renewal cron entry no longer contains a stray fragment
- Script scheduling is now correctly available on the Pro plan

## The scripts update 💽

URL: https://ploi.io/news/the-scripts-update
Published: 2026-05-12

Oh boy this is a cool one, we've been giving the scripts feature the home it deserved. What used to be a single edit page with a "run on these servers" checkbox at the bottom is now a proper toolkit: dedicated pages to run, schedule, and react to events on your servers, with every action recorded, revocable, and visible in real time.

If you live in the panel, scripts now look and feel like a first-class part of Ploi — searchable, sortable, and filterable, using the same table as the rest of the panel. If you're an automation person, this update is the one you've been waiting for.

A dedicated home for every script
---------------------------------

The script edit page used to do three jobs at once: edit, run, and dump live output. We split it.

- **Edit** — just the editor. Nothing else.
- **Run** — a clean run page with a server picker, live streaming logs per server, and nothing in your way.
- **Schedule** — manage recurring runs of this script.
- **Actions** — wire this script to server events.

The index now has search, sort, column toggling, and bulk delete — same table you already know from the rest of the panel. Each row has Run / Edit / Schedule / Actions / Delete buttons so you can jump straight to what you came for.

Scripts on a cron schedule (Pro plan)
-------------------------------------

![](https://ploi.io/storage/Jk5KOfd9aBpvUtg76pfGnXiwxDpW3jXsmEDWGmfl.png)

Put any script on a recurring cron and let Ploi handle the rest. No `crontab -e` on every box, no SSH dance — schedules live in Ploi and fire across as many servers as you like, every matching minute.

- **Standard cron syntax** (`* * * * *`) with quick presets for the most common intervals — every minute, every 5/10/15/30 minutes, hourly, daily at midnight or 03:00, weekly, monthly.
- **One schedule, many servers** — pick a script, pick a cron expression, pick a set of servers, done.
- **Pause and resume** in one click. No SSH, no destructive edits.
- **Next-run and last-run** shown inline so you always know where a schedule is in its cycle.

Script actions: react to what happens on the server (Unlimited plan)
--------------------------------------------------------------------

![](https://ploi.io/storage/H1qvI9yzpCAuABztUR4WppNiJwxsArZOPZHxW3Be.png)

This is the headline feature. Tie a script to a server event and Ploi will run it automatically when that event fires. We start with the two most-requested triggers:

- **Server has booted** — runs once your server reaches a network-online state after boot. Perfect for warming caches, sending a heartbeat, or running post-reboot sanity checks.
- **Server is shutting down** — best-effort fire on graceful shutdown. Great for flushing in-memory state or letting a downstream service know the box is going away.

Under the hood, each action installs a tiny systemd unit on every selected server, calling back to Ploi over a signed webhook when the event fires. We then queue your script for execution, exactly the same as if you'd clicked Run yourself.

The actions page shows you live status per server — *installing*, *installed*, or *failed* with the exact error — so you never have to wonder whether a unit landed. Pause an action without uninstalling it, ship a fix, resume it. No SSH required.

We'll be adding more events very soon!

Built secure by default
-----------------------

Script actions hold a webhook URL that gets embedded into a systemd unit on your servers. We treat those URLs the way you'd want us to:

- **Signed URLs** — every webhook URL is HMAC-signed with your application key. Tampering with any part of the URL invalidates it.
- **Per-action revocable secret** — every action carries its own secret that's bound into the signature. Rotating that secret instantly invalidates every previously-issued URL for that action.
- **Root-only unit files** — installed unit files are `chmod 600`, so non-root users on the server can't read the embedded URL.

Try it
------

If you're already on Ploi, the new scripts pages are live in your panel. Pop over to **Scripts** and have a click around — even the old "create a script, run it on a server" flow has a fresh coat of paint.

If you're not on Ploi yet, scripting is one of those features you reach for the moment you have more than one server. This is a great moment to give it a try.

### Added

- Schedule scripts on a cron expression across multiple servers, with pause/resume and live next-run info (Pro plan)
- Script actions: trigger a script automatically when a server boots or shuts down via a signed Ploi webhook (Unlimited plan)
- Dedicated **Run**, **Schedule**, and **Actions** pages for every script — no more cramming everything onto the edit page
- A new searchable, sortable scripts list with column toggles and bulk delete
- Per-action revocable webhook secret, on top of the existing signed URL, so leaked URLs can be rotated instantly
- Live deploy log persists on the site so it survives page reloads
- Graceful reload action on the services API

### Improved

- Server provisioning falls back to `archive.ubuntu.com` when `mirror.hetzner.com` is having a bad day
- Removed dead Apache and hybrid Apache paths from the web server provisioning code, simplifying the install

### Fixed

- Deleting a server no longer hangs when the underlying box has already been powered off
- A failed PHP installation now correctly stops the rest of the server install chain instead of carrying on regardless
- Turning off Octane no longer leaves stray queue workers running in the background
- UpCloud server provisioning works again after a breaking change in one of our upstream libraries
- The API key edit form no longer shows an editable scopes field — scopes are locked in at the moment the key is issued, so we removed the misleading control

## The WordPress update 💡

URL: https://ploi.io/news/the-wordpress-update
Published: 2026-04-28

The WordPress update
====================

We've spent the last two months turning Ploi into a proper home for your WordPress sites.

What started as basic WP-CLI plumbing is now a full WordPress control panel: manage plugins and themes in bulk, deploy multiple Git repositories per site, clone an entire WordPress install (database and all) to another server, and run search-replace right from the dashboard.

Everything is also exposed through the API, so you can wire it into your own automation. Here's everything that landed.

A new WordPress dashboard
-------------------------

Every WordPress site in Ploi now has a dedicated WordPress page packed with the things you actually open phpMyAdmin or SSH for today.

- **Statistics overview** — version, post and page counts, comments, users, active plugins, current theme, and pending updates, all on the site's general page. Cached for 24 hours with a one-click refresh.
- **WP\_DEBUG toggle** — flip debugging on or off without editing `wp-config.php` by hand. We set `WP_DEBUG_DISPLAY=false` automatically so errors never leak to your visitors, and there's an in-panel log viewer with load, refresh, and clear actions.
- **Smarter config detection** — Ploi now auto-detects `wp-config.php` whether it lives in your web directory or one level up, and "Environment file location" was renamed to the more accurate "Configuration file location" (it covers both `.env` and `wp-config.php`).

![](https://ploi.io/storage/7GdJL7d9PwNaWngvjxL2TIqmkRi1vcUg6Ens6E7h.png)

Plugin and theme management
---------------------------

This is the big one. No more `wp plugin install foo` over SSH.

- **Install plugins by WordPress.org slug** with an optional "activate immediately" toggle.
- **Install themes** the same way, with a handy link to browse the free theme directory.
- **Delete plugins and themes** safely, with a confirm modal and a clean `wp-cli uninstall --deactivate` under the hood.
- **Bulk actions** — checkboxes on every row, select-all in the header, and a blue action bar that lets you activate, deactivate, update, or delete many plugins (or update/delete many themes) in a single WP-CLI call. Deletes still ask for confirmation.
- **MU-plugin awareness** — must-use plugins are marked with a blue "Auto-enabled" badge and excluded from bulk selection so you don't accidentally try to manage them.

![](https://ploi.io/storage/S3dGtO7XDsRWNcO3j5BXku9Mtz71msHQBc6v5WC1.png)

Search &amp; Replace
--------------------

A new "Search &amp; Replace" tab runs `wp search-replace` against your database with the safe defaults you'd want: `--precise` and `--all-tables-with-prefix`. There's a dry-run mode so you can preview the change count before committing. Perfect for domain migrations, environment swaps, and SSL switches.

![](https://ploi.io/storage/x0bQeQhhjDQRP4lVuBYH20h9nKwzVZ3XtkwuS02g.png)

Multi-repository management
---------------------------

WordPress sites are rarely a single repo anymore — you've got a custom theme here, a private plugin there, maybe a mu-plugins repo. Ploi now treats them as first-class citizens.

- Install, deploy, and manage **multiple Git repositories per WordPress site** — themes, plugins, or any custom path.
- **Per-repo deploy scripts** so each repository can have its own build steps.
- **Real-time status tracking** via broadcasting — installs and deploys updates live in the UI.
- A **deploy modal with full log output** so you can watch the deploy stream and debug failures in place.
- Edit, delete confirmations, full path display, and branch-aware deploy scripts included.

![](https://ploi.io/storage/iNsJm3JbkuBW3DbXkDn8FIXyCcinYN9x0maVzJxt.png)

WordPress site cloning
----------------------

Cloning a WordPress site is now a one-click operation, and it actually clones WordPress — not just the files.

- New cloning job handles **database creation, duplication,** `wp-config.php` **credential rewriting, and a domain-aware** `wp search-replace` in one go.
- Replaces all URL variants (bare domain, `https://`, `http://`) so the clone boots up, pointing at its new home.
- Works **on the same server and across servers**.
- The Clone Site card is right there on the WordPress General tab.
- Bonus Cloudflare fix: subdomain cloning now correctly walks up the DNS hierarchy to find the matching Cloudflare zone (e.g. `sub.example.com` → `example.com`).

API: everything above, programmatically
---------------------------------------

Every new WordPress capability ships with a matching API endpoint, so the same things you can click in the dashboard can be triggered from CI, scripts, or your own tooling.

- Endpoints for listing, activating, deactivating, installing, updating, and deleting plugins and themes.
- A search-replace endpoint with dry-run support.
- A clone endpoint with a `clone_database` flag.
- All WordPress API actions now run through a **queued job by default**, so long-running WP-CLI commands don't tie up your HTTP request.
- Need the result inline? Pass `?ondemand=true` and the endpoint runs synchronously and returns the WP-CLI output in the response.

Check all the endpoints at our [API documentation](https://developers.ploi.io/wordpress-management/complete-install).

Try it
------

If you already manage WordPress sites with Ploi, the new WordPress tab, the new Repositories tab, and the cloning flow are live in your panel right now — no migration needed.

If you're not on Ploi yet, this is a great moment to give it a try. WordPress hosting on your own servers, with the developer experience you'd expect from a modern panel.

**Added**

- Multi-repository management for WordPress sites — install, deploy, and manage multiple Git repositories per site
- Edit modal, delete confirmation, full path display, and branch-aware deploy scripts for repositories
- WordPress plugin and theme install and delete, with confirm modals
- Bulk actions for WordPress plugins (activate, deactivate, update, delete) and themes (update, delete)
- WordPress search &amp; replace tool with dry-run support
- WordPress site cloning with database duplication and `wp search-replace` for the new domain
- WordPress statistics overview (version, posts, pages, comments, users, plugins, theme, updates) on the site general page
- WP\_DEBUG toggle with built-in debug log viewer
- Queued WordPress API actions with `?ondemand=true` for synchronous responses
- WordPress API endpoints for plugins, themes, search-replace, and clone
- Native rclone backup driver type
- FTP backup file tracking and rotation for database and site backups
- Variable injection via deploy webhooks for applications
- Search servers and sites by ID in global search
- Tags for sites in global search results
- Automatic DPA generator
- View logs button on deploy failed and rollback emails
- Helpful hint when GitLab HTTP git access is disabled
- Discord community link in the welcome email
- Feedback link in the subscription cancellation email
- Show Server Insights in subscription plan feature lists
- Show team member git providers on the site install view

**Improved**

- Refreshed all email templates with blue buttons, a unified footer, and updated welcome copy
- Hardened DPA v2.0 to reduce processor liability
- Insights tab is now visible regardless of subscription status
- Show existing saved payment methods in Stripe Checkout
- Health check error emails now include the server name and a manage button
- WordPress configuration file handling auto-detects `wp-config.php` whether it lives in the web directory or one level up
- Renamed "Environment file location" to "Configuration file location" to reflect support for both `.env` and `wp-config.php`
- Cloudflare zone matching now walks up subdomain levels to find the correct parent zone

**Fixed**

- SEPA subscription handling — proper async payment event handling with 14-day grace period
- Server installation on Ubuntu 24+ now uses `libpcre2-dev` after `libpcre3-dev` was removed upstream
- Certbot now includes all domains in `webroot_map` on multi-domain certificates
- Rclone backup failures resolved with `--ignore-checksum` and proper archive generation handling
- Database backup local files are now cleaned up after upload
- Zero-time deployment now guards against a missing repository
- Server log description no longer overflows when the script label is too long
- Test domain toggle now shows the correct message after state changes
- Deployment limit banner no longer disappears when a free-plan user exceeds 5 deploys

## NGINX config history ⚡️

URL: https://ploi.io/news/nginx-config-history
Published: 2026-03-24

Ever made a change to your NGINX configuration and wished you could just go back? We've all been there. That's why we're excited to introduce **NGINX config version history** for both servers and sites.

![NGINX history](https://ploi.io/storage/Hn6gq4z6ebWb9kNuZkjudHTHCfXoVW3ZUkDaWrGv.png)

Every time you save a configuration file, Ploi now automatically keeps a snapshot of the previous version. We store the last **3 versions** per file, so you always have a safety net. You can preview any previous version directly in a modal, copy it to your clipboard, or restore it into the editor with a single click.

This works everywhere: the site-level NGINX editor, the server-level NGINX editor, and even when updating configs through the API. Each history entry tracks when it was saved and by whom, so you always know what changed and who changed it.

No more SSH-ing into your server to dig through backups. Just hit the **History** button, pick a version, and you're good to go.

Changelog
---------

**Added**

- NGINX config version history for servers and sites
- Ability to email backup password if you've lost it (edit modal)
- Topbar navigation in panel
- Server grid view in server index
- Server list is now paginated
- Monitoring filter options to server index (has monitoring, no monitoring)
- Server provider icon is now shown on the server index list
- NPM security insights just like Composer CVE's
- 7 new AWS regions for server provisioning
- Rule type selection in firewall tab for load balancers
- DNS fallback is now set up when installing servers
- Automatically select SSL DNS provider when you only have one credential
- MariaDB 11.4 LTS support
- Laravel Pulse 1-click support
- Queue tab for applications, allowing you to spawn queues easily
- Support for markdown output for AI agents in our documentation: <https://ploi.io/documentation/server/how-can-i-use-sftp.md>
- New email template design
- Server name is now included in the site file backup failed email
- Allow setting the next backup time when modifying a backup
- Deploy started notification for all notification channels
- New suspended template

**Improved**

- S3 backups are now done with Rclone, other drivers will follow soon
- Uptime monitoring now includes an actual failure reason when errors occur
- Site cloning now also clones cronjobs and redirects properly
- Daemon command length has been increased from 200 to 500 characters
- System users modal: show site usage, async creation, delete loader

**Fixed**

- Bug in running scripts where a cache lock prevented the script from actually running
- Use proper site PHP version when running Statamic commands (php please)
- fastcgi\_pass not updating when force-uninstalling a PHP version
- Repository edit form when switching to custom type
- Daemon log path now uses actual system\_user instead of hardcoded ploi
- Site clone not creating system user on target server
- Site file backup validation failing for team members using owner's backup configuration
- Backup rotation only deleting one excess file per run
- Support multiple {RESTART\_DAEMON} variables in deploy scripts

**Removed**

- [ploi.dev](http://ploi.dev) testing domain as it caused SSL problems

## New server insight: CVE's 🚨

URL: https://ploi.io/news/new-server-insight-cves
Published: 2026-01-12

Happy new year! 🥳 We're starting this year great with a few awesome new updates!

**CVE insights**

Some of you might have noticed that we have a new insight that scans for common vulnerabilities and exposures.

![](https://ploi.io/storage/05LF6fu8tD344O6Zz6RIgJkEmGduXZ3W0xRJFYlz.png)

This insight automatically scans the Composer packages across all your sites and checks them against known security vulnerabilities. If any of your dependencies have reported CVEs, you'll see them appear in your insights dashboard with details about the affected package, severity, and recommended actions.

![](https://ploi.io/storage/MZ9U1PuRU7WENEZXE5v8eAwbtPxa13G4ECff4Nil.png)

**How it works:**

- For newer servers, Ploi runs composer audit to check for known vulnerabilities
- For older servers (created before 2025), Ploi parses your composer.lock and checks packages against the PHP Security Advisories database
- Vulnerabilities are grouped by severity and displayed with direct links to more information

**What you can do**

- Review affected packages and their safe versions
- Update your dependencies to patch the vulnerabilities
- Mark insights as fixed once you've addressed them

This feature is available for Pro plans and higher. Head over to your server's Insights page to see if any of your applications need attention.

**Server insight notifications**

Also new, the notifications tab when you visit the insights in your server. In here, you can define the notifications you'd like to receive when new insights come in. You can create them per-server and per-priority type!

![](https://ploi.io/storage/Ea3YVoQI80QSDNCBrez6PGMyaIrSVupaYYYT8x27.png)

**Fresh status page design**

We also took the opportunity to create a fresh status page design and fixed some of the bugs that are present, including a dark-mode toggle for your users.

![](https://ploi.io/storage/n4iywlRlbvCCfqMFdYspJn7NjMIIIYUhU8OqtP1O.png)

**Changelog**

- \[Added\] New status page design
- \[Added\] PostgreSQL 18 support
- \[Added\] PHP CLI version change available in API now: <https://developers.ploi.io/php/switch-php-cli-version>
- \[Added\] A proper payment retry system for whenever payments fail, we will try 3 times within a week and notify you each time a failure happens
- \[Improved\] Global server insights overview now uses a proper table with filters: <https://ploi.io/panel/dashboard/insights>
- \[Improved\] When installing a PHP version you now actually get proper UI feedback when installing
- \[Refactored\] Settings page in profile is streamlined with tabs now
- \[Fixed\] Issue when uninstalling PHP 8.5
- \[Fixed\] Issue where insights would duplicate itselfves, they now replace itself instead
- \[Fixed\] Issue when deleting a tenant and their SSL won’t be deleted, this is now forced properly
- \[Fixed\] Issue for duplicate cronjob creation for server monitoring

## Recap Ploi 2025 🎆

URL: https://ploi.io/news/recap-ploi-2025
Published: 2025-12-18

Another year has passed, time is flying! This was yet another great year for Ploi, a lot has happened, let’s take a look what happened over the course of 2025!

![](https://ploi.io/storage/ttDuEbOgTnImm1D9WPZgfemKqPdUx1WDUVhX6QfK.png)

**IPv6 support has arrived** 🚨

IPv4 is running out and preparing for IPv6 is important. Not only did we add support for IPv6 but also hostnames! So now you can not only use an IPv4, IPv6 address but also a hostname like [server.example.com](http://server.example.com) 🔥

**A new CLI has arrived** 💻

Ploi CLI, bringing the full power of Ploi right to your terminal! Now you can manage your entire infrastructure without leaving your command line environment: <https://github.com/ploi/cli>

**Ploi Core is now free** ✌️

[Ploi Core](https://ploi-core.io/) is now completely free, no purchase fee anymore. You will still need the Ploi Unlimited (<https://ploi.io/pricing>) subscription, but other than that you can now download this software for free at <https://github.com/ploi/ploi-core>

This change now makes it possible for others to contribute and make it an even better product 🔥

**Server monitoring updates** 💡

A lot has happened to our server monitoring feature, not only can Unlimited users go back to 30 days in history now but Pro users are also increased to 14 days retention!

Next to that we added: additional disks monitoring, network monitoring, revamped the charts and filters, and we added recovery notifications!

**Teams update** 🔥

We can safely say this was one of the biggest updates and migrations of Ploi this year. Servers now belong to teams instead of individual users, enabling better team collaboration and access control. This was a highly requested feature on our roadmap: <https://roadmap.ploi.io/projects/7-bugs/items/467-team-member-does-not-have-access-to-all-features-you-need-a-paid-subscription>

**BIMI emails verified** 🔋

Some of you might of noticed already, Ploi now sends their emails with a BIMI certificate. That means our emails will have a blue checkmark and our logo shows up in your inbox for most of the email providers. Ploi sends delicate emails, security is important. This allows you to see whether the email was really sent by us which increases security🔥

**Wrapped** 🎁

Did you already create your Ploi Wrapped for 2025? Over 800 Ploi users already did! Go check it out and get yours: <https://ploi.io/panel/wrapped>

**Reflecting**

It’s always good to reflect and see what we promised to deliver and actually delivered. When we take a look at the 2024 recap (<https://ploi.io/news/recap-ploi-2024>) these things we’d focus on:

- IPv6 support (Done ✅)
- Typesense server type (Done ✅)
- Ploi surge (Running a BETA 🚧)
- Customised server (WIP 🚧)
- Streaming backups (Cancelled ❌)
- Brand new file explorer (Still planned 📅)
- And many more… (And boy, did we deliver on other features, take a look above 😊)

So not everything worked out, but that doesn’t mean it’s not coming. We’re still actively working on these features, and we’re already planning ahead.

**Reviews**

We’d appreciate if you have the time to leave a review for Ploi, it helps us a lot! 🥰

<https://ploi.review>

If you want to be listed on our testimonial wall: <https://ploi.io/testimonials> (including a link), let us know by replying to this email with your testimonial!

**What's coming for 2026?**

- Brand new file explorer
- WordPress enhancements (<https://roadmap.ploi.io/projects/2-site-level-requests/items/1300-wordpress-feature-roadmap-proposal-for-ploi>)
- Status page updates &amp; new features
- Populair items from our roadmap (yes, some have been open too long)
- Mobile app updates
- Exciting updates we can’t share about 👀
- The same level of dedication as we did for 2025 💪

**Stay connected**

- Discord: <https://ploi.io/discord>
- Twitter: <https://twitter.com/ploi_deploy>
- Facebook: <https://facebook.com/ploideploy>
- Instagram: <https://www.instagram.com/ploi_deploy/>
- Mastadon: <https://phpc.social/@ploi>
- Bluesky: <https://bsky.app/profile/ploi.io>

Thank you for being part of the Ploi community in 2025! We're excited to continue serving your deployment needs and bringing you more innovations in 2026! 🚀

**Changelog**

- \[Added\] Wrapped feature (<https://ploi.io/panel/wrapped>)
- \[Added\] PHP 8.5
- \[Added\] Deployments are now stored forever the site lives 100% history will be available
- \[Added\] When you link a site to a docker app, it will now show which site directly in the list
- \[Changed\] Moved phpMyAdmin as site 1-click installer, it has been removed from the server manage page
- \[Changed\] We now default to PHP 8.5 for new server installations
- \[Changed\] Hetzner DNS now uses the new API endpoint
- \[Changed\] Dropped Composer V1 support
- \[Fixed\] Issue that automatic updates wouldn’t run
- \[Fixed\] UpCloud DEV plans would use the wrong disk (HDD instead of standard)
- \[Fixed\] Microsoft teams notifications wouldn’t work, they do now
- \[Fixed\] NGINX issue for the catchall configuration, now properly sends a 444 response

**Previous recaps**

- 2024: <https://ploi.io/news/recap-ploi-2024>
- 2023: <https://ploi.io/news/recap-ploi-2023>
- 2022: <https://ploi.io/news/recap-ploi-2022>
- 2021: <https://ploi.io/news/recap-ploi-2021>
- 2020: <https://ploi.io/news/recap-ploi-2020>
- 2019: <https://ploi.io/news/recap-ploi-2019>

## Teams update 🔥

URL: https://ploi.io/news/teams-update
Published: 2025-11-17

From all the updates we've done, this is a major update changing how servers work in Ploi.

Servers now belong to teams instead of individual users, enabling better team collaboration and access control.

🎉 Teams update - major changes
------------------------------

What changed?
-------------

**Servers now belong to teams instead of individual users.**

- All your existing servers are now in your **Personal Team** (automatic, no action needed)
- Switch between teams to access different servers, sites, and resources
- Everything is filtered by your current team context

Key features
------------

**🔄 Team switching**

- Switch teams from the sidebar, teams list, search results, or team detail pages
- Smart navigation keeps you on the same page when switching (if it exists in the new team)

**🔍 Team-Scoped everything**

- Dashboard, servers, sites, backups, scripts, monitoring - all filtered by current team
- Global search now includes teams with quick team switching from results

**🔐 New "Manage Backups" permission**

- Team owners can now control who accesses the backup overview page

**📬 Better notifications**

- Both team owners AND server creators get notified when servers are ready
- Notifications include team context

**📊 Team logs filtering**

- Filter logs by server and/or user
- Quick reset to clear filters

**⚙️ Enhanced UI**

- Team search appears when you have 5+ teams
- Better empty states showing your team name
- Improved provider selection in team settings

---

What this means
---------------

**Solo users:** Nothing changes - everything works through your personal team

**Team managers:** Better control over team access and permissions

**Team members:** Clear visibility into what you can access and do

---

Coming soon
-----------

- Team-based API keys (scoped to specific teams)
- More granular permissions (e.g., separate create/delete/update permissions)

**Changelog**

- \[Added\] Huge teams update 🔥
- \[Added\] A fresh dashboard
- \[Added\] Server monitoring recovery notifications
- \[Added\] Typesense server type
- \[Added\] Ability to set a message and HTTP code for suspending websites
- \[Added\] New info card to site show view with all relevant data
- \[Added\] New testing domain [ploi.xyz](http://ploi.xyz)
- \[Added\] Breadcrumbs
- \[Changed\] Header has been removed and user menu has been moved to bottom sidebar
- \[Changed\] The site uptime monitoring feature has completely been refactored, a better graph, way more data
- \[Changed\] The server monitoring feature has completely been refactored, a better graph, way more data (and we’re adding 30 days soon)
- \[Fixed\] A issue where backups could get stuck, and you’d force them to start again a wrong status would be applied

## Server monitoring updates 💡

URL: https://ploi.io/news/server-monitoring-updates
Published: 2025-10-23

Recently, we’ve done some great updates to our server monitoring feature. We’ve added:

- Additional disk monitoring
- Network monitoring
- Revamped the chart and filters, much clearer now
- Added history logging for a maximum 14(!) days
- Added recovery notifications

![](https://ploi.io/storage/1NT5zhdnRCN6EijCvBJcpGka3Llxu7cmEMrTDJF0.png)

Directly available and ready to use!

We’re currently also considering saving service usage details, like MySQL or PHP-FPM (per version), which would show up in the server monitoring section as well. Vote on that here: <https://roadmap.ploi.io/projects/1-server-level-requests/items/1318-service-monitoring>

**New update location: Amsterdam** 🇳🇱

For a European tool it was kinda amazing we never had a European uptime monitoring location. Not anymore, we now offer Amsterdam as a EU solution. In the Monitor tab in Ploi on site level, you can now configure Amsterdam as uptime monitoring location.

**Roadmap updates**

You might have heard about the open-source software Roadmap we’ve been actively developing. A lot has been added just recently:

- Feedback widget, allowing to easily let users submit feedback through your own application
- Activity widget, allowing easy access to the recent items and changelogs through your own application
- Upgraded to Tailwind 4, Vite 7 &amp; Filament V4

And many, many more, go check out the free software here: <https://github.com/ploi/roadmap>

**Changelog**

- \[Added\] New server monitoring UI
- \[Added\] Server monitoring now also has Networking grahps
- \[Added\] Recovery notifications for server monitoring
- \[Added\] MySQL 8.4 support
- \[Added\] New testing domain [on-ploi.com](http://on-ploi.com)
- \[Added\] New testing domain [ploi.bot](http://ploi.bot)
- \[Added\] New testing domain [ploi.cool](http://ploi.cool)
- \[Added\] Awesome new update schedule options
- \[Added\] New popover for certificates with details
- \[Added\] Site clone will also copy over staging site now
- \[Added\] Ability to select all databases when creating a backup that do not have a backup yet
- \[Added\] Docker application status syncing, now whenever you run docker compose up on the server Ploi will automatically sync upon loading the view
- \[Added\] Zurich region for AWS
- \[Added\] New insight: SSL renewal fails (from letsencrypt.log file)
- \[Improved\] Site alerts now show consitently above the deploy script (like app\_debug true)
- \[Changed\] Server transfer links are now 24 hours valid
- \[Changed\] Suspending sites now returns a 503 status which is more SEO friendly
- \[Fixed\] Issue when switching to dark mode and the code editor not going along with the new theme
- \[Fixed\] Backups redirect fix when editting backups on deeper pages
- \[Fixed\] SFTP uploading issue with custom system users which could have the wrong permissions
- \[Fixed\] Issue where the innoDB pool insight would be duplicated over and over again
- \[Fixed\] Issue with load balancers and SSL renewals, improved reloading script
- \[Fixed\] Cannot unselect "Options" filter on Servers page without resetting all filters
- \[Fixed\] DNS verification when site is connected with domain fails
- \[Fixed\] Change PHP version for a queue
- \[Fixed\] DNS Zone after domain change
- \[Fixed\] Craft CMS logs tab issues
- \[Fixed\] CMD + S keybind when a modal opens on the site overview page, doesn’t save deploy script anymore
- \[Fixed\] SSL expire date checker
- \[Fixed\] Issue when creating a Minio server on AWS not having the ports configured correctly

## Ploi Core is now free ✌️

URL: https://ploi.io/news/ploi-core-is-now-free
Published: 2025-08-13

After our last newsletter in May with the IPv6 update it is now time to publish another big one!

[Ploi Core](https://ploi-core.io) is now completely free, no purchase fee anymore. You will still need the Ploi Unlimited (<https://ploi.io/pricing>) subscription, but other than that you can now download this software for free at <https://github.com/ploi/ploi-core>

This change now makes it possible for others to contribute and make it an even better product 🔥

If you made a purchase, or a renewal in the last 2 months, please get in touch with us in on the support platform, you will be eligible for a refund 😎

Other than that, there’s a huge update list again with some significant changes, like a new server installation screen, new server type, hostname support and many, many more.

If you have any suggestions or feature requests be sure to submit them on our roadmap: <https://roadmap.ploi.io> 🥰

**Changelog**

- \[Added\] Ploi Core is now FREE!
- \[Added\] Staging to production sites now can have the FastCGI flush deployment script variable
- \[Added\] Breadcrumbs
- \[Added\] Completely new server installation screen exactly showing you what it’s doing
- \[Added\] Button to refresh the GIT repositories list when installing a GIT repository
- \[Added\] Hostname support just like IPv6 support for your server IP address
- \[Added\] Sponsoring page: <https://ploi.io/sponsoring>
- \[Added\] Trademark page: <https://ploi.io/trademark>
- \[Added\] Hetzner plans in server creation screen are now properly grouped
- \[Added\] Valkey server type support: <https://ploi.io/features/valkey-server>
- \[Added\] Tags on site index now also show
- \[Added\] Ability to edit backup configurations updating all the backups using that configuration
- \[Added\] Certbot automatic update check when a SSL request fails due to an old certbot version
- \[Added\] A new deployment start webhook url when a deployment starts, trigger an URL that you define
- \[Added\] New debug tools when a server is unreachable to see what part is actually failing to connect
- \[Added\] Ploi server monitoring now supports multiple disks
- \[Added\] Ability to select if you want redis or valkey when installing a new server
- \[Added\] A check when a backup is stuck, it now notifies you about this
- \[Added\] Ability to run cronjobs directly
- \[Added\] Server updates now have way more options to run exactly when you want in manage tab
- \[Added\] New server insight if the innodb buffer pool is full, the insight can clear it for you and raise the buffer setting for you
- \[Updated\] Nextcloud now always installs the latest version, NGINX configurations have been updated as well
- \[Updated\] NGINX amplify is now available for Ubuntu 24 as well
- \[Changed\] Network tab is now called Firewall in server level
- \[Changed\] Two factor routes are now rate limited for security improvement
- \[Changed\] FastCGI buffers have been raised for new websites from 16k to 32k
- \[Prepared\] PHP 8.5 preparations
- \[Fixed\] An issue with duplicate www.www. server names when using custom certificates
- \[Fixed\] An issue with PHP 8.4 not being able to uninstall
- \[Fixed\] An issue with Minio and SSL renewals, it now copies the new certificate to the correct directory when a renew happened

## Big news 🚨 IPv6 support is here!

URL: https://ploi.io/news/big-news-ipv6-support-is-here
Published: 2025-05-08

Oh boy, this is a big one! 🔥

It’s been widely requested, repeated: when is full IPv6 support coming in Ploi? (<https://roadmap.ploi.io/projects/1-server-level-requests/items/2-ipv6-support>)

As of today, it is now possible to create servers with IPv6 (obviously, only if the native server provider offers it). Also, if your old server has an IPv6 address, you could even decide to move over to IPv6 via your server settings (and disable IPv4 if you don’t need that at all).

**Important**: to use IPv6 at all, you will need to have an IPv6 address on your side as well if you want to interact with your server, otherwise, it will not work (connecting via SSH or to the domain you’ve added to your server). Check if you have IPv6 here: <https://ploi.io/what-is-my-ip>

On Ploi’s side, both subjects (server connections and NGINX configurations) have been updated to work with IPv6.

**What providers work with IPv6?**

Basically, all supported providers work with IPv6; it’s just a matter of provisioning the server that’s different.

- **UpCloud**: Works completely
- **Hetzner**: Works completely
- **Amazon**: Works completely
- **Vultr**: Works completely
- **DigitalOcean**: Works, but you always get an IPv4 record as well; it is not possible yet to create IPv6-only servers
- **Hostinger**: Works, but you always get an IPv4 record as well; it is not possible yet to create IPv6-only servers
- **Linode**: Works, but you always get an IPv4 record as well; it is not possible yet to create IPv6-only servers
- **Katapult**: Works, but you always get an IPv4 record as well, it is not possible yet to create IPv6-only servers

**How do I make my current server IPv6 compatible?**

If your server provider supports IPv6, it is possible to make your current already-provisioned servers IPv6-ready. We have a guide to follow if you want to make sure your server is IPv6 ready: <https://ploi.io/documentation/server/how-do-i-make-my-existing-ubuntu-server-ipv6-ready>

**Changelog**

- \[Added\] IPv6 support 🥳
- \[Added\] What is my IP page now also shows IPv6 address (if you have IPv6) (<https://ploi.io/what-is-my-ip>)
- \[Added\] Ploi CLI (<https://github.com/ploi/cli>)
- \[Added\] Ability to search on tags in global search in servers and sites
- \[Added\] Ability to define where your .env file lives so the editor knows where to look
- \[Changed\] S3 backups now use streaming method to improve backup speed and no temporary files on your server taking up space
- \[Changed\] Fresh Statamic landing page (<https://ploi.io/statamic>)
- \[Changed\] Changed Google Drive login to force the auth login screen when re-authing
- \[Changed\] When creating a WordPress installation with database it will now ignore ‘www’ in the name
- \[Fixed\] Issue with saving locations in backups because using the wrong columns
- \[Fixed\] Dark mode issue with the datepicker
- \[Fixed\] Inconsitency in the backup name when having site file backups and having rotation enabled

**Changelog API**

- \[Added\] Docker API - <https://developers.ploi.io/containers/list-containers>
- \[Fixed\] Queue paused status would not display

## Ploi CLI is now available! 💻

URL: https://ploi.io/news/ploi-cli-is-now-available
Published: 2025-02-12

**Introducing Ploi CLI - Command Your Infrastructure!** 💻

Great news - we've just launched the official Ploi CLI, bringing the full power of Ploi right to your terminal! Now you can manage your entire infrastructure without leaving your command line environment.

[![](https://ploi.io/storage/ORoMxswl0QsbD5lZa8x0sqdsFuWEVHHly5eUYHzB.png)Untitled-1.png 201.09 KB](https://ploi.io/storage/ORoMxswl0QsbD5lZa8x0sqdsFuWEVHHly5eUYHzB.png)

**Key features**

- Manage servers and sites directly from your terminal
- Create and configure databases with simple commands
- Set up and monitor daemons and cronjobs effortlessly
- Quick deployment triggers right from your local environment

**Getting started is easy**

1\. Install Ploi CLI: **composer global require ploi/cli**

2\. Authenticate with your Ploi API credentials

3\. Start managing your infrastructure!

More in our documentation which is a work in progress: <https://cli.ploi.io>, and here’s the repository: <https://github.com/ploi/cli>

**Streaming backups** ⚡️

It’s been on the roadmap for a while (<https://roadmap.ploi.io/projects/1-server-level-requests/items/14-stream-backups>) and it’s finally coming, backup streaming.

Why streaming? Streaming saves you the resources on your server, instead of creating a file on your server and uploaded that to the driver you have selected, it’s being send right away to that driver. No more overhead or wasted space.

Currently all S3 drivers (Custom S3, AWS S3 &amp; DigitalOcean spaces) already stream it to your storage. All the other drivers (except the local one) will be done in the upcoming week!

**Changelog**

- \[Added\] Ploi CLI initial release
- \[Added\] Ability to reset database user passwords
- \[Added\] Tags to servers and sites (settings tab)
- \[Added\] A brand new laravel log parser in the Laravel tab of your site
- \[Added\] SSH login logs to the SSH login notifications modal and logs tab (dropdown)
- \[Added\] Ploi.website as testing domain
- \[Changed\] All S3 drivers now stream backups instead of creating the file on the server and uploading it then
- \[Changed\] Cloudflare DNS SSL request propagation seconds increase from 20 to 30
-  \[Fixed\] Bugfix for tenants when you changed the PHP version for the main site, tenant would not always come along

## Recap Ploi 2024 🎇

URL: https://ploi.io/news/recap-ploi-2024
Published: 2024-12-20

This year has been transformative for Ploi, marked by a beautiful set of new features and improvements. While maintaining our commitment to stability and performance, we've delivered several major updates that make server management even more seamless and secure (and let’s not forget the official Ploi Elephpant: <https://ploi.io/elephpant> 🥰).[![](https://ploi.io/storage/UJ2HlOa880HYMPhgOJG0v3LV1i8ThvKB7LkX09T6.png)recap-2024.png 874.31 KB](https://ploi.io/storage/UJ2HlOa880HYMPhgOJG0v3LV1i8ThvKB7LkX09T6.png)Let's dive into the major highlights of 2024!

**Ubuntu 24.04 support** 🐧

We're proud to announce full support for Ubuntu 24.04 LTS, ensuring you have access to the latest stable operating system for your servers. This addition brings enhanced security features and improved performance to your infrastructure.

**ZeroSSL integration** 🔒

Security remains a top priority, and with our new ZeroSSL support, you have an additional trusted option for SSL certificate management, making secure deployments even more accessible.

**PHP 8.4 support** ⚡

Keeping up with the latest PHP developments, we've added support for PHP 8.4, allowing you to leverage the newest features and improvements in PHP development.

**Passkeys support** 🔑

We've implemented passkeys support, offering a more secure and convenient way to authenticate, moving beyond traditional password-based security.

**Under the hood**

Beyond these major features, we've dedicated significant effort to bug fixing and platform stability:

- Enhanced system reliability
- Improved deployment performance
- Strengthened security measures
- Refined user interface responsiveness

**What's coming for 2025?**

While we're proud of what we've accomplished in 2024, we're already looking ahead to next year. Our roadmap at <https://roadmap.ploi.io/> continues to grow with your feedback and suggestions. If you have ideas for new features or encounter any issues, please don't hesitate to submit them.

A few highlights we will be focussing on for 2025:

- IPv6 support (<https://roadmap.ploi.io/projects/1-server-level-requests/items/2-ipv6-support>)
- Typesense server type (<https://roadmap.ploi.io/projects/1-server-level-requests/items/130-typesense-server>)
- Ploi Surge (<https://roadmap.ploi.io/projects/1-server-level-requests/items/1126-load-testing-tool-ploi-surge>)
- Customized server (<https://roadmap.ploi.io/projects/1-server-level-requests/items/803-customized-server-creation>)
- Streaming backups (<https://roadmap.ploi.io/projects/1-server-level-requests/items/14-stream-backup>s)
- Brand new file explorer
- And many more…

Stay connected with us on social media:

- Twitter: <https://twitter.com/ploi_deploy>
- Facebook: <https://facebook.com/ploideploy>
- Instagram: <https://www.instagram.com/ploi_deploy/>
- Mastadon: <https://phpc.social/@ploi>
- Bluesky: <https://bsky.app/profile/ploi.io>

Thank you for being part of the Ploi community in 2024! We're excited to continue serving your deployment needs and bringing you more innovations in 2025! 🚀

**Changelog**

- \[Added\] Last used column to the passkeys update
- \[Added\] New testing domain: ploi.sh
- \[Added\] Database copy connection URL in databases tab
- \[Changed\] PHP installation tab is now improved and searchable
- \[Changed\] We now store server logs separately allowing us to log more content instead of the 40.000 character limit
- \[Dropped\] PHP 5.6 support has been dropped
- \[Fixed\] Issue when saving excluded tables for database backups
- \[Improved\] Swoole (PHP) installation is now installing properly including detecting failures
- \[Improved\] Event (PHP) installation is now installing properly including detecting failures
- \[Improved\] Swap installation is now smarter for newly created servers, we are working on swap management as well after installations

## PHP 8.4 support & Passkeys update 🔐

URL: https://ploi.io/news/php-84-support-passkeys-update
Published: 2024-11-25

**PHP 8.4 is here!** 🎉

Great news - we've added support for PHP 8.4 right away! This new version comes with some really cool features like property hooks and a handy new array\_find method. Want to try it out? Just hit that 1-click install button to either set up a fresh server or add it to your existing one.

**Making login easier with Passkeys** 🔐 

We're super excited about this one - you can now use passkeys to log into your Ploi account! It's faster, safer, and works with your favorite password manager. Just head to your profile, click on the [security tab](https://ploi.io/profile/security#passkeys), and you're good to go.

**More control over your deployments** ⚡️

You asked, we listened! You can now run scripts before, during, and after your zero-downtime deployments. Need to restart those queue workers or warm up your cache? No problem - you've got full control over the whole process now.

**Quick updates**:

- Added PostgreSQL 17 support
- Fixed that annoying Redis installation issue (no more "Class redis not found" errors!)
- Made SSL certificates available via ZeroSSL for all tenants

**Something exciting brewing...** 🚀 

We've started beta testing Ploi Surge, our new website load testing tool. Want to help us test it? Drop us a message!

**For our API users**: We've added some new endpoints to make your life easier:

- Manage your load balancers (attach/detach servers)
- Work with source control providers and their repositories
- Full docs: <https://developers.ploi.io>

**Changelog**

\- \[Added\] PHP 8.4 🎉
\- \[Added\] Passkeys support
\- \[Added\] Pre, main and post deployment scripts for zero downtime deployments
\- \[Added\] Tenants are now also able to request SSL certificates via ZeroSSL
\- \[Added\] PostgreSQL 17 support
\- \[Fixed\] Issue with using testing domains &amp; Statamic (but might also cover other frameworks) not using HTTPS properly
\- \[Fixed\] Issue with installing redis (Class redis not found error), this is now properly being installed in PHP
\- \[Fixed\] Issue with installing certbot being unavailable in the repositories, will be retried with a decent amount of time in between to guarantee success
\- \[Improved\] Adding Hetzner API DNS key, earlier required you to have a domain in your Hetzner account, this is no longer the case
\- \[BETA\] We’ve started with the initial testers for Ploi Surge, a website load testing tool

**Changelog API**

\- \[Added\] Attach endpoint load balancers: https://developers.ploi.io/315-load-balancers/2196-attach-server
\- \[Added\] Detach endpoint load balancers: https://developers.ploi.io/315-load-balancers/2197-detach-server
\- \[Added\] List source control providers: https://developers.ploi.io/28-user/2198-list-source-control-providers
\- \[Added\] Show source control providers: https://developers.ploi.io/28-user/2199-show-source-control-providers
\- \[Added\] Repositories for source control provider: https://developers.ploi.io/28-user/2200-repositories-for-source-control-providers

## ZeroSSL support has arrived 🔐

URL: https://ploi.io/news/zerossl-support-has-arrived
Published: 2024-10-29

Exciting news! We're thrilled to announce that Ploi now officially supports ZeroSSL, giving you more flexibility in managing your SSL certificates. This integration allows you to easily secure your websites while maintaining the streamlined experience you expect from Ploi 💙

While Let's Encrypt remains a great choice, ZeroSSL brings additional features to the table including extended validation (EV) certificates, priority support, and flexible certificate management.

You'll benefit from higher rate limits for certificate issuance and a convenient dashboard to manage all your certificates in one place. For high-traffic sites or multiple domains, ZeroSSL's infrastructure provides robust support for large-scale deployments with reliable performance and seamless renewals.

[How do I request a ZeroSSL certificate?](https://ploi.io/documentation/ssl/how-do-i-request-a-zerossl-certificate)

But that's not all – we've also rolled out some game-changing features to enhance your server management experience:

🌐 **HTTP3 support (BETA)**: Experience faster, more reliable connections with our new HTTP3 support for certificates. Early results are promising! (Not all servers supports this as you need NGINX 1.25 or higher)

⚡️ **Deployment superpowers**: Custom variables support for webhook URLs and API deployment endpoints gives you more control over your deployments than ever before.

💾 **Smarter backups**:

- New TAR compression option for more efficient storage
- Automatic cleanup of failed backups
- Enhanced backup management through our API

🤝 **Better value**: Save 10% when you switch to yearly subscriptions – now with automatic enrollment!

As always, check out our detailed changelog below for the complete list of improvements and fixes. Take note that we don’t log everything in there, Ploi receives about 5 to 10 commits each day with fixes, small improvements. Logging those would generate insanely long changelogs so we filter &amp; structure those properly 🥰

Be sure to follow us for the latest updates!

- Discord: <https://ploi.io/discord>
- Twitter: <https://twitter.com/ploi_deploy>
- Facebook: <https://facebook.com/ploideploy>
- Instagram: <https://www.instagram.com/ploi_deploy/>

**Changelog**

- \[Added\] ZeroSSL support 🔐
- \[Added\] Ability to set timezone automatically for newly created servers (from your profile)
- \[Added\] Ability to use TAR compression for backups
- \[Added\] Ability to pass in custom variables when using the deploy webhook URL or API deployment endpoint (<https://x.com/dennis_smink/status/1820791594850689514>)
- \[Added\] Ability to clean up backups that have failed from the server instead of leaving them there
- \[Added\] [Ploi.club](http://Ploi.club) as new testing domain
- \[Added\] Ability to subscribe automatically yearly which includes a 10% discount
- \[Added\] New site filter, show only sites which have robots disabled (including the badge)
- \[Added\] New amazon region Middle East (UAE)
- \[Added\] HTTP3 support for certificates, currently in BETA but the results have been really promising! (Not all servers supports this as you need NGINX 1.25 or higher)
- \[Changed\] Most tables have been completely refactored and generalized in Ploi for a better user experience
- \[Changed\] System user passwords that were being generated were 16 characters long, that’s changed to 24 characters now
- \[Changed\] We removed/filtered the 512MB plans from AWS, the minimum requirements has always been 1024MB minimum
- \[Fixed\] MariaDB installations now properly respect their selected versions
- \[Fixed\] In some occasional event it could happen that an older certbot version would get installed (probably due to legacy packages), this is now set to hold which solves the whole issue
- \[Updated\] Nextcloud to version 30

**Changelog API**

- \[Added\] New database backups endpoint - <https://developers.ploi.io/database/list-database-backups>
- \[Added\] New site file backups endpoint - <https://developers.ploi.io/site/list-site-file-backups>
- \[Fixed\] Update scripts endpoint (didn’t update properly) - <https://developers.ploi.io/scripts/update-script>

## Action required: DNS providers (new feature)

URL: https://ploi.io/news/action-required-dns-providers-new-feature
Published: 2024-07-15

Some of you might have already noticed, something has changed with the DNS tab. It’s because we’ve completely redesigned the way DNS management works in Ploi.

Before, you’d be able to save Cloudflare &amp; Hetzner API credentials for DNS management, and for DigitalOcean, Vultr, and others you’d need to have a server provider attached.

**Multiple providers**

This is no more and has been separated. You can now easily create your own (and as many) DNS providers under the Integrations tab in your profile.

The biggest benefit of this is that you can now also save other API keys from your customers to manage their DNS, instead of having to add all the domains to your Cloudflare account (or any other provider) for example.

The part where we mean action required is a 50% chance it went right in the migration, or not. How do you check &amp; fix? That’s the easy part luckily.

**How to check &amp; fix**

Go to your site in Ploi where you know DNS was configured, and simply open the DNS tab, if it loads all is good. If it throws you a big red toast, then you’d need to update the DNS provider in your profile under the Integrations tab.

If you did that, then also check in the site settings, under the DNS provider card, if the correct DNS provider has been selected. After that, you’re good to go!

**Changelog**

- \[Added\] Ability to have as many DNS providers as you want
- \[Added\] Line numbers to the editor for tenants (NGINX config)
- \[Added\] Ability to edit the bitbucket source control providers for their workspace name
- \[Improved\] Hetzner DNS certificate request is now being done via an official certbot plugin
- \[Fixed\] Issue with saving in the NGINX editor which would result in a 500 error (our side)
- \[Fixed\] Applications would not allow to change repository or branch in repository tab

## Company update & bug fixing months 🥰

URL: https://ploi.io/news/company-update-bug-fixing-months
Published: 2024-07-04

As of July 1st, 2024, we’ve changed the legal form of our company. You might have already noticed this when you opened a recent invoice from us:

[![](https://ploi.io/storage/LksCvifMsrAU255J9sI8HYQrfEFT4Aq98kpl9N6i.png)CleanShot 2024-07-04 at 08.39.25.png 116.97 KB](https://ploi.io/storage/LksCvifMsrAU255J9sI8HYQrfEFT4Aq98kpl9N6i.png)If you use our VAT number to do your bookkeeping, make sure you change that. Our new VAT number is: **NL866641658B01**

**Bug fixing month?**

You might of noticed we didn’t release that many features in the last 2 months, and while we actually did release quite a few, we didn’t announce them as big as we used to do normally. From May, until the end of July this year, we try to focus as much as possible on increasing our infrastructure, fixing pesky bugs, and tackling small quick QOLs. We’re trying to make the already stable Ploi, even more stable to prepare for the future!

**What’s cooking in Ploi HQ?**

Obviously, we have been cooking a lot of cool stuff; multiple DNS provider support, the ability to clone staging/production sites completely, PM2 improvements with ecosystem.config.js and many, many more. Obviously, if you have any idea’s feel free to submit them to our [roadmap](https://roadmap.ploi.io) or [Discord](https://ploi.io/discord)!

**Changelog**

\[Added\] Ability to always use isolated system users so you don’t always have to open advanced settings anymore (enable in profile)

- \[Added\] Ability to edit redis configuration for default server type (manage tab)
- \[Added\] Ability to read redis logs in logs tab (dropdown)
- \[Added\] Ability to close modals with ESC key
- \[Added\] Ability for users to completely remove their accounts
- \[Added\] ploi.team testing domain added
- \[Added\] Ability to download Let’s Encrypt certificates directly from the panel
- \[Fixed\] Bug in test domains that would always say it was successfully created while it might not
- \[Fixed\] Move site system user now also works for team users
- \[Fixed\] Clone site now also properly respects custom SSH ports
- \[Fixed\] Clone database now also properly respects custom SSH ports
- \[Fixed\] Security issue with PHP FPM sockets, this has been patched now, older sites will automatically be patched in batches (thank you Vladimir!)
- \[Fixed\] Issue with deploy script suggestions modal keep turning back when changing page, or editing environment file for example
- \[Fixed\] Issue with deploy script editor and variables, if you’d start typing {SITE\_ and entered through on a variable you’d get {{SITE\_PHP}} with double brackets
- \[Fixed\] Documentation search is more comprehensive and smart now
- \[Fixed\] Documentation search no results now actually shows no results alert
- \[Fixed\] Issue where PermitRootLogin in SSHD config would not be set properly to no with fresh installations
- \[Fixed\] Dark mode issue with SSL expires label on sites overview
- \[Fixed\] Tenant SSL certificate request via DNS provider is now properly validated, email field removed
- \[Fixed\] Minio installation would not always succeed because of missing installation steps
- \[Fixed\] Typo in the site file backup succeed email (thank you Sam!)
- \[Fixed\] Issue when you used SFTP as backup driver and had spaces in backup path, these are now escaped
- \[Fixed\] Issue with DigitalOcean spaces and using site file backups using incorrect regions and would fail
- \[Changed\] Company VAT number has changed to: **NL866641658B01**
- \[Changed\] We used to save the plans in the database, this is unnecessary and causes additional queries which are useless, this is now hardcoded and migrated
- \[Changed\] Script code content increased to 7500
- \[Changed\] AWS CLI installation has been moved to snap instead of apt

## Ubuntu 24.04 support has arrived 🎉

URL: https://ploi.io/news/ubuntu-2404-support-has-arrived
Published: 2024-05-08

Ubuntu 24.04 support has finally arrived! All providers have been updated, tested, and checked to see whether 24.04 would be stable enough, and it is! The only provider that does not have 24.04 support yet is Katapult, once they release it, we’ll obviously add this.

Ubuntu 24.04 isn’t selected by default yet, usually, we wait 1 or 2 weeks to get rid of all the possible bugs that were introduced. After this, we’ll default to 24.04 but for now, you have to switch it to 24.04 manually when you create a server.

**Should I upgrade?**

"If it ain’t broke, don’t fix it", in other words; no, we don’t advise upgrading **existing** servers.

You can view all the release cycles, end of support, and more details about your OS here: <https://ubuntu.com/about/release-cycle>

From our perspective, we can’t recommend upgrading from an older Ubuntu version to a newer version within your existing server. The best is to provision a fresh server and migrate sites/data over slowly if you absolutely have or want to.

This ensures you have a fresh server, all services run with the latest updates and you do not have to migrate/upgrade/update any packages to make it work.

**Changelog**

- \[Added\] Ubuntu 24.04 support 🔥
- \[Added\] Ability to search on server in site file backups
- \[Added\] Server clone feature
- \[Added\] Ability to copy log content in a log modal including redacted
- \[Added\] Ability to sort on disk size in sites
- \[Added\] Ability to save composer authentication (inside PHP tab)
- \[Added\] Ability to view database credentials for 1 time after creation
- \[Added\] New toastr package
- \[Added\] Ability to set a custom name for a backup ZIP
- \[Added\] [ElePHPant page 🐘](https://ploi.io/elephpant)
- \[Added\] AWS eu-south-2 region to server creation
- \[Added\] Laravel Reverb tab including composer deploy script suggestions
- \[Added\] Fresh referral page
- \[Added\] 30 minute timeout when you delete a server, you can delete right away, but the default is 30 minutes so you can undo the deletion
- \[Added\] Ability to select all servers when adding a new SSH key in your profile
- \[Added\] Ability to obfuscate the SSH login notification IP address before or after
- \[Added\] Ability to search in tenants (global search also included)
- \[Added\] Ability to set a port for public and server for storage servers (minio)
- \[Added\] New deploy script variable {DEPLOYMENT\_SOURCE} to get the source from the deployment
- \[Improved\] 2FA disabling now requires to enter the token for extra security
- \[Improved\] Whenever an SSL request fails, you will be presented with a modal with the direct failing result
- \[Fixed\] 2FA feature input fields has now changed to 1 complete input, for better understanding
- \[Fixed\] A bug inside the database clone modal with the wrong server types
- \[Fixed\] A bug inside the opcache enabled, would always popup again after ignoring/fixing
- \[Fixed\] A bug when you had quick deploy on with Gitlab and the webhook couldnt be found anymore, it will just disable quick deploy for you
- \[Fixed\] A bug inside the FTP backup driver for the wrong path (could not find \*.zip error)
- \[Fixed\] A bug when deleting a cronjob that was attached to a site, it would let all the cronjobs dissapear and on a refresh they’d be back again
- \[Fixed\] Site suspension was broken due to a configuration error, this is fixed
- \[Removed\] Docker version statement from default docker compose file

## It's here: The new Ploi Mobile app 📱💙

URL: https://ploi.io/news/its-here-the-new-ploi-mobile-app
Published: 2024-01-30

**It's here: The new Ploi Mobile app** 📱💙

We're thrilled to announce the launch of Ploi Mobile V3, a significant upgrade from our previous version. Remember the sneak peek we gave in [December](https://twitter.com/ploi_deploy/status/1738204464891273523)? It’s finally here, and it's everything we promised and more!

[![](https://ploi.io/storage/iVNO0raHO1EoYYRShiyKqacc9e5bu8xpUxWHLjIx.png)iphone-mockup.png 136.95 KB](https://ploi.io/storage/iVNO0raHO1EoYYRShiyKqacc9e5bu8xpUxWHLjIx.png)

**Why are we excited?** 🌟

The leap from Ionic to React Native is more than just a technical shift. It transforms Ploi Mobile into a genuinely native app, offering an unmatched user experience with improved performance and responsiveness. This change alone elevates the app to a whole new level of efficiency and ease of use.

**What's new in V3?** 🆕

- **Multiple account management**: Seamlessly switch between different Ploi accounts within the app. Perfect for users handling multiple projects or clients.
- **Enhanced sorting capabilities**: Now sort your sites based on disk usage, making it easier to manage resources efficiently.
- **New global overviews**: Dive into comprehensive views for backups, insights, and monitoring. Range filtering adds an extra layer of control and precision.
- **True dark mode**: Experience the OLED dark mode, designed to be easy on your eyes and battery.
- **Revamped network tab**: Advanced features like allow/deny rules and IP address specifications give you more power over your network settings.

Don't miss out on the chance to elevate your server management experience. Download or update to the latest version of Ploi Mobile today and explore the fresh set of features and improvements.

**Downloading 🚀**

iOS: <https://apps.apple.com/gb/app/ploi/id1556215510>

Android: <https://play.google.com/store/apps/details?id=io.ploi.app>

Happy managing! 🎉

**Changelog**

- \[Added\] New mobile app 📱🥰
- \[Added\] Ability to do deployments without synchronized deployments (if you have any)
- \[Added\] New insight: is OPcache enabled
- \[Added\] SSH login notifications 🕵️
- \[Fixed\] Issue when creating a repository with Bitbucket for Statamic or Craft CMS
- \[Fixed\] 2FA issue when submitting to fast (419 error)
- \[Fixed\] Team members couldn’t schedule deployments
- \[Fixed\] Minor SSL issues for Minio storage servers
- \[Fixed\] Minor SSL issues for tenants

**Changelog API**

- \[Added\] Install WordPress CLI - <https://developers.ploi.io/services/install-wordpress-cli>
- \[Added\] Run WordPress CLI command - <https://developers.ploi.io/services/run-wp-cli-command>
- \[Added\] Uninstall WordPress CLI - <https://developers.ploi.io/services/uninstall-wordpress-cli>

## Happy New Year! 🎆 Mobile App Testing 📱

URL: https://ploi.io/news/happy-new-year-mobile-app-testing
Published: 2024-01-02

**Happy New Year!** 🎆

Let’s make this year great again without any hassle of managing your servers and sites, let Ploi handle that 🤓

We’ve already got awesome things planned for this month and for the whole year 🚀

**Mobile App Testing** 📱

Those who are active in our [Discord server](https://ploi.io/discord) might have noticed we’ve begun testing a whole new fresh mobile app. This email also includes a public link for you to test the mobile app!

Test the apps here:

**iOS:** <https://testflight.apple.com/join/RdKynxDr>

**Android:** <https://play.google.com/store/apps/details?id=io.ploi.app> (still in review, might not be available yet)

**New web server** ✨

Last Sunday, we migrated to a fresh web server separating the workers from the web which is better for the overall infrastructure. This should not affect your server too much, but it might result in connection issues when editing your .env file or NGINX configuration.

If you do use strict IP whitelisting, we recommend checking your firewalls against our IP addresses here (make sure you’re logged in): <https://ploi.io/documentation/introduction/ploi-ip-for-whitelisting>

**Disk usages** 🤔

Recently, we added the ability to see how much disk usage your sites have: <https://twitter.com/ploi_deploy/status/1740448657114058754>

This feature is available for all users on the Pro or Unlimited plan!

**Changelog**

- \[Added\] FrankenPHP octane support
- \[Added\] Site disk usages on overviews and API
- \[Added\] Server cloning (will be publicly available next week)
- \[Improved\] Octane tab removed save button, spawn button is enough
- \[Fixed\] Deployments via API would always assume their scheduled, this is fixed now (didn’t affect usability)

## Recap Ploi 2023 🎆

URL: https://ploi.io/news/recap-ploi-2023
Published: 2023-12-18

This year marks a year that’s mostly about bug fixing and improving logic that isn’t directly visible for you, as a customer. Nonetheless, we’ve still pushed a lot of updates this year!

[![](https://ploi.io/storage/Gfli30oRgDtCjb9NRKPp6lnbcKl4ChoqQj6bfFEb.png)recap-2023.png 878.71 KB](https://ploi.io/storage/Gfli30oRgDtCjb9NRKPp6lnbcKl4ChoqQj6bfFEb.png)Next year, we’ll be focussing a lot more on visible updates for you. We’ve got some really exciting stuff planned for the beginning of the new year, for now we can’t say anything, sit tight and keep following us!

Let's sum up a few of the highlights for 2023!

- [Ploi celebrates its five-year anniversary 🎉](https://ploi.io/news/ploi-celebrates-its-five-year-anniversary)
- [Backup notifications update 🔔](https://ploi.io/news/backup-notifications-update)
- [Scheduled deployments update ⏰](https://ploi.io/news/scheduled-deployments-update)
- [Dashboard update 🎨](https://ploi.io/news/dashboard-update)

**PHP 8.3 added**

PHP 8.3 was released on November 23, 2023, and we supported this version directly after. You can easily install PHP 8.3 via the PHP tab when you visit your server in Ploi. Please note that older OS versions like Ubuntu 18 might not support PHP 8.3 and you’ll not be able to install this version. In that case, you might want to consider upgrading your server or migrating to a fresh server.

**What's coming for 2024?**

So when you’re looking at our <https://roadmap.ploi.io/>, you might of notice we’re not done yet. There is so much awesome stuff on there, and we do not stop working until we’ve finished all those cards. If you have a feature in mind or discovered a bug, do not hesitate and submit it to our roadmap. We also post regularly on our social media about the updates we do.

Be sure to follow us!

- Twitter: <https://twitter.com/ploi_deploy>
- Facebook: <https://facebook.com/ploideploy>
- Instagram: <https://www.instagram.com/ploi_deploy/>

Thank you for using Ploi in 2023 and we hope to see you in 2024, waiting for a big bag of features to come that year 😎👋

Here is the recap of last year: <https://ploi.io/news/recap-ploi-2022>

**Changelog**

- \[Added\] PHP 8.3 🎉
- \[Added\] Postgresql 16
- \[Added\] MariaDB 11.2 &amp; MariaDB 10.11
- \[Added\] Confirm modal when deleting an SSH key from your profile
- \[Added\] Worker IP address is now added to the testing connection failed email so you know which to whitelist
- \[Added\] More randomized server name possibilities, there are now 14.000+ possibilities for randomized server names
- \[Added\] Ability to move sites between server system users
- \[Added\] Ability to redirect to the panel when you’re accessing [ploi.io](https://ploi.io) and you’re logged in
- \[Added\] 1Password button added whenever you’re getting your server credentials (in settings tab)
- \[Added\] Sweden region for UpCloud provider
- \[Added\] Version numbers for every service possible in status tab
- \[Added\] Filter on server index to filter on servers that require a reboot
- \[Added\] 2 more testing domains, ploi.dev &amp; ploi.ing
- \[Changed\] Cloudflare key’s now used scoped keys instead of the global API keys for enhanced security
- \[Changed\] Increased max configuration length Docker applications
- \[Changed\] Upgraded our site uptime monitoring servers, their IP’s has changed
- \[Changed\] Email server type has been deprecated
- \[Improved\] Is supervisor running insight will now automatically get removed once you provision queue’s or daemons
- \[Improved\] Referral program has been revised, you can now see in detail how many referees you’ve received
- \[Fixes\] Symphony tab improved
- \[Internal\] We’ve migrated from Laravel Mix to Vite

## Dashboard update 🎨

URL: https://ploi.io/news/dashboard-update
Published: 2023-09-18

We hope your September is going as smoothly as a well-optimized server! Are you sitting down? Because we've got some news that will make you jump up faster than a load balancer under stress. 🎢

**A Dashboard So Fresh, It Deserves Its Own Runway!** ✨

You know how you always have 101 tabs open on your browser, desperately trying to keep track of server metrics, insights, and what's for dinner tonight? Well, consider your life uncomplicated.

We are thrilled to introduce our **brand-new, sparkly Dashboard!** 🌈

[![](https://ploi.io/storage/1Mhg80pLHIs89vaSDwhL3hl3xp3SQ6OgesGThbSa.png)CleanShot 2023-09-18 at 13.07.41@2x.png 1.89 MB](https://ploi.io/storage/1Mhg80pLHIs89vaSDwhL3hl3xp3SQ6OgesGThbSa.png)With this update, we've brought everything you care about front and center. Here's a sneak peek into what's waiting for you:

- **Real-time Insights**: No more sifting through logs at midnight. Your key metrics and analytics are now on display, as clear as your love for tech! 📈
- **Monitoring Details**: CPU spikes? Memory overload? Keep tabs on all the action happening on your servers, with details so granular, you can see the 'byte dust' settling. 🖥️
- **Your Servers &amp; Sites**: All your beloved servers and sites are now accessible in one unified view. Talk about putting all your ducks—or in this case, servers—in a row! 🦆

The monitoring, and insights details also come with their own new dashboards, press "View all" at the top right of the card to get a global overview 📊

**Meet Our New Worker** 🤖

If you're using firewalls, please consult our documentation to find the new IP address to whitelist. This new worker is itching to get to work, but it can't be without your green light!

You can find all our worker IP addresses here: <https://ploi.io/documentation/introduction/ploi-ip-for-whitelisting>

That's it for this month's update! We are continually awed by this incredible community of developers, tech enthusiasts, and server whisperers. You inspire us to make Ploi better each day.

Have fun exploring the new features and as always, if you run into any issues or have suggestions, our support team is just a click away.

**Changelog**

- \[Added\] A fresh new dashboard!
- \[Added\] Ability to setup failed notifications for backups
- \[Added\] WordPress admin link if WordPress is installed to the sidebar
- \[Added\] Line numbers to several code editors like NGINX configuration, database configuration
- \[Added\] Ability to proxy docker containers to a site if NGINX and docker is both installed
- \[Added\] Ability to set a project from server settings directly is now possible
- \[Added\] Ability to request tenant certificate via DNS provider is now possible
- \[Added\] Ability to reset site permissions inside manage tab
- \[Added\] New insight if the database service has too many connections and also provides a fix for this
- \[Improved\] Vultr server creation error handling
- \[Improved\] Meilisearch server indexes list isn’t limited anymore
- \[Improved\] Latest NGINX version is now being used instead of 1.18
- \[Improved\] When installing a server with database, the force of utf8\_unicode\_ci is now removed
- \[Improved\] When spawning Laravel Octane, you may now pick workers up to 1000 instead of 500 as max
- \[Improved\] When cloning a database, you weren’t able to clone to a database-type server, or vice-versa, this is now possible
- \[Improved\] You may now use 10.000 lines for your docker container config instead of 5000 as max
- \[Bugfix\] SSL request for NodeJS sites when html directory was missing
- \[Bugfix\] When editing database configuration for MariaDB the wrong config file was loaded and displayed
- \[Bugfix\] When adding a DNS record an A record was also accepting IPv6, validation prevents this now
- \[Bugfix\] When adding domain aliases, and you had proxy\_ssl\_server\_name inside the NGINX configuration, it would overwrite that as well, this is now fixed
- \[Bugfix\] Quick deploy delay setting wasn’t honored
- \[Bugfix\] When editing a cronjob in a site, it would list all the cronjobs in the server after update has been completed, this is now fixed

**Changelog API**

- \[Added\] Ability to setup custom deployments is now possible via the API - <https://developers.ploi.io/repositories/custom-deployment>
- \[Added\] Ability to update a server - <https://developers.ploi.io/servers/update-server>

## Scheduled deployments update ⏰

URL: https://ploi.io/news/scheduled-deployments-update
Published: 2023-07-12

We're thrilled to announce the rollout of a fresh feature to simplify your deployment process—**Scheduled Deployments**. Yes, you read it right!

[![](https://ploi.io/storage/FENv9kyows0elTM2j1d9AReZVq3c04jdVJVvzNFW.png)CleanShot 2023-07-12 at 09.14.38.png 186.53 KB](https://ploi.io/storage/FENv9kyows0elTM2j1d9AReZVq3c04jdVJVvzNFW.png)We understand that managing deployments can sometimes be a juggling act. Coordinating different teams, dealing with different time zones, or simply wanting to schedule updates during non-peak hours, these challenges are all too real. And that's where Scheduled Deployments come in.

Scheduled Deployments allow you to set up deployments for a future date and time of your choosing. Like setting your morning alarm, you can now schedule your deployments and let Ploi handle the rest. Sleep easy knowing your updates will go live at the perfect moment, even if you're away from your desk or sleeping!

We’ve also went ahead and added 2 new deploy script variables for deploy script logic implementations.

- {ANY\_DEPLOYMENT\_SCHEDULED} - Will return a 1 or 0 if there’s a deployment scheduled
- {DEPLOYMENT\_SCHEDULED\_AT} - Will return the first scheduled deployment date

You can even use the API to schedule your deployment. You can read more about that here: <https://developers.ploi.io/deployments/deploy-site>

📣 **Your Feedback Matters!**

We love hearing from you! Your experiences, suggestions, and stories help us grow and make Ploi better each day. If you've found Ploi's server management tool helpful, we'd be thrilled if you could take a few moments to leave a review.

Visit [https://ploi.review](https://ploi.review/), where you can choose your favorite platform to share your thoughts. Remember, your words have power - they can inspire our team and guide fellow developers looking for the perfect server management solution. So, let your voice be heard!

Thanks for your ongoing support. Every single review brings a smile to our faces and keeps us striving for excellence. We can't wait to read your review! 😊

Happy scheduling, everyone!

**Changelog**

- \[Added\] Scheduled deployments ⏰
- \[Added\] New insight to check whether your OPcache is full (https://ploi.io/documentation/server/how-does-server-insights-work)
- \[Added\] When deleting a tenant, and a certificate was present, it will delete that now
- \[Added\] SSH button to easier access SSH inside your server
- \[Added\] NodeJS service restart option for staging to production sites
- \[Added\] User agent to the health checks
- \[Added\] Ability to synchronize production to staging (so the reverse)
- \[Added\] Failover mail configuration to increase deliverability if a service goes out
- \[Added\] Syncing production sites back to staging
- \[Improved\] Site file backup failures are now detected better
- \[Fixex\] Max children insight wasn’t running properly and would never show itself
- \[Fixed\] API token expiring emails only for the Ploi client

**Changelog API**

- \[Added\] Custom server creation requests now allow custom SSH ports
- \[Added\] Deploy webhook is now in the response
- \[Started\] A brand new backups endpoint, which will release very soon

## Backup notifications update 🔔

URL: https://ploi.io/news/backup-notifications-update
Published: 2023-04-05

We are excited to announce the latest updates, with a focus on Backup Notifications! We've been working hard to improve your experience, and now you can stay informed about your backups more effortlessly than ever.

**Backup Notifications: Attach Notification Channels** 🔔

With the new Backup Notifications update, you can now attach your notification channels when a backup starts or finishes. This means you'll always be in the know when your backups are successfully completed, giving you the peace of mind that your data is safe and secure.

To set up your notification channels, simply head over to your Ploi dashboard and go to the backups overview. You can attach your own notification channels per backup.

[![](https://ploi.io/storage/Ni6JDpgwoRqbEB944KOT2Y3XStqCdSW9WluduWBh.png)CleanShot 2023-04-05 at 09.57.17.png 726.14 KB](https://ploi.io/storage/Ni6JDpgwoRqbEB944KOT2Y3XStqCdSW9WluduWBh.png)We've also uploaded a video demonstrating:[ https://www.youtube.com/watch?v=3Dg1Z7uLYw](https://www.youtube.com/watch?v=3Dg1Z7uLYw4)4

**Changelog: Packed with New Updates**

As always, we are committed to providing you with the best server management experience possible. In our latest changelog, you'll find a treasure trove of updates that enhance Ploi's functionality and make managing your servers &amp; sites a breeze.

**Changelog**

- \[Added\] Ability to notify when a database backup starts and finishes to your favorite notification channels
- \[Added\] Ability to clone whole databases to another server (database type must match)
- \[Added\] Fresh new chart for server &amp; site monitoring
- \[Added\] Ability to restore database from Google Drive
- \[Added\] Ability to request a chain SSL for tenants (add your own extra domains to your tenant)
- \[Added\] Server column to site file backups in the table
- \[Added\] Czech language
- \[Added\] Ability to update the physical servers hostname when changing the name
- \[Added\] Project specific tabs like Laravel now use the actual site PHP version on the CLI
- \[Added\] Ability to 1-click install a WordPress cronjob &amp; define the interval for that
- \[Added\] Ability for team owners to see pending member invites
- \[Added\] New deployment variable {SITE\_DOMAIN} which returns your domain as in [ploi.io](https://ploi.io)
- \[Added\] New deployment variable {SITE\_COMPOSER} which returns the composer command with the site’s PHP version
- \[Added\] When cloning a site, also clone domain aliases and tenants
- \[Added\] 2 new testing domains (to spread records better), [ploi.site](https://ploi.site) &amp; [ploi.link](https://ploi.link)
- \[Added\] Ability to request an SSL certificate based on DNS provider request (Cloudflare, Hetzner, etc)
- \[Added\] Ability to delete a database when deleting a site (if a database was attached to a site)
- \[Added\] Ability to create docker networks from the UI
- \[Added\] Ability to specify additional arguments for the Meilisearch server type
- \[Added\] Site file backups index now also has the new queued, in progress &amp; active badge
- \[Added\] Site file backups are now also notifiable
- \[Changed\] Backup index now has the filters above the table instead of a dropdown
- \[Changed\] Status tab in server is now completely renewed and has reload feature for services that support them
- \[Changed\] Refactored PHP extensions window, you may now also uninstall them
- \[Changed\] Moved to Redis database storage for site uptime monitoring
- \[Changed\] Logic to delete a server from your account, this is more fluent now
- \[Changed\] Databases backup index now shows when it’s queued and running
- \[Changed\] Katapult server creations are now faster as it checks on server status
- \[Fixed\] Issue with editing S3 backups in profile
- \[Fixed\] Issue with installing a new PHP version and not being able to reload FPM as Ploi or system user
- \[Fixed\] Issue when creating a server with UpCloud and returned an error
- \[Fixed\] Issue when a team member wanted to install a repository and the installer got stuck
- \[Fixed\] Issue when patching PHP, not all extensions would be patched
- \[Fixed\] Don’t allow to add yourself to a team when creating one

## Ploi celebrates its five-year anniversary 🎉

URL: https://ploi.io/news/ploi-celebrates-its-five-year-anniversary
Published: 2023-02-10

5 years. Think about it, 5 full years. That’s 43.830 hours, 2.629.800 minutes and 157.788.000 seconds 🤯

[![](https://ploi.io/storage/DU3Tp5mdYDRCf93ZfxNZlNatq8PnQTpuQSTYtbp0.png)5-year-1.png 644.41 KB](https://ploi.io/storage/DU3Tp5mdYDRCf93ZfxNZlNatq8PnQTpuQSTYtbp0.png)In 5 years we’ve been able to provide so much awesome features and feedback from our customers! This is why we’ve completely updated our homepage temporarily to show a few highlighted things that happened over the course of 5 years, check it out:

<https://ploi.io> 🎉

**The next 5 years?**

The next 5 years we’ll again do our best to keep serving you the best experience with managing your servers and sites. We still have a roadmap full (thank you for that!) of features, suggestions and bugs that we can process for Ploi 🤝

**Recaps**

We’ve made it a default to do a recap each year, we started doing these in 2019 and we’d like to sum these up, from old to new:

- <https://ploi.io/news/recap-ploi-2019>
- <https://ploi.io/news/recap-ploi-2020>
- <https://ploi.io/news/recap-ploi-2021>
- <https://ploi.io/news/recap-ploi-2022>

**Don’t forget**

Don’t forget to follow us on our social media &amp; Discord, where we regularly post updates and questions! We’ve also recently joined mastodon!

- <https://ploi.io/discord>
- <https://twitter.com/ploi_deploy>
- <https://facebook.com/ploideploy>
- <https://phpc.social/@ploi>

If you’re happy with us we love to hear from you in form of a review if you have the time, it shouldn’t take more than 2 minutes!

<https://ploi.review>

**Changelog**

- \[Added\] 5 years 🎉
- \[Added\] NGINX editor on server level for main server files
- \[Added\] Brand new auth pages (login, register, 2FA, locked)
- \[Added\] Grouping Vultr servers in server builder
- \[Added\] Basic Node version manager installation (manage tab)
- \[Added\] Markdown support when suspending a website
- \[Added\] Delete website-related cronjob when website is deleted
- \[Added\] Label inside backup overview from the backup configuration
- \[Added\] Laravel Octane support for PHP 8.2
- \[Added\] Laravel about command to the Laravel tab
- \[Added\] When using IP whitelisting for the API, and you get denied, you now see the IP address your using in the message to debug it
- \[Added\] Drastically changed the deploy live log output, much more intuitive now
- \[Added\] Custom deployments feature also for applications now
- \[Added\] Comment support for Cloudflare DNS integration
- \[Added\] Ability to sort backups by name in the backups overview
- \[Added\] Toggle all button for scripts when you want to run it on all servers
- \[Added\] Ability to monitor a path for site uptime monitoring
- \[Added\] Ability to enter multiple IP addresses when adding a network rule
- \[Re-Added\] Backup restore
- \[Improved\] Applications on worker server, added deployment logs, rotations and notifications
- \[Improved\] Reworked all S3 backup commands to prevent the issue with .credentials and .config files
- \[Improved\] Dropbox backup error handling registration is now better
- \[Improved\] Vultr API key validation
- \[Improved\] VAT validation message
- \[Updated\] Nextcloud version to 25
- \[Updated\] InertiaJS to version 1
- \[Updated\] Active statement sidebar if you’re in a site, to have the sites tab active
- \[Fixed\] Editing backup configurations in your profile
- \[Fixed\] Monitoring view when refreshing &amp; dropdown range
- \[Fixed\] DigitalOcean DNS now uses the actual provider where the server has been created with
- \[Removed\] OctoberCMS support

**Changelog API**

- \[Added\] Description to response - <https://roadmap.ploi.io/projects/6-api-level-requests/items/474-add-descriptionnotes-to-servers-response>

**Changelog Ploi Core**

- \[Added\] NZD currency support
- \[Added\] Ability to configure if impersonation is possible
- \[Added\] Notification message when a sync to system fails
- \[Added\] Cancel subscription button for users to list itself, they can also change/swap their subscription
- \[Fixed\] Ticket label in admin
- \[Fixed\] User creation error in admin
- \[Fixed\] Bugfix for synchronizing sites with PHP version

## Recap Ploi 2022 🎆

URL: https://ploi.io/news/recap-ploi-2022
Published: 2022-12-09

This is already the 4th recap since we started writing these, and what a great ride 2022 has been. We’ve been focussing on improving the core of Ploi to make it more stable, reliable, and better. As you are used from us, we’re not stopping.

We’re really grateful for the feedback you have been giving and for helping us out, this helps a lot in making Ploi a better place and helping you make your developer's life easier.

Let's sum up a few of the highlights for 2022!

- [The NGINX update 🌍](https://ploi.io/news/the-nginx-update)
- [The source control update 🕵️](https://ploi.io/news/the-source-control-update)
- [Docker support 🐳](https://ploi.io/news/docker-support)
- [Worker servers are now available](https://ploi.io/news/worker-servers-are-now-available)
- [Ubuntu 22 support](https://ploi.io/news/ubuntu-22-support-has-arrived)
- [Mobile app update 📱](https://ploi.io/news/ready-for-2022)
- [New roadmap 🛣️](https://ploi.io/news/worker-servers-are-now-available)
- [Published open source roadmap software](https://github.com/ploi-deploy/roadmap)
- [Published open source heatmap software](https://github.com/ploi-deploy/heatmap)

**PHP 8.2 released**

On December 8th, PHP 8.2 was released. This beautiful new PHP version is also available on the panel for you to install! To view all the changes and updates for PHP 8.2 take a look at [this article](https://stitcher.io/blog/new-in-php-82).

**What's coming for 2023?**

So when you're looking at our [roadmap](https://roadmap.ploi.io/), you might notice we're not done yet. There is so much awesome stuff on there, and we do not stop working until we've finished all those cards. If you have a feature in mind or discovered a bug, do not hesitate and feel free to submit it to our roadmap. We also post regularly on our social media about the updates we do.

Another big thing for 2023 is our anniversary of 5 years! Yes, it's been that long. Keep a close eye on us in February, we've got some awesome things coming up to celebrate 🎉

Be sure to follow us on social media!

- Twitter: <https://twitter.com/ploi_deploy>
- Facebook: <https://facebook.com/ploideploy>
- Instagram: <https://www.instagram.com/ploi_deploy/>

Thank you for using Ploi in 2022 and we hope to see you in 2023, waiting for a big bag of features to come that year 😎👋

Here is the recap of last year: <https://ploi.io/news/recap-ploi-2021>

**Changelog**

- \[Added\] PHP 8.2 🎉
- \[Added\] Ability to decouple staging &amp; production sites to have them separated
- \[Added\] Ability to install Docker to default servers with NGINX
- \[Added\] Ability to clear the cache of listed files inside the NGINX editor
- \[Added\] Ability to reset deployment status for staging to production sites
- \[Updated\] The worker servers &amp; their application feature have gotten a lot of updates, such as advanced repository installation, webhook URL, and deployment logging
- \[Updated\] When you spawn a daemon or queue and had the "does supervisor need to run" insight, it will now delete that insight automatically
- \[Fixed\] Error when saving an empty .env file
- \[Fixed\] Interval destroy for NodeJS sites and live-logs

**Changelog API**

- \[Added\] 'name' key to the repository endpoint - <https://developers.ploi.io/repositories/get-repository>
- \[Added\] Global overview of all the servers with their monitoring data in 1 request - <https://developers.ploi.io/servers/monitored>

## IMPORTANT: New IP address

URL: https://ploi.io/news/important-new-ip-address
Published: 2022-11-22

To keep up with all the demanding tasks Ploi has to do, we’ve added a new worker to our infrastructure which might require action from your side.

This new worker will be running upcoming Thursday as we want to make sure everyone gets the time to allow their setup from this new IP address.

You can find the new IP address here:

<https://ploi.io/documentation/introduction/ploi-ip-for-whitelisting>

Or by running the /ips endpoint in our API:

<https://developers.ploi.io/getting-started/ip-addresses>

**Do I have to take action?**

If you use whitelisting in your firewalls or other software that allows access to your servers, you’ll need to whitelist this new IP address.

Please let us know if you have any questions or concerns!

**Changelog**

- \[Added\] Ability to use Google Chat as a notification provider
- \[Added\] Ability to have your own deployments without having a repository installed
- \[Added\] Ability to read MySQL/MariaDB logs (server level, logs tab)
- \[Added\] Improved sorting for UpCloud plans in the server builder
- \[Added\] New insight that inspects NGINX worker connections limit reached
- \[Added\] Raised server monitoring data to go back to 24 hours instead of 6
- \[Added\] Restore feature to NGINX config editor
- \[Added\] Docker networks tab to view all docker networks
- \[Added\] Ability to edit SSH keys in the profile area
- \[Added\] Ability to edit backup configurations in the profile area
- \[Added\] Edit environment button available for "I’ll manage my own deployment" sites
- \[Improved\] Applications for worker servers have advanced repository installation now as well
- \[Improved\] Laravel tab: Separated the Horizon statistics card from the Horizon daemon card
- \[Fixed\] Uptime monitor notification fix for pushover
- \[Fixed\] Load balancer design fixes
- \[Fixed\] Ability to force-run site file backups now works again from the backups overview
- \[Fixed\] Bug when adding a basic auth user with path "/", would crash NGINX

## The NGINX update 🌍

URL: https://ploi.io/news/the-nginx-update
Published: 2022-10-21

Greetings!

We come to you once again, with a great update, the NGINX update 🔥

We’ve been meaning to visualize the NGINX configuration flow for a while now, and we can safely say we’ve landed on a design and functionality we think is absolutely perfect.[![](https://ploi.io/storage/mgp3Xbu39H9ZzFcvvgntDPFTCzumxxuSj9AIvPAu.png)CleanShot 2022-10-21 at 12.56.22@2x.png 634.78 KB](https://ploi.io/storage/mgp3Xbu39H9ZzFcvvgntDPFTCzumxxuSj9AIvPAu.png)When you press "NGINX configuration" on your site, you’ll now see the main configuration on the left right away, and on the right, you’ll see all the files that are being loaded by your NGINX configuration for that specific website.

We are also planning on the following updates for this new editor:

- Ability to have some kind of version control (for example undo changed configs)
- Ability to restore original configuration files

If you have any suggestions on this NGINX update please let us know!

**Changelog**

- \[Added\] Fluent NGINX configuration editor
- \[Added\] Ability to specify the path when creating basic auth user
- \[Added\] Ability for a team member to leave a team on their own
- \[Added\] Custom Gitlab server support
- \[Added\] Ability to set up a delay for quick deploy triggers
- \[Added\] 5 tries to file backups the same as database backups
- \[Added\] Detailed error reporting to failed file backups the same as database backups
- \[Added\] Indicator on backups overview to see if there are backups that have failed
- \[Added\] Force renew SSL button (only for Let’s Encrypt certificates)
- \[Added\] UpCloud Ubuntu 22 support
- \[Added\] New insight: sites that use outdated PHP versions
- \[Updated\] phpMyAdmin installation to version 5.2
- \[Improved\] Saving the .env file has become much smarter as we added validation
- \[Improved\] Empty states extracted to their own component and used everywhere there’s no records
- \[Fixed\] Flush CGI modal bugfix
- \[Fixed\] Missed semicolon tenants PHP change
- \[Fixed\] No sites for team members if they were attached to more than 1 team
- \[Fixed\] Several dark mode fixes
- \[Fixed\] SSH key was not displaying for SFTP backups when creating a backup
- \[Removed\] SSH keys count from the dashboard (why did we have this there in the first place?)

**Changelog API**

- \[Added\] Ability to specify the path when creating basic auth user
- \[Added\] Accept wildcard requests for SSL

## The source control update 🕵️

URL: https://ploi.io/news/the-source-control-update
Published: 2022-09-13

Our holiday is over, and we’re back in action, to make sure you don’t have to spend too much time on server &amp; site management.

**Source control has become much easier**

This was one of the most requested features by far we ever got, so we dove into this and made this a pretty sick feature 🔥

The roadmap item in question: <https://roadmap.ploi.io/projects/3-panel-requests/items/159-connect-multiple-accounts-with-same-gitlabgithub-account> (we know it has a few votes, that’s because we migrated from our old road mapping software to the open source road mapping software)[![](https://ploi.io/storage/UgS9Vr95Md4cTnsscWDS3Uu6ODQolg9xOzX8SJGq.png)CleanShot 2022-09-13 at 17.03.38.png 418.58 KB](https://ploi.io/storage/UgS9Vr95Md4cTnsscWDS3Uu6ODQolg9xOzX8SJGq.png)

It is now possible to attach multiple GIT accounts to your Ploi account and use them to install your projects. Very handy if you have another GIT account from the same provider (like GitLab, or GitHub) and want to be able to manage both.

Head over to your profile, and press the blue button behind the desired provider. Do note, that whenever you want to attach a new provider, you’re logged out before you’re trying to attach a new provider. Chances are, you’ll probably attach a GIT account that’s already attached to your Ploi account.

We’ve also introduced the ability to view how many repositories are using your GIT provider **and** you can click on the counter and see which repositories are actually using that GIT provider 👊

**Backups now have a try limit of 5**

We’ve done quite a few updates to the backup system and while this is still ongoing, we wanted to show you 2 new updates to that.

The first one is that backups (currently only database) will have a try limit of 5, if it fails 5 times, then it will deactivate. It will also notify you each time it fails including a detailed error of what’s going on.

The second one is that the backups overview is now bigger and shows a "failed" badge (including the number of tries) whenever a backup fails. With that, you can also press the failed badge and see a description as to why it failed.

For now, that’s it, a bit of a smaller changelog because of the vacation, but we’re back in action and already pushing out new updates💙

**Changelog Ploi**

- \[Added\] Ability to attach multiple GIT accounts from the same provider 🔥
- \[Added\] Backup update - we now display failed messages in the backup overview and have a max tries of 5
- \[Added\] {SITE\_PHP} deploy script variable, usable for getting the whole PHP handler: php8.1
- \[Fixes\] To the docker integration, mostly from user feedback
- \[Fixed\] Site file backup for SFTP rotating
- \[Fixed\] If a deployment message was longer than 255 characters we were unable to save that because of the 255 VARCHAR limit, changed it to TEXT
- \[Removed\] action\_events table traces (Nova) from our database (you really shouldn’t care about this)

## Docker support 🐳

URL: https://ploi.io/news/docker-support
Published: 2022-08-12

It’s been one of the most requested features since we ever started Ploi, and now it’s finally here: Docker support! 🐳

We did a BETA test for a small week with users from our [Discord community](https://ploi.io/discord) and we can safely say we’ve landed on a pretty good basis. You can now easily install Docker servers via the server creation screen.

We’re not stopping there though, as we’re learning Docker as we go, we still value feedback very much on this new feature. That’s why we ask you, if you have anything, feel free to submit that to our roadmap.[![](https://ploi.io/storage/U8t1pL2mX3I7sTUJ56aEwuVUS8S72kqhVtd1X4AD.png)CleanShot 2022-08-12 at 10.01.18.png 229.6 KB](https://ploi.io/storage/U8t1pL2mX3I7sTUJ56aEwuVUS8S72kqhVtd1X4AD.png)**File backups status**

As most of you know, we’ve been refactoring the site file backups feature, and while most has been done, we’re still frequently asking for feedback on how this is going. We haven’t heard anything in a while which makes it seem to be stable enough: but we want to be sure.

If you still experience issues, like no notifications for a failing backup, please report! We’re eager to look into that and solve that along the way.

That being said, we also did raise the backup time from 25 minutes to 35 minutes, which is fairly high. If you’re still hitting this limit, we’re recommending other backup solutions or try to narrow down your backup folder to only backup the files &amp; folders you actually need. (Most of the time this could be user-uploaded content for example).

**Changelog Ploi**

- [\[Added\] Docker support](https://roadmap.ploi.io/projects/1-server-level-requests/items/196-docker-support)
- \[Added\] Ability to select PHP version when spawning a site queue worker
- \[Added\] Backups now show how long they took
- \[Added\] Ability to patch PHP versions
- \[Added\] Support for type ecdsa-sha2-nistp521 SSH keys
- [\[Added\] Ability to run multiple servers behind 1 IP address](https://ploi.io/documentation/server/how-to-install-multiple-servers-behind-1-ip-address)
- \[Added\] When you upgrade your subscription, you will now receive an email containing the invoice as well
- \[Added\] Ability to edit Google Drive folder ID for backups
- \[Added\] New command for Statamic: static:warm
- \[Added\] Deploy script suggestions are back again
- \[Updated\] We migrated from Vue 2 to Vue 3
- \[Updated\] All modals have been rewritten to have their own routes &amp; logic
- \[Updated\] You can now resize modals to fullscreen (and this saves to your local storage)
- \[Updated\] Monaco editor has been updated to the latest version
- \[Updated\] Backups overview now has a wider container
- \[Updated\] File backups can now take 35 minutes instead of 25 minutes
- \[Updated\] Rollbacks are now logged as well
- \[Updated\] Notification channel labels are now editable in your profile
- \[Updated\] Validation for network rules, can’t start with a 0
- \[Updated\] Dropbox backups now use refresh tokens confirm with their latest updates for new clients
- \[Changed\] Increased delay for DigitalOcean server installations before Ploi starts installation
- [\[Changed\] Native push notifications now use emoji’s for clarity](https://roadmap.ploi.io/items/167-deployment-notifications-add-emoji-to-indicate-successfailed)
- \[Changed\] The button to cancel your subscription from “Delete” to “Cancel”
- \[Fixed\] Gitlab nested repositories deeper than 3 levels was not supported, it is now
- \[Fixed\] An issue with teams &amp; members for load balancers
- \[Fixed\] Updating a cronjob when the user was root, it would change the log location to the wrong folder
- \[Fixed\] Bug when pausing a cronjob, it would return a smaller list because of a logic issue

**Changelog Ploi API**

- [\[Added\] Clone sites available in API](https://developers.ploi.io/sites/clone-site)
- [\[Added\] Install PHP versions available in API](https://developers.ploi.io/php/install-php-version)
- [\[Added\] Tenant NGINX configuration](https://developers.ploi.io/tenants/get-nginx-configuration-tenant)
- \[Added\] PHP version &amp; system user keys to site queues endpoint
- [\[Added\] Projects endpoint](https://developers.ploi.io/projects/list-projects)

**Changelog Ploi Core**

Version 2.4 released: <https://roadmap.ploi.io/changelog/1-ploi-core-24>

## Worker servers are now available!

URL: https://ploi.io/news/worker-servers-are-now-available
Published: 2022-06-22

Another packed update this time, with a lot coming as well 🏄‍♂️

**Worker servers**

As of now, you may easily create worker servers for your PHP background tasks such as queues. The worker server is quite similar to the plain server, but comes with supervisor installed and you’re able to install "apps" on it.

Apps are just like domains you'd install on a server, but without NGINX configuration, you can easily use SFTP or GIT to clone your applications on these servers and run the workers on the fly.

**Site file backups**

We're actively working on a fairly big refactor for site file backups, especially the 20-minute limit and error reporting. When the 20-minute limit is reached, it would always dump that same error that the limit has been reached which isn’t really helpful if you want to debug.

That’s why we’re going to be pushing a fair few of updates to the site file backups. Do note; as user, you’ll probably not notice much of this as it's mostly in the backend, but we do appreciate any feedback at this point so we can process that as well along with it, we’re planning on releasing this update this month.

**New roadmap**

Some of you might already notice, that we've moved to a fresh piece of software for our roadmap, [which is open source as well](https://github.com/ploi-deploy/roadmap). Visit the roadmap [here](https://roadmap.ploi.io), and while you're at it, if you have a suggestion don’t hesitate to submit that. Oh, and to make things easy, you can log in with your Ploi account ✅

**Changelog Ploi**

- \[Added\] Dry-run staging to production deployments
- \[Added\] Live deploy log staging to production
- \[Added\] Europe Milan (eu-south-1) to backup configurations AWS
- \[Added\] Tenants UI view, able to manage tenants from there (manage tab, site level)
- \[Added\] Worker server
- \[Added\] Ability to use web server templates in profile for your Ploi Core installation (if you have a license)
- \[Changed\] Raised workers for site statistics to process them faster
- \[Changed\] Roadmap switched: <https://roadmap.ploi.io>
- \[Changed\] Updated about page <https://ploi.io/about>
- \[Changed\] Removed NGINX Amplify installation for Ubuntu 22 (not supported yet)
- \[Fixed\] Bug with rotating file backups S3 driver
- \[Fixed\] When retrieving the PostgreSQL database configuration it would say it can’t find the configuration file
- \[Fixed\] Bug when using Laravel Octane 1-click, wouldn't consider aliases, it does that now
- \[Fixed\] When spawning the Laravel cronjobs from the Laravel tab, it wouldn't attach it to the site
- \[Fixed\] GitLab's oauth tokens expired after 2 hours, we made them renew automatically in deployments (this can still result in push errors if you use Statamic for example, we recommend setting up your repository using SSH instead of HTTPS)
- \[Removed\] Cookie banner (we don’t set any tracking cookies anymore)

**Changelog Ploi API**

- \[Added\] Tenants documentation (<https://developers.ploi.io/tenants/list-tenants>)
- \[Added\] Force SSL request just like in the panel (<https://developers.ploi.io/certificates/create-certificate>, <https://roadmap.ploi.io/projects/6-api-level-requests/items/20-ssl-via-api-force-request-skip-dns-verification-site-level-request>)

**Changelog Ploi Core**

- \[Added\] BRL currency
- \[Added\] PHP version on sites list
- \[Added\] Site aliases
- \[Added\] Ability to receive an email when a customer creates a site
- \[Fixed\] Synchronizing sites all used the wrong foreign ID

## Ubuntu 22 support has arrived 🎉

URL: https://ploi.io/news/ubuntu-22-support-has-arrived
Published: 2022-05-04

Ubuntu 22 has been out since April 22, 2022, and it was time we started supporting this new LTS OS as well. Not all providers support this OS yet, but the ones that do, are now available to be installed via Ploi 🙏

If you’re currently on an older version of Ubuntu, don’t worry, the end of life of those (and that’s why we only provide LTS) is over the year 2028. To give you a small example, **Ubuntu 18.04 LTS** end of life is the year **2028**, **Ubuntu 20.04 LTS** end of life is the year **2030** and **Ubuntu 22.04 LTS** end of life is the year **2032**, so plenty of time to provision a new server later. More on that here: <https://ubuntu.com/blog/what-is-an-ubuntu-lts-release>[![](https://ploi.io/storage/BXTX4l9Ed7bEPTXTvg5yYNutL34GtZM1bcM1pHVM.png)ubuntu-lts.png 17.14 KB](https://ploi.io/storage/BXTX4l9Ed7bEPTXTvg5yYNutL34GtZM1bcM1pHVM.png)

From our perspective, we can’t recommend upgrading from an older Ubuntu version to a newer version within your existing server. The best is to provision a fresh server and migrate sites/data over slowly. This ensures you have a fresh server, all services run with the latest updates and you do not have to migrate/upgrade/update any packages to make it work.

**Changelog Ploi**

- \[Added\] Ubuntu 22 support 🎉
- \[Added\] Ability to manage Meilisearch keys (including permissions)
- \[Added\] Ability to edit notification channels in your profile
- \[Added\] Craft CMS logs tab
- \[Added\] Ability to specify path styled endpoint for S3 backups
- \[Added\] Laravel Horizon tab &amp; card (<https://ploi.io/documentation/domains/how-do-i-configure-laravel-horizon-statistics-in-ploi>)
- \[Added\] schedule:list button to Laravel tab
- \[Added\] Active label to IP lock section in security tab from your profile to see which lock is being used at the current time
- \[Added\] {COMMIT\_AUTHOR} deploy script variable to get the name of the author of the deployed commit
- \[Added\] Banner for Russian users and how to manage their payments
- \[Added\] Site level cronjobs
- \[Added\] When using global search, you may now also search for system users for a site
- \[Changed\] Database backups occur now earlier in the night when selected nightly interval
- \[Improved\] Gitlab’s deeper project selector when cloning or updating the repository is now recursive
- \[Improved\] Site monitoring is now much more stable and reliable
- \[Improved\] Server build speeds, we now poll within a minute to see whether the server is ready from the server provider to be installed, this increases the build time a lot (this only counts for server provider installations)
- \[Improved\] Unable to proxy a wildcard record for Cloudflare in DNS tab
- \[Improved\] Validation for synchronized deployments now validates properly
- \[Improved\] Site file backups, now using the complete relative path to the zip for more consistency
- \[Fixed\] Backup pagination when pausing/unpausing backups
- \[Fixed\] All team permissions selectable are now correct in create &amp; edit forms
- \[Fixed\] When spawning a NodeJS server with supervisor, the wrong system user would spawn the process, respawning solves this
- \[Fixed\] When configuring a site file backup with SFTP and SSH key, it would display the wrong SSH key if a custom system user was used

**Changelog API**

- \[Added\] Ability to create servers without passing a name (gets generated automatically)
- \[Added\] IP’s endpoint (<https://developers.ploi.io/getting-started/ip-addresses>)
- \[Added\] Laravel Horizon statistics endpoint (<https://developers.ploi.io/sites/laravel-horizon-statistics>)
- \[Added\] Modify site’s NGINX configuration file (<https://developers.ploi.io/sites/get-nginx-configuration>)
- \[Improved\] Tenants validation when adding new ones (more strict)

## Ready for 2022 🤓

URL: https://ploi.io/news/ready-for-2022
Published: 2022-02-10

The first time we get back to you in 2022! It’s been a while, but for clear reasons. Let’s update you in this post!

**Mobile app update**

We’ve revamped the app a lot, it was long due since release and small releases but finally, we’re proud to do one of the bigger releases once again. Android is currently already available and Apple is currently reviewing our submitted build.

One of the significant updates to the app is Biometrics, allowing you to protect the app with Face ID / Touch ID / Fingerprint Sensor / Face recognition. Be sure to try it out!

- iOS: <https://apps.apple.com/us/app/ploi/id1556215510>
- Android: <https://play.google.com/store/apps/details?id=io.ploi.app>

**Laravel logs tab**

Laravel lovers unite! We’ve always felt reading Laravel logs is a pain (because you had to login into SSH). That’s why we added this beautiful logs view to the Laravel tab, where you can read all the log files from your Laravel application.

![](https://ploi.io/storage/hizhd0QCf1V8GgurYl97CNNXHmC6MWiLHYO3Uhhe.png)

**Whitelist IP addresses for API tokens**

Another security update besides the biometric update in the mobile app, we’ve also gone ahead and added the ability to whitelist IPs per API token. This will improve security significantly when using the Ploi API.

![](https://ploi.io/storage/5Xuh8n0pPtUySKkJoHX4FTFGNFqdaaRtUyMjxHek.png)

**That’s it?**

No, besides these updates we have a packed change log again. As well as for the app, Ploi itself, the API and Ploi Core. We have also been very busy in January with **bug fixing** in the background, doing **responsive fixes,** and rewriting our **tests**.

*Bugfixing*

It is good to know that our changelogs are handwritten and do not always contain every piece of change in our system, some changes are too small to document so we just skip them entirely. Being said, we’ve focused a lot on bug fixing reported from our discord in the roadmap. Most is background stuff that you can’t see, but good progress has been made!

*Responsive*

We’ve had a few reports from users via support or discord telling us a few things were ‘off’ when using the responsive version of the Ploi panel. We’re actively working on that and have already made significant changes.

*Tests*

Back in 2017 when we started with Ploi, its tests grew fairly slowly with it. Until 2021 December it had 854 tests with decent coverage. In January 2022 we’ve decided to drop all the PHPUnit tests we had, and start fresh in PestPHP. As you can imagine, this is a time-consuming task to rewrite 854 tests from scratch. So why do it?

2 reasons:

- We want to have a higher coverage of our own written code to ensure every piece of route, class, function, service, util and so on is tested thoroughly.
- We want to raise our code quality, by rewriting our tests, we’re also re-evaluating our code and are able to decide whether something needs a refactor, and then get a fresh test.

Up until now with rewriting to PestPHP tests, we’re at 117 tests with 365 assertions. In future news posts, we’ll keep you informed about our progression!

**Changelog App**

- \[Added\] Server insights
- \[Added\] PHP 8.1 option when installing a server
- \[Added\] Biometrics (Face ID/Touch ID/Fingerprint) authentication for extra security
- \[Added\] Ability to reload PHP OPcache (server level, PHP tab)
- \[Updated\] Cleaned a lot of code, reduced app size
- \[Updated\] Core versions that improve performance
- \[Updated\] Status tab when a service has the right status, disable the correct buttons (stop/restart/start)
- \[Updated\] Reduced header size which allows more room for data &amp; lists
- \[Updated\] Removed search in the header and added searches in overviews
- \[Updated\] Removed number of SSH keys in the dashboard (why did we have this there anyway?)
- \[Fixed\] Status indicator pulsating margins

**Changelog Ploi**

- \[Added\] Staging production sites now have deploy script variables as well
- \[Added\] Ability to install Amplify for Ubuntu 20 as well
- \[Added\] Ability to select branches from a dropdown when installing a GIT repository
- \[Added\] A new deploy script variable {DO\_NOT\_NOTIFY} is now available to skip notifications
- \[Added\] When using the Ploi Raycast extension, log items will show a badge that it’s been performed through Raycast
- \[Added\] Ability to restart a daemon via a deploy script with {RESTART\_DAEMON 1} (where 1 is the ID of your daemon)
- \[Added\] <https://ploi.shop>
- \[Added\] Ability to whitelist IP addresses for API tokens
- \[Updated\] Responsive, still not there but we’ve come a long way
- \[Updated\] New invoice design
- \[Updated\] Automatic incident reporting for status pages now use the label if entered for a server, instead of the name
- \[Updated\] Nextcloud 1-click installer to version 23
- \[Fixed\] Several bugfixes for database backups have been done
- \[Fixed\] Refreshing DigitalOcean’s plan would not grab them all (API pagination issue)
- \[Fixed\] Custom interval for cronjobs when using @reboot is now allowed
- \[Fixed\] MeiliSearch client now uses bearer token to communicate with your meilisearch server
- \[Fixed\] When using Google Drive backups and the rotation, we didn’t add the supportsAllDrives flag so shared drive rotation didn’t work, fixed now
- \[Released\] Raycast Ploi extension is now available (<https://www.raycast.com/Cannonball/ploi>)

**Changelog API**

- \[Added\] Rate limiting per plan (<https://developers.ploi.io/getting-started/rate-limiting>)
- \[Added\] Description in HTML available now as well (<https://developers.ploi.io/insights/detail-insight>)
- \[Added\] Ability to update root domain via API (<https://developers.ploi.io/sites/update-site>)
- \[Added\] Ability to whitelist IP addresses for API tokens

**Changelog Ploi Core**

- \[Added\] Ability to rotate system logs
- \[Added\] Ability to remove the logo
- \[Added\] Ability for your users to revoke credit card
- \[Added\] Favicon when the logo is uploaded
- \[Added\] Ability to show renewal date for customers
- \[Added\] Ability to select a database type for customer server creations
- \[Fixed\] DNS records would not always display properly
- \[Upgraded\] TailwindCSS 2 &gt; 3

## Recap Ploi 2021 🎆

URL: https://ploi.io/news/recap-ploi-2021
Published: 2021-12-16

Just like we started [last year's article](https://ploi.io/news/recap-ploi-2020), this year was not much different. COVID-19 is still in our lives and by the looks of it, it's going to take a while before we get rid of it too. 




Anyhow, we are not doctors or scientists, so let's get on with the positive! 🤓




This year was once again a wild ride, we've been able to introduce so many awesome new features &amp; tools to speed things up server management-wise. Let's sum up a few of the highlights up for 2021!

- [Release a mobile app](https://ploi.io/news/mobile-app-now-available-bulk-assign-notifications)
- [Added a bunch of awesome 1-click installers](https://ploi.io/news/new-1-click-installers-available-security-improvement)
- [1-click enable a Laravel Octane application](https://ploi.io/news/1-click-install-laravel-octane-is-now-available)
- [A fresh frontend design](https://ploi.io/news/launched-a-new-frontend-design)
- [Added a marketplace for users to share their knowledge](https://ploi.io/news/marketplace-is-now-available)
- [Easily deploy your NodeJS applications](https://ploi.io/news/nodejs-support-is-here)
- [Server insights help you discover potential issues in your server](https://ploi.io/news/server-insights-is-now-available)
- [Welcomed a new partnership with Katapult server provider](https://ploi.io/news/welcome-new-server-provider-katapult)
- [Ploi Core became a 1-time payment product](https://ploi.io/news/postgresql-13-is-now-available)




**NGINX 1-click install Amplify**




NGINX Amplify is a free, SaaS-based monitoring tool for NGINX Open Source and NGINX Plus. With NGINX Amplify you can monitor performance, keep track of infrastructure assets, and improve configuration with static analysis.

And now, you may easily install NGINX Amplify with 1-click on the button. Head over to your manage tab, press “Install NGINX Amplify” and enter your API key, it's as easy as that. Obviously, we also offer the ability to easily uninstall.




**Log4j**




Just recently a security vulnerability was discovered in the Log4j package for Apache (CVE-2021-45046). In response to that, we’ve done extensive testing to see whether Ploi provisioned servers we’re vulnerable as well. We can safely say that Ploi has never installed Log4j, and does not install packages that rely on the Log4j package. Obviously, if you’ve manually installed any software, we still recommend checking out whether your server is vulnerable. 




We’ve also tweeted about this matter: <https://twitter.com/ploi_deploy/status/1470331708960555010> (be sure to follow us 💙)




**What's coming for 2022?**




So when you’re looking at our [roadmap](https://roadmap.ploi.io/), you might have noticed we’re not done yet. There is so much awesome stuff on there, and we do not stop working until we’ve finished all those cards. If you have a feature in mind or discovered a bug, do not hesitate and submit it to our roadmap. We also post regularly on our social media about the updates we do. 




Be sure to follow us on social media!




Twitter: <https://twitter.com/ploi_deploy>

Facebook: <https://facebook.com/ploideploy>

Instagram: <https://www.instagram.com/ploi_deploy/>




Thank you for using Ploi in 2021 and we hope to see you in 2022, waiting for a big bag of features to come that year 😎👋




Here is the recap of last year: [https://ploi.io/news/recap-ploi-2020](https://ploi.io/news/recap-ploi-2019)




**Changelog**

- \[Added\] 1-click install NGINX Amplify
- \[Added\] New server insight (open package &amp; security updates)
- \[Added\] Forced to remove the scrollbars on the UI, especially for windows devices
- \[Added\] Ability to see where a log item came from (Ploi Core, Ploi API, Mobile App)
- \[Added\] You may now enter your VAT number to your profile without getting in touch with support to get verified
- \[Added\] PHP 8.1 support
- \[Added\] Ability to relate databases to sites (for more clarity as to which site is using which database)
- \[Added\] Ploi will now tell you about the —no-dev flag for composer you can add in your deploy script (more tips: <https://ploi.io/documentation/deployment/composer-installation-tips>)
- \[Added\] Ability to specify an environment file when creating a daemon
- \[Updated\] Email server list of accounts now shows 200 email accounts
- \[Updated\] Made the environment edit window bigger
- \[Updated\] Branding kit &amp; stickers (<https://ploi.io/branding>)
- \[Fixed\] Small issue with colors in the deploy log, you might not notice this, but it’s fixed
- \[Fixed\] Show error when max upload size is changed and not correct entered
- \[Fixed\] DNS record issue when using TXT &amp; Cloudflare, resolved now
- \[Fixed\] When changing the PHP version while having tenants to that domain, those tenants will now also shift the PHP version
- \[Fixed\] Issue with team members and elastic search servers in regards to saving




**Changelog API**

- \[Added\] Server insights to API (<https://developers.ploi.io/insights/list-insights>)
- \[Added\] Tenants feature documented properly now (<https://developers.ploi.io/tenants/list-tenants>)
- \[Added\] Ability to set project\_type when creating a site (<https://developers.ploi.io/sites/create-site>)

## Welcome new server provider: Katapult

URL: https://ploi.io/news/welcome-new-server-provider-katapult
Published: 2021-11-05

[![](https://ploi.io/storage/Wh1V74foNrgJpiJ1HxvC4YOYk8h6xsdY9qaop5br.jpg)og-katapult.jpg 652.26 KB](https://ploi.io/storage/Wh1V74foNrgJpiJ1HxvC4YOYk8h6xsdY9qaop5br.jpg)It has been a long while since we were able to announce a new server provider integration in Ploi. This changes today, we are happy to announce Katapult has become an official integration in Ploi.



Katapult is a server provider that has been around for over 17 years already, and since 2017 their main focus was becoming eco-friendly. According to their statistics, they have already planted over 1(!) million trees!




We’ve been able to test Katapult’s platform thoroughly when building the integration for Ploi, and we can say we’re very pleased with the promises they make. Their panel is fluent &amp; fast, and deploying servers with Katapult usually doesn’t take longer than 30 to 60 seconds.




To add Katapult as a server provider to your account follow this guide: <https://ploi.io/documentation/server-providers/add-katapult-as-server-provider>




**Changelog**

- \[Added\] Katapult server provider
- \[Added\] Support for MariaDB 10.6 (ubuntu 20) \* PostgreSQL 14
- \[Added\] Ability to delete ignored insights
- \[Added\] Ability to have servers in status pages collapsed/uncollapsed by default
- \[Added\] New Hetzner datacenter (Ashburn)
- \[Added\] Ability to restart your NodeJS application server after deployment (checkbox in the settings tab)
- \[Added\] Added timestamp to .sql file backups
- \[Added\] Ability to press CMD/CTRL + S to save inside deploy script
- \[Updated\] Made several modals with the editor inside larger (a remake of all the modals is coming very soon)
- \[Fixed\] Bug for spawning a NodeJS server button loading state (kept being disabled)
- \[Fixed\] Several server insights bugs
- \[Fixed\] A bug in Hetzner DNS that wouldn’t save a record when creating a new one
- \[Fixed\] Pagination inside backups overview when in the files tab
- \[Fixed\] An issue when you changed the domain, the available queue workers would also update all sub-domain’s queue workers, this behavior is fixed now
- \[Fixed\] Server service status tab would not reflect new notification channels when just added, it does now
- \[Fixed\] Overflow issue with the collapsed sidebar on the left when a small window was being used

## Server insights is now available 🛰

URL: https://ploi.io/news/server-insights-is-now-available
Published: 2021-10-29

We’ve been working on this awesome new feature called "Insights" for quite a while now. Our BETA testers were able to test out this feature and submit suggestions to this addition to Ploi.

We are happy to announce that "Insights" is now available for everyone (subscription required)!




Server insights is a great feature by Ploi that allows you to get help with optimizations. A good example could be the **max\_children** being reached for PHP. Ploi will help you discover these errors and help you fix these.
[![](https://ploi.io/storage/Qq4uvY8vL70NdtZSYlJ5kGDYpIur2ZUSSo96iTs9.png)i17FWlc6NoPMHww9iJgRVp4pGIPox03djsGQ2Yip.png 162.13 KB](https://ploi.io/storage/Qq4uvY8vL70NdtZSYlJ5kGDYpIur2ZUSSo96iTs9.png)

Ploi will check obvious log files, service statuses, and more to determine whether there are optimizations possible for your server. You can visit the insights on server level, on the left hand side press "Insights".



Currently, it will check for these optimizations:

-  PHP max\_children reached, per PHP version and per pool
-  Check if supervisor is running without using it
-  Check if Node could use an LTS update
-  Check if the system clock is in sync
-  Check if the load average is high for a longer period of time
-  Check if the MySQL/MariaDB binlogs are growing and filling up your disk space

Ploi will also allow you to automatically fix these optimizations, so you don't have to worry about difficult configurations.




**Server service notifications**

There is nothing more annoying to discover one of your services isn’t running. This is why we introduced the ability to attach notification channels per-service. Easily get notified through one of your favorite notification channels about the status of your service.
[![](https://ploi.io/storage/tP34dAqRlWnRydEH1ARc8b10tLEvqnIqVtBAZU8i.png)Screenshot 2021-10-29 at 11.32.10.png 148.67 KB](https://ploi.io/storage/tP34dAqRlWnRydEH1ARc8b10tLEvqnIqVtBAZU8i.png)

**Changelog**

- \[Added\] New editor in Ploi monaco has been added
- \[Added\] Ability to select a script as default deploy script
- \[Added\] Webhook to deploy staging to production site (visible in production site)
- \[Added\] When a server is unreachable, it now also shows a list of sites that are affected
- \[Added\] Team member administration now shows truncated email addresses for clarity
- \[Added\] Live deploy log (and log items) should now be colorized
- \[Added\] Ability to attach notifications to service statuses so you get notified when a service like NGINX goes down
- \[Added\] New York location for UpCloud server provider
- \[Added\] Ability to specify task-workers for Laravel Octane when using the swoole driver
- \[Updated\] UpCloud server integration to use the latest API &amp; SSH keys authentication method for more security
- \[Updated\] Health URL check delay from 5 seconds to 10 seconds after deployment
- \[Updated\] NodeJS 14 is now the default (coming from 12), upgrade article: <https://ploi.io/documentation/server/how-to-upgrade-node-12-to-node-14>
- \[Fixed\] Gitlab subgroups repository installation is now working: <https://roadmap.ploi.io/b/site-level-requests/support-sub-levels-in-git-repositories/>
- \[Fixed\] Gitlab repository list now also shows the organization and/or attached repositories
- \[Fixed\] Do not allow the " character in SSH keys (breaks SSH config)
- \[Fixed\] Updated minio server type to the latest variables (deprecated vars were used)
- \[Fixed\] Issue with setting default site template when uninstall repository, fixed now
- \[Fixed\] "Ploi" in "Ploi" (modal) issue when session expired and you clicked a link (for anyone else that’s using InertiaJS: <https://twitter.com/dennis_smink/status/1443502869135740928>)
- \[Fixed\] SSL label tooltip would not be visible for the first site, fixed now
- \[Fixed\] Autocomplete fields on the login, register &amp; password forget pages for password managers
- \[Fixed\] When altering php max execution time other variables would possibly get touched as well




**Changelog API**

- \[Added\] Ability to enable/block robots via api (<https://developers.ploi.io/sites/robot-access>)
- \[Added\] Ability to install ploi monitoring when creating a server on the fly (if your subscription allows this) (<https://developers.ploi.io/servers/create-server>

## NodeJS support is here 🤩

URL: https://ploi.io/news/nodejs-support-is-here
Published: 2021-09-03

It's one of the most requested features in Ploi: official NodeJS support. And we're excited to share to you that this is now available for everyone!




The roadmap in question should already tell you that this was a very populair requested feature: <https://roadmap.ploi.io/b/panel-requests/add-nodejs-support/>

[![](https://ploi.io/storage/MdcO1uOPz5ULrQfJR5phUTadUFfBO5cyLDWr7Tmj.jpg)Screenshot 2021-09-02 at 09.09.49.jpeg 49.37 KB](https://ploi.io/storage/MdcO1uOPz5ULrQfJR5phUTadUFfBO5cyLDWr7Tmj.jpg)

We've made the best out of this feature already, there's no need to do any complicated configuration. It's literally a push on the button the spawn a NodeJS server with the service you desire. Currently PM2 and Supervisor are available to be used as your preferred driver to run your NodeJS server with.




It's as easy as creating a new site and while doing that select the project type NodeJS, of course, you can also do this after you’ve created a site. Ploi will then make sure the proper NGINX configuration is used to proxy your NodeJS server through NGINX. After this, you're more than welcome to add custom configuration to your NGINX host without losing this.




Next install your repository (we've got a demo repository here if you want to try: <https://github.com/ploi-deploy/nodejs-example>) and make sure packages are installed (you can now also select &#96;npm install&#96; when installing your repository). After this, head over to the NodeJS tab, adjust settings to your likings and spawn the NodeJS server!




A quick demo video illustrating how easy it is (1 minute): <https://www.youtube.com/watch?v=_ooZFv0UkHE>




Besides this great news, we’ve got a **packed** changelog again.. Have a look!




**Changelog**




- \[Added\] NodeJS support
- \[Added\] Deploy script variable {COMMIT\_HASH} which returns the commit hash
- \[Added\] Ability to transfer servers to another Ploi account
- \[Added\] Ability to attach notifications for site uptime monitors
- \[Added\] Ability to clone sites on the same server
- \[Added\] Ability to force team members to use 2FA or IP lock login features
- \[Added\] New default site template (<https://github.com/ploi-deploy/template>)
- \[Added\] Ability to toggle file backup status in backups overview
- \[Added\] Ability to limit sites per team, per member and per server
- \[Added\] Alex (<https://ploi.io/about>)
- \[Added\] Ability to copy custom commands for Laravel tab to other sites
- \[Added\] Ability to view logs per deployment (message is clickable)
- \[Added\] When deploy script is "dirty", and you press deploy, it will now automatically save
- \[Added\] When changing a site’s domain and a file backup has been setup, that file backup will now also update domain
- \[Added\] Ability to separate sites with projects just like you could with servers
- \[Added\] Sites in server will now show tooltip if aliases are present when you hover on domain
- \[Added\] Laravel queue tab now has backoff and memory input to be configured
- \[Added\] Ability to specify a port for SFTP backups in the host
- \[Added\] Animated favicon when deploying (indicating status)
- \[Added\] Pricing page now has a yearly checkbox for pricing with discount (<https://ploi.io/pricing>)
- \[Added\] MongoDB service to status list so it will be visible in status tab
- \[Fixed\] Using rollback feature when site system user is different would still use default ploi user
- \[Fixed\] Few responsive fixes
- \[Fixed\] Few darkmode fixes
- \[Fixed\] Automatic system user creation and www domains are now excluding www
- \[Fixed\] Dropbox backups with specific path would fail upon rotating, this is fixed now
- \[Fixed\] Hetzner DNS records had some issues, in particular with MX records, resolved now




**Changelog Ploi Core**




- \[New\] Fresh landingpage [https://ploi-core.io](https://ploi-core.io/)
- \[Added\] Ability for users to install custom certificates
- \[Added\] Ability for admins to synchronize existing sites
- \[Added\] Ability for admins to synchronize all sites &amp; servers
- \[Added\] Autofocus to login page
- \[Added\] Ability to setup terms of service and privacy policy for users to accept
- \[Added\] Ability for admins to see Horizon status
- \[Added\] Ability for admins to see how many regions &amp; plans a provider has when synchronizing
- \[Added\] Ability for admins to select per providers which regions and plans should be available
- \[Fixed\] Permission fix for server updating




**Changelog API**




- \[Added\] Ability to install custom certificate via API (<https://developers.ploi.io/certificates/create-certificate>)
- \[Added\] Ability to toggle quick deploy (<https://developers.ploi.io/repositories/toggle-quick-deploy>)

## PostgreSQL 13 is now available 👏

URL: https://ploi.io/news/postgresql-13-is-now-available
Published: 2021-07-19

We’ve got a packed changelog once again for you today!




**PostgreSQL 13 support**




It’s actually been requested quite a lot, PostgreSQL 13 support. We’ve now added this and it is available for Ubuntu 18 &amp; 20.




Just create a new server, and in the dropdown select "PostgreSQL 13".




**Ploi Core is now a 1-time payment product**




We’ve changed the pricing for Ploi Core definitely. It is now a 1-time payment of €149 or 180$ for one year of updates &amp; support. After that it will still be available of course, but without updates &amp; support.




Besides the 1-time payment, you will also need an Unlimited subscription in Ploi in order for Ploi Core to work.

More information at <https://ploi-core.io>




**Elasticsearch server support**




This server type has also been requested many, many times (<https://roadmap.ploi.io/b/server-level-requests/elasticsearch-server-support/>) and is available right away! 




Easily create your own elasticsearch server to give your search results a boost 🚀




**Changelog**

- \[Added\] PostgreSQL 13 support
- \[Added\] Elasticsearch server type (<https://ploi.io/features/elasticsearch-server>)
- \[Added\] Ability to set your own custom template when creating new sites (<https://ploi.io/documentation/domains/how-do-i-set-my-own-default-template>)
- \[Added\] Ability to use 1-click marketplace scripts for clean sites
- \[Added\] Warsaw region to UpCloud regions
- \[Added\] Sydney region to UpCloud regions
- \[Added\] {CLEAR\_NEW\_RELEASE} deploy script variable for zero downtime deployments
- \[Added\] Server logs now show which user executed that task
- \[Added\] Supervisor logs to logs tab
- \[Added\] Ability to transfer server (<https://ploi.io/documentation/server/how-do-i-transfer-a-server-to-another-account>)
- \[Added\] A new "Setup" tab for Laravel has been added so you can easily create the cronjob &amp; horizon daemon
- \[Added\] Laravel tab now also shows for Statamic projects
- \[Added\] Ability to specify a folder inside dropbox backups
- \[Improved\] Backups overview when creating backups the right tab is now selected
- \[Improved\] A lot of darkmode issues have been resolved
- \[Improved\] Matomo 1-click installer now does proper modifications to make it a lot more secure
- \[Improved\] If a new team member signs up and gets attached to a team, the trial notification bar at the top gets removed now
- \[Improved\] Service statuses tab is now sorted by name
- \[Fixed\] Source for zero downtime deployment was not saved properly
- \[Fixed\] Saving custom Laravel commands sometimes deleted the wrong command, fixed now
- \[Fixed\] Changing the PHP max execution time in Ploi was bugged, this is resolved now
- \[Fixed\] Team users could not use the file explorer if that was allowed, this is resolved now




**Changelog Ploi API**

- \[Added\] Ability to duplicate database via API (<https://developers.ploi.io/databases/duplicate-database>)




**Changelog Ploi Core**

- \[Changed\] Pricing is now €149 ($180) as a **1 time payment for 1 year updates &amp; support** (you will still need a Unlimited subscription with Ploi)

## Marketplace is now available 🏫

URL: https://ploi.io/news/marketplace-is-now-available
Published: 2021-06-07

As of today we’re proud to announce the Marketplace inside the Ploi panel![![](https://ploi.io/storage/luowlpjUxxz7fdC6HjgllU5BbSMomm5fry1DQ3aF.png)Marketplace Screenshot](https://ploi.io/storage/luowlpjUxxz7fdC6HjgllU5BbSMomm5fry1DQ3aF.png)**What is the marketplace?**The marketplace is a place where you can share your nifty scripts with the community. As well as creating new scripts you may also copy over other scripts, or even fork them and edit them to your own likings.
There are four types of scripts:

- Webserver templates
- Scripts
- Deployment scripts
- 1-click installation scripts

This opens up a lot of possibilities, especially with the 1-click installation scripts. This allows you to install an application to your site directly from a script which another community member has submitted to the marketplace.
You can easily subscribe to the script, and then select it after you’ve installed your site to your server.
Visit the marketplace right away: <https://ploi.io/panel/marketplace>
You can read more about the concept here: <https://roadmap.ploi.io/b/panel-requests/ploi-marketplace/>
**Changelog**

- \[Added\] Marketplace for scripts, 1-click installs, webserver templates &amp; deploy scripts
- \[Added\] DigitalOcean Spaces driver for backup support
- \[Added\] Custom S3 driver for backup support (both databases and site file backups)
- \[Added\] Ability to login with Gitlab
- \[Added\] Load balancer SSL certificates can now be aliased as well
- \[Added\] Watch option flag for Laravel Octane
- \[Added\] New "queue:retry all" button to Laravel tab
- \[Added\] New log type added in server level under logs tab: UFW logs
- \[Added\] Ability for dropbox backups to backup in sub-folders
- \[Added\] Database name to confirm delete modal has been added to make sure you’re deleting the right one
- \[Updated\] Server queue log viewing is now rotated so you alway see latest first
- \[Updated\] Commits tab
- \[Updated\] Global search now has a max height with scrolling and sticky headers
- \[Fixed\] Cronjob under different user
- \[Fixed\] oAuth scopes for Gitlab were wrong (not enough permissions), have been added now
- \[Fixed\] Server monitoring times was in wrong timezone, now uses user setup timezone

## Launched a new frontend design 🎨

URL: https://ploi.io/news/launched-a-new-frontend-design
Published: 2021-05-17

Some of you already might have noticed, we've just recently launched a brand new fresh design for our frontend 🥳 
[![](https://ploi.io/storage/EwECV24k048bd44sVhBfjtbIvtk2uQ7MrEs3GBsi.png)CleanShot 2021-05-17 at 10.35.36.png 282.54 KB](https://ploi.io/storage/EwECV24k048bd44sVhBfjtbIvtk2uQ7MrEs3GBsi.png)With a lot more readability, a new documentation section we hope to present a much more professional look to you.

We'd love to hear what you think! 💪

With this, we also have a packed changelog again for you 😍

**Changelog**

- \[Added\] Brand spanking new design 😍
- \[Added\] Laravel Octane is now available for production use
- \[Added\] Ability to configure database backups with new intervals weekly &amp; monthly
- \[Added\] Label to database overview with counter of how many database backups there's configured
- \[Added\] Improved cron expression validator to prevent user errors
- \[Added\] Ability to view average deploy time
- \[Added\] Ability to lock your account to an IP address including a label
- \[Added\] Ability to suspend and resume websites
- \[Added\] Support for Github emoji’s in recent deployments log
- \[Added\] Ability to disable robots for status pages
- \[Added\] Team servers now also get shown on the servers overview for team members
- \[Added\] Server name now shows in monitoring limit emails in the content
- \[Added\] When using global search it now shows server label after site names (handy if you have duplicate sites)
- \[Added\] Ability to select workspaces when installing a GIT project from Bitbucket
- \[Added\] You now need to enter your password again if you want to visit Profile -&gt; Security for improved security
- \[Added\] New security page (https://ploi.io/security)
- \[Added\] We now notify you about expiring API tokens in time
- \[Added\] Recent deployments now also work for non-integration GIT providers
- \[Added\] Documentation articles in frontend now also show latest updated date
- \[Added\] Ability to install WP CLI with 1-click in the servers -&gt; manage tab
- \[Improved\] We now default to PHP 8.0 when installing a new server
- \[Improved\] Git cloning repositories now has way better error handling if cloning fails
- \[Fixed\] Encoding issue for live deploy log failed when mallformed characters were found
- \[Fixed\] When using staging to production feature with a 1-click installer, project type was not set for production site, this is resolved now
- \[Updated\] Using TW dark mode feature now instead of a 3rd party package
- \[Updated\] Server monitoring statistics are now saved in a redis instance for better speed
- \[Updated\] Increased the processing time for staging to production sites


**Changelog Ploi API**

- \[Added\] Ability to suspend &amp; resume websites (https://developers.ploi.io/sites/suspend-site)
- \[Fixed\] Network rule type parameter was not accepted, it is now (tcp or udp) (https://developers.ploi.io/network-rules/create-network-rule)

## 1-click install Laravel Octane is now available!

URL: https://ploi.io/news/1-click-install-laravel-octane-is-now-available
Published: 2021-04-22

We've worked hard on making installing Laravel Octane as easy as possible for you, and we're happy to present you can now 1-click enable a Laravel Octane server easily.

You have the ability to save the settings desired to your needs and spawn an Octane server on the fly. We’ll also show you the output log live. You can easily enable Octane for new sites, but also for existing sites.

When enabling, Ploi will switch from FPM to Octane (either Roadrunner or Swoole) and when you disable it will automatically switch back to FPM, so when changing Ploi will always keep your site online.

Do note that during this news item, Laravel Octane is still in beta and we do not recommend running it on a production website.

We've setup a real simple Github repository for you to give it a try: <https://github.com/ploi-deploy/laravel-octane-test>, you'll need at least Laravel Octane 0.3.1 or higher in your Laravel installation.

If you run into any issues or have any feedback please let us know!

**Changelog**

- \[Added\] Laravel Octane is now available through the Laravel tab
- \[Added\] Blue alert for when creating a backup and there's no DB's
- \[Added\] Ability to see what last API token usage was
- \[Added\] New starter kits are now available for Statamic
- \[Added\] Ability to exclude folders/files for site file backups
- \[Added\] Ability to edit site file backups
- \[Updated\] Cloudflare config for NGINX added 2 new IP addresses
- \[Fixed\] Invoice with a long billing address on one line would not break on new line, this is resolved
- \[Fixed\] Cloudflare DNS proxy would be disabled when you edit the record, solved now

**Changelog Ploi API**

- \[Added\] Ability to install Statamic via the API (<https://developers.ploi.io/apps/install-statamic>)
- \[Added\] Ability to provide a webhook\_url for server creations
- \[Updated\] Return ok response when updating .env file via API

## New 1-click installers available & security improvement 🔐

URL: https://ploi.io/news/new-1-click-installers-available-security-improvement
Published: 2021-04-07

Just recently, we’ve added three new 1-click installers which makes installing software a breeze.




These three 1-click installers have been added:

- Statamic 💜
- Craft CMS ❤️
- Matomo 💚

With Statamic &amp; Craft CMS you may easily let Ploi create a repository for you. While this might not sound logic at first, via this way you can clone locally and deploy right away with Ploi.



It also easily opens up the ability to try out any of these CMS systems which is great.



With that we’ve also released another security feature in Ploi to protect your account even more. You may now "IP lock" your account which means that your account is not accessible when the IP is not whitelisted.



When you try to access from a new location, we’ll send you a email containing a token that you can fill in to regain access to your account again. 




**Changelog**

- \[Added\] 1-click Statamic installer ✨
- \[Added\] 1-click Craft CMS installer ✨
- \[Added\] 1-click Matomo installer ✨
- \[Added\] Account IP lock feature ✨
- \[Added\] Whole new design for confirmation alerts
- \[Added\] New deploy script suggestions for Statamic projects
- \[Added\] Drop blur for modals &amp; confirmation modals
- \[Added\] Invoice link to subscription page
- \[Added\] New "Users" tab in databases tab to assign database users to other databases
- \[Added\] Laravel Octane deploy script suggestion to the deploy script suggestor
- \[Changed\] DigitalOcean plans now display in sub groups to provide more readability
- \[Changed\] Branch "master" now defaults to "main" for Github projects
- \[Fixed\] Creating new folders &amp; files in file explorer may now contain a - character
- \[Fixed\] Deleting network rule with protocol from specific IP address wouldn’t delete properly
- \[Fixed\] AWS database backup rotation now uses the correct bucket
- \[Fixed\] Some server providers do not allow underscores in server names, we updated our validation accordingly
- \[Started\] Preparations for Laravel Octane &amp; Swoole have been started… 👀

## Mobile app now available 📱 & bulk assign notifications!

URL: https://ploi.io/news/mobile-app-now-available-bulk-assign-notifications
Published: 2021-03-22

You might of already read it on Twitter, Discord or any other social media. 

We've been cooking up an awesome addition to the Ploi family: **a mobile app**! Both apps have been reviewed by Google &amp; Apple and both got approved without any problem.

You may now download the app via these links:

- iOS: <https://apps.apple.com/us/app/ploi/id1556215510>
- Android: <https://play.google.com/store/apps/details?id=io.ploi.app>

We'd love to hear your feedback or any suggestions, don't hesitate to get in touch with us about any! 

Besides the mobile app, we've also released another nice feature that allows you to bulk assign notifications to deployment notifications for example. You can find the bulk notifications button on your profile -&gt; notification channels tab.

**Changelog**

- \[Added\] Mobile app now available! (<https://ploi.io/features/app>)
- \[Added\] Ability to bulk assign notifications
- \[Added\] API tokens are now expanded with permissions per entity subject
- \[Added\] Amazon T3 plans available now
- \[Added\] Discord link to footer frontend
- \[Added\] Ploi now lets you know if debug mode is on from your Laravel app
- \[Added\] Statamic projects are now much better supported (specific Statamic tab available)
- \[Added\] Ability to enable DigitalOcean backups upon server creation
- \[Added\] Site details to settings tab in site level (ID, creation)
- \[Added\] Ability to specify a channel when using slack notifications
- \[Added\] Ability to read letsencrypt log in panel (from /var/log/letsencrypt/letsencrypt)
- \[Added\] Ploi now allows *ecdsa-sha2-nistp256* SSH key types
- \[Added\] Ability to change timezones
- \[Added/Fixed\] Ploi now forces CLI version for PHP when installing a new server
- \[Added\] SSH keys for users now get correct comments behind them
- \[Updated\] All new confirm modals over the whole ploi system now (dropped alertify)
- \[Fixed\] Quick deploy bugged out sometimes with wrong response errors, this has now been solved
- \[Fixed\] When using email server and you rebooted, it would not work anymore because redis didn't start, solved now
- \[Fixed\] Sites filter on server show was broken, works now
- \[Fixed\] On small screens the sidebars left (collapsed and open) would not be scrollable, this is scrollable now
- \[Fixed\] Network rule creation with multiple ports from a specific IP address was not possible, it is now
- \[Started\] Working on new 1-click installers.. sssssshh..


**Changelog Ploi Core**

- \[Added\] GBP currency
- \[Fixed\] Register fix for when you had a empty or false default package setting for open registrations


**Changelog Ploi API**

- \[Added\] Ability to restart server via API (https://developers.ploi.io/servers/restart-server)

## Planned maintenance & cool stuff coming 🙃

URL: https://ploi.io/news/planned-maintenance-cool-stuff-coming
Published: 2021-02-10

A new update long due! 



We've been busy with a lot of cool stuff in Ploi, some of them that are already released and some of them are already available. When you check out our roadmap (<https://roadmap.ploi.io/>) on the live section you'll see a lot of new stuff has been added, certainly worth it to check out this list.



We're also planning on doing more video tutorials on how to solve specific problems or setup specific use-cases. You're more than welcome to submit your idea's to this card so we can transform this into a video: <https://roadmap.ploi.io/b/general/youtube-instructional-videos/>


**Planned maintenance**

Due to the growth we are improving our server power. The planned maintenance is on **February 16th at 08:00 CET**, and it is expected to last about 30 minutes or less. During this time you will not be able to manage servers/sites via [ploi.io](https://ploi.io/). Neither will any of your services go down, everything will still keep on going like you're used to from [ploi.io](https://ploi.io/).



**You may now easily migrate from Forge**

Felix Schmid recently created an awesome tool to migrate from Forge to Ploi. The tool covers all the basics (and a bit more) to migrate everything to have a flying start. A migration costs 19€ and if you have more servers the price goes down. Check out <https://migrator.felix-schmid.de/> for more information.



**Changelog**

- \[Added\] Ability to rotate AWS site file backups
- \[Added\] Ability to synchronize databases to Ploi that have been created outside of Ploi
- \[Added\] Database backup failures are now notified via email as default
- \[Added\] Ability to add favicon to status pages
- \[Added\] Global backup overview to manage your database &amp; site file backups more easily
- \[Added\] New filter on site overview to see which sites have backups or not
- \[Added\] Ability to set a redis server password
- \[Added\] Ability for team members to create servers with the new permission
- \[Added\] Ability to select a SSH key from your profile to provision to your server
- \[Added\] Projects overview now shows how much servers there are inside that project
- \[Added\] Ability to select a toast notification position in your profile
- \[Added\] Ability to select a default server provider so you need less clicks upon server creation
- \[Added\] Ability to change to a custom repository when changing the repository remote
- \[Added\] GIF image added to the email testing notification
- \[Added\] Linode servers now get the label/server name passed in properly to reflect in Linode itself
- \[Added\] Ability to create sites via sites overview
- \[Improved\] A lot of dark mode improvements!
- \[Improved\] Health URL check is now much smarter
- \[Improved\] SSL icon on sites overview now has a nice tooltip with more information about the certificate
- \[Improved\] phpMyAdmin installation is now done differently (not using APT anymore, using a direct download)
- \[Improved\] General grammar errors
- \[Improved\] Interactive command validation, added php artisan wink:migrate check for missing —force flag
- \[Improved\] Team invite link is now valid for 24 hours, instead of 1 hour
- \[Updated\] SV language (<https://github.com/ploi-deploy/ploi-translations/pull/20>)
- \[Updated\] Load balancers now use HTTP2 version forced
- \[Fixed\] Team members couldn't edit DNS, now they can
- \[Fixed\] DNS key for Hetzner &amp; TransIP would be mixed with validation reporting, is now fixed
- \[Fixed\] Composer version changing didn't work properly (between version 1 &amp; 2), this is now fixed
- \[Prepared\] Preparations for PHP 8.1 have been started

**Changelog Ploi Core**

- \[Changed\] Pricing changed to a definitive price of 99€ (125$) per month

**Changelog Ploi API**

- \[Added\] Ability to set a rule type upon creation, also added on index (<https://developers.ploi.io/network-rules/create-network-rule>)
- \[Added\] You may now also pass in a description that gets reflected to the notes section in settings tab (<https://developers.ploi.io/servers/create-server>)

**Community**

Glenn has created a GitHub action to easily deploy from your GitHub actions, you can find this here: <https://github.com/Glennmen/ploi-deploy-action>

## Recap Ploi 2020 🎇

URL: https://ploi.io/news/recap-ploi-2020
Published: 2020-12-21

2020 was a strange and rough year, COVID-19 has changed our lives and has not gone unnoticed sadly. No one was expecting a worldwide pandemic at the start of 2020. Projects got cancelled, budgets got cut off and people have been laid off their jobs.




Aside from the annoying lockdowns and measures that had to be taken, we were not going to give up or back down. Instead, we've had a very busy year with a lot to tell you once again. In fact, we were happy to announce we started 2020 with a partnership together with DigitalOcean: <https://ploi.io/news/ploi-partnered-with-digitalocean>




To sum up 2020 for Ploi:

- Synchronized deployments - <https://ploi.io/news/synchronized-deployments>
- AWS S3 backups - <https://ploi.io/news/aws-s3-database-backups-have-arrived>
- Staging to production - <https://ploi.io/news/staging-to-production-sites-feature-is-live>
- Restore database backups &amp; duplicating - <https://ploi.io/news/restore-database-backups-duplicating-them>
- Service status tab - <https://ploi.io/news/service-status-tab>
- FastCGI cache - <https://ploi.io/news/fastcgi-cache-is-now-available>
- Brand new panel design released - <https://ploi.io/news/brace-yourself-weve-just-stepped-up-our-game>
- Let’s Encrypt wildcard support - <https://ploi.io/news/letsencrypt-wildcard-support-linode-partnership>
- Linode partnership - <https://ploi.io/news/letsencrypt-wildcard-support-linode-partnership>
- Cloudflare detailed statistics &amp; news feed - <https://ploi.io/news/cloudflare-detailed-statistics-news-feed>
- Dark mode - <https://ploi.io/news/introducing-dark-mode>
- Testing domains - <https://ploi.io/news/testing-domains-rolling-back-deployments>
- Rollback deployments - <https://ploi.io/news/testing-domains-rolling-back-deployments>
- Meilisearch server type - <https://ploi.io/news/meilisearch-server-support-ploi-core-is-released>
- Ploi Core released - <https://ploi.io/news/meilisearch-server-support-ploi-core-is-released>
- Webserver templates - <https://ploi.io/news/webserver-templates-composer-2-is-out>
- Added PHP 8.0 - <https://ploi.io/news/php-80-available-wordpress-qol-feedback>




A lot of these articles actually contain more features &amp; releases which we have not mentioned, it is totally worth it to read them through and get familiar with the features we offer. Besides the mentioned articles &amp; features there have been a lot of small additions to the system which are usually not always mentioned in the news articles but mostly on social media. However we have recently started with adding changelogs to our news items (as well as this one)




Be sure to follow us on social media!




Twitter: <https://twitter.com/ploi_deploy>

Facebook: <https://facebook.com/ploideploy>

Instagram: <https://www.instagram.com/ploi_deploy/>




That being said we are not going to stop here. We have a lot of plans for Ploi in 2021 and there is a lot coming (just by checking out our [https://roadmap.ploi.io](https://roadmap.ploi.io/) should say enough)




Thank you for using Ploi in 2020 and hope to see you in 2021, waiting for a big bag of features to come that year 😎👋




Here is the recap of last year: <https://ploi.io/news/recap-ploi-2019>




**Changelog**

- \[Improved\] SSL icon after site name with tooltip (<https://twitter.com/ploi_deploy/status/1336612577284124672>)
- \[Added\] Label to profile if your VAT is verified
- \[Added\] Ability to star servers (<https://twitter.com/ploi_deploy/status/1339509290793635841>)
- \[Added\] Ability to star sites
- \[Added\] Ability to pause corncobs
- \[Added\] Ability to sort sites in your server (<https://twitter.com/ploi_deploy/status/1339551935255461892>)
- \[Fixed\] Deployments are now in the correct timezone
- \[Fixed\] Create time had wrong meta title
- \[Fixed\] Site cloning feature keyscan host failures
- \[Fixed\] Queue worker log was looking inside wrong directory when custom system user
- \[Fixed\] General quick deploy fixes, should be a lot less buggy now
- \[Fixed\] Issue when creating crontab as root user, wrong log directory
- \[Updated\] Turkish language (<https://github.com/ploi-deploy/ploi-translations/pull/17>)

## PHP 8.0 available & WordPress QOL feedback

URL: https://ploi.io/news/php-80-available-wordpress-qol-feedback
Published: 2020-12-07

PHP 8.0 has been released on November 26th and we've had support for PHP since the RC versions. You may easily 1-click install PHP 8.0 via the PHP tab in your server.




Do note, since PHP 8.0 is fresh, not all applications will properly run or support PHP 8.0 yet. Obviously, with Ploi, you can easily serve multiple PHP versions per website so you can easily test this.




**WordPress Quality of Life Improvement**

We're planning on improving the WordPress integration even more. Over the last 2,5 years we've seen quite a few users submit WordPress feature to us that could be a major improvement to set up WordPress even more easily.




To keep track of everything we made a roadmap card with a list of features we're going to add. Feel free to add your comment with a feature suggestion for improving WordPress support &amp; integration in Ploi!




<https://roadmap.ploi.io/b/feature-requests/wordpress-qol-improvements/>




**Changelog**

- \[Added\] PHP 8.0 officially 🥳
- \[Added\] Webserver templates
- \[Added\] Max connection settings for load balancers available
- \[Added\] {COMMIT\_MESSAGE} deploy script variable is now available
- \[Added\] PHP CLI aliases for quick CLI versions (php56, php70, etc)
- \[Added\] Ability to add description to network rules
- \[Added\] Ability to see the source of a deployment (e.g. button, API, quick deploy, web hook, synced)
- \[Added\] Ability to select per SSH key in your profile if they need to be pushed to newly created servers
- \[Added\] Ability to disable robots for a site (settings tab site level)
- \[Added\] In SSL tab, you may now 1-click add all the added aliases easily to request SSL certificates
- \[Added\] In server providers tab (profile level) you may now see how many servers are attached to that server provider
- \[Added\] Turkish language
- \[Improved\] Health checker now checks from 4 locations after deployment, to see reachability and response time ✨
- \[Fixed\] Quick deploy received several fixes to improve stability
- \[Fixed\] Currency symbol in invoices
- \[Fixed\] Bugfix in social login on register page
- \[Fixed\] Render type for automatic order PDF has changed because unreadability for specific tools
- \[Fixed\] General design fixes, such as border radius not visible in dark mode and more




**Changelog Ploi Core**

- \[Added\] Ability to isolate sites per (Ploi Core) user &amp; site
- \[Added\] Currencies: NOK, AUD, CAD
- \[Added\] Ability to specify per user if a account password is needed to get FTP password
- \[Added\] Default language setting
- \[Added\] Sorting in billing for packages
- \[Added\] Coupon feature in billing
- \[Added\] Ability to create alert messages for your users
- \[Added\] Cloudflare DNS support
- \[Added\] Theme support (<https://docs.ploi-core.io/theme/create-your-own-theme>)
- \[Added\] Ability to upload your own logo
- \[Fixed\] Norwegian language key was wrong




**Changelog Ploi API**

- \[Added\] Ability to enable testing domain via API (<https://developers.ploi.io/sites/enable-test-domain>)
- \[Added\] Ability to view full logs
- \[Added\] Ability to request SSL for load balancers via API (<https://developers.ploi.io/load-balancers/request-certificate-for-domain>)
- \[Added\] Health URL statistics comes with site if it has this data

## Webserver templates & Composer 2 is out! ✨

URL: https://ploi.io/news/webserver-templates-composer-2-is-out
Published: 2020-10-26

It's been a while since we send out our latest newsletter, but that doesn't mean we haven’t been doing anything.




Progress is still well alive and ongoing strongly. We are so hyped to show you what’s coming, be sure to check out our roadmap to keep posted of the latest features, bugs and suggestions!




That being said, we've got something new to show you once again.




**Webserver templates!**

This feature makes it possible to save NGINX virtual host config files to your account, so you can select these to create your sites. Think of a specific Magento configuration, or a Statamic site where you need to do customization. 




You can select the webserver template when pressing the "Advanced" button upon creating a site, in there you'll find a dropdown containing all your created webserver template configurations.
[![](https://ploi.io/storage/O1RFkjP4c7NUJCAI5YMhuX5Az3hZL2ZjaoKnC2KK.png)CleanShot 2020-10-26 at 11.39.20.png 247.37 KB](https://ploi.io/storage/O1RFkjP4c7NUJCAI5YMhuX5Az3hZL2ZjaoKnC2KK.png)

**Composer 2 is out!**

Composer 2, with a huge performance increase has been released. All new servers provisioned by Ploi are automatically using the latest version. We leave it up to our users to upgrade from version 1 to 2, which is a real easy task to do so.




If you want to upgrade, all you need to run is this command in your command line:




**composer self-update —2**




From there, composer will do everything to update to version 2.




More information about version 2 and the changes that are done:




<https://blog.packagist.com/composer-2-0-is-now-available/>




**Changelog**

- \[Released\] Webserver templates ✨
- \[Added\] Easy copy to clipboard button when creating API keys
- \[Added\] TransIP as DNS provider
- \[Added\] Ability to see the deployment time per deployment in deployments card
- \[Added\] Status indicators now have pulsing background to make more clear something is going on
- \[Added\] French language
- \[Added\] Polish language
- \[Added\] Plain server type (<https://ploi.io/features/plain-server>)
- \[Added\] {DATE} deploy script variable to represent the date deployed
- \[Added\] When searching, automatically select the first result to make click-through faster
- \[Added\] Ability to add a label to your server inside status pages
- \[Added\] Ability to disable keyboard shortcuts (<https://ploi.io/profile/settings>)
- \[Added\] Ability to install PHP 8.0 RC (BETA)
- \[Added\] Ability to specify custom services in status tab
- \[Added\] Ability to create readonly database users
- \[Added\] Ability to specify bind address inside manage tab on server level incase you serve your database on another address for backups
- \[Added\] Madrid location for UpCloud provider
- \[Added\] Ability to set default site sorting in your profile settings
- \[Added\] Ability to define a table prefix when 1-click installing WordPress
- \[Changed\] Dark/light mode icon to a better suitable icon
- \[Fixed\] Properly deleting SSH keys from user profile
- \[Fixed\] Creating a site with system user as team user would not create the automatic system user
- \[Fixed\] FTP backups sometimes gave a curl 530 error
- \[Fixed\] Issue with API rate limiting, it was using a wrong signature key per request which has now been resolved
- \[Fixed\] Sorting sites by domain was not working
- \[Fixed\] Issue with dark mode and cronjob user not being visible
- \[Updated\] Nextcloud 1-click install version 19 to 20




**Changelog Ploi Core**

- \[Added\] Ability to specify a default HTML template in [ploi.io](https://ploi.io) (index.html) to make the white label experience even better
- \[Added\] Stripe support to allow billing (<https://docs.ploi-core.io/digging-deeper/using-stripe>)
- \[Added\] Ability as admin to look into application logs
- \[Added\] Server management, users can now provision servers via your panel
- \[Added\] Danish language
- \[Added\] Norwegian language
- \[Added\] Ability to disable keyboard shortcuts
- \[Improved\] The package permissions have now greatly improved
- \[Fixed\] MariaDB is now also supported




**Changelog Ploi API**

- \[Added\] Ability to manage SSH keys on a server (<https://developers.ploi.io/ssh-keys/list-ssh-keys>)

## MeiliSearch server support & Ploi Core is released!

URL: https://ploi.io/news/meilisearch-server-support-ploi-core-is-released
Published: 2020-09-17

Last week we've released support for MeiliSearch servers. MeiliSearch is a great alternative to Elasticsearch to make searching your documents (or data) fast.




Ploi makes setting up MeiliSearch a breeze, you can easily configure settings via our UI and start serving super fast search results.




**Ploi Core is released!** 🥳




We're very excited to shared that Ploi Core is now available, the panel to easily serve a panel to your customers. You can start right away by clicking "Get Ploi Core" on the website:




<https://ploi-core.io>




**Changelog**

- \[Released\] Ploi Core 🎉  <https://ploi-core.io>
- \[Added\] MeiliSearch server type support (<https://ploi.io/features/meilisearch-server>)
- \[Added\] Ability to edit PHP FPM pools
- \[Added\] More DNS providers added, DigitalOcean, Linode &amp; Hetzner (Cloudflare is already supported)
- \[Added\] Rocket.chat notifications support
- \[Added\] CTRL/CMD+S command for saving deploy script easily and fast
- \[Added\] Editing daemons allow directory changes
- \[Added\] More filters and information on the sites overview page
- \[Added\] Ability to copy system user name on sites index in server
- \[Changed\] Install certbot using snap now and renew hook is now using a dedicated script
- \[Changed\] Used mousetrap library for keyboard shortcuts for wider browser support
- \[Fixed\] Laravel tab down message removed as Laravel 8 does not support this anymore
- \[Fixed\] Google Drive shared drive backups were not working, they are now
- \[Fixed\] Input types on profile password page were normal inputs, changed to password type
- \[Fixed\] AWS Site file backups were not running properly, this has been resolved now
- \[Fixed\] MySQL dumps now use UTF8 encoding enforced so emoji's come in backups as well

## White label demo & phpMyAdmin SSL

URL: https://ploi.io/news/white-label-demo-phpmyadmin-ssl
Published: 2020-08-17

Last week we have released the ability to specify a hostname for your phpMyAdmin installation. At the same time, you can now 1-click install SSL to increase security while managing your database. 

We have also done some major modifications to the load balancer view. It is now possible to specify a weight &amp; backup per webserver you attached to the load balancer. With that we took the liberty to add the same status tab that normal servers had, to the load balancers to easily debug any problems.

In other news: We've made the Ploi Core white label demo available! 🥳

**What is Ploi Core?**
Ploi Core is a white label panel for you to use as webhosting panel for your customers. With Ploi as backbone, you'll be able to power-launch your webhosting company to the skies.

For more information on Ploi Core, visit <https://ploi-core.io>

You can visit the exclusive demo at <https://demo.ploi-core.io> with the following credentials:
Email: demo@ploi-core.io
Password: secret

**Changelog**

- \[Added\] Ability to specify a hostname &amp; SSL for phpMyAdmin
- \[Added\] Global database backup configurations
- \[Added\] Global file backup configurations
- \[Added\] Restore database backups from AWS support
- \[Added\] Ability to deny specific rules in networking
- \[Added\] Quick discord invite link (<https://ploi.io/discord>)
- \[Added\] Deploy notifications are now also triggered when a deploy fails
- \[Added\] Ability to restart server
- \[Added\] Ability to edit php.ini per version in PHP tab
- \[Added\] Ability to define weight and backup server in load balancer settings
- \[Added\] Status tab to load balancers
- \[Re-Added\] Ability to view the script output when running scripts on servers directly on the same page
- \[Fixed\] When adding a new SSH key, provisioning to selected servers didn't work properly
- \[Fixed\] Issue for file backups where large portions of zipping output was saved, this is useless and has been removed
- \[Fixed\] Monitoring screenshot frontend was missing
- \[Fixed\] Issue in load balancer settings when a variable was not set
- \[Fixed\] Issue where team members where unable to do management with FastCGI cache


**Changelog API**

- \[Added\] OPcache routes to API - <https://developers.ploi.io/php/refresh-opcache>
- \[Added\] Installed PHP versions route - <https://developers.ploi.io/php/installed-php-versions>
- \[Added\] FastCGI routes to API - <https://developers.ploi.io/fastcgi-cache/enable-fastcgi-cache>

## White label is coming 👀

URL: https://ploi.io/news/white-label-is-coming
Published: 2020-07-31

It's been one of the most requested features people liked to see for Ploi: white labeling. The time is finally coming!



With Ploi Core, you'll power-launch your webhosting company. Using the ploi.io system as backbone you will be able to serve your customers your custom panel &amp; feeling.

[![](https://ploi.io/storage/jCtY0wvo1xQ3MO5wHr75uMHWG5kjAULZVA3KNDdC.png)screencapture-ploi-core-test-sites-2020-07-31-09\_13\_22.png 47.85 KB](https://ploi.io/storage/jCtY0wvo1xQ3MO5wHr75uMHWG5kjAULZVA3KNDdC.png)

The scheduled release is around **20th of august**, which could be moved around still. We'll also be releasing a demo of the panel soon so you can see what the capabilities are and how the panel looks &amp; feels.



Sign up for the Ploi Core newsletter here to stay up to date about the release and future updates:

<https://ploi-core.io>



**Changelog**

- \[Upcoming\] White label: <https://ploi-core.io>
- \[Added\] Hetzner Let’s Encrypt wildcard support
- \[Added\] Ability to add commands (small script) when rolling back deployments
- \[Re-added\] Ability to remove files in file explorer
- \[Improved\] Rate limiting on specific actions now take the actual URL into consideration
- \[Improved\] FAQ on pricing page: <https://ploi.io/pricing>
- \[Improved\] Newly created system users now default to sudo false
- \[Fixed\] DB backups with zip password protection could not contain a ‘&amp;’ character, validation is updated
- \[Fixed\] Installation failures for servers that had MariaDB
- \[Fixed\] Quick deploy toggle was also showing for non supported GIT drivers, this should not happen
- \[Fixed\] PHP version button on site level was not indicating which version it was running, it is now

## Testing domains & rolling back deployments 🔥

URL: https://ploi.io/news/testing-domains-rolling-back-deployments
Published: 2020-07-14

Don't have a domain yet to test on, or don't want to switch the main DNS yet? 



No problem, we've got your back now. You can now easily 1-click enable a testing domain for your site in Ploi so you can easily view the website without any DNS setup. Under the hood we utilize the Cloudflare API to create a DNS record in the [ploi.link](http://ploi.link) domain.
[![](https://ploi.io/storage/8E5eBimHZdH1MnQrHqkzK2T2kt6ptvY3MjKz05tK.png)CleanShot 2020-07-11 at 08.40.20@2x.png 355.42 KB](https://ploi.io/storage/8E5eBimHZdH1MnQrHqkzK2T2kt6ptvY3MjKz05tK.png)

With that, we also silently released another big feature yesterday. You are now able to rollback deployments with the click of a button. 

This makes a great feature because you're able to quickly switch back to a previous version if something didn't go right.
[![](https://ploi.io/storage/FOWe7Fm0f8lAYQMUn8iSzpnE1kNvxmbku3j9NuCB.png)CleanShot 2020-07-14 at 11.03.00.png 94.89 KB](https://ploi.io/storage/FOWe7Fm0f8lAYQMUn8iSzpnE1kNvxmbku3j9NuCB.png)
At this time, we keep track of the latest 5 deployments, so you're able to go back 5 deployments in total. If you pushed a new fix to your repository, you can just click the original deploy button and it will pull in the latest changes.



**Changelog**

- \[Added\] Testing domains
- \[Added\] Rollback deployments
- \[Added\] Route 53 support for Let’s Encrypt wildcard domains
- \[Added\] Microsoft teams notifications support
- \[Added\] Path label to SSL certificates to see where the certificate is stored
- \[Added\] PostgreSQL to service status list (status tab)
- \[Added\] Support for CIDR firewall rules (10.0.0.0/24) (<https://roadmap.ploi.io/b/panel-requests/allow-firewall-rule-creation-with-cidr/>)
- \[Added\] Support for daemon directory input (<https://roadmap.ploi.io/b/server-level-requests/daemon-directory-input>)
- \[Re-added\] Cloning sites (currently only for sites using ploi user)
- \[Updated\] Darkmode progress &amp; tweaks
- \[Updated\] File explorer UI has been revamped completely
- \[Updated\] Terms &amp; privacy policy updated (<https://ploi.io/terms>, <https://ploi.io/privacy>)
- \[Fixed\] Quick deploy toggle had issues with enabling/disabling
- \[Fixed\] Editing database config file while postgresql installed wouldn’t be able to find the config file
- \[Fixed\] When deleting the last domain alias, it wouldn't allow you, fixed validation for this

**Changelog languages**

- \[Added\] Spanish language (ES) (<https://github.com/ploi-deploy/ploi-translations/commit/448a88763d17697cf18177fb21252294cff560a6>)
- \[Updated\] German language (DE) (<https://github.com/ploi-deploy/ploi-translations/pull/13>)

**Changelog Youtube**

- \[Added\] Rollback a deployment - <https://www.youtube.com/watch?v=jgq6J3jGiaE>

## Introducing: Dark mode  🎨

URL: https://ploi.io/news/introducing-dark-mode
Published: 2020-06-29

Over the weekend we silently released the dark mode for the Ploi panel, we did this so we could iron out any trivial glitches and bugs. We're not done yet - but a big step has been made and it is usable ?

[![](https://ploi.io/storage/cU0682XY3KePHRifn6I6S9PATXibQSl1z6LsBBxa.png)CleanShot 2020-06-29 at 09.53.52.png 158.82 KB](https://ploi.io/storage/cU0682XY3KePHRifn6I6S9PATXibQSl1z6LsBBxa.png)

Switching mode is fairly easy, just press the moon at the top right to switch forth and back. You can also head over to your profile to select a third option: "automatic". This will use your browsers preference, if it is in dark mode, Ploi will come along with your preference automatically.

[![](https://ploi.io/storage/4Uf3lefkL8bOUqwIstoJZCwsMs3kuiYVgbdO0Y54.png)CleanShot 2020-06-29 at 09.54.05.png 151.83 KB](https://ploi.io/storage/4Uf3lefkL8bOUqwIstoJZCwsMs3kuiYVgbdO0Y54.png)

Be sure to let us know if you run into any design issues so we can solve these accordingly.

Besides the dark mode, we've also worked on the responsive design which is coming along very nicely. However we still advice you to not do any heavy server management stuff on mobile, it is nice to have the panel available in mobile as well.

**Changelog**

- \[Added\] Dark mode ? ?
- \[Added\] Amazon T3 plans
- \[Added\] Ability to read key &amp; CSR for certificate requests
- \[Added\] Security updates label on server index will only show if there are security updates to do
- \[Changed\] Laravel tab improvements
- \[Updated\] Nextcloud version 19 &amp; installation improvements
- \[Fixed\] PHP tab had some issues when switching PHP version, is now being picked up correctly
- \[Fixed\] Added fallback for LE certificates if any old traces where left
- \[Fixed\] PostgreSQL 12 is now being installed for Ubuntu 20
- \[Improved\] Subscription page with features you gain/loose when upgrading/downgrading
- \[Improved\] Responsive panel design
- \[Started\] Development has started on backup configurations per profile (so you can easily select a configuration if you want to backup a DB or site) - https://roadmap.ploi.io/b/panel-requests/global-backup-configuration

**Changelog languages**

- \[Updated\] German language (DE) (<https://github.com/ploi-deploy/ploi-translations/pull/12>)

**Changelog API**

- \[Added\] Ability to manage domain aliases (<https://developers.ploi.io/aliases/list-aliases>)
- \[Added\] Ability to specify if a system user should have sudo or not (<https://developers.ploi.io/system-users/create-system-user>)

**Changelog Youtube -** (<https://ploi.io/youtube>)

- \[Added\] Load balancing video - <https://www.youtube.com/watch?v=4KxGUv5vZy4>
- \[Added\] Let’s Encrypt video - <https://www.youtube.com/watch?v=LYGNH4CAkNI>

## Cloudflare detailed statistics 📈 & News feed

URL: https://ploi.io/news/cloudflare-detailed-statistics-news-feed
Published: 2020-06-11

If you have Cloudflare attached to your Ploi account you’re in luck! 

It is now possible to view detailed statistics gathered by Cloudflare easily in the Ploi panel. You are able to see requests (pageviews, cached), bandwidth, TLS version &amp; uniques per day. Just visit the DNS tab in site level and press “Statistics”.

[![](https://ploi.io/storage/1UZprz2GZV70dpvmy6qKanm0ON3q3NnsGoyOOy7r.png)screencapture-ploi-io-panel-servers-6557-sites-11665-cloudflare-dns-records-2020-06-05-09\_10\_09.png 201.56 KB](https://ploi.io/storage/1UZprz2GZV70dpvmy6qKanm0ON3q3NnsGoyOOy7r.png)

Another bigger update we have done is adding a news RSS feed. We’ve had some more requests lately users asking us to add a feed so they can easily track us that way.

So here it is: [https://ploi.io/news/feed](https://ploi.io/feed/news)

**Changelog**

- \[Added\] Detailed statistics view for Cloudflare integrations ?
- \[Added\] Ability to add a description to databases (<https://roadmap.ploi.io/b/panel-requests/add-description-to-database/>)
- \[Added\] Ability to add PTR records in Cloudflare DNS management
- \[Added\] {RELEASE} variable for deploy scripts with sites having zero downtime enabled
- \[Added\] {RELOAD\_PHP\_FPM} variable for deploy scripts to reload FPM worker (which uses the site’s PHP version)
- \[Added\] Documentation link to sidebar in panel
- \[Added\] Logout button whenever you were presented with the lock screen
- \[Added\] Ability to see usages for notification channels in your profile
- \[Added\] News feed ([https://ploi.io/news/feed](https://ploi.io/feed/news))
- \[Fixed\] Sites overview had wrong &lt;title&gt; text
- \[Fixed\] Applied general fixes for SSL wildcard LetsEncrypt
- \[Fixed\] Bug when you wanted to delete a notification channel from your profile with entities attached
- \[Fixed\] Bug when you wanted to test pushover notifications

**Changelog languages**

- \[Added\] Swedish language (SV)
- \[Updated\] German language (DE)

**Changelog API**

- \[Added\] Ability to deploy staging to production sites <https://developers.ploi.io/deployments/deploy-staging-site-to-production>

## LetsEncrypt wildcard support & Linode partnership 🎉

URL: https://ploi.io/news/letsencrypt-wildcard-support-linode-partnership
Published: 2020-05-29

It has been a few weeks after we released the awesome panel update, and yet again we are back with awesome updates.

We now support LetsEncrypt wildcard SSL! 🎉 Supported drivers for now are Cloudflare, DigitalOcean &amp; Linode. With Linode it is good to know that requesting wildcard SSL can take up to 15 minutes as their DNS system processes each 15 minutes.

[![](https://ploi.io/storage/NQB1eCCKMeTWhR1CrZtaIea0yDxJZ0RHopGOfUN7.png)CleanShot 2020-05-29 at 12.03.34@2x.png 206.19 KB](https://ploi.io/storage/NQB1eCCKMeTWhR1CrZtaIea0yDxJZ0RHopGOfUN7.png)

A guide on how to request wildcard SSL can be found here: <https://ploi.io/documentation/ssl/how-do-i-request-an-letsencrypt-wildcard-certificate>

Besides this great update we have another big item to share: we established a new partnership with Linode 👋 We are planning on adding awesome features for this specific server provider as well as other partnered server providers on our system, we will share more about that in the near future.



**Changelog**

- \[Added\] LetsEncrypt wildcard support ?
- \[Added\] Linode as official partner (<https://ploi.io/links>)
- \[Added\] Arrow navigation in search results when pressing “/“
- \[Added\] More keyboard shortcuts to navigate in panel, press “/“ to see which shortcuts are available
- \[Added\] Completely new onboarding experience view for new users
- \[Added\] Ability to purge cache when using Cloudflare (In DNS tab)
- \[Added\] Logs when enabling, flushing or disabling FastCGI cache module
- \[Added\] {FLUSH\_FASTCGI\_CACHE} variable for deploy scripts to flush the cache after deployment
- \[Added\] UpCloud now also supports Ubuntu 20.04
- \[Added\] Documentation link to sidebar
- \[Added\] Ability toggle if a new system user should have sudo or not
- \[Progress\] On translations, we’re still looking for more translations: <https://github.com/ploi-deploy/ploi-translations>
- \[Progress\] On responsive, we still discourage to manage server through mobile, however we have made big steps in making the panel more responsive
- \[Fixed\] Encoding on server logs reading, sometimes an unknown format is returned which we convert properly now to read
- \[Fixes\] Since the release of the new panel a lot of small UI things have been changed/updated according to user feedback, we’re satisfied with how it is now. There still might be some small labels or texts that are wrong or misplaced, let us know if you find any and we’ll update that right away. Thanks so much for your support &amp; feedback on the new panel release! ?

## Brace yourself, we’ve just stepped up our game 👀

URL: https://ploi.io/news/brace-yourself-weve-just-stepped-up-our-game
Published: 2020-05-12

We’ve been working on this for a long while and it is now finally the time to release: a brand new panel.



A lot of things have been refactored and rewritten to your benefit 🤩



With this new design we increase the consistency between all the elements we use, that being said; it could be that some things are on different places from what you where used too. Not to worry, not a single feature has been dropped in this update, we kept them all 😎
[![](https://ploi.io/storage/maCwC2kjLVGwrFAbr7DpyPQa55n63R5Lck7MdKjl.png)CleanShot 2020-05-12 at 15.19.41.png 119.28 KB](https://ploi.io/storage/maCwC2kjLVGwrFAbr7DpyPQa55n63R5Lck7MdKjl.png)

Some small finetuning &amp; changes could occur since this is a more bigger update, the start this morning was quite rough however it is coming along very nicely!

With this update we also release the support of Ubuntu 20.04 LTS, this is when you use the server provider integration (this does not include UpCloud yet, as they do not support Ubuntu 20.04 yet). 

Of course, you can also install a custom server with this OS, make sure when you install a custom server that you select the correct OS.



**Changelog**

- \[Added\] As described above, brand new panel design 🎨
- \[Added\] Sites overview
- \[Added\] Ability to setup custom Laravel commands in Laravel tab
- \[Added\] API now has redirects endpoints (<https://developers.ploi.io/redirects/list-redirects>)
- \[Added\] API now has custom server creation (<https://developers.ploi.io/servers/create-custom-server>)
- \[Added\] Ability to view queue worker logs
- \[Added\] Ability to search in status pages
- \[Added\] Keyboard shortcuts (which ones show in the search modal), if you have suggestions let us know!
- \[Breaking change\] Site deploy notifications (notifications tab) is now (finally) using the new notifications system. Old setup notifications will not work anymore and will have to be setup again.
- \[Changed\] Default PHP version when installing a server is now 7.4
- \[Changed\] New server installations will now use Ubuntu 20.04 if installed by server provider
- \[Changed\] New server installations will now use NGINX 17
- \[Changed\] New server installations will now use MySQL 8
- \[Changed\] We have swapped Codemirror for Codejar (for editing config files, deploy scripts)
- \[Changed\] Meta has been renamed to settings
- \[Changed\] FastCGI cache path more specifically to the domain itself
- \[Changed\] We have closed support for non-paying customers
- \[Changed\] We have removed wysiwyg editor from support, you can now use markdown in requests
- \[Fixed\] When using AWS installing a storage server it would not open the 9000 port in AWS security group

## FastCGI Cache is now available

URL: https://ploi.io/news/fastcgi-cache-is-now-available
Published: 2020-04-21

It is now possible to 1-click enable the FastCGI cache module in NGINX!

FastCGI cache is a module that can cache directive content which is served from the PHP backend. Using this module will significantly improve your site speed.

![](https://ploi.io/storage/118/Screen-Shot-2020-04-21-13-01-43.14.png)

By default we deploy a set of rules that should be usable for a default PHP app &amp; WordPress. However, you are completely free to edit these lines to your likings so it will work for your own application.

![](https://ploi.io/storage/119/Screen-Shot-2020-04-21-13-02-11.55.png)

We also offer the ability to flush your cache from the FastCGI Cache modal, soon we will also release a deploy script variable to trigger the cache flush so cache is flushed on each deploy.

**Changelog**

- \[Added\] FastCGI cache 1-click install ?
- \[Added\] Storage servers may now easily request LetsEncrypt SSL
- \[Added\] Ability to scroll in scripts modal
- \[Added\] Ability to search in repositories dropdown when installing a repository
- \[Added\] Symphony tab added with specific commands
- \[Added\] YouTube channel (<https://ploi.io/youtube>)
- \[Added\] Documentation now uses Meilisearch for fast and quick search results (<https://ploi.io/documentation>)
- \[Updated\] Servers will now be installed with Node V12
- \[Updated\] Validation message when adding Vultr server when Ploi has no access
- \[Updated\] 2FA package has been updated
- \[Improved\] Monitoring script has been improved on the CPU resource measurement
- \[Improved\] Queue tab will not display if no PHP is installed
- \[Improved\] phpMyAdmin installations are now the newest version
- \[Fixed\] Redis with PHP installation is now solved

## Service status tab 🚦

URL: https://ploi.io/news/service-status-tab
Published: 2020-04-09

We've received an awesome request by one of our users a while back to implement a view where you could see an overview of all the important services and their status. You can read more up on the request here: <https://roadmap.ploi.io/b/panel-requests/show-services-status-nginx-php-etc-in-control-panel/>


![](https://ploi.io/storage/114/Screen-Shot-2020-04-09-13-22-26.94.png)

We found this to be an excellent feature in Ploi and processed it! You can now visit the 'Status' tab on the left hand side in server level and see an overview of your services and their status. You can also request their specific status by pressing the "Status" button. This makes debugging easier as it will include an error code if something is wrong.



![](https://ploi.io/storage/115/Screen-Shot-2020-04-09-13-22-11.88.png)

You also have the ability to start, stop and restart services from that tab to restart specific services: giving you even more control over your server easily by a click on the button.



As always we include a changelog at the bottom for you to read what has changed since the last newsletter that has been sent, and if you did not receive that check out the latest news article, this contains the changelog as well: <https://ploi.io/news/restore-database-backups-duplicating-them>


If you have any suggestions or feedback, you are more than welcome to leave it on our roadmap: <https://roadmap.ploi.io/>


**Changelog** 


- \[Added\] Service status tab ?
- \[Added\] Status page management in API (<https://developers.ploi.io/status-pages/list-status-pages>)
- \[Added\] If you have cloudflare attached and create a subdomain in ploi that exists in cloudflare, it will also link that domain so you can manage DNS
- \[Added\] Ability to provide passwords to the ZIP for database backups
- \[Added\] More strict validation for when using interactive commands in a deploy script
- \[Added\] Ability to update IP address when the server got unreachable and user was presented with an unreachable screen
- \[Added\] Ability to deploy SSH keys from your profile to multiple servers at once
- \[Added\] Ability to see backup path for site file backups
- \[Added\] Ability to delete single log items or select a few to delete those
- \[Added\] Ability to synchronise environment files (.env)
- \[Added\] Ability to disable incident log for status pages when there are no incidents present
- \[Added\] Notification when quick deploy was triggered but could not deploy with a specific reason included
- \[Changed\] Dropped reCaptcha from Google and added a honeypot as recaptcha
- \[Improved\] Support tickets now give documentation suggestions according to your ticket title to help you
- \[Improved\] Fail registration for deployments
- \[Fixed\] Hetzner server provider does not accept \_ characters, fixed to cast to - now
- \[Fixed\] Fix for hostname while installation when invalid characters are present in server name
- \[Fixed\] Several fixes for team members not being able to do actions they should be able to do
- \[Fixed\] Default placeholder URL for Gitlab in commits tab

## Restore database backups & duplicating them 🚀

URL: https://ploi.io/news/restore-database-backups-duplicating-them
Published: 2020-03-20

Development is at full steam! We’ve been working hard delivering you a better server management experience, as always.



**Restoring databases** 


Restoring your database has never been easier, just click the “Files” button behind your backup setting and select the backup you want to restore to your database. Make sure that whenever you decide to restore your backup that the database could be unavailable for a brief time as it is processing the backup. We recommend to put your application in a maintenance mode if possible.



Currently restoring databases is available for Dropbox &amp; local, we are working on the other drivers to support this.



**Duplicating databases** 


In addition to that, you can now also duplicate your database. This can be especially handy if you want to setup a quick development or staging site with actual data. 



**Changelog** 


- \[Added\] Ability to restore database backups ?
- \[Added\] Ability to disable status page branding
- \[Added\] Server tokens are now off by default (NGINX webserver does not show version number anymore)
- \[Added\] An overview of servers that have monitoring installed
- \[Added\] Ability to duplicate databases
- \[Added\] Ability to specify a system user name when creating a site
- \[Added\] Ability to search on domain aliases in mega search
- \[Added\] Pacific timezones to profile settings
- \[Added\] Ability to create wildcard domain aliases (like: \*.[example.com](http://example.com))
- \[Updated\] Staging feature now has more settings to customise better to your needs
- \[Updated\] Scripts that did not contain the -y flag with apt update or install commands validation is improved
- \[Fixed\] Additional site deploy scripts where not considering the owner of the server, team users would get denied access
- \[Fixed\] Adding network rules for both TCP/UDP on same port was not possible
- \[Fixed\] A lot of design inconsistencies in the panel have been resolved

## Important: LetsEncrypt is revoking (specific) certificates due to a bug

URL: https://ploi.io/news/important-letsencrypt-is-revoking-specific-certificates-due-to-a-bug
Published: 2020-03-03

**Important**

LetsEncrypt is revoking certain certificates due to a bug in CAA code on the 4th of March. You can read more about the details on this here: <https://community.letsencrypt.org/t/2020-02-29-caa-rechecking-bug/114591>

Public announcement: <https://letsencrypt.org/caaproblem/>

**What should I do?**

You can use this service to easily check whether your domain is affected: <https://unboundtest.com/caaproblem.html>

Whenever it is affected, make sure to remove the certificate from the Ploi UI and request a new one.

## Staging to production sites feature is live 🥳

URL: https://ploi.io/news/staging-to-production-sites-feature-is-live
Published: 2020-02-28

We have released a very awesome new feature, called staging sites!



Easily enable the staging site by just clicking "Create Staging Site", it is as easy as that.
Ploi will handle everything in the background for you, we even create a DNS record for your staging domain to make things even smoother.



When you're ready to push to production, just press the Deploy to production button and sit back.
Want to exclude files to be deployed? No problem. Specify your own list of files to be ignored from deployment.



**Changelog** 


- \[Added\] Staging sites feature 🥳
- \[Added\] Ability to make status pages post auto updates regarding server connection
- \[Added\] Jetbrains spaces to the user keyscan
- \[Added\] Manage tab to load balancers to setup automatic updates
- \[Added\] Log tab to load balancers to view logs
- \[Added\] Ability to edit the database configuration file (my.cnf)
- \[Added\] Ability to search on internal IP addresses
- \[Added\] Ability to read certbot renew log in log tab
- \[Updated\] Queue’s are now created with “queue:work” instead of “queue:listen”
- \[Updated\] Monitoring labels now show “N/A” if a value of 0 or none was filled in
- \[Updated\] We will now always force NGINX 16 (instead of 14)
- \[Updated\] Restart button for database would always show “MySQL” if any other type was installed
- \[Updated\] The way deployment failed registration worked, this is now completely accurate
- \[Updated\] Virtual host file for Nextcloud installations to match their new standards
- \[Updated\] About page now has a timeline
- \[Fixed\] Whenever a domain was added with “www.” prefixed, redirects would not follow up correctly
- \[Fixed\] Whenever there where multiple ssh ports in network tab, you would not be able to delete them
- \[Dropped\] Support for hybrid has ended due to instability

## AWS S3 Database Backups have arrived

URL: https://ploi.io/news/aws-s3-database-backups-have-arrived
Published: 2020-02-05

Yes! You are now able to backup your databases to your S3 bucket ?

We have had a huge amount of requests for S3 backups (<https://roadmap.ploi.io/b/server-level-requests/database-backup-drivers/>) and basically this is just the beginning. We will also start supporting other S3 drivers such as our own supported storage server MinIO, or like Wasabi S3.

Check out our article how to retrieve your security details for your server to access your bucket, so it can upload your backup ?

<https://ploi.io/documentation/mysql/how-do-i-create-iam-user-for-aws-s3-database-backups>

**Changelog**

- \[Added\] AWS S3 backups ?
- \[Added\] Ability for users on a subscription to easily upgrade/downgrade their subscription
- \[Added\] Ability to run site file backups on demand via UI
- \[Added\] Displaying backup file size in database backups, this is not available for all drivers yet
- \[Updated\] New Hetzner logo
- \[Updated\] DNS tab CAA record did not have border color, added this
- \[Updated\] Deployment email (&amp; failed one) added server name in subject
- \[Fixed\] Updating a network rule when it was SSH port would not function properly
- \[Fixed\] Site file backups would not always run, we have told them to stop goofing around and just run
- \[Fixed\] Responsive design in frontend documentation improved
- \[Fixed\] Automatic system user name generation when creating a domain was faulty when TLD was like: .[co.uk](http://co.uk)
- \[Fixed\] Telegram server updates notification, we do not send the log output anymore as it was getting too big for telegram to handle
- \[Started\] Progress on service status tab on server level, to quickly see what the statuses are for several services (like nginx, php, etc)

## Synchronized deployments

URL: https://ploi.io/news/synchronized-deployments
Published: 2020-01-21

You can now easily synchronize deployments across multiple domains! We personally ran into this where we needed to keep our uptime monitor servers code in sync, and where deploying them all manually each time, this was a pain and cumbersome. Just visit your repository tab in site level, and press "Manage synchronized deployments", this will open up a window to save sites to your repository that should be in sync once the initial site gets deployed.

 ![](https://ploi.io/storage/82/Screen-Shot-2020-01-21-12-58-31.13.png)

By adding this feature we’ve actually also introduced a second feature automatically, it is now easier for servers that are load balanced to keep your code in sync, and in addition to that we have added a deploy button in the "Sites" tab from the load balancer so you don’t even have to go to your webservers and figure out which one to deploy.

This is because once you deploy a site through the load balancer it will automatically determine which repository is having synchronized websites and use that one to deploy (so the linked sites will get deployed as well). The sites do not have to be on the same server, you can select any site from all the servers you want to.

 ![](https://ploi.io/storage/83/Screen-Shot-2020-01-21-12-59-03.44.png)

**Changelog**

- \[Added\] Synchronized deployments ?
- \[Added\] PHP extensions window to install PHP extensions easily
- \[Added\] Run scripts while creating a new server
- \[Added\] Branding page (<https://ploi.io/branding>)
- \[Added\] Onboarding view when a new user registers
- \[Added\] Teams permissions now have inherit permissions
- \[Updated\] Dropped support for TLS 1 &amp; 1.1
- \[Updated\] Total repositories in dropdown for GIT cloning has increased from 20 to 100
- \[Updated\] FAQ in panel is now renamed to Documentation which is more clear
- \[Updated\] Status pages now always display recent incidents days (<https://status.larabug.com/>)
- \[Updated\] DigitalOcean plans now show more information about which type it is when creating a server
- \[Updated\] A lot of tweaks to load balancing have been made to make the UX way more fluent
- \[Fixed\] Ability to delete servers via API while building is now disabled
- \[Fixed\] PHP 7.4 was not added to the user permission to reload
- \[Fixed\] While installing a new server with custom scripts that contained ‘reboot or shutdown’ installation would break, disabled those scripts in server builder
- \[Fixed\] Github social login if there was no e-mail in the return response, will now display a nice validation message

## Ploi partnered with DigitalOcean 💙

URL: https://ploi.io/news/ploi-partnered-with-digitalocean
Published: 2020-01-11

![](https://ploi.io/storage/80/Frame_4.png)




We are very proud to announce we have established an official partnership with DigitalOcean, this partnership is a big step for us moving forward. 👏



Soon we will announce what our plans are with this partnership, but we can assure you: it will be very awesome 😎



We are still working on partnering up with the other providers that are available in our integrations system. It is an excellent way for us to offer stability and assurance to our users.



If you know a server provider that would fit nicely in Ploi; let us know! We are more than welcome to open up our list and welcoming new and/or young providers. 🤝

## AWS EC2 support has arrived 👏

URL: https://ploi.io/news/aws-ec2-support-has-arrived
Published: 2020-01-04

We are excited to announce that we have released AWS EC2 support, you can now easily use the Amazon integration right from the Ploi system.



Ploi will automatically select the newest official Ubuntu 18.04 LTS release for you to be installed. We also have created a guide on how to get your credentials from AWS.



<https://ploi.io/documentation/server-providers/add-aws-amazon-as-server-provider>


While creating an AWS EC2 server you also have the ability to manually specify the disk size which defaults to 15GB. We have added a link to the AWS calculator so you can calculate the monthly server price.



**Changelog** 


- \[Added\] AWS EC2 support ?
- \[Added\] Status page incidents
- \[Added\] Dark mode for status pages (light, dark, auto)
- \[Updated\] Renewed indexes for servers, teams &amp; status pages to be more clear when no records are present
- \[Updated\] New toaster
- \[Updated\] Sidebar now has less dropdowns to reduce click throughs
- \[Updated\] Balanced the way server monitoring stats where send from servers
- \[Updated\] Our VAT number to be compliant with new EU laws
- \[Fixed\] Validation message for when adding Telegram notification channel which was not clear
- \[Fixed\] Telegram notifications content too long (limited now)
- \[Fixed\] Deleting a DigitalOcean server failure fix
- \[Fixed\] API site repository was not functioning properly

## Recap Ploi 2019 🎇

URL: https://ploi.io/news/recap-ploi-2019
Published: 2019-12-16

2019 was a busy year for Ploi, as a new upcoming server management tool we have grown bigger and bigger. We started great in 2019 with the UpCloud partnership (<https://ploi.io/news/upcloud-integration-support-with-ploiio>) and with a lot of features.



To sum them up what has happened in 2019 in total:

- Teams update (<https://ploi.io/news/huge-teams-update>)
- phpMyAdmin support (<https://ploi.io/news/install-phpmyadmin-with-1-click>)
- Server monitoring (<https://ploi.io/news/server-monitoring-phpmyadmin-1-click-install>)
- Google Drive support (<https://ploi.io/news/google-drive-support>)
- Automatic subscriptions (<https://ploi.io/news/automatic-subscriptions-now-available>)
- Load balancing (<https://ploi.io/news/introducing-load-balancing>)
- User isolation per site (<https://ploi.io/news/website-isolation-anyone>)
- NGINX + Apache2 hybrid (<https://ploi.io/news/so-nginx-apache2-hybrid-is-a-thing-now>)
- Different PHP versions per site (<https://ploi.io/news/you-may-now-select-different-php-versions-per-site>)
- Partnership with Hetzner (<https://ploi.io/news/partnership-with-hetzner>)
- File explorer support (<https://ploi.io/news/file-explorer-feature-free-larabug>)
- Database server support (<https://ploi.io/news/database-server-type-server-updates>)
- Clone site support (<https://ploi.io/news/clone-sites-notification-system-update>)
- Site monitor &amp; PostgreSQL support (<https://ploi.io/news/site-uptime-monitor-postgresql-support>)
- Rebranded (!!) ?(<https://ploi.io/news/so-we-ditched-our-logo>)
- Database &amp; file backups rotatable (<https://ploi.io/news/database-file-backups-are-now-rotatable>)
- Telegram support &amp; notifications update (<https://ploi.io/news/sit-back-we-have-a-lot-to-tell-you>)
- Storage server support (<https://ploi.io/news/storage-servers-released>)
- Beautiful crafted status pages (<https://ploi.io/features/status-pages>)

A lot of these articles actually contain more features &amp; releases which we have not mentioned, it is totally worth it to read them through and get familiar with the features we offer. Besides the mentioned articles &amp; features there have been a lot of small additions to the system which are usually not always mentioned in the news articles but mostly on social media. However we have recently started with adding changelogs to our news items (as well as this one)



Be sure to follow us on social media!



Twitter: <https://twitter.com/ploi_deploy>
Facebook: <https://facebook.com/ploideploy>
Instagram: <https://www.instagram.com/ploi_deploy/>


That being said we are not going to stop here. We have a lot of plans for Ploi in 2020 and there is a lot coming (just by checking out our <https://roadmap.ploi.io> should say enough)



Thank you for using Ploi in 2019 and hope to see you a lot in 2020, waiting for a big bag of features to come that year ?



**Changelog**

- \[Added\] Status pages
- \[Added\] Pushover notifications
- \[Added\] PHP 7.4 support
- \[Added\] Ability to restart PHP FPM workers
- \[Added\] Ability to read PHP FPM logs
- \[Added\] SFTP password support for file backups
- \[Added\] SFTP database backups rotations
- \[Added\] Ability to change the currency you pay in (EUR &amp; USD)
- \[Added\] Ability to read private key from certificates (besides CSR)
- \[Added\] Lightbox to frontend pages with screenshots so you can view images more clearly
- \[Added\] Articles to deploy script suggestions
- \[Added\] Ability to show private IP in overviews (setting in profile settings)
- \[Changed\] Documentation in panel blue color reduced
- \[Fixed\] Crucial bugfix in switching PHP versions when system user was not ploi
- \[Fixed\] Whenever you installed another PHP version and it would fail, the status of the server would be changed to “Building failed” which is incorrect
- \[Fixed\] Storage servers does now also install certbot

## Black Friday 2019!

URL: https://ploi.io/news/black-friday-2019
Published: 2019-11-20

We have had a lot of questions about Black Friday for this year, if we are participating in this discount round. Well good news, because we are!

Enjoy 50% discount to extend your current subscription for a month ? Use the following code while using **manual payment** on the subscription page: **BLACK-FRIDAY-2019**

This code will only work on the **29th of November 2019** and is usable once per account for a maximum of 1 month.

**Changelog**

- \[Added\] Ability to change repository URL
- \[Added\] Ability to change the default sorting of servers on the index (check your profile settings)
- \[Added\] Telegram notification screenshot has been added to the frontend notifications page
- \[Added\] Ability to run database backups on demand
- \[Added\] PHPRedis is now installed by default on all new servers (you can install it on your current server using our documentation article)
- \[Added\] API servers endpoint now also displays whether server needs a reboot or not
- \[Added\] SFTP password support for database backups
- \[Fixed\] When leaving keep backup amount field empty error would be generated
- \[Fixed\] Automatic updates notification for slack and discord didn’t contain the servers name
- \[Fixed\] The process of enabling and disabling OPCache
- \[Fixed\] Bugfix in Daemon’s tab where it would not display users field if it did not contain custom system users
- \[Changed\] Updated Vultr logo to their new logo
- \[Updated\] Updated our WYSIWYG editor to latest version

## Storage servers released! ?

URL: https://ploi.io/news/storage-servers-released
Published: 2019-11-14

**Storage servers are now available**

Your own file storage for your applications, it could not get any easier. Object storage with Amazon S3 support at its finest, most applications work out of the box because of the S3 support so it could not get any easier.

Ploi will help you setup a very easy maintable storage server ready for the future. Our system offers several features to make the complete setup a breeze for you.

Another benefit is that Ploi does not save any keys to increase security, everything is being read live from your server.

<https://ploi.io/features/storage-server>

**Website and server monitoring**

We have also been working on some adjustments for our monitoring systems. Soon you’ll be able to set up notification channels for site monitoring, SSL checks &amp; mixed content. We hope to release this before the new year, so stay tuned.. ?

**New roadmap!**

We have moved away from Trello and started with Upvoty as roadmap now, you can visit our roadmap here: <https://roadmap.ploi.io>, it is also possible to sign up and subscribe to cards so you can stay up to date when we change status so you know what you’re up against.

**Other important updates**

- Prepared: PHP 7.4 (not released yet)
- Added: Ability to add a new credit or debit card
- Added: Storage type servers!
- Changed: Rotating server logs is now more efficient
- Changed: /roadmap now routes to the new roadmap from UpVoty
- Changed: The way server connections where handled at night (to check if Ploi can still connect to your server)
- Changed: Frontend design has more CTA cards now
- Started: On status pages ?
- Fixed: Fix for SSH keys creating in authorized\_keys file
- Fixed: Composer package suggestions had an error, this has been resolved now
- Fixed: Server monitor had a bug with disk size, this has been resolved now
- Fixed: SSL table had a bug with long root domain names, this has been resolved now
- Fixed: When the notifications in the header dropdown where too long, it would adjust size as well, this has been resolved now
- Fixed: Total used places for notifications in profile counter did not show all used places, it does now
- Fixed: Fixed an issue with changing web directories, this works properly now
- Removed: Servitor integration

## Sit back, we have a lot to tell you ?

URL: https://ploi.io/news/sit-back-we-have-a-lot-to-tell-you
Published: 2019-10-21

**Important change to notifications** ?

We are currently changing the way the notifications are handled in Ploi and want our users to be able to customize more in what they receive and where they receive notifications.

Thats why you can now define ‘Channels’ inside your profile in order to use those at places like server monitor or server updates. You can setup Slack, Discord and E-mail channels, we are working on more drivers like RocketChat.

To be able to receive notifications for server monitor, you may now attach your created channels to a server monitor notification. Just press the “Channels” button after the created notifications.

We are still working on the channel support at every notification ability that we offer, expect this real soon.

**Telegram notification support**

Following up on the important change from above, we have also added support for Telegram notifications. You can link your telegram account inside your profile under the API keys tab and then create a channel for it so it can be used for notifications.

**S3 server type support**

We have started on the ability for our users to create their own S3 supported servers, this feature is nearly done and requires some thoroughly testing before we can release is, but expectations are that we will be able to release this the beginning of november this year.

**Pricing change to Unlimited plan**

To keep improving our services we have decided to raise the price for the Unlimited plan from **€25** to **€30**, this change will come in effect on the **25th of October 2019**. Existing customers with an active automatic subscription will keep on the **€25** price unless they cancel and restart their subscription.

**Smaller updates**

- Fixed: team members where not able to search on sites in their teams
- Fixed: hourly site file backups where not enabled yet
- Fixed: WYSIWYG editor for support modals where bugged
- Fixed: specific e-mail validation in teams section, it allowed ' characters which are not valid
- Changed: frontend pricing now has a proper toggle button for yearly pricing
- Added: ability to read Apache2 logs when server is a hybrid version
- Added: ability to delete server through API
- Added: hashtags to titles on the frontend pages for linking
- Added: API featured block to frontend landing page

## Database & file backups are now rotatable 🚀

URL: https://ploi.io/news/database-file-backups-are-now-rotatable
Published: 2019-08-20

**Rotating backups**

So earlier it was already possible to backup your database &amp; files, the only downside was that it never really rotated anything. So eventually you would end up with a full Dropbox or Google Drive for example.

Well no more, you can now setup the maximum number of backups to keep in your provider. ?![](https://ploi.io/storage/70/Screen-Shot-2019-08-20-14-20-53.png)**Internal IP address**

Since yesterday we also save an internal IP address whenever you install a server through [ploi.io](https://ploi.io) itself. This makes it easier and faster to know what your internal IP address is for your server. You can find this IP address inside the server’s META tab, you also have the ability to setup the internal IP address there.![](https://ploi.io/storage/71/Screen-Shot-2019-08-20-14-30-21.21.png)

As always be sure to submit your feature suggestion inside our panel if you have any, we’d love to hear from you! ?

## So we ditched our logo.. 🖼

URL: https://ploi.io/news/so-we-ditched-our-logo
Published: 2019-08-04

As you might of noticed a lot has changed; we ditched the logo and changed the complete design.



We have changed our primary color from #62A6A6 to #1853DB, a very clean blue color. With that we have dropped the logo, basically the logo now is “[**ploi**.io](https://ploi.io)”:![](https://ploi.io/storage/66/ploi512blue.jpg)![](https://ploi.io/storage/67/ploi512white.jpg)



With this update there are also some significant changes under the hood, we have optimized a lot in the backend for your comfort.



To sum up the changes;



- Ditched our logo (all text now)
- Changed branding color from #62A6A6 to #1853DB
- Completely redesigned frontend website
- Completely hauled over the panel design
- Changed login, register &amp; password forget page
- Code editor highlighting added
- Exported sites &amp; servers to 1 general search bar
- A lot of new features added to API (server creation is still in progress &amp; changelog page is coming to https://developers.ploi.io)
- Ability to export personal user data to see what we save
- Speed improvements panel
- Bug fixes panel

And we’re not done yet! In this month we will be doing a lot of stuff to our API and we also have some very nice features coming to the panel.



We’d appreciate your opinion about this, be sure to let us know what you think!

## Site Uptime Monitor & PostgreSQL support

URL: https://ploi.io/news/site-uptime-monitor-postgresql-support
Published: 2019-07-15

**Site Uptime Monitor**

We now offer the ability for users with the Unlimited plan to monitor their websites. We currently offer 2 locations: US &amp; Singapore, we will be expanding this in the upcoming month to support more locations.

This is a real nice way to see what the response of your website is, we are also working on notifications per monitor so you can get notified whenever something is wrong or which has a higher response time.

 ![](https://ploi.io/storage/65/Screen-Shot-2019-07-15-12-14-41.21.png)

 **PostgreSQL Support**

We also have added the ability to install servers with PostgreSQL support, it is not possible to upgrade existing servers to allow PostgreSQL support. Backups are also fully working for PostgreSQL servers.

 ![](https://ploi.io/storage/64/Screen-Shot-2019-07-11-13-51-22.png)

## Clone Sites & Notification System Update! ?

URL: https://ploi.io/news/clone-sites-notification-system-update
Published: 2019-07-01

**Clone Sites**

It is now possible to clone your websites to your other servers, it will copy over all the files automatically for you. You can clone a website by going to the ‘Manage’ tab in site level. There you will find a button ‘Clone Site’ to head over to the clone window. ?

 ![](https://ploi.io/storage/62/Screen-Shot-2019-07-01-09-09-47.77.png)

**Notification System Update**

We have also refactored and updated our notification system. It will now display real time incoming notifications and you are able to clear all the notifications at once. There are also plans to make the notification system more customizable so you can completely manage the notifications you want to receive.

 ![](https://ploi.io/storage/63/Screen-Shot-2019-07-01-09-09-16.40.png)

## Database server type & Server updates ?

URL: https://ploi.io/news/database-server-type-server-updates
Published: 2019-06-20

**Database Server Type**

This week we have launched a new server type called “Database server”, this allows you to create a database specific server for other servers to connect with. Currently we support MySQL &amp; MariaDB, and we are working on MongoDB and PostgreSQL support.

This is also a step forward towards the second version on our roadmap of loadbalancing (<https://trello.com/c/zq5xVF2r/115-database-high-availability-follow-up>) where it will be possible to load balance database servers and sync them between each other.

You can create a database server by creating a server like normal, and selecting “Database Server” in the type dropdown.

 ![](https://ploi.io/storage/60/Screen-Shot-2019-06-19-11-07-18.png)


**Server Updates**

You might of already seen it, we are now displaying any open updates on the server cards and server list view.

 ![](https://ploi.io/storage/61/image.png)


Whenever you see any open updates you can update these by running **apt-get update &amp;&amp; apt-get upgrade** in your server. You will have to re-test server connection in Ploi to refresh the label. It might be possible that not all updates have been done, this is because some packages are not upgradable by apt-get upgrade. You will need to run **apt-get dist-upgrade** and answer a few questions (config files which might change).

If you have any suggestions for any other server types (like worker servers for example), do let us know!

## Server Infrastructure Update

URL: https://ploi.io/news/server-infrastructure-update
Published: 2019-06-12

We are updating our server infrastructure, therefore we will have a new IP address. ?

**Do I need to change or do anything?**
There is no action required from your end if you have everything setup. If you are using IP whitelisting in your favorite server provider, we do recommend updating your API key with our new IP address.

**When is this taking into action?**
The update will occur on the 16th of june 2019 10:00 CEST, there could be some downtime but we expect it to be switched real quick.

You will be able to find our updated IP address in our [documentation](https://ploi.io/documentation).

If you have any questions please do let us know!

## File Explorer Feature & Free Larabug ?

URL: https://ploi.io/news/file-explorer-feature-free-larabug
Published: 2019-05-31

**File Explorer**

Today we have released a new feature; the server file explorer, easily manage your folders &amp; files through the Ploi panel. This feature was built silently in the background and was now ready for its first release ?

 ![FileExplorer](https://ploi.io/images/screenshots/file-explorer.jpg)﻿﻿


This feature is available for all users with an subscription on the **Unlimited** plan.

**Laravel Developers Unite, free Larabug! ?**

We have recently added Ploi social login to <https://larabug.com/login>, where you can login with your Ploi account. 
This is because every user that has a paid subscription in Ploi: gets a free paid subscription with Larabug. Upon login (with your Ploi account) we will sync your expire date from Ploi, to Larabug.

 ![](https://ploi.io/storage/59/Screen-Shot-2019-05-31-11-28-12.png)


Head over to <https://www.larabug.com> and login with Ploi to retrieve your free subscription.

## Partnership with Hetzner! ?

URL: https://ploi.io/news/partnership-with-hetzner
Published: 2019-05-21

We are very proud to announce we have established an official partnership with Hetzner, this partnership is a big step for us moving forward. ?

We are still working on partnering up with the other providers that are available in our integrations system. It is an excellent way for us to offer stability and assurance to our users.

If you know a server provider that would fit nicely in Ploi; let us know! We are more than welcome to open up our list and welcoming new and/or young providers. ?

## You may now select different PHP versions per site ?

URL: https://ploi.io/news/you-may-now-select-different-php-versions-per-site
Published: 2019-04-18

Today we released the feature to switch PHP versions per site.

You can install each desired PHP version we offer inside server level PHP tab, once installed you will get more versions available inside the site -&gt; META tab where you can select the desired PHP version for that site.

 ![](https://ploi.io/storage/56/Screen-Shot-2019-04-18-12-21-44.29.png)

It is also possible to select a default PHP version which newly created sites will use, you can change this once it has ben created.

![](https://ploi.io/storage/57/Screen-Shot-2019-04-18-12-22-05.42.png)

## So NGINX + Apache2 Hybrid is a thing now ?

URL: https://ploi.io/news/so-nginx-apache2-hybrid-is-a-thing-now
Published: 2019-04-04

UPDATE MARCH 2020: Support for this feature has been dropped: <https://ploi.io/features/nginx-apache-hybrid>

Added because of high demand: **NGINX + Apache2** as a proxy!



With this it is possible to run any application that would also require a .htaccess file. Of course you are still able to run any application without .htaccess, this is what makes the NGINX + Apache2 combination so awesome.



We’ve set this up so the NGINX server is still your main web server, and Apache2 is running as a proxy. Basically nothing is different except another layer has been added to the stack.



![](https://ploi.io/storage/53/Screen-Shot-2019-04-04-22-36-07.png)





To use this functionality, create a new server and select "NGINX + Apache2 Hybrid" as web server type.
 **Note:** It is currently not possible to upgrade an existing server to this configuration. If you are in need of .htaccess support, we recommend you provision a new server and select the “NGINX + Apache2 Hybrid” web server type when creating a server.

## Website Isolation, anyone? ?

URL: https://ploi.io/news/website-isolation-anyone
Published: 2019-03-25

Sometimes you want to isolate a website from another application that might be vulnerable for security exploits, this is where website isolation comes into action. ?

We just released a new feature where you are able to manage your own server system users, this allows you to separate applications from one to another.

You can let Ploi.io automatically create a system user for you when creating a new domain (this will generate a unique name from the root domain):

 ![](https://ploi.io/storage/51/unnamed-%281%29.png)

You are also free to create your own system users by going into the ‘Manage’ tab and press ‘System Users’ to get an overview of your current system users:

![](https://ploi.io/storage/52/unnamed-%282%29.png)

## Introducing: Load Balancing! 🛰️

URL: https://ploi.io/news/introducing-load-balancing
Published: 2019-03-08

We are very proud to introduce load balancing!

**Load balancing?**

In a nutshell; Load balancing is a way to evenly distribute traffic between several servers to reduce load on your webservers and have a higher uptime. You have 1 load balancing server that distributes the traffic between the assigned webservers.

![](https://ploi.io/storage/43/loadbalancing.png)

It is now possible to install your own load balancer and assign servers to the load balancer, we have made it a breeze to set this up. Even Let’s Encrypt support has completely been taken care of.

**How do I create a load balancer in Ploi?**

Head over to the server creation screen and select your provider. In the server detail form you will see a type field where you can specify the type of the server. Select Load Balancer and you're all set!

![](https://ploi.io/storage/44/Image-2019-03-08-at-12.25.48-PM.png)

## Automatic subscriptions now available ?

URL: https://ploi.io/news/automatic-subscriptions-now-available
Published: 2019-02-18

No more manual renewing your subscription!

It is now possible to enable automatic subscriptions so you will never forget to extend your subscription. You can do this by going to your [profile](https://ploi.io/profile/subscription) and selecting the ‘Subscription’ tab.

 ![](https://ploi.io/storage/41/Image-2019-02-18-at-12.08.04-PM.png)

Click on your desired plan and select ‘Automatic renewal’, this will guide you through the automatic renewal process. Currently we support automatic renewals with these methods: Credit card &amp; iDEAL.

Let us know if you run into anything!

## Google Drive Support!

URL: https://ploi.io/news/google-drive-support
Published: 2019-02-16

We have just released the ability to backup to your Google Drive!

We had this featured ready a while ago, we were waiting for Google to approve our application which has to follow strict guidelines regarding privacy.

You can easily link your Google Drive account inside your profile under the “API Keys” tab. After this, you will be able to select “Google Drive” as backup provider.

You can also provide folder ID’s to backup too, we have written a FAQ on how to find these ID’s: <https://ploi.io/documentation/mysql/where-do-i-get-google-drive-folder-id>

 ![](https://ploi.io/storage/40/Image-2019-02-16-at-2.34.35-PM.png)

## Server Monitoring & phpMyAdmin 1-click install

URL: https://ploi.io/news/server-monitoring-phpmyadmin-1-click-install
Published: 2019-01-29

We are still going strong and a lot of updates are incoming, so be sure to follow us on social media!

**Server Monitoring**

The first start has been made to our monitoring system, notifications and more specific details about your server usages will be available soon. For now users with a Pro plan or higher can install Ploi monitoring and view a chart with their statistics.

 ![Monitoring](https://ci5.googleusercontent.com/proxy/QuQgR-YqmEU9sNUxYGAOMa1oDl8ZXE-6ZA9p7nq8CnlwiRNg2ZOkoVC_Y-dpvXOiuNdxia7JY4ZhNMXrrzQGjIA3MyuNBnJ9iJTNUbbOhzNjPSye9Q8JGiw9HF2Cb9f2cdR2DoBy0ExFP2Rmcae77TputxKSG3Mk2Cv6y3nfQTYGX-wbMk8P8WAcuu-E0q1dFSlAGjdyKEJ6dXliCnfz3D4TrGbiiOukGi6pynEPJestVgODOW6tznfjt0KWvw=s0-d-e1-ft#https://duaw26jehqd4r.cloudfront.net/items/3f1M0y0T1N2G0U3z3f1z/%5Bb7d48cb516c12dada1b286e24fbd44fc%5D_screencapture-ploi-test-panel-monitoring-90-2019-01-29-09_39_23.png)

<https://ploi.io/features/monitoring>

**phpMyAdmin 1-click install**

This is a highly requested feature, it is now possible to safely install phpMyAdmin with 1 click in your server management tab. After installing, your server will expose the phpMyAdmin dashboard @ <http://%7Bserver_ip%7D/phpmyadmin>

This can be extremely handy if you need to access it from a place other than your regular computer. (Because you can uninstall it with 1 click too)

<https://ploi.io/phpmyadmin>

**Upcoming features..**

We still recommend you to keep looking at our [roadmap](https://ploi.io/roadmap), because everything that is getting built, featured by users is put on there.

For now, we are working on these parts;

**Teams**

We are doing one more bigger refactor to our recent teams update with global permissions.

**MongoDB**

MongoDB is a highly requested feature as well, we are working on support inside our panel for this database type.

If you have anything, feature wise, bug wise, it does not matter, let us know!

## Install phpMyAdmin with 1 click ✍?

URL: https://ploi.io/news/install-phpmyadmin-with-1-click
Published: 2019-01-18

We have added support to 1-click install [phpMyAdmin](https://www.phpmyadmin.net/) through our panel.

You will be able to find the installation in the 'Manage' tab server-level.

 ![](https://ploi.io/storage/92/Screen-Shot-2020-01-24-09-25-50.png)

## Huge Teams Update ?

URL: https://ploi.io/news/huge-teams-update
Published: 2019-01-17

Doing nothing, is moving backwards. Thats why we always move forward, to continue to make Ploi even a better system for you to work with.  (And thats why we value your feedback very, very much)

**Refactored Teams Feature!**

Today we are happy to announce a whole new teams refactor in our panel ?

**Why change what worked?**

Correct, fact was that it did worked. But not extensively enough, we also received some feedback on how we could improve on this particular feature.

That being said it is not completely polished yet, there might be some UI changes to make it more fluent and workable.

**Are there any more updates coming?**

Certainly, we have a lot of more updates incoming for teams. As for one are more extensive higher level permissions on teams besides the team-server-user permission system.

**Screenshots:**

 ![](https://ploi.io/storage/31/team1.png) ![](https://ploi.io/storage/32/team2.png) ![](https://ploi.io/storage/33/team3.png) ![](https://ploi.io/storage/34/team4.png) ![](https://ploi.io/storage/35/team5.png) ![](https://ploi.io/storage/36/team6.png)


We love to hear from you if you have any feedback!

## Happy New Year, Hetzner Support & Updates ?

URL: https://ploi.io/news/happy-new-year-hetzner-support-updates
Published: 2018-12-31

Past week quite a few things have been added, changed and updated. One of the bigger updates is UpCloud support which we released a few weeks ago.

This past week we have added Hetzner as supported server provider, this way you can easily create servers with Hetzner.

**Server Builder**

The server builder screen has been updated as well, we now display the logos of the provider. There are more changes coming soon to the server builder to allow more flexibility to creating your own personal server.

**Database Backup**

The database backup window now also has another field where you can exclude specific table names that you do not want to include in your backup. This can be extremely handy if you don’t need specific log tables to be backed up to speed up your backup and make it more lightweight.

 ![](https://ploi.io/storage/27/Image-2018-12-29-at-4.48.20-PM.png)

Last but not least, HAPPY NEW YEAR! We would like to thank everyone for believing in us and providing feedback. We have a lot upcoming for 2019 ([see our roadmap](https://ploi.io/roadmap)) which is great!

**DISCOUNT!**

Use this discount code **HAPPY-NEW-YEAR** to get 15% off your plan subscription. This code is valid until the 5th of januari, 2019. Its only usable once and can be used for extending your plan for 2 months maximal.

## UpCloud integration support with Ploi.io ?

URL: https://ploi.io/news/upcloud-integration-support-with-ploiio
Published: 2018-12-21

We partnered with UpCloud! ?

<https://upcloud.com/community/tutorials/start-deploying-ploi/>

UpCloud is a cloud hosting company and states that they provide the fastest cloud servers (generally speaking they tell everyone they are 50% faster than other hosting providers are, which is a big statement and really saying something!).

Their numbers don’t lie; they claim to even provide faster servers than DigitalOcean does: <https://upcloud.com/compare/digitalocean/>

Throughout partnering we’ve had contact with several UpCloud employees because of the integration, and al of them; were really friendly, responded swiftly and accurately.

Recently UpCloud rebranded completely; their whole style and website has changed to a more slick &amp; fluent design.

Currently Ploi is hosted with DigitalOcean, but we are changing our infrastructure to several UpCloud servers which will be load balanced. We do recommend UpCloud as server hosting provider as they have proven themselves more than enough.

UpCloud is fully integrated in our panel, easily add your UpCloud account in your Ploi profile so you can create UpCloud servers straight from our panel!

**Use this link to get a 25$ credit on your UpCloud account:** <https://www.upcloud.com/register/?promo=ploi>

## Black Friday 2018 is coming up!

URL: https://ploi.io/news/black-friday-2018-is-coming-up
Published: 2018-11-22

It’s that time of year again! For the next two days, you can upgrade or extend your current plan with a discount of 25% for a maximum of 2 months.

Use this code to get the 25% discount: **BLACKFRIDAY2018**

We would also like to take this opportunity to thank everyone that has been giving their input about Ploi and how to be even better at what we do. As we say many times; user feedback is very important for us.

To see what is to be expected in Ploi in the upcoming months, we recommend you check out our roadmap here: <https://ploi.io/roadmap>

Have a great day and if you think you have any friends/co-workers that might be interested in Ploi let them know about it ?

## Automatic File Backups now available! ?

URL: https://ploi.io/news/automatic-file-backups-now-available
Published: 2018-11-03

![](https://ploi.io/storage/21/banner-file-backups.png)

It is now possible for users with a plan that contain automatic file backups to specify paths that they want to have backed up.

You can save up unlimited backup locations to your website, each path that you specify will be verified if it exists. Currently we only allow folders in side the /home/ploi folder to be backed up.

To start backing up file locations, check out the 'Manage' tab inside your website to create new locations that you want to have backed up.

 ![](https://ploi.io/storage/22/Image-2018-11-03-at-1.23.26-PM.png)

## Automatic Updates ⏰ & Server Apps ?

URL: https://ploi.io/news/automatic-updates-server-apps
Published: 2018-09-25

**Automatic Updates**

We have released automatic updates after a user suggested to us that he needed this badly. We saw the need of this feature request as we had more people requesting this. As we value user feedback very much, we processed this and is now visible in your server under the “Manage” tab. You can choose to execute updates daily, weekly and monthly.

 ![AutomaticUpdates](https://ci5.googleusercontent.com/proxy/0LweLDBLgTXRuR2CIZAmT9yIx06Ki6tFLtjQGti7RSSf9UUPhNdbWpBAWu9Fuk_PF1jE2PgBCx3WrL2J-DBdL7YHtez7QobQL_85BgCIyabq5btZ7NfdGGat1V9W13UBJM7b9TYSMFQzNPh42jU=s0-d-e1-ft#http://screenshot.dennissmink.nl/b2c51afbe0d2/Image%202018-09-23%20at%208.06.17%20PM.png)

**Server Apps**

Server apps are comparable to sites, but without all the default webserver configuration. This makes it possible to run your own apps like JAVA daemons, socket servers or anything else from a GIT repository. (The functionality is exact the same)

These apps will be stored under /home/ploi/applications/{slug-app}

**PHP version**

We also made it possible while setting up your server to select your PHP version. The default refers to PHP 7.1. Once PHP 7.3 is fully released we will of course make this available through our interface. (You do not need to reinstall your server for this to change, as we can already change PHP versions without any problem)

 ![PHPVersion](https://ci6.googleusercontent.com/proxy/ZCd_Ck1S0PjeKjPvPst9GfwVOpgPx5Hod90POZrAfEUHRs12K6KiH9yEhU8r_Tkh50E6R2bNku6HGSc8-xCQ06xG89WY9nrMnOm6k8uV7tfGbtTab-0FE9hAfikUymwpr8aXALfDYuDELkkg70E=s0-d-e1-ft#http://screenshot.dennissmink.nl/4f7e5bbb314e/Image%202018-09-18%20at%203.01.30%20PM.png)

**Whitelabel**

One of the biggest features yet to be released yet, still in full progress. We had to postpone this a bit more as we found some features that would be nice to integrate simultaneously with the release of whitelabel.

Also we have decided that we are releasing the Ploi-hosted whitelabel in 2 versions:

- Reseller version
- Company version

The reseller version is for users that want their clients/customers to log in and manage their own server/sites. Company version is basically the same but only ment for internal usage.

Pricing wise these will not differ from each other, we have not settled on a price yet.

If you want to submit a feature just contact us, or check out our [Roadmap](https://ploi.io/roadmap) and leave a comment in a card if you want to give more priority to one!

## New Frontend Design & Cloudflare integration

URL: https://ploi.io/news/new-frontend-design-cloudflare-integration
Published: 2018-08-26

Big updates to present to you once again!

**Frontend Design**

First of all we updated our frontend design, its completely renewed and ready for the future ?

Let us know what you think!

[https://ploi.io](https://ploi.io/)

**Cloudflare Integration**

As you might of seen on social media, we have been working on the Cloudflare DNS integration.

This allows you to manage your DNS easily in our control panel.

**API SDK &amp; API documentation renewed**

We have replaced our old documentation generated by documentation with a VuePress system. This improves overview and readability.

You can find our new documentation over here: <https://developers.ploi.io/>

To be able to communicate with this API, you will either need to write your own class or use our SDK. We got help whilst developing (which you can find on the about us page) this package.

<https://github.com/ploi-deploy/ploi-php-sdk>

As always we love to hear your feedback or suggestions, do not hesitate to contact us!

## New Logo, Domain Aliases & More!

URL: https://ploi.io/news/new-logo-domain-aliases-more
Published: 2018-08-15

Last time we've announced our [public roadmap](https://ploi.io/roadmap), since then people have been submitting features and suggestions. If you don't see your request on here please let us know so we can add this to the list.

**Domain aliases**

This was actually quite requested a lot, which we processed in our UI. It is now easily possible to manage your domain aliases through our panel. This makes it possible to point multiple domains to 1 site in Ploi.

 ![DomainAliases](https://ci4.googleusercontent.com/proxy/51qmwBXxbSKhAgFEUvKcjuHyWOjsE5aJgIhUVEWYPYtLRrNlrhDBbIjLvCu-NA0gN1lEqwk2u5Feim4eO5uqxEjnOaYiuMVXASET_KI1DEhtkOTEvyydYltzZWn-Kxd5bkV-tJ9CkX8rg3WxBwQoEhTINu6CTSaBrwa9uyw9Grs=s0-d-e1-ft#https://dha4w82d62smt.cloudfront.net/items/3N1S0Y3f3i0o0T1m2W16/Image%202018-08-13%20at%204.18.55%20PM.png)

**New logo?!**

Ah, yes. We've changed our logo, here it is;

 ![NewPloiLogo](https://ci5.googleusercontent.com/proxy/x0ELTLa2ouTaU_h5a57fTGIZsvsGKCmiB9MtgoP1nORvwt8X-Gwqr_ZXskxFUKmZxNaLBaUUUxlfuSUBG9cphwy2YfmAEu49=s0-d-e1-ft#https://ploi.io/images/ploi-logo-outline-small.png)

**View deployments log**

Usually you could only see 1 latest deploy log from your website, now you can read back the latest 5 (if there are any):

 ![Latest5Deploys](https://ci6.googleusercontent.com/proxy/gYpzzkIyyY8P8s8hMSj8yXOwGYPf9YEuMhtl187f6cpGSAyxDWvmPy85ztYxmDRNc880_SXWZ51n1g0ZZfQiveBFNChMnCLrvd9gELqxdKTX-HmWHG-JptmHaikOi3U5aMQpcAAiKHYjEtvMW36RTXkBxwJJG0cS1n_25OwhWoc=s0-d-e1-ft#https://dha4w82d62smt.cloudfront.net/items/2u3u1X2H0g0K1K1W1L2A/Image%202018-08-09%20at%209.12.54%20AM.png)

We also recommend you to follow our [Twitter](https://twitter.com/ploi_deploy) page as we provide a lot of updates and news on there: [Ploi Twitter](https://twitter.com/ploi_deploy)

## Local backups, pricing update & roadmap ?

URL: https://ploi.io/news/local-backups-pricing-update-roadmap
Published: 2018-08-06

**Roadmap**

We have made our Trello board public for everyone to see. If you submit a feature or bug, chances are big you will see it back on the Trello board.

You can find it here: <https://ploi.io/roadmap>

**Local backups &amp; interval**

Thanks to one of our members you are now able to automatically create MySQL backups to your local drive.

For those wondering about use cases, on top of backing up to the local file system, you can also backup to a mounted volume and not have to worry about losing backups if you destroy the droplet, much easier to setup than (S)FTP also.

Not to forget is the interval feature as well, when selecting a database to backup you will be able to set a interval. This can vary from each 10 minutes to 8 hours, you can also select 'Each night' so Ploi will always back up each night for you automatically.

**Pricing update**

As of the **10th of August** we will change our prices, these price changes will be as following:

PlanOld PriceNew PriceFree$0$0Basic$5$8Pro$10$13Unlimited$20$25


As always we hope to see you soon @ [https://ploi.io](https://ploi.io/) and if you have any questions just let us know!

## Can it get any easier? Install OctoberCMS with 1 click & updates?

URL: https://ploi.io/news/october-cms-backups-update
Published: 2018-08-03

We can't say (and develop) it enough, we love progress. Thats why we have a hand-full of updates again for you.

**OctoberCMS 1-click-install**

Quickly whip up a CMS system? No problem, we now also offer OctoberCMS support! Installation is pretty straightforward, just press the "Install OctoberCMS" button and Ploi will take care of the rest for you.

![OctoberCMS](https://ci6.googleusercontent.com/proxy/itfpDs2auskB7s9uJeMffdtH9Tw1PEYim53JNnFLs_ppjooWdvs1FlFgXz5Igsp2Ojk7ajpcq9a30cy_nexIxIFe3IDVlFVahpxpIrEAKU4G4xCzSfCDCNLM07_7BweQ0CgLyY_86DrcoUXkissMY19pmogIsfvmfGSE1vwcc4j8=s0-d-e1-ft#https://dha4w82d62smt.cloudfront.net/items/1n2v2Q401o0O0Y3n0w1l/Image%202018-08-02%20at%2010.00.46%20PM.png)

**Extended MySQL Backups**

MySQL backups are usually forgotten or people find it a hassle to setup. Well no more hassle! There is no excuse to not run MySQL backups now when Ploi makes this very, very easy for you.

![Backups](https://ci4.googleusercontent.com/proxy/R2ftaHHBCy4ZNkv90e3uUvB487LnvH79FJS7DQOTcZY_DTWiyxt_wfWwFrjYw5ykkAtXjpIDxhlcma7BtjSaPN7y4SkShGA36dqxzUM8y_DPo01KM1m2vsssMkR2JaqIHyhgVxX0PFR5gCE61idedbU4i-y3ECZ51ZRDHoL6oXiIYr9NMnYbemzsi_tDp3b62tBcR0zuSV5A7ZlsKxkzpWDLVhUIp10ZEl8=s0-d-e1-ft#https://dha4w82d62smt.cloudfront.net/items/282f1b3j3m2q0q2w0E2a/Image%202018-08-01%20at%201.18.35%20PM.png?X-CloudApp-Visitor-Id=2342373&v=e1ea785b)

We have added FTP and SFTP to supported drivers and we are also working on OneDrive and Google Drive support. If you have any suggestions for supported drivers to backup to, let us know.

As always if you have any feedback please let us know as we value this very, very much.

## 3 new features released!

URL: https://ploi.io/news/3-new-features
Published: 2018-07-29

We have some great updates for you once again, we keep on innovating Ploi so you get to enjoy the most relaxed and easy tool to manage your servers and sites with.

**Installation Screen refactor**

Today we have released a new version of our server installation process, we refactored the screen a lot which is more fluent with setting up a server.

![ServerBuilder](https://ci4.googleusercontent.com/proxy/8jxv1ExuXKZZF9yAM3ckeIzGwXFke7ZpOA715J8w2pM9Hu6ERe1IMNkFpvdrPmzKdIPY2T5pKeXfg7xP0YsoHXhJY4XvZn2D4zdwP1ZtAhB1-oCkMrKsKL6ykCl1NPrFulSQTzp1BVFBn6W9pX0=s0-d-e1-ft#http://screenshot.dennissmink.nl/3u3E0e004006/Image%202018-07-29%20at%202.47.18%20PM.png)

**Custom SSH ports**

Also a new feature is custom SSH ports, this makes it possible to change your SSH port after you created the server to any port you like. Be aware that Ploi does nothing on your server, this is only to update the knowledge for Ploi where to connect on.

![CustomSSHport](https://ci4.googleusercontent.com/proxy/eU2Y1x8beY8LsXVrMxxvqHzE4UScBFVvg6KNkjgLhnL6QJaY6gxvhE737c35zyiHN17KSC-QOENt2z81oHWtAZxzWAu5RatXDn1R98t7Pe1ejhjBr_HX_OlRK2HKhlWXjSD45tTo4yXC_DW0c9U=s0-d-e1-ft#http://screenshot.dennissmink.nl/1D093P471m3e/Image%202018-07-29%20at%202.46.36%20PM.png)

**Monitoring update**

We have also updated our monitoring tab, it now displays more information regarding your server. (This will require you to setup Servitor, which is really easy)

![Monitor1](https://ci4.googleusercontent.com/proxy/cmucjyVWpNBzNDTvnXRvyr77VGp1wADOG2kfD8oCbttn6ELY-NXL761Shz6L7v-riFT1r2AYXV9xx4HOQkieTYJL8Ti4buITGQc1NNB9F3evJPtDEG8Jzj3FanRbqZPtSyrdBNLJaiHy8X0MFrM=s0-d-e1-ft#http://screenshot.dennissmink.nl/1p3m3D1K2w2Q/Image%202018-07-28%20at%209.31.20%20AM.png)

When you enabled monitoring, you will also be greeted with information below your server to quickly display the health:

![Monitor2](https://ci5.googleusercontent.com/proxy/_PfCUp84wv_-KXtnB0R4MCoAUQFKZ9mNYF_08q9zatuHTVtoB6vNSKGDRAV-2RqFvSEYjq9BnqPLbZdU5mTeKiCSxAy6Cx35vYWrMm6LyTxq4-Q6ilJhbWeKtW5Dl9gmd5fdbUBEokWTOv3yiU0=s0-d-e1-ft#http://screenshot.dennissmink.nl/0A392T1D2x3M/Image%202018-07-28%20at%203.19.54%20PM.png)

Please let us know what you think and if you have any feedback do not hesitate to contact us!

## Scaleway support has been added & more..

URL: https://ploi.io/news/scaleway-support-and-more
Published: 2018-07-26

Last time we asked you if Scaleway support was wanted, we got enough responses to actually implement this in our panel.

You can easily couple your Scaleway account to your Ploi profile and create servers with them.

For more information we guide you to this article about the update: [Medium: Deploy a Scaleway server with Ploi](https://medium.com/@dennissmink/deploy-a-scaleway-server-with-ploi-io-5259ef7935a7)

If you have any more suggestions about providers you'd like to see in Ploi, just let us know by leaving a reply to this e-mail!

**New server building screen**

We also updated our server building screen, this is the new screen that you see when your server is building with a progress bar to get a indication on how far your server is with installing:

![ServerBuilds](https://ci3.googleusercontent.com/proxy/9PCuA10lnYTJChIx4fV1N-PGjtiB_aCBxyh2jKUbwGBssKVFCW6DwiBKr-1Dh1jh-haQJGgbnPpID83K4hGze4fYRGKWxcGgk7UIHuLXlDvHTTlRevp4OGr_2eNNLc_KJZ2dDZ8BI0pGBFsiSl4BDSP4j0Vdn9zGLW5KgLckSkGu=s0-d-e1-ft#https://dha4w82d62smt.cloudfront.net/items/3d293p2J29470C032Y2Z/Image%202018-07-26%20at%2010.35.33%20AM.png)

**Any more?**

Next up is the server creation screen, we will update this screen to offer more fluent support to setup your server.

We are currently also looking into 'server types', this feature that we are creating will make it possible to provision servers that have specific apps. For example if you want a seperate Redis or MySQL server you can setup a server with Ploi and group them with other servers. With this feature we are simultaneously working towards the High Availability network principle, we will update you later on this feature.

## 2 new features!

URL: https://ploi.io/news/2-new-features
Published: 2018-07-12

**Basic Authentication**

We released a new feature called "Authentication" inside site level, in here you can create basic auth users so you can protect your sites with a username/password combination. This makes it easy if you have a dev domain for example, to protect this from the outer world. This feature is enabled for all paid plans and looks like this:

**Quick Deploy**

Also, we release a feature called "Quick Deploy", which makes it possible to deploy once you commit to the master branch. You can enable this with Bitbucket, Github, and Gitlab.

## Scripts functionality

URL: https://ploi.io/news/scripts-functionality
Published: 2018-06-18

**Ploi introduces: Scripts!**

You can now save scripts to your account to easily run on your servers. Do you have a script to install MongoDB? Or perhaps Elastic Search? Save your script and run it easily on a server.

Scripts are only available for users that have a paid plan.

You can save as many scripts as you want, and you can run them anytime you want.

## Zero time deployment

URL: https://ploi.io/news/zero-time-deployment
Published: 2018-05-28

**Ploi introduces: Zero time deployments!**

You can now easily enable zero time deployments for your site. Zero time deployment makes it possible to deploy without any downtime, this makes your application more reliable and no one will even noticed the deploy.

Zero time deployment is currently only available for users with the Pro or Unlimited plan.

## Linode support

URL: https://ploi.io/news/linode-support
Published: 2018-05-22

**Ploi introduces: Linode support!**

It is now possible for our users to create servers with Linode, all you have to do is create a Linode API key (Personal Access Token), and add this to your Ploi profile (under "Server providers section").

Be aware that this token needs to have read and write access for Linode's, otherwise Ploi will not be able to create a server for you.

## Automatic Dropbox MySQL support

URL: https://ploi.io/news/automatic-dropbox-mysql-support
Published: 2018-05-14

**Ploi introduces: Automatic Dropbox MySQL support!**

It is now possible for users with a paid plan, to backup their MySQL databases to Dropbox. You can enable this by going to the MySQL overview and enable the backup.

Ploi creates a dump of your database, zip's it and then uploads it straight to your Dropbox account. This happens every night at 04:00 AM UTC.

Please note that this feature is only available for paid plans.
