Daily Archives: 09/04/2017

Owncloud con almacenamiento en S3 (con replicación de zona) y Let’s Encrypt

Una entrada completita para antes de irnos de vacaciones

Contendores y Proxy Pass

Comenzamos creando una instancia en OpenStack a la que provisionamos con un volumen para la persistencia de datos. El volumen lo podemos montar en /mnt y será nuestro directorio de trabajo.

En el directorio de trabajo creamos la siguiente estructura de directorios:

.
├── docker-compose
├── mysql
└── owncloud

En el directorio de docker-compose creamos el fichero yaml con el estado deseado de los contendedores:

---
version: '2'
services:
  owncloud:
    image: owncloud
    ports:
      - 8080:80
    volumes:
      - /mnt/volumen/owncloud:/var/www/html
  mysql:
    image: mariadb
    volumes:
      - /mnt/volumen/mysql/db:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: s3cr3t

Por no liar con los grupos de seguridad de OpenStack solo permito acceso al puerto 80/tcp así que vamos a levantar un Nginx delante de los contenedores.

# apt install nginx
# vim /etc/nginx/sites-enable/default
## Añadir este contenido ##
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name owncloud.example.com;

    root /var/www/html;

    # Add index.php to the list if you are using PHP
    index index.html index.htm index.nginx-debian.html;

    location / {
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_pass http://localhost:8080;
    }
}
## Reiniciar el servidor ##
# systemctl restart nginx

Podemos acceder a la url con el navegador y configuramos el usuario y la password para Owncloud. La conexión a la base de datos que podemos acceder por el host mysql con la contraseña que hemos elegido previamente.

Una vez dentro de Owncloud instalamos la App External storage support y lo dejamos aquí de momento.

Configuración de S3

Entramos en la consola de AWS y creamos un usuario, necesitaremos el AccessKeyID y el SecretAccessKey, este usuario podrá acceder a los buckets. A continuacion creamos dos buckets S3. Como vamos a replicarlos entre zonas tenemos que actuvar Versioning. En la pestaña de permisos eliminamos al owner ya que usaremos Policy. Con el recurso creado vamos la pestaña Permissions -> Bucket Policy y añadimos las siguente politica:

{
            "Sid": "AllowAccess",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::ACCOUNT:user/USER"
            },
            "Action": [
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::BUCKET_NAME/*"
        },
        {
            "Sid": "AllowList",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::ACCOUNT:user/USER"
            },
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::BUCKET_NAME"
        },
         {
            "Sid": "IPAllow",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::BUCKER_NAME/*",
            "Condition": {
            "IpAddress": {"aws:SourceIp": "IP de OWNCLOUD"}
         } 
       } 
    ]
}

Nos movemos ahora a la pestaña de Properties y activamos Cross-region replication completamos el formulario que nos aparece. En source el bucket de origen, en Destination ponemos la zona y el segundo bucket que hemos creado. en Destination storage class establecemos con Same as source object y en Select role ponemos Create new.

En el segundo bucket establecemos la política de acceso cambiando el nombre del bucket

Configurar Owncloud

Volvemos a nuestro Owncloud y entramos a la pestaña de configuración donde configuramos la cadena de conexión al bucket es decir, le ponemos el S3 access key el S3 secret key y el nombre del bucket. Si todo está correcto un punto verde debería aparecer a la izquierda del cuadro de diálogo. También podéis probar a subir y borrar archivos también para comprobar que replican a la otra zona de disponibilidad.

Let’s Encrypt

Vamos a instalar certbot para gestionar automáticamente los certificados digitales. Para ello seguimos estos pasos:

# Instalamos:
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install certbot 
# Generamos los certificados
$ certbot certonly --webroot -w /mnt/volumen/owncloud -d owncloud.example.com
# Este comando crea un fichero en la raiz del servidor para verificar que somos propietarios del dominio.
# A continuación generará el certificado en
# /etc/letsencrypt/archive/owncloud.example.com/fullchain1.pem

Ya con el certificado configuramos Nginx:

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name owncloud.example.com;

    root /var/www/html;

    # Add index.php to the list if you are using PHP
    index index.html index.htm index.nginx-debian.html;

    location / {
        return 301 https://$host$request_uri;
    }
}
server {
    listen 443 ssl;
    server_name owncloud.example.com;

        root /var/www/html;

    ssl_certificate     /etc/letsencrypt/archive/owncloud.example.com/fullchain1.pem;
    ssl_certificate_key /etc/letsencrypt/keys/0000_key-certbot.pem;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers         HIGH:!aNULL:!MD5;

    location / {
        proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_pass http://localhost:8080;
    }
}

Reiniciar Nginx

# systemctl restart nginx

Habilitar docker-compose para que arranque con el sistema

Ahora configuramos para que si se tiene que reiniciar la máquina por algún motivo los contenedores arranquen automáticamente. Para ello añadimos un nuevo servicio a systemd

# vim /etc/systemd/system/docker-compose.service
## Añadimos este contenido:
[Unit]
Description=Owncloud on Docker Compose
Requires=docker.service
After=network.target docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/mnt/volumen/docker-compose
ExecStart=/usr/local/bin/docker-compose -f /mnt/volumen/docker-compose/docker-compose.yaml start 
ExecStop=/usr/local/bin/docker-compose -f /mnt/volumen/docker-compose/docker-compose.yaml stop

[Install]
WantedBy=multi-user.target
## Y recargamos la configuración
# systemctl daemon-reload

Y listo.