2019-12-03 17:32:27 +01:00
# Install Fab-Manager in production with docker-compose
2016-03-23 18:39:41 +01:00
2019-12-03 17:32:27 +01:00
This document will guide you through all the steps needed to set up your Fab-Manager app on a production server, based on a solution using Docker and Docker-compose.
2017-07-20 19:54:37 +02:00
We recommend DigitalOcean, but these steps will work on any Docker-compatible cloud provider or local server.
2019-12-03 17:32:27 +01:00
In order to make it work, please use the same directories structure as described in this guide in your Fab-Manager app folder.
2017-07-20 19:54:37 +02:00
You will need to be root through the rest of the setup.
2016-03-23 18:39:41 +01:00
2017-07-20 17:14:02 +02:00
##### Table of contents
2017-07-20 17:18:19 +02:00
1. [Preliminary steps ](#preliminary-steps )< br />
2019-12-30 17:34:15 +01:00
1.1. [Setup the server ](#setup-the-server )< br />
1.2. [Setup the domain name ](#setup-the-domain-name )< br />
1.3. [Connect through SSH ](#connect-through-ssh )< br />
1.4. [Prepare the server ](#prepare-the-server )< br />
2017-12-13 17:51:44 +01:00
2. [Install Fab-manager ](#install-fabmanager )< br />
2017-07-21 09:27:29 +02:00
2.1. Add docker-compose.yml file< br / >
2.2. pull images< br / >
2.3. setup database< br / >
2.4. build assets< br / >
2.5. prepare Elasticsearch (search engine)< br / >
2017-12-14 14:33:49 +01:00
2.6. start all services< br / >
2.7. Generate SSL certificate by Let's encrypt
2017-07-20 17:14:02 +02:00
4. [Docker utils ](#docker-utils )
2017-12-14 14:33:49 +01:00
5. [Update Fab-manager ](#update-fabmanager )< br />
2017-07-20 17:42:55 +02:00
5.1. Steps< br / >
5.2. Good to know
2017-07-20 17:14:02 +02:00
2017-12-13 17:51:44 +01:00
< a name = "preliminary-steps" > < / a >
2017-07-20 17:37:03 +02:00
## Preliminary steps
2017-07-20 16:48:34 +02:00
2017-12-14 14:33:49 +01:00
< a name = "setup-the-server" > < / a >
2017-12-13 17:51:44 +01:00
### Setup the server
There are many hosting providers on the internet, providing affordable virtual private serveurs (VPS).
Here's a non exhaustive list:
- [DigitalOcean ](https://www.digitalocean.com/pricing/#droplet )
- [OVH ](https://www.ovh.com/fr/vps/ )
- [Amazon ](https://aws.amazon.com/fr/ec2/ )
- [Gandi ](https://v4.gandi.net/hebergement/serveur/prix )
- [Ikoula ](https://express.ikoula.com/fr/serveur-virtuel )
- [1&1 ](https://www.1and1.fr/serveurs-virtuels )
- [GoDaddy ](https://fr.godaddy.com/hosting/vps-hosting )
- [and many others... ](https://www.google.fr/search?q=vps+hosting )
2017-12-14 14:41:43 +01:00
2017-12-13 17:51:44 +01:00
Choose one, depending on your budget, on the server's location, on the uptime guarantee, etc.
You will need at least 2GB of addressable memory (RAM + swap) to install and use FabManager.
2017-07-20 19:54:37 +02:00
We recommend 4 GB RAM for larger communities.
2016-04-11 20:24:09 +02:00
2018-03-27 18:15:01 +02:00
On DigitalOcean, create a Droplet with One-click apps ** "Docker on Ubuntu 16.04 LTS"**.
2019-12-30 17:34:15 +01:00
This way, Docker and Docker-compose are pre-installed.
Choose a datacenter and set your domain name as the hostname.
2017-12-13 17:51:44 +01:00
2019-12-03 17:32:27 +01:00
With other providers, choose a [supported operating system ](../README.md#software-stack ) and install docker on it:
2017-12-13 17:51:44 +01:00
- [Debian ](https://docs.docker.com/engine/installation/linux/docker-ce/debian/ )
- [Ubuntu ](https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/ )
2017-12-14 14:41:43 +01:00
2017-12-13 17:51:44 +01:00
Then install [Docker Compose ](https://docs.docker.com/compose/install/ )
2019-12-30 17:34:15 +01:00
< a name = "setup-the-domain-name" > < / a >
2017-12-13 17:51:44 +01:00
### Setup the domain name
2016-04-11 20:24:09 +02:00
2017-12-13 17:51:44 +01:00
There are many domain name registrars on the internet, you may choose one that fit your needs.
You can find an exhaustive list [on the ICANN website ](https://www.icann.org/registrar-reports/accredited-list.html )
2019-12-03 17:32:27 +01:00
1. Once done, buy a domain name on it
2017-12-13 17:51:44 +01:00
2. Replace the IP address of the domain with the IP address of your VPS (This is a DNS record type A)
2019-12-03 17:32:27 +01:00
3. **Do not** try to access your domain name right away, DNS are not aware of the change yet so **WAIT** and be patient.
2016-04-11 20:24:09 +02:00
2019-12-30 17:34:15 +01:00
< a name = "connect-through-ssh" > < / a >
2017-12-13 17:51:44 +01:00
### Connect through SSH
2016-04-11 20:24:09 +02:00
2017-07-20 19:54:37 +02:00
You can already connect to the server with this command: `ssh root@server-ip` . When DNS propagation will be done, you will be able to
connect to the server with `ssh root@your-domain-name` .
2016-03-23 18:39:41 +01:00
2019-12-30 17:34:15 +01:00
< a name = "prepare-the-server" > < / a >
2017-12-13 17:51:44 +01:00
### Prepare the server
Before installing fab-manager, we recommend you to:
- Upgrade your system
- Setup the server timezone
- Add at least 2GB of swap memory
2017-12-14 14:33:49 +01:00
- Protect your SSH connection by forcing it through a RSA key
2016-04-11 20:24:09 +02:00
2017-12-14 14:33:49 +01:00
You can run the following script as root to easily perform all these operations:
2016-04-11 20:24:09 +02:00
2016-03-23 18:39:41 +01:00
```bash
2017-12-14 14:33:49 +01:00
\curl -sSL prepare-vps.sleede.com | bash
2016-03-23 18:39:41 +01:00
```
2017-12-14 14:33:49 +01:00
< a name = "install-fabmanager" > < / a >
2017-07-20 19:54:37 +02:00
## Install Fabmanager
2019-12-30 17:34:15 +01:00
### Setup script
2017-12-14 14:33:49 +01:00
2019-12-30 17:34:15 +01:00
Run the following command to retrieve the initial configuration files.
This script will also guide you through the installation process by checking the requirements and asking you some configuration elements.
2016-03-23 18:39:41 +01:00
```bash
2019-12-30 17:34:15 +01:00
\curl -sSL setup.fab-manager.com | bash
2016-03-23 18:39:41 +01:00
```
2019-12-30 17:34:15 +01:00
**OR**, if you don't want to install fab-manager in `/apps/fabmanager` , use the following instead:
2016-03-23 18:39:41 +01:00
```bash
2019-12-30 17:34:15 +01:00
\curl -sSL setup.fab-manager.com | bash -s "/my/custom/path"
2016-03-23 18:39:41 +01:00
```
2017-12-14 14:33:49 +01:00
< a name = "generate-ssl-cert-letsencrypt" > < / a >
2019-12-24 16:19:44 +01:00
### Generate SSL certificate by Let's encrypt
2016-03-23 18:39:41 +01:00
2017-07-20 19:54:37 +02:00
**Important: app must be run on http before starting letsencrypt**
2016-07-21 15:21:33 +02:00
2016-07-21 15:11:08 +02:00
Start letsencrypt service :
```bash
sudo systemctl start letsencrypt.service
```
2016-07-21 15:21:33 +02:00
2019-12-24 16:19:44 +01:00
If the certificate was successfully generated, you must update the nginx configuration to activate the ssl port and certificate.
```bash
mv /apps/fabmanager/config/nginx/fabmanager.conf /apps/fabmanager/config/nginx/fabmanager.conf.nossl
2019-12-30 17:34:15 +01:00
mv /apps/fabmanager/config/nginx/fabmanager.conf.ssl /apps/fabmanager/config/nginx/fabmanager.conf
2019-12-24 16:19:44 +01:00
```
2019-12-30 17:34:15 +01:00
Remove your app container and run your app again to apply the changes running the following commands:
2017-07-20 16:48:34 +02:00
```bash
docker-compose down
docker-compose up -d
```
2016-07-21 15:11:08 +02:00
2019-12-24 16:19:44 +01:00
Finally, if everything is ok, start let's encrypt timer to update the certificate every 1st of the month :
2016-07-21 15:21:33 +02:00
2016-07-21 15:11:08 +02:00
```bash
2016-11-30 21:48:46 +01:00
sudo systemctl enable letsencrypt.timer
2016-07-21 15:11:08 +02:00
sudo systemctl start letsencrypt.timer
2017-12-14 14:33:49 +01:00
# check status with
sudo systemctl list-timers
2016-07-21 15:11:08 +02:00
```
2017-12-14 14:33:49 +01:00
< a name = "docker-utils" > < / a >
2017-07-20 19:54:37 +02:00
## Docker utils with docker-compose
2019-12-24 16:19:44 +01:00
Below, you'll find a collection of useful commands to control your instance with docker-compose
2016-03-23 18:39:41 +01:00
2017-07-20 16:48:34 +02:00
### Restart app
2016-04-11 20:24:09 +02:00
2017-07-20 19:54:37 +02:00
`docker-compose restart fabmanager`
2016-04-11 20:24:09 +02:00
2017-07-20 16:48:34 +02:00
### Remove app
2016-04-11 20:24:09 +02:00
2017-07-20 19:54:37 +02:00
`docker-compose down fabmanager`
### Restart all containers
`docker-compose restart`
### Remove all containers
`docker-compose down`
### Start all containers
`docker-compose up -d`
2016-04-11 20:24:09 +02:00
2017-07-20 16:48:34 +02:00
### Open a bash in the app context
2016-04-11 20:24:09 +02:00
2017-07-20 19:54:37 +02:00
`docker-compose run --rm fabmanager bash`
2016-04-11 20:24:09 +02:00
2017-07-20 16:48:34 +02:00
### Show services status
2016-06-14 14:33:57 +02:00
2017-07-20 16:48:34 +02:00
`docker-compose ps`
2016-06-14 14:33:57 +02:00
2017-07-20 19:54:37 +02:00
### Restart nginx container
`docker-compose restart nginx`
2017-07-24 12:26:50 +02:00
### Example of command passing env variables
2017-07-20 19:54:37 +02:00
2017-12-21 11:32:13 +01:00
docker-compose run --rm -e ADMIN_EMAIL=xxx -e ADMIN_PASSWORD=xxx fabmanager bundle exec rake db:seed
2016-06-14 14:33:57 +02:00
2017-12-14 14:33:49 +01:00
< a name = "update-fabmanager" > < / a >
## Update Fab-manager
2017-07-20 17:14:02 +02:00
2017-07-20 17:49:18 +02:00
*This procedure updates fabmanager to the most recent version by default.*
2017-07-20 17:14:02 +02:00
2017-07-20 17:37:03 +02:00
### Steps
2017-07-20 17:14:02 +02:00
2018-11-26 10:56:15 +01:00
When a new version is available, follow this procedure to update fab-manager app in a production environment, using docker-compose.
2019-03-26 14:04:45 +01:00
You can subscribe to [this atom feed ](https://github.com/sleede/fab-manager/releases.atom ) to get notified when a new release comes out.
2016-06-14 14:33:57 +02:00
2017-07-20 17:37:03 +02:00
1. go to your app folder
2016-06-14 14:33:57 +02:00
2017-07-20 19:54:37 +02:00
`cd /apps/fabmanager`
2016-06-14 14:33:57 +02:00
2017-07-20 17:37:03 +02:00
2. pull last docker images
2016-06-14 14:33:57 +02:00
2017-07-20 17:50:37 +02:00
`docker-compose pull`
2016-07-21 15:21:33 +02:00
2017-07-20 17:37:03 +02:00
3. stop the app
2016-06-14 14:33:57 +02:00
2017-07-20 17:50:37 +02:00
`docker-compose stop fabmanager`
2016-06-14 14:33:57 +02:00
2017-07-20 17:37:03 +02:00
4. remove old assets
2016-06-14 14:33:57 +02:00
2017-07-20 19:54:37 +02:00
`rm -Rf public/assets/`
2016-06-14 14:33:57 +02:00
2017-07-20 17:37:03 +02:00
5. compile new assets
2016-06-14 14:33:57 +02:00
2017-07-20 17:50:37 +02:00
`docker-compose run --rm fabmanager bundle exec rake assets:precompile`
2016-06-14 14:33:57 +02:00
2017-07-20 17:37:03 +02:00
6. run specific commands
2016-06-14 14:33:57 +02:00
2017-07-20 17:50:37 +02:00
**Do not forget** to check if there are commands to run for your upgrade. Those commands
2019-03-26 14:04:45 +01:00
are always specified in the [CHANGELOG ](https://github.com/sleede/fab-manager/blob/master/CHANGELOG.md ) and prefixed by ** [TODO DEPLOY]**.
They are also present in the [releases page ](https://github.com/sleede/fab-manager/releases ).
2017-07-20 17:50:37 +02:00
Those commands execute specific tasks and have to be run by hand.
2019-03-27 17:44:19 +01:00
Using docker, you must prefix these commands with `docker-compose run --rm fabmanager bundle exec` .
You can also ignore commands only applicable to development environnement, which are prefixed by `(dev)` in the CHANGELOG.
2016-06-14 14:33:57 +02:00
2017-07-20 17:37:03 +02:00
7. restart all containers
2016-06-14 14:33:57 +02:00
2017-07-20 17:50:37 +02:00
```bash
docker-compose down
docker-compose up -d
```
2016-06-14 14:33:57 +02:00
2017-07-20 16:48:34 +02:00
You can check that all containers are running with `docker ps` .
2016-06-14 14:33:57 +02:00
2017-07-20 17:37:03 +02:00
### Good to know
2016-06-14 14:33:57 +02:00
2017-07-20 16:48:34 +02:00
#### Is it possible to update several versions at the same time ?
2016-06-14 14:33:57 +02:00
2017-07-20 16:48:34 +02:00
Yes, indeed. It's the default behaviour as `docker-compose pull` command will fetch the latest versions of the docker images.
2019-03-26 14:04:45 +01:00
Be sure to run all the specific commands listed in the [CHANGELOG ](https://github.com/sleede/fab-manager/blob/master/CHANGELOG.md ) between your actual
2017-11-15 10:20:23 +01:00
and the new version in sequential order. (Example: to update from 2.4.0 to 2.4.3, you will run the specific commands for the 2.4.1, then for the 2.4.2 and then for the 2.4.3).