# Pipeline Setup: MySQL

**Time Required: 10 minutes (Setup: 5 minutes; Data relocation: 5 minutes)**

DigitalOcean provides an excellent [MySQL setup guide](https://www.digitalocean.com/community/tutorials/how-to-install-mysql-on-ubuntu-18-04) as well as a ready-made MySQL instance image. We're going to use follow the guide, using the template image we created in Part 4 and prepared in [Part 5: Instance Prep](https://github.com/MordantWastrel/cf_swarm/tree/0580a1e6c94dfe23c5720afb58bfd6d50a447854/part7-productionsetupoutsidetheswarm/pipeline-setup-instance-prep.md).

Follow the guide exactly and do not skip any steps.

{% hint style="info" %}

### Aside: Remote Root Logins

One of the selections during the **mysql secure installation** script is an option to disable remote root logins to ensure that no-one can guess at the root password from the network. This is a good idea, but we'll want to block anyone not on our network (whether a VPN, a work subnet, or just within our provider's network, e.g. other droplets) from connecting at all. If we can do that, allowing remote root mysql logins is less bad.
{% endhint %}

## Moving the Data Directory

Once you've completed the basic setup guide, be sure to continue to the instructions on [How to Move a MySQL Data Directory](https://www.digitalocean.com/community/tutorials/how-to-move-a-mysql-data-directory-to-a-new-location-on-ubuntu-16-04) so we can take advantage of block storage. Just remember to use the mount point you named in Instance Prep: The guide uses **/mnt/db**, so if you did the same then you'd use that instead of the example in DigitalOcean's guide of **/mnt/volume-nyc-01**.

## Allow Port 3306 through your OS Firewall

Most of our access control will come from the provider-level firewall rather than UFW, so for now we'll just open MySQL's default port 3306 on UFW and deal with the bulk of the firewall rules in the next section.

```
sudo ufw allow 3306
```

Once you've verified that you can connect to your database instance with your preferred MySQL client, we'll continue with access control in the next section: [Database Setup (Provider Firewall)](https://github.com/MordantWastrel/cf_swarm/tree/0580a1e6c94dfe23c5720afb58bfd6d50a447854/part7-productionsetupoutsidetheswarm/pipeline-setup-provider-firewall.md).


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://cfswarm.inleague.io/part7-productionsetupoutsidetheswarm/pipeline-setup-database-prep/pipeline-setup-mysql.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
