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.