Installer Owncloud avec SaltStack

By KrustyHack / a couple of years ago

Owncloud

Owncloud est un projet open-source qui permet de partager des fichiers à la Dropbox. Vous pouvez ainsi avoir votre propre cloud pour gérer vos fichiers ou les partager avec vos amis. Classe !

On commence

Cet exemple de formule SaltStack ne respecte pas entièrement les recommandations SaltStack car je l’avais fait spécifiquement pour mon usage personnel et pour m’entraîner. Donc n’hésitez pas à modifier toute partie non conventionnelle et éventuellement à m’en notifier. Je me ferais un plaisir de puller pour faire évoluer la formule.

Préparation du pillar

Il nous faut préparer un pillar SaltStack pour notre Owncloud. Celui-ci va gérer différents aspects tels que:

  • le nom de domaine
  • le fichier vhost à appliquer
  • le mot de passe Owncloud
  • le path d’installation de Owncloud
owncloud:
  vhost: cloud.domain.com
  vhost_file: owncloud
  owncloudpass: password
  root_path: /var/www/owncloud

Ceci nous installera un Owncloud dans /var/www/owncloud et préparera un vhost Nginx prêt à l’emploi. Le pillar est mis dans pillars/owncloud/init.sls.

Installation des states de prérequis

Il nous faut installer les dépendances indispensable à Owncloud: Mysql et python-mysqldb.

Rien de bien compliqué il suffit de définir de state pour les deux prérequis.

python-mysqldb

python-mysqldb:
  pkg.installed

C’est tout con hein… 🙂

mysql

include:
  - owncloud.python-mysqldb

mysql-requirements:
  pkg.installed:
    - pkgs:
      - mysql-server
      - mysql-client
    - require_in:
      - service: mysql
      - mysql_user: owncloud

mysql:
  service.running:
    - watch:
      - pkg: mysql-requirements

owncloud-local:
  mysql_user.present:
    - name: owncloud
    - host: localhost
    - password: {{ salt['pillar.get']('owncloud:owncloudpass', '') }}
    - require:
      - pkg: python-mysqldb
      - pkg: mysql-requirements
      - service: mysql

ownclouddb:
  mysql_database.present:
    - name: owncloud
    - require:
      - mysql_user: owncloud
      - pkg: python-mysqldb
  mysql_grants.present:
    - grant: all privileges
    - database: owncloud.*
    - host: localhost
    - user: owncloud
    - require:
      - mysql_database: owncloud
      - pkg: python-mysqldb
      - service: mysql

Installation de la state principale

Là rien de bien méchant non plus ! On définit le repo pour Owncloud, on installe le paquet et on règle les droits sur les dossiers Owncloud.

{% set oc = salt['pillar.get']('owncloud',{}) %}

include:
  - owncloud.mysql

owncloud-repo:
  pkgrepo.managed:
    - name: deb http://download.opensuse.org/repositories/isv:ownCloud:community/xUbuntu_14.10/ /
    - key_url: http://download.opensuse.org/repositories/isv:ownCloud:community/xUbuntu_14.10/Release.key
    - gpgcheck: 1
    - require_in:
      - pkg: owncloud

owncloud:
  pkg.installed: []

{{ oc.root_path }}:
  file.directory:
    - user: www-data
    - group: www-data
    - recurse:
      - user
      - group

{{ oc.root_path }}/apps:
  file.directory:
    - user: www-data
    - group: www-data
    - mode: 755
    - recurse:
      - user
      - group
      - mode

Ca ne fonctionne pas !

Bon, vous allez me dire c’est tout ? Ca fonctionne ? Et bien non ! Il faut encore définier sur le minion les paramètres d’accès au Mysql ! Pour cela, rien de plus simple.

Editez le fichier /etc/salt/minion et configurez-y Mysql:

##### Mysql #####
mysql.host: 'localhost'
mysql.port: 3306
mysql.user: 'user'
mysql.pass: 'password'

http://docs.saltstack.com/en/latest/ref/modules/all/salt.modules.mysql.html

On rajoute également les datas pillar à notre minion dans top.sls du dossier pillar:

base:
  'minion1':
    - owncloud

On refresh les pillars: salt "TARGET" saltutil.refresh_pillar.

Ensuite on redémarre notre minion salt "TARGET" cmd.run "service salt-minion restart" et c’est bon, on est prêt à déployer Owncloud: salt "TARGET" state.sls owncloud.

Il nous restera ensuite à mettre en place notre vhost Nginx pour Owncloud. Moi j’utilise une state SaltStack avec un template de vhost:

{{ pillar['headers']['salt']['bash'] -}}

upstream php-handler {
  server 127.0.0.1:9000;
  #server unix:/var/run/php5-fpm.sock;
}

server {
  listen 80;
  server_name {{ vhost }};
  # enforce https
  return 301 https://$server_name$request_uri;
}

server {
  listen 443 ssl;
  server_name {{ vhost }};

  access_log /var/log/nginx/{{ vhost }}/access.log;
  error_log /var/log/nginx/{{ vhost }}/error.log;

  ssl_certificate /etc/nginx/ssl/{{ vhost }}.crt;
  ssl_certificate_key /etc/nginx/ssl/{{ vhost }}.key;

  # Path to the root of your installation
  root /var/www/owncloud/;
  # set max upload size
  client_max_body_size 10G;
  fastcgi_buffers 64 4K;

  rewrite ^/caldav(.*)$ /remote.php/caldav$1 redirect;
  rewrite ^/carddav(.*)$ /remote.php/carddav$1 redirect;
  rewrite ^/webdav(.*)$ /remote.php/webdav$1 redirect;

  index index.php;
  error_page 403 /core/templates/403.php;
  error_page 404 /core/templates/404.php;

  location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
    }

  location ~ ^/(?:\.htaccess|data|config|db_structure\.xml|README){
    deny all;
    }

  location / {
   # The following 2 rules are only needed with webfinger
   rewrite ^/.well-known/host-meta /public.php?service=host-meta last;
   rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last;

   rewrite ^/.well-known/carddav /remote.php/carddav/ redirect;
   rewrite ^/.well-known/caldav /remote.php/caldav/ redirect;

   rewrite ^(/core/doc/[^\/]+/)$ $1/index.html;

   try_files $uri $uri/ /index.php;
   }

   location ~ \.php(?:$|/) {
   fastcgi_split_path_info ^(.+\.php)(/.+)$;
   include fastcgi_params;
   fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
   fastcgi_param PATH_INFO $fastcgi_path_info;
   fastcgi_param HTTPS on;
   fastcgi_pass php-handler;
   }

   # Optional: set long EXPIRES header on static assets
   location ~* \.(?:jpg|jpeg|gif|bmp|ico|png|css|js|swf)$ {
       expires 30d;
       # Optional: Don't log access to assets
         access_log off;
  }
}

N’oubliez pas également de générer un certificat SSL pour plus de sécurité.

Il vous faudra également terminer l’installation de Owncloud via l’interface graphique disponible à l’adresse cloud.domain.com et hop, vous voilà l’heureux propriétaire d’un service cloud de fichiers !

113085-owncloud-admin

Leave a comment: