ficloud
======

ficloud alows to deploy your fig infrastructure to remote servers . Also it
provides all the services needed for hosting production apps.

Features:

 - define your app config through Dockerfile and fig.yml
 - easy deploy through git push
 - pushing several versions of app (dev, staging, production ... etc)
 - haproxy based balancer tcp
 - easy switch balancer endpoint between app versions (ex swap prod and dev)
 - persistent storage for containers
 - easy copying persistence storage between containers (prod -> staging, etc)
 - push and pull persistent volumes from your production server

Installation
-------------

Install docker: http://docs.docker.io/en/latest/installation/

Make sure you can run docker containers::

    sudo docker run -i -t ubuntu echo -e "OK";

Install packages::

    sudo apt-get install python-pip python-dev
    sudo pip install ficloud

Test that ficloud is working::

    $ ficloud-server app-list

    +-----+---------+-------+
    | App | Version | State |
    +-----+---------+-------+
    +-----+---------+-------+

Create ficloud user (you can pick any username)::

    sudo useradd -s /bin/bash -d /home/ficloud -m ficloud
    sudo su ficloud
    cd /home/ficloud
    mkdir ~/.ssh
    vim ~/.authorized_keys # insert your ssh key and ssh key of your root user into this file
    chmod -R go-rwx ~/.ssh

Test you can ssh into your server using ficloud account::

    ssh ficloud@yourserver.com

Make sure your root user can also access your server::

    sudo ssh ficloud@yourserver.com

Add ficloud user to docker group::

    sudo usermod -a -G docker ficloud

Check ficloud can run docker now::

    sudo su ficloud
    docker run -i -t ubuntu echo -e "\033[0;32mFicloud can run Docker - OK\033[0m";
    exit

Install haproxy::
    sudo apt-get install haproxy
    sudo echo "ENABLED=1" | sudo tee /etc/default/haproxy
    sudo service haproxy start
    sudo curl https://raw.github.com/pywizard/ficloud/master/examples/haproxy.cfg.tpl | sudo tee /etc/haproxy/haproxy.cfg.tpl

Now install incron to reconfigure haproxy, when you deploy new apps::

    sudo apt-get install incron
    sudo echo "root" | sudo tee /etc/incron.allow

Edit incrontab file and insert lines generated by inotify-dump in incrontab file::
    
    ficloud-server inotify-dump

    /home/ficloud/apps-conf IN_MODIFY,IN_CREATE,IN_DELETE,IN_NO_LOOP /usr/local/bin/ficloud-server balancer-dump /home/ficloud/apps-conf
    /etc/haproxy/haproxy.cfg.tpl IN_MODIFY,IN_CREATE,IN_DELETE,IN_NO_LOOP /usr/local/bin/ficloud-server balancer-dump /home/ficloud/apps-conf

    $ sudo incrontab -e

And the last thing. Allow ficloud to read-write any docker container volume:
   
    ficloud ALL= NOPASSWD:/usr/bin/rsync
    
    
Install git:

    sudo apt-get install git


Deployement
-------------

Start by creating application that is working locally using fig.yml

Set working ssh account::

    $ ficloud use ficloud@myserver.com

Create an application:

    $ ficloud remote app-create foo

Deploy code:

    $ git push ficloud@myserver.com:apps/foo master:prod

Check port number:

    $ ficloud remote app-list

Configure balancer:

    $ ficloud remote balancer set mydomain.com web:80@foo#prod

Push volume to deployment:

    $ filcoud volume-push web/code@foo#master

Push volume from deployment:

    $ filcoud volume-pull web/code@foo#master

Remote volume copy:

    $ ficloud remote volume-copy web/code@foo#master foo#v1

Your app is deployed!

Data migration
----------------


