Uploading a Large File to Amazon S3

AWS_S3

Amazon Web Services Simple Storage Service

The largest single file that can be uploaded into an Amazon S3 Bucket in a single PUT operation is 5 GB. If you want to upload large objects (> 5 GB), you will consider using multipart upload API, which allows to upload objects from 5 MB up to 5 TB.

The Multipart Upload API is designed to improve the upload experience for larger objects, which can be uploaded in parts, independently, in any order, and in parallel. The AWS tool to use to perform this is API-Level (s3api) command set.

In this tutorial, we assume:

  • You have installed and configured AWS Command Line Interface on a Linux OS computer/server,
  • You have an Amazon account and a S3 Bucket (MyBucketName),
  • The size of the file to upload is 20 GB (MyObject.zip),
  • 100 MB can be uploaded without problem using our internet connection.

Theoretically, how it works

The process involves in 4 steps:

  1. Separate the object into multiple parts. There are several ways to do this in Linux, ‘dd‘, ‘split‘, etc. We will use ‘dd’ in this tutorial,
  2. Initiate the multipart upload and receive an upload id in return (aws s3api create-multipart-upload),
  3. Upload each part (a contiguous portion of an object’s data) accompanied by the upload id and a part number (aws s3api upload-object),
  4. Finalize the upload by providing the upload id and the part number / ETag pairs for each part of the object (aws s3api complete-multipart-upload).

And practically?

1. Separate the object into multiple parts

We will create 205 parts (100 MB * 204 + 80 MB):

$ dd if=/dev/urandom of=MyObject.zip bs=1024k count=20000


$ dd if=MyObject.zip of=MyObject1.zip bs=1024k skip=0 count=100
$ dd if=MyObject.zip of=MyObject2.zip bs=1024k skip=100 count=100
$ dd if=MyObject.zip of=MyObject3.zip bs=1024k skip=200 count=100
...
$ dd if=MyObject.zip of=MyObject10.zip bs=1024k skip=900 count=100
$ dd if=MyObject.zip of=MyObject11.zip bs=1024k skip=1000 count=100
$ dd if=MyObject.zip of=MyObject12.zip bs=1024k skip=1100 count=100
...
$ dd if=MyObject.zip of=MyObject203.zip bs=1024k skip=20200 count=100
$ dd if=MyObject.zip of=MyObject204.zip bs=1024k skip=20300 count=100
$ dd if=MyObject.zip of=MyObject205.zip bs=1024k skip=20400 count=100

A one line shell script can be written to automate this process:

$ for i in {1..205}; do dd if=MyObject.zip of=MyObject"$i".zip bs=1024k skip=$[i*100 - 100] count=100; done

2. Initiate the multipart upload and receive an upload id in return

aws s3api create-multipart-upload --bucket MyBucketName --key MyObject.zip
You will received as output something like:
{
"UploadId": "UVditMTG8U--MyLongUploadId--ksmFT7N6bNTWD",
"Bucket": "MyBucketName",
"Key": "MyObject.zip"
}

3. Upload each part

For the following commands, note the console output:
{
"ETag": "\"fggcd799--ETagValue1--dhe76dd8dc\""
}


$ aws s3api upload-part --bucket MyBucketName --key MyObject.zip --upload-id \ MyLongUploadId --part-number 1 --body MyObject1.zip
$ aws s3api upload-part --bucket MyBucketName --key MyObject.zip --upload-id \ MyLongUploadId --part-number 2 --body MyObject2.zip
...
$ aws s3api upload-part --bucket MyBucketName --key MyObject.zip --upload-id \ MyLongUploadId --part-number 100 --body MyObject100.zip
...
$ aws s3api upload-part --bucket MyBucketName --key MyObject.zip --upload-id \ MyLongUploadId --part-number 204 --body MyObject204.zip
$ aws s3api upload-part --bucket MyBucketName --key MyObject.zip --upload-id \ MyLongUploadId --part-number 205 --body MyObject205.zip

Note: Once more you can write a small shell script to automate this process.

Finalize the upload

Create a JSON file MyMultiPartUpload.json containing the following:

{
"Parts": [
{
"ETag": "\"ETagValue1\"",
"PartNumber": 1
},
{
"ETag": "\"ETagValue2\"",
"PartNumber": 2
},
...
{
"ETag": "\"ETagValue100\"",
"PartNumber": 100
},
...
{
"ETag": "\"ETagValue204\"",
"PartNumber": 204
},
{
"ETag": "\"ETagValue205\"",
"PartNumber": 205
},
]
}

$ aws s3api complete-multipart-upload --bucket MyBucketName --key \
MyObject.zip --upload-id MyLongUploadId --multipart-upload MyMultiPartUpload.json

That is all, you can verify that the large file is uploaded with:
aws s3 ls s3://MyBucketName/MyObject.zip
2014-09-18 20:29:19 20495340 MyObject.zip

References and resources:

Solution de portail Intranet : Intégration de Liferay et Alfresco sous Ubuntu Server avec MySQL

Liferay est une solution aboutie Open Source de gestion de contenu, orientée portail social et collaboratif (internet, extranet ou intranet) ; plusieurs grandes entreprises et administrations l’ont utilisé pour déployer leur portail internet.

Lorsqu’il faut cependant mettre sur pied un portail intranet ou extranet, la fonctionnalité GED (gestion et archivage électronique de documents) est indispensable (partage de documents, sécurité, accès CIFS/FTP/Lecteur réseau, etc.), malgré les efforts des équipes de développement de Liferay dans l’ajout de cette fonctionnalité (notamment dans sa dernière version (6.1) avec l’apparition de Liferay Sync qui permet de synchroniser les documents distants avec un dossier local ou sur un mobile – un peu comme DropBox), les fonctionnalités de base d’une GED sont loin d’être remplies.

Heureusement Liferay a dans cette même version 6.1, facilité l’intégration de quelques systèmes de gestion documentaire, en particulier Alfresco, SharePoint et Documentum. La collaboration entre Liferay et Alfresco permet:

  • soit d’intégrer Alfresco à Liferay – Liferay joue ici un rôle de présentation des documents
  • soit de faire cohabiter les deux applications – toutes les données de Alfresco peuvent être vues dans Liferay, avec une gestion commune des droits d’accès.

Le but de ce tutoriel est de mettre sur pied la deuxième solution.
Alfresco Liferay Integration

Principales étapes

  1. Installation de Alfresco 4.2.c sur Ubuntu Server 12.04 avec MySQLSuivre ce tutoriel. Il est préférable d’installer le serveur Tomcat à part, et d’utiliser un port différent que 8080 (utiliser par exemple 8081) pour Alfresco.
  2. Installation de Liferay 6.1 sur Ubuntu Server 12.04 avec MySQLSuivre ce tutoriel
  3. Démarrer Alfresco (service alfresco start)
  4. Le couple (utilisateur, mot de passe) doit être le même à Alfresco et Liferay, Alfresco étant prioritaire. Par défaut Liferay ne sauvegarde pas les mots de passe en session, il faut l’activer dans le fichier des propriétés – portal-ext.properties. Modifier ce fichier comme suit :
    session.store.password=true
    company.security.auth.type=screenName
  5. Démarrer Liferay (service liferay start)
  6. Ouvrir Liferay dans votre navigateur favori et se connecter comme administrateur, puis aller sur le panneau d’administration.
  7. Cliquer sur Documents et médias puis ajouter un nouveau dépôt (voir Image 1 ci-dessous). Vous ajoutez ici les détails de connexion à Alfresco comme suit:
    • Nom: Donner un nom au dépôt (Documents Alfresco par exemple)
    • Description: Une brève description du dépôt
    • Type de dépôt: Vous pouvez choisir Services Web ou AtomPub (que nous utliserons)
    • AtomPub URL: http://localhost:8081/alfresco/cmisatom
    • ID du dépôt: paramètre optionnel, important si nous avons plusieurs dépôts. Si rien n’est mis le système choisira le 1er dépôt
    • Cliquer sur Enregistrer. Liferay essaiera de se connecter à Alfresco avec les paramètres entrés et affichera le résultat (rassurez-vous que Alfresco et bien démarré et fonctionnel). En cas de succès vous verrez s’afficher tous les dossiers et fichiers d’Alfresco dans la partie Documents et médias de Liferay (Image 2 ci-dessous)

Tous les documents ajoutés à Liferay seront visibles dans Alfresco, et vice versa, tout est synchronisé, les droits d’accès sont conservés. Elle n’est pas belle la vie???

Nouveau Depot
Paramètres de configuration de la connexion de Liferay à Alfresco
Alfresco Dans Liferay
Documents présents à la fois dans Alfresco et dans Liferay

Installation du PGI OpenERP 7.0 sur Debian Squeeze et CentOS 6.4

OpenERP est un PGI (Progiciel de Gestion Intégré) Open Source dont le développement a commencé il y a maintenant 14 ans par Fabien Pinckaers (pinky) pour les business de son père, et plus tard de son oncle.
OpenERP
Développé avec Python et utilisant le SGBD libre PostGreSQL, le logiciel est aujourd’hui très abouti et plusieurs grandes entreprises l’ont implémenté; il peut très facilement être installé et configuré sur plusieurs distributions de Linux, dont Debian.

Les principaux modules présents sont la gestion:

  • des ventes,
  • de la gestion de relation client (CRM),
  • de projet,
  • d’entrepôt,
  • de la production,
  • de la comptabilité et
  • des ressources humaines.

Processus d’installation sur Debian Squeeze

Mettre à jour les paquets

sudo apt-get update

Installer la base de données PostGreSQL

sudo apt-get install postgresql

Créer un utilisateur pour la base de données

su - postgres -c "createuser --createdb --no-createrole --no-superuser openerp"
echo "ALTER USER openerp WITH PASSWORD 'MonMotDePasse';ALTER USER postgres WITH PASSWORD 'MonMotDePasse';" | su postgres -c psql

Ajouter le dépôt OpenERP

echo "deb http://nightly.openerp.com/7.0/nightly/deb/ ./" >> /etc/apt/sources.list

Mettre à jour la base de données des paquets

aptitude update && aptitude && upgrade && aptitude clean

Installer OpenERP

aptitude install openerp
Accepter le Package en tapant ‘Yes’ et en validant sur le clavier, toutes les dépendances seront installées.

Accéder à OpenERP via le navigateur

http://127.0.0.1:8069

Installation sur CentOS 6.3 ou 6.4

L’installation ici est moins automatique que sous Debian, heureusement dans le domaine des logiciels libres le partage d’expérience d’expertise nous permet d’avancer relativement vite! Je vous conseille ce simple script de Mario Gielissen (http://www.openworx.nl) :

#!/bin/sh
# Modified script from Carlos E. Fonseca Zorrilla
yum -y install wget unzip
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
rpm -ivh http://yum.pgrpms.org/9.2/redhat/rhel-6-i386/pgdg-centos92-9.2-6.noarch.rpm
yum -y install python-psycopg2 python-lxml PyXML python-setuptools libxslt-python pytz \
python-matplotlib python-babel python-mako python-dateutil python-psycopg2 \
pychart pydot python-reportlab python-devel python-imaging python-vobject \
hippo-canvas-python mx python-gdata python-ldap python-openid \
python-werkzeug python-vatnumber pygtk2 glade3 pydot python-dateutil \
python-matplotlib pygtk2 glade3 pydot python-dateutil python-matplotlib \
python python-devel python-psutil python-docutils make\
automake gcc gcc-c++ kernel-devel byacc flashplugin-nonfree poppler-utils pywebdav\
yum -y install postgresql92-libs postgresql92-server postgresql92
service postgresql-9.2 initdb
chkconfig postgresql-9.2 on
service postgresql-9.2 start
su - postgres -c "createuser --superuser openerp"
cd /tmp
wget http://gdata-python-client.googlecode.com/files/gdata-2.0.17.zip
unzip gdata-2.0.17.zip
rm -rf gdata-2.0.17.zip
cd gdata*
python setup.py install
cd /tmp
adduser openerp
DIR="/var/run/openerp /var/log/openerp"
for NAME in $DIR
do
if [ ! -d $NAME ]; then
mkdir $NAME
chown openerp.openerp $NAME
fi
done
rm -rf openerp*
wget http://nightly.openerp.com/7.0/nightly/src/openerp-7.0-latest.tar.gz
tar -zxvf openerp-7.0-latest.tar.gz --transform 's!^[^/]\+\($\|/\)!openerp\1!'
cd openerp
python setup.py install
rm -rf /usr/local/bin/openerp-server
cp openerp-server /usr/local/bin
cp install/openerp-server.init /etc/init.d/openerp
cp install/openerp-server.conf /etc
chown openerp:openerp /etc/openerp-server.conf
chmod u+x /etc/init.d/openerp
chkconfig openerp on
service openerp start

Voilà, c’est tout! Profitez de toutes les fonctionnalités de l’application!

10 useful SQL queries to save time with WordPress

Le CMS (Content Management System) WordPress utilise le système de gestion de base de données MySQL dans 99,9% de cas, et occupe plus de 60% de part de marché des CMS devant Drupal (mon préféré…) et Joomla.
WordpressDrupalJoomla
Toutes les informations de WordPress (paramètres, billets, pages, commentaires, catégories, tags, etc.) sont stockées dans la base de données, qui est bien plus lisible et compréhensible que la base de données de Joomla qui à mon humble avis est une “usine à gaz”. Vous pouvez suivre ce lien pour en savoir un peu plus sur la structure de la base de données de WordPress.

La façon la plus simple d’exécuter une requête SQL est d’utiliser PHPMyAdmin. Si vous avez installé WordPress avec succès c’est que vous avez certainement l’adresse du serveur MySQL, le login et le mot de passe; si vous ne connaissez pas l’URL demandez à votre hébergeur, presque tous les hébergeurs PHP/MySQL ont ce logiciel installé sur leurs serveurs (il est en effet facile d’utilisation et vous évite de taper les commandes shell de Linux et autres).

Connaître quelques commandes SQL de base est très important et pourrait vous faire gagner beaucoup de temps. Par exemple vous changez d’adresse URL (ça peut arriver!) ou transférez le site que vous avez développé en local vers le serveur en ligne, 30 pages et 50 billets génèrent en moyenne 400 lignes dans la table wp_posts de votre BD, s’il faut modifier ligne par ligne, comptez le temps que ça prendra… et si vous aviez 100 pages et 300 billets…

I. Vous changez l’URL ou transférez votre site local

1. Changer l’URL et la page d’accueil du site

UPDATE wp_options SET option_value = replace(option_value, 'http://www.AcienURL.com', 'http://www.NouvelURL.com') WHERE option_name = 'home' OR option_name = 'siteurl';

2. Changer l’URL de chaque page et billet

UPDATE wp_posts SET guid = REPLACE (guid, 'http://www.AcienURL.com', 'http://www.NouvelURL.com');

3. Changer l’URL dans le contenu des pages et billets

UPDATE wp_posts SET post_content = REPLACE (post_content, 'http://www.AcienURL.com', 'http://www.NouvelURL.com');

II. Commandes d’administration

4. Changer le nom d’utilisateur par défaut Admin

UPDATE wp_users SET user_login = 'NouvelAdministrauetr' WHERE user_login = 'Admin';

5. Changer le mot de passe de l’utilisateur jtouzi

UPDATE wp_users SET user_pass = MD5('NouveauMotPasse') WHERE user_login = 'jtouzi';

6. Assigner tous les articles écrits par l’auteur auteurA à l’auteur auteurB

La première chose à faire est de trouver les ID-auteur, par exemple pour l’auteur auteurA tapez
SELECT ID FROM wp_users WHERE user_login = 'auteurA' LIMIT 1; Assignez ensuite les articles avec la commande:
UPDATE wp_posts SET post_author = 'ID-auteurB' WHERE post_author = 'ID-auteurA';

7. Supprimer toutes les révisions

Lorsque vous éditez un article dans WordPress, par mesure de prudence plusieurs copies sont sauvegardées, ce qui surcharge votre base de données et peut ralentir le chargement des pages. Si vous êtes certains que les versions publiées en ligne sont les bonnes et que vous ne risquez pas de revenir à une version antérieure, supprimez les révisions!
DELETE a,b,c FROM wp_posts a
LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id)
LEFT JOIN wp_postmeta c ON (a.ID = c.post_id)
WHERE a.post_type = 'revision'

Source de cette requête

7. Supprimer les Posts Meta

Lorsque l’on installe les plugins, plusieurs données sont sauvegardées dans la table wp_postmeta; lorsque l’on en désinstalle, ces données ne sont pas toujours supprimées, ce qui peut ralentir le traitement de données et surcharger votre BD. Une fois que vous connaissez la clé Méta du plugin exécutez la commande:
DELETE FROM wp_postmeta WHERE meta_key = 'CleMeta';

8. Afficher la liste des emails des commentateurs

SELECT DISTINCT comment_author_email FROM wp_comments;
Vous pouvez ensuite utiliser l’option exporter de PHPMyAdmin pour les sauvegarder en fichier PDF ou SQL (en vue de les ajouter à votre Newsletter par exemple)

9. Supprimer tous les Pingbacks et tous les Spams

DELETE FROM wp_comments WHERE comment_type = 'pingback' OR comment_approved = 'spam';

10. Identifier les tags non utilisés

Si vous avez utilisé une requête SQL pour supprimer quelques anciens articles (par exemple DELETE FROM wp_posts WHERE post_date < '2009-12-12 12:00:00'), ce que les tags qui leur avaient été assignés restent dans la base de données, et faussent votre nuage de tags. Pour résoudre de ce problème, exécutez
SELECT * From wp_terms wt
INNER JOIN wp_term_taxonomy wtt ON wt.term_id=wtt.term_id WHERE wtt.taxonomy='post_tag' AND wtt.count=0;

Formation PHP/MySQL et Webmastering avancé

php_mysql

Du 17 au 20 avril 2013 j’anime une formation sur le Webmastering et la programmation d’applications Web.

Véritable chef d’orchestre, le Webmaster est désormais l’acteur incontournable des différents sites Web de l’organisation. Il doit être capable de repérer les stratégies des différents acteurs impliqués dans la conception d’un site et d’harmoniser leurs différentes logiques.

Public concerné

Développeurs, Webmasters ou futurs Webmasters, ou personnes souhaitant acquérir, actualiser ou entretenir des connaissances.

Pré-requis

Maîtriser parfaitement la micro-informatique et Internet en tant qu’utilisateur. Des notions de HTML et de CSS sont un plus.

Durée et coût

La formation dure quatre jours, et coûte 395.000 BIF (trois cent quatre vingt quinze mille francs burundais) par participant, avec une possibilité de réduction si vous êtes 02 ou plus.

Objectifs

Ce séminaire a pour objectif :

  • acquérir les bases du langage PHP et du système de gestion de bases de données MySQL
  • acquérir les compétences spécifiques liées à la structuration des contenus, à l’ergonomie et au design d’un site
  • pratiquer les outils principaux pour créer des pages Web
  • savoir dialoguer avec les différents intervenants internes de l’entreprise et les prestataires.

Programme provisoire non détaillé

  • Le métier de Webmaster
    • Compétences nécessaires
    • Le Cahier des Charges dans un projet Web
    • Hébergement de site Web
    • Principaux langages (HTML, JavaScript, CSS, PHP)
    • Principaux protocoles web (FTP, HTTP, SMTP)
    • Les CMS (Content Management System)
  • Les bases du langage HTML
  • Les bases des feuilles de styles CSS et du JavaScript
  • Le langage PHP
    • Fonctions de base
    • Intégration de PHP dans le HTML
    • Interaction entre PHP et le SGBD MySQL (connexion à la base, sélection, insertion, modification et suppression de données)
    • Notions de Cookies et de Sessions
  • Le SGBD MySQL
    • Définition
    • Installation et administration
    • Présentation et utilisation de PHPMyAdmin
  • Les CMS
    • Définition
    • Principaux CMS et choix d’un CMS dans son projet
    • Installation et personnalisation d’un CMS

Installation de Alfresco Community avec MySQL sur Ubuntu Server

Alfresco with MySQL

Alfresco with MySQL

Le leader Open Source de la gestion et d’archivage électronique de documents (GED) Alfresco est-il encore à présenter ? Si oui ben faites un tour sur le site de Alfresco : http://www.alfresco.com.

Pendant que vous y êtes, téléchargez la dernière version de Alfresco Community (à l’heure actuelle c’est la 4.2.c) pour Linux 64 bits sur la page : http://wiki.alfresco.com/wiki/Download_and_Install_Alfresco.
Lien direct vers le téléchargement : https://process.alfresco.com/ccdl/?file=release/community/build-04576/alfresco-community-4.2.c-installer-linux-x64.bin. Copier le fichier alfresco-community-4.2.c-installer-linux-x64.bin dans /opt.

Depuis la version 4.0 (je pense…), Alfresco utilise par défaut le SGBD PostGreSQL (qui n’est pas mal!) et donc son connecteur, du moment que nous souhaitons utiliser le SGBD MySQL il faut télécharger la dernière version de son connecteur (la 5.1.24 à l’heure actuelle) sur cette page http://dev.mysql.com/downloads/connector/j/, le dé-zipper et copier le fichier mysql-connector-java-5.1.24-bin.jar dans le dossier /opt.

1. Installation

Si votre serveur n’a pas été installé avec l’option MySQL Server coché, installé le tout simplement avec la commande : sudo apt-get install mysql-server. Pour plus de sécurité tapez un mot de passe d’administration de la base de données.

Dans la suite je suppose que la base de données qui habritera notre GED sera alfresco et que le nom d’utilisateur d’administration de la base de données sera alfrescouser (il est déconseillé d’utiliser le compte root, qui gère toutes les bases de données du serveur, dans les applications particulières, toujours créer un compte d’administration par application).

1.1 Connexion à MySQL en ligne de commandes

Ouvrir le terminal, taper mysql -u root -p et entrez le mot de passe d’administration

1.2 Création de la base de données

CREATE DATABASE alfresco DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;

1.3 Création de l’utilisateur qui gérera la BD

CREATE USER 'alfrescouser'@'localhost' IDENTIFIED BY 'motDePasseAlfrescouser';

1.4 Attribution des droits

GRANT ALL ON alfresco.* TO 'alfrescouser'@'localhost' IDENTIFIED BY 'motDePasseAlfrescouser' WITH GRANT OPTION;

1.5 Installation

cd /opt
sudo ./alfresco-community-4.2.c-installer-linux-x64.bin

Choisir l’option “Avancé” afin de remplir les paramètres de la base de données et renseignez les champs. Spécifiez les paramètres suivants pour la base de données:

Driver: org.gjt.mm.mysql.Driver
URL: jdbc:mysql://localhost/alfresco?useUnicode=yes&characterEncoding=UTF-8

Lorsque vous l’aurez spécifié et que le processus d’installation aura commencé, copiez le fichier mysql-connector-java-5.1.24-bin.jar précédemment téléchargé dans /opt/alfresco/tomcat/lib

C’est tout, ou presque… à la fin de l’installation si vous regardez votre base de données, vous constaterez qu’elle est vide, c’est au premier lancement de la GED (http://localhost:8080/share) que la BD est constitué, ceci prend un temps et “bouffe” toute votre CPU!

2. Problèmes rencontrés

2.1 Preview de documents (.doc, .pdf, .flv, .mp3)

J’ai constaté qu’il y a quelques librairies qu’il faut installer: libsm6, libxrender1 et libxinerama1 dans mon cas (sudo apt-get install libsm6, libxrender1, libxinerama1). Il peut en avoir d’autres, afin de connaître toutes les librairies manquantes tapez la commande dans le terminal : /opt/alfresco/libreoffice/program/soffice -nofirststartwizard -nologo -headless -accept=socket,host=localhost,port=8100,urp;StarOffice.ServiceManager
Il faut aussi penser à changer le ctl.sh du fichier de configuration en openoffice_ctl.sh pour LibreOffice.

2.2 Problème de CPU

Alfresco me prenait plus de 150% de CPU! Il faut dans ce cas adapter le “stack size -Xss” dans JAVA_OPTS (/opt/alfresco/tomcat/setenv.sh) en fonction des capacités de votre serveur.

2.3 Démarrage du service CIFS, service oh combien important!

Dans mon cas il m’a fallu installer Samba sudo apt-get install samba smbfs, puis modifier les ports comme suit dans le fichier fichier-servers.properties situé ici : /opt/alfresco/tomcat/webapps/alfresco/WEB-INF/classes/alfresco/subsystems/
fileServers/default/file-servers.properties

cifs.tcpipSMB.port=1445
cifs.netBIOSSMB.sessionPort=1139
cifs.netBIOSSMB.namePort=1137
cifs.netBIOSSMB.datagramPort=1138

Redémarrez Alfresco avec service alfresco restart, pour vérifier que le service CIFS a bien démarré tapez telnet localhost 1445

J’ai ensuite modifié les règles iptables comme suit (lisez cet article pour en savoir plus)
sudo su
echo 1 > /proc/sys/net/ipv4/ip_forward
modprobe iptable_nat
iptables -F
iptables -t nat -F
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport 445 -j REDIRECT --to-ports 1445
iptables -t nat -A PREROUTING -p tcp --dport 139 -j REDIRECT --to-ports 1139
iptables -t nat -A PREROUTING -p udp --dport 137 -j REDIRECT --to-ports 1137
iptables -t nat -A PREROUTING -p udp --dport 138 -j REDIRECT --to-ports 1138

3. Pour aller plus loin…

3.1 Personnaliser le design de Afresco Share

Choisissez tout d’abord le thème qui vous plaît dans l’espace d’administration, puis modifiez les CSS et les images en fonction de vos besoins, tout se trouve dans /opt/alfresco/tomcat/webapps/share/themes/{themeChoisi}/

3.2 Changer le File System Name et configurer le dossier par défaut

Le File System Name par défaut est Alfresco, ce qui est souvent embêtant. Ceci se trouve par défaut à la racine de notre système GED, les utilisateurs qui se connectent via FTP, CIFS ou même NFS ont donc plusieurs clics à faire avant d’arriver à l’espace documentaire de leur site. Dans mes projets j’ai presque toujours eu à créer un seul site pour les utilisateurs, il faut donc qu’ils arrivent directement à l’espace documentaire…
Pour personnaliser ceci modifier le Server properties file path en fonction de vos besoins: /opt/alfresco/tomcat/webapps/alfresco/WEB-INF/classes/alfresco/subsystems/fileServers/default/file-servers.properties

3.3 Personnaliser les messages mails générés par Alfresco

Vous voulez vos propres mots et vos propres liens dans les messages générés par votre système, eh ben rien de plus normal! Modifiez les fichiers nécessaires dans /opt/alfresco/tomcat/webapps/alfresco/WEB-INF/classes/alfresco/messages/

3.4 Couplage Alfresco <==> Liferay pour réaliser un portail Intranet complet

Alfresco est une application de gestion et d’archivage électronique de documents. Plusieurs fonctionnalités de travail collaboratif ont été ajoutées dans les dernières versions, et l’interface Alfresco Share nous permet déjà de faire pas mal de choses. Seulement ceci reste très loin des fonctionnalités que l’on attend d’un portail Intranet ou Extranet comme Liferay. Heureusement il est possible de coupler les deux applications afin d’avoir un système abouti de portail collaboratif. Lire ce tutoriel d’intégration de Liferay 6.1 et Alfresco 4.2 pour voir comment le mettre sur pied.

Que sont les CLOM (MOOC) et quelles en sont les différences fondamentales avec les REL (OER)?

Les années 2000 ont été marquées par l’essor des REL (Ressources Éducatives Libres) ou OER en anglais (Open Educational Resources). Plusieurs universités de renom, notamment dans le monde anglo-saxon, se sont lancées dans leur production, des dizaines de milliers de ressources ont été ainsi créées sur Internet. Depuis 2008/2009 le monde francophone essaie tant bien que mal de suivre le pas dans la production de ces ressources d’enseignement, je dirai plutôt d’apprentissage.

Depuis l’année dernière un autre mouvement, pas loin de celui des REL, a vu le jour aux Etats Unis, plus précisément à New York : Les CLOM, entendez par là Cours en Ligne Ouverts aux Masses, ou MOOC en anglais (Massive Open Online Courses). Il fût d’ailleurs l’un des évènements dominants dans le monde de l’enseignement supérieur en 2012, (lire cet article du New York Times : The Year of the MOOC).

1. Les CLOM en 5 points

  1. Les CLOM sont des cours en ligne visant une participation à grande échelle (en masse),
  2. Ils doivent être hébergés sur des sites facilement accessible et d’utilisation facile comme des wikis, des blogs,
  3. Les activités de cours peuvent inclure des vidéos, les commentaires sur les forums de discussion et les blogs ; ces commentaires peuvent aussi être postés depuis les plateformes de médias sociaux (Twitter, Facebook, etc.),
  4. Les instructeurs peuvent utiliser les médias sociaux pour favoriser la participation collaborative et l’apprentissage d’égal à égal,
  5. Les participants pouvant provenir de divers horizons et de tous âges, un cours peut bénéficier d’une riche diversité d’idées.

2. Différences fondamentales entre les CLOM et les REL

Ressources Éducatives Libres Cours en Ligne Ouverts aux Masses
La plupart des matériaux peuvent être modifiés et redistribués Modification des CLOM impossible
Ressources éducatives gratuites, avec souvent des syllabus et des grandes lignes, mais pas de cours complets Les cours sont complets, avec un début et une fin (comme un parcours normal de formation quoi…)
Pas de participation de la faculté ou même des enseignants. En effet les universités ou facultés publient des ressources pour l’usage du public, et c’est presque tout Participation de la faculté, et assez souvent des professeurs assistants

3. Ce que je pense en ce moment précis…

  • Un peu déçu par le 1er point, l’une des caractéristiques principales des REL est la production collaborative de contenus éducatifs, ce qui démocratise l’enseignement et l’apprentissage, il y a en effet cette possibilité pour les enseignants d’adapter les ressources aux réalités locales,
  • Les MOOC ne sont autre chose que le “eLearning traditionnel”, à la seule différence qu’ici les cours sont ouverts au public. Cependant la possibilité d’avoir une attestation de participation ou même un diplôme de l’institut/université (moyennant bien-sûr finances) me paraît être une grande avancée dans l’éducation.

Automatic Backup of MySQL Database to Amazon S3. Use of Object Expiration to Delete Old Backups

The importance of backing up a database needs no further demonstration.

The following will create daily, weekly and monthly backups for our database and copy them to an Amazon S3 Bucket (MyBucketName) in MyBucketName/Daily, MyBucketName/Weekly and MyBucketName/Monthly folders respectively.

To control the cost of our backup solution, we will set expiration to each file to remove them from S3 automatically after 15 days for daily, 60 for weekly and 180 for monthly backups.

Lifecycle rules can also be used to delete files or transfer them into Amazon Glacier. The lifecycle rule could be to delete files under MyBucketName/Daily after 15 days, in MyBucketName/Weekly after 60 days, and MyBucketName/Monthly after 180 days [1].

In this tutorial we will use AWS Command Line Interface [2], with its high-level S3 commands [3]. Another tool like ‘s3cmd’ can also be used [4].

1. Install and configure AWS Command Line Interface

$ sudo yum install awscli or $ sudo apt-get install awscli for Ubuntu/Debian
$ aws configure
You will need to enter your AWS Access Key ID and AWS Secret Key, other parameters can be ignored, I recommend setting a default region.

2. Write scripts for backups

We will create three scripts to dump the database, name it todaysdate.sql and copy it to Amazon S3.

2.1. Script for daily backup – DailyBackupDB.sh

#!/bin/bash

NOW="$(date +'%m-%d-%Y')"
EXPIRES="$(date +'%m-%d-%Y' --date='15 days')"
mysqldump -uUSER -pPASSWORD database | gzip > /path/to/databasebackups/$NOW.sql.gz
aws s3 cp /path/to/databasebackups/$NOW.sql.gz s3://MyBucketName/Daily/$NOW.sql.gz --expires $EXPIRES --region YourRegion

2.2. Script for weekly backup – WeeklyBackupDB.sh

#!/bin/bash

NOW="$(date +'%m-%d-%Y')"
EXPIRES="$(date +'%m-%d-%Y' --date='60 days')"
mysqldump -uUSER -pPASSWORD database | gzip > /path/to/databasebackups/$NOW.sql.gz
aws s3 cp /path/to/databasebackups/$NOW.sql.gz s3://MyBucketName/Weekly/$NOW.sql.gz --expires $EXPIRES --region YourRegion

2.3. Script for weekly backup – MonthlyBackupDB.sh

#!/bin/bash

NOW="$(date +'%M-%Y')"
EXPIRES="$(date +'%m-%d-%Y' --date='180 days')"
mysqldump -uUSER -pPASSWORD database | gzip > /path/to/databasebackups/$NOW.sql.gz
aws s3 cp /path/to/databasebackups/$NOW.sql.gz s3://MyBucketName/Monthly/$NOW.sql.gz --expires $EXPIRES --region YourRegion

The three scripts above can be optimized to a single.

3. Make the scripts executable

$ sudo chmod +x DailyBackupDB.sh
$ sudo chmod +x WeeklyBackupDB.sh
$ sudo chmod +x MonthlyBackupDB.sh

4. Run CRON tasks to automate the backup process

Cron tasks for daily, weekly and monthly backups respectively:
$ sudo nano crontab -e
Add the following lines:
0 0 * * * root /path/to/script/DailyBackupDB.sh # Run every day at midnight
0 0 * * 0 root /path/to/script/WeeklyBackupDB.sh # Run every Sunday at midnight
0 0 1 * * root /path/to/script/MonthlyBackupDB.sh # Run every 1st of the month at midnight

And that is all… you have a cost-effective and reliable backup solution…

Links:
[1] – Objects lifecycle management
[2] – AWS Command Line Interface
[3] – AWS high-level S3 commands
[4] – s3cmd tool

Installing Alfresco Community With MySQL on Ubuntu Server on AWS EC2 With Content Stored on Amazon S3

Alfresco On AWS

Alfresco On AWS

At the top of almost every Linux distribution, the Debian-based Ubuntu surpasses all other Linux server distributions – from its simple installation to its excellent hardware discovery to its world-class commercial support.
Amazon Web Services is indisputably the largest cloud service provider.
MySQL is the world’s most popular open source database.
Alfresco is the world’s leading open-source alternative for document management and collaboration.

The purpose of this tutorial is to see how to set up an Enterprise Content Management system using these ‘world class tools’. The best way for Alfresco to interact with Amazon S3 is to use Alfresco S3 Connector, however this tool is available only for Alfresco Enterprise Edition. Since this tutorial is based on Alfresco Community, we will use a workaround.
Also there are several Alfresco AMIs in AWS Community AMIs, you can choose one of them if you want to make things simply, however they generally don’t have the latest version.

In an upcoming tutorial, we will see how to use Alfresco Enterprise Edition with Amazon RDS (PostGreSQL), Amazon EC2 (CentOS instance) and Amazon S3 (Alfresco S3 Connector).

For more information about Amazon Web Service and Alfresco, have a look at:

1. Parameters used in this tutorial

  • Linux Distribution and version: Ubuntu Server 14.04
  • Database: MySQL
  • Database Name: alfresco
  • Database username: alfrescouser
  • S3 Bucket name: myalfrescodata

2. Configure your Ubuntu Server, and create an Amazon S3 Bucket

For this tutorial I used an AMI in North Virginia Region (ubuntu-trusty-14.04-amd64-server-20140926 – AMI ID: ami-0070c468), and launched a t2.medium instance (4 GB memory). In security group associated with the intance I opened required Ports: SSH (22), FTP (21), Tomcat Server (8080), Tomcat SSL (8443) and LibreOffice (8100).

Create an Amazon S3 Bucket

For performance and cost reasons, it’s better to create the bucket in the same region as your EC2 instance, indeed you have a low latency and transferring data from an EC2 instance to a S3 Bucket in the same AWS Region is free of cost. You can create your S3 Bucket using AWS S3 Console or AWS CLI (Command Line Interface). By default AWS CLI is installed only on Amazon Linux AMIs. To install AWS CLI run:
$ sudo apt-get install awscli
Configure AWS CLI
$ aws configure
AWS Access Key ID [None]: MyAWSAccessKeyIdHere
AWS Secret Access Key [None]: MyAWSSecretKeyHere
Default region name [None]: us-east-1
Default output format [None]:

Create the Bucket:
$ aws s3 mb s3://myalfrescodata --region us-east-1
make_bucket: s3://myalfrescodata/

3. Install Alfresco Community 5.0.a with MySQL

Install and configure MySQL Server

$ sudo apt-get install mysql-server
$ mysql -u root -p
$ CREATE DATABASE alfresco DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
$ CREATE USER 'alfrescouser'@'localhost' IDENTIFIED BY 'alfrescouserPassword';
$ GRANT ALL ON alfresco.* TO 'alfrescouser'@'localhost' IDENTIFIED BY 'alfrescouserPassword' WITH GRANT OPTION;

Download Alfresco Community 5.0.a

$ wget http://dl.alfresco.com/release/community/5.0.a-build-00023/alfresco-community-5.0.a-installer-linux-x64.bin
$ sudo +x alfresco-community-5.0.a-installer-linux-x64.bin

By default Alfresco uses PostGreSQL as database, in order to use MySQL database, download its connector for Java and unzip the file (the last version is 5.1.33):
$ wget http://ftp.kaist.ac.kr/mysql/Downloads/Connector-J/mysql-connector-java-5.1.33.zip
$ sudo apt-get install unzip
$ sudo unzip mysql-connector-java-5.1.33.zip

Install Alfresco Community 5.0.a

$ sudo ./alfresco-community-5.0.a-installer-linux-x64.bin
Find below my settings:

—————————————————————
Installation Type

[1] Easy – Installs servers with the default configuration
[2] Advanced – Configures server ports and service properties.: Also choose optional components to install.
Please choose an option [1] : 2

—————————————————————
Select the components you want to install; clear the components you do not want
to install. Click Next when you are ready to continue.

Java [Y/n] :Y
PostgreSQL [Y/n] :N
Alfresco : Y (Cannot be edited)
SharePoint [Y/n] :Y
Web Quick Start [y/N] :Y
Google Docs Integration [Y/n] :Y
LibreOffice [Y/n] :Y
Is the selection above correct? [Y/n]:Y

—————————————————————
Installation folder

Please choose a folder to install Alfresco Community
Select a folder [/opt/alfresco-5.0.a]: /opt/alfresco

Have a look at JDBC URL and Driver here.

JDBC URL: [jdbc:postgresql://localhost/alfresco]: jdbc:mysql://localhost/alfresco?useUnicode=yes&characterEncoding=UTF-8
JDBC Driver: [org.postgresql.Driver]: org.gjt.mm.mysql.Driver
Database name: [alfresco]:alfresco
Username: []: alfrescouser
Password: :
Verify: :

—————————————————————
Tomcat Port Configuration
Please enter the Tomcat configuration parameters you wish to use.
Web Server domain: [127.0.0.1]: xx.xx.xx.xx
Tomcat Server Port: [8080]:
Tomcat Shutdown Port: [8005]:
Tomcat SSL Port [8443]:
Tomcat AJP Port: [8009]:

—————————————————————
Alfresco FTP Port
Please choose a port number to use for the integrated Alfresco FTP server.
Port: [21]:

—————————————————————
Alfresco RMI Port
Please choose a port number for Alfresco to use to execute remote commands.
Port: [50500]:

—————————————————————
Admin Password
Please give a password to use for the Alfresco administrator account.
Admin Password: :
Repeat Password: :

—————————————————————
Install as a service
You can optionally register Alfresco Community as a service. This way it will
automatically be started every time the machine is started.
Install Alfresco Community as a service? [Y/n]:Y

—————————————————————
LibreOffice Server Port
Please enter the port that the LibreOffice Server will listen to by default.
LibreOffice Server Port [8100]:

—————————————————————
Setup is now ready to begin installing Alfresco Community on your computer.
Do you want to continue? [Y/n]: Y

Once the install process started, copy MySQL Connector for Java in /opt/alfresco/tomcat/lib in a new SSH windows.


$ cp mysql-connector-java-5.1.33/mysql-connector-java-5.1.33-bin.jar /opt/alfresco/tomcat/lib

—————————————————————
Please wait while Setup installs Alfresco Community on your computer.

Installing
0% ______________ 50% ______________ 100%
#######################################

—————————————————————
Setup has finished installing Alfresco Community on your computer.

It is almost everything… at the end of the installation MySQL database is empty, the first launch of Alfresco takes some time, it creates DB tables and default data (http://MyPublicIPAddress:8080/share). These data are stored on EC2 EBS Volume, now we will see how to migrate these data in our Amazon S3 bucket.

4. Move ‘alf_data’ from EBS to S3

There is an Alfresco connector that provides a mechanism to store content in Amazon S3, however this connector is only available for Alfresco Enterprise users. If you are using the Community edition and would like to store your data only in Amazon S3, the only way to process at the moment is to mount the bucket as filesystem on your server.

Amazon does not recommend mounting an S3 bucket as a filesystem.

Mounting Amazon S3 Bucket as filesystem on our server

Install, Configure, and test s3fs-fuse

$ sudo apt-get update
$ sudo apt-get install build-essential gcc libfuse-dev fuse libcurl4-openssl-dev libxml2-dev mime-support build-essential libcurl4-openssl-dev
$ wget http://s3fs.googlecode.com/files/s3fs-1.63.tar.gz
$ sudo tar -xvzf s3fs-1.63.tar.gz
$ cd s3fs-1.63/
$ sudo ./configure --prefix=/usr
$ sudo make
$ sudo make install
$ sudo nano vi /etc/passwd-s3fs

Fill this file as follows: MyAWSAccessKeyId:MyAWSSecretKey
$ sudo chmod 600 /etc/passwd-s3fs
Create a directory to mount S3 bucket
$ sudo mkdir /mnt/myalfrescodata
Mount the s3 bucket
$ sudo s3fs myalfrescodata /mnt/myalfrescodata
Check if the S3 bucket is mounted
$ sudo df -h
You will note 256T of size, this is normal…
To mount automatically at boot, at this line to your /etc/fstab
$ nano /etc/fstab
s3fs#myalfrescodata /mnt/myalfrescodata fuse allow_other,_netdev,nosuid,nodev,url=https://s3.amazonaws.com 0 0

Move “alf_data” from EBS to S3

Stop Alfresco server
$ service alfresco stop
Copy “alf_data” to “/mnt/myalfrescodata”
$ sudo cp -R /opt/alfresco/alf_data/ /mnt/myalfrescodata
Change “dir.root” from “/opt/alfresco/alf_data” to “/mnt/myalfrescodata” in Alfresco global properties
$ sudo nano /opt/alfresco/tomcat/shared/classes/alfresco-global.properties
Start Alfresco Server
$ service alfresco start

That is ALL. Your Alfresco data are stored in your Amazon S3 Bucket.

For some tips in configuring Alfresco (CIFS, CPU, previews, etc.) have a look at this blog post.

Seminar on Cloud Computing and Open Source

I just facilitated a seminar on Cloud Computing and Free Softwares. The aims of the seminar was to present the Cloud Computing and the Open Source softwares, and which solutions can be used in the Africa Context (especially with our bad bandwidth). Around 125 participants, coming from public administrations (presidence, 1st vice-presidence, independant national electoral commission, national assembly, ministries of defense, Finance and education, IDEC, etc.), private companies (LEO Burundi, radios, Multinational Consulting Group, etc.) and NGO (FORSC, ADEPAE, Swiss cooperation, etc.) attend the seminar. Find bellow the program, the three presentations and some pictures.

Program

  • 14h00 – 14h30′ : Accueil des participants autour d’un café offert
  • 14h30′ – 15h00 : Le Cloud Computing – On en parle beaucoup mais qu’est-ce que c’est ? (Exemple de Google Apps)
  • 15h00 – 15h30′ : Les Logiciels Libres – Quels avantages ? Quels inconvénients ? Comparatif Windows/Linux
  • 15h30′ – 17h00′ : Présentation de quelques « domaines de maturité » des logiciels Open Source :
    • L’Administration de réseaux LAN (serveur Linux)
    • La Gestion Electronique et l’Archivage de Documents (GED)
    • La messagerie d’entreprise et le travail collaboratif
    • Le portail intranet d’entreprise
    • La sauvegarde de données informatiques
    • Le Monitoring IT
    • La création de sites web Internet
    • La gestion de bibliothèque
  • 17h00 – 17h30′ : Séance de Questions/Réponses
  • 17h30′ – 18h00 : Remplissage du formulaire et fin du séminaire

Presentations

Some pictures