Thank you for downloading Chamilo
This guide explains how to install Chamilo FREE. Please read this fully before proceeding with the installation.
Spanish: También puede leer esta guía de instalación en español.
French: Vous pouvez aussi lire ce guide d'installation en français.
Italian: You can also read this guide in Italian.
<Directory /> AllowOverride All Order allow,deny allow from all </Directory> <Directory /var/www/chamilo/> AllowOverride All Order allow,deny allow from all </Directory>and for Apache >=2.4:
<Directory /> AllowOverride All Require all granted </Directory> <Directory /var/www/chamilo/> AllowOverride All Require all granted </Directory>
Before you start installing Chamilo LMS, you must understand that, because we provide Chamilo as free software, many services providers
have been able to develop extensions of Chamilo, which have made it possible to install Chamilo in many ways:
The following directories need to be readable, writeable and executable by your web server. This usually requires no specific action on Windows servers, but will require a "chmod" under Linux and Mac. See instructions below.
Replace [chamilo] with the directory where your Chamilo installation is located):If you find a tests/ directory at the root of your package, please delete it. This is a development directory that has not been checked for security issues, an it should *never* be accessible to final users on a production server.
On Linux, Mac OS X and BSD operating systems you can use the chmod 0775 command for this (although we recommend you seek advice from an experienced system administrator to avoid security issues). On Windows, you may need to check the properties of the folders (by right-clicking on them).
max_execution_time = 300; Maximum execution time of each script, in seconds max_input_time = 600; Maximum amount of time each script may spend parsing request data memory_limit = 256M; Maximum amount of memory a script may consume (128MB) post_max_size = 100M upload_max_filesize = 100M; short_open_tag = Off safe_mode = Off magic_quotes_gpc = Off magic_quotes_runtime = Off
Important: You need to set your date.timezone setting to whatever your server's timezone is. For example, if your server is in the 'America/New_York' timezone, set the date.timezone parameter to this value in your php.ini:
date.timezone = 'America/New_York'
Note: PHP 5.3.9 introduces a new setting "max_input_vars", which limits the number of elements you can send in one single form. If you are dealing with numerous users or very long learning paths (many items), make sure you set this setting higher than its default value of 1000.
BSD and CentOS users: these php libraries have to be included during the PHP installation (php5 might have to be replaced by php in some instances):
You might also add the following php modules and packages:
Chamilo LMS 1.11.x comes with a new database structure in comparison to 1.9, as was the case between 1.9 and 1.8. Although the upgrade script takes the migration in charge, it might be generating a very heavy load on your server during the upgrade, and will change your database considerably, preserving the data as well as possible (we have tested the procedure many times, but remember this is GNU/GPLv3 and we cannot be held responsible for what would happen to your data without professional supervision). This is why we *really* recommend you take a full backup of your system before you upgrade.
Also note that Chamilo LMS 1.10 unites all language files from the main/lang/ directory into one single file by language. If you have changed language files directly (instead of using the recommended way: sub-languages), you should take a backup copy of these changed translations before you upgrade. Sublanguages might also require some manual work, but the upgrade procedure will not touch sublanguages directly.
WARNING:
Do not delete the previous Chamilo installation directory before installing
the new one. The upgrade process should take care of all unrequired folders.
If you have problems, go to the Chamilo website and ask a question on the support forum. Please read the previous messages first to see if there is already an answer to your question.
To access the Chamilo administration section, open browser, go to your Chamilo adress and log in with the admin user. Then you will see a "Administration" tab in the webpage header. You can manage users, courses, sessions, portal look and feel, homepage content, course categories etc. there
This part is optional, only organisations with an LDAP server will need to read this.
An LDAP module is already provided in Chamilo, but it has to be configured to make it work.
Linux servers: It's possible that you have to recompile php with ldap support. Newer distributions also allow downloading rpms for additional packages.
Note: Please check the LDAP configuration settings inside Chamilo to learn the details.
In [Chamilo folder]/app/config/configuration.php, around line 93, you'll find settings like the following:// -> Uncomment the two lines below to activate LDAP AND edit main/inc/conf/auth.conf.php for configuration // $extAuthSource["extldap"]["login"] = $_configuration['root_sys'].$_configuration['code_append']."auth/external_login/login.ldap.php"; // $extAuthSource["extldap"]["newUser"] = $_configuration['root_sys'].$_configuration['code_append']."auth/external_login/newUser.ldap.php";remove the // from the last two lines to activate LDAP.
Ask the LDAP server admin for the settings:
By default, Chamilo will check if the "employeenumber" field has a value. If it has, then Chamilo will
consider this user as being a teacher.
If you want to change this behaviour, you can edit main/auth/ldap/authldap.php, function ldap_put_user_info_locally(),
and change the if (empty($info_array[$tutor_field])) condition to whatever suits you.
You can also remove this check by removing the condition and leaving only the $status = STUDENT; line.
Some LDAP servers do not support anonymous use of the directory services.
In this case, you should fill in the appropriate fields in the
administration panel (e.g. "manager" and "mypassword") and Chamilo will
try to authenticate using these, or fall back to anonymous mode before
giving up.
There is a new set of scripts now that allow you to insert users
from LDAP directly into a Chamilo session. This, however, relies on a
set of static choices in the LDAP contact attributes.
The fields used intensively by the Chamlio module are:
Installing this plugin you get WIRIS editor and WIRIS CAS.
This activation will not be completed unless you have previously downloaded the PHP plugin for CKeditor WIRIS and unzipped its contents into the main/inc/lib/ckeditor/editor/plugins/ckeditor_wiris/ directory.
This is necessary because Wiris is proprietary software and its services are commercial. To make adjustments to the plugin, edit configuration.ini file or replace his content by configuration.ini.default Chamilo file.
Note: This step will require a dedicated server or a virtual dedicated server as the packages involved are not available on most shared hosting solutions.
On Debian or Ubuntu 10.04 and superior, you will simply need to install the php5-xapian package and restart your web server:
sudo apt-get install php5-xapian sudo /etc/init.d/apache2 restart
Then go to your administration page -> Configuration settings -> Search and enable the search tool. Follow the recommendations on the page to get the complete indexing suite installed. Once you're done, all documents you import into your Chamilo portal in a recognized format will be indexed and searchable. Chamilo intermediate Administrators training (which you can ask any Chamilo's Official Provider for) include a full review of the full-text search feature.
Note: Xapian's licensing for the PHP extension is a bit different than what is necessary to enter the Debian repositories, so it has been excluded. You can, however, generate your own package by following the packaging instructions on Xapian's wiki.
Note: This step will require a dedicated server or a virtual dedicated server as the packages involved are not available on most shared hosting solutions.
On Debian or Ubuntu 11.10 and superior, install LibreOffice v3 (or v4) and start it as a headless server:
sudo apt-get install libreoffice screen sudo adduser rapid sudo adduser rapid www-data screen sudo -s su - rapid soffice --accept="socket,host=127.0.0.1,port=2002,tcpNoDelay=1;urp;" --headless --nodefault --nofirststartwizard --nolockcheck --nologo --norestore CTRL+a, CTRL+dPlease note that this will effectively launch LibreOffice in a "headless" mode (thanks to the --headless option), in a "headless" terminal (thanks to screen). You can later get back into your "headless" terminal by launching:
sudo screen -rYou can then go to your administration page -> Chamilo Rapid and set the host to "localhost" and the port to "2002". Save. Go to your course, learning path tool and see the new icon appeared. Import your PPT. This should work. Note: Sometimes, this doesn't work out so easily. You can probably ask for the assistance of any system administrator around with a bit of Java and PHP experience, or you can always ask one of the Chamilo's Official Providers for assistance (ask for a guaranteed commercial contract). The above is *not* meant for production servers with a high load. You should get a real system administrator to look at it and develop init scripts, in a way that makes monitoring and relaunching feasable. If any sysadmin wants to contribute this, feel free to contribute it to Chamilo: send us an e-mail at info@chamilo.org. Note: If you use LibreOffice 4, please note that version 4.2 (available in Ubuntu 14.04) has demonstrated to be more successfull at converting documents than version 4.1, which tended to crash when sending a document for conversion.
Since Chamilo 1.8.8, a few tasks need to be executed regularly in order to get the best out of your server resources. One of such tasks (and the only one around at the time of Chamilo 1.8.8) is the sending of internal messaging notifications by e-mail, i.e. when you receive an e-mail from another person or from a group inside the internal messaging system of Chamilo, if all e-mails are sent immediately, then you might not have the chance to receive them at your pace, once a day or even once a week. For cases like this you, as a Chamilo administrator, should setup a cron process on the server to check the queue of e-mails and send is timely.
Setting up a cron task is easy and there are several ways to do it. We recommend you have a look at the Drupal documentation for setting up cron and define your own cron process as:35 * * * * wget -O - -q -t 1 http://campus.example.com/main/cron/run.phpMake sure you have a look into run.php as maybe you want to change a few settings there.
// Custom name_order_conventions //$_configuration['name_order_conventions'] = array( // 'french' => array('format' => 'title last_name first_name', 'sort_by' => 'last_name') //);
// Custom name_order_conventions $_configuration['name_order_conventions'] = array( 'french' => array('format' => 'first_name last_name', 'sort_by' => 'last_name') );
$_configuration['enable_x_sendfile_headers'] = true;If you have issues with files taking a long time to download, make sure you reconfigure your webserver and add this line. You should see an notable difference in download time.
Chamilo supports the connection to two different videoconference servers: BigBlueButton (versions 0.81, 0.9 and 1.0) and OpenMeetings.
While BigBlueButton seem easier to install, more clearly documented and more
esthetically finished, some users have manifested that OpenMeetings
consumes less bandwidth, is less restrictive in terms of running environments
and offers more tools and connectors.
The decision is up to you, but in any case you will have to install a
videoconference server separately from the normal Chamilo LMS installation
process.
You will find the installation guide for BigBlueButton here. Once installed,
issue a "bbb-conf --secret" on the command line to get the parameters to
indicate in the "Videoconference" plugin in Chamilo (platform settings page).
This should make an additional "Videoconference" tool icon appear in every course.
Chamilo LMS 1.10 is the first version to require the web server to allow redirections of requests (and so 1.11 does as well).
For Apache, this is done through enabling the Rewrite module and either allowing overrides (through .htaccess) or adding a specific configuration section to the VirtualHost defined for Apache.
For Nginx, this is done through specific redirection rules in the corresponding virtual host (server clause).
To make sure this isn't too complex for anyone, we recommend a configuration below to help you out in both cases.
Please note that using .htaccess is the easiest way but might affect your server load considerably,
given .htaccess files are interpreted on *every* request, while a configuration block in your VirtualHost
section is compiled at configuration reload time.
<Directory /> AllowOverride All Order allow,deny allow from all </Directory>or, if you are working with Apache 2.4, that syntax changed a little and looks more like this:
<Directory /> AllowOverride All Require all granted </Directory>
<LocationMatch "/.git*"> order deny,allow deny from all </LocationMatch> <Directory ~/.> AllowOverride None Options -Indexes </Directory> <Directory "/var/www/chamilo"> RewriteEngine On RewriteCond %{QUERY_STRING} ^id=(.*)$ RewriteRule ^certificates/$ certificates/index.php?id=%1 [L] RewriteRule ^courses/([^/]+)/?$ main/course_home/course_home.php?cDir=$1 [QSA,L] RewriteRule ^courses/([^/]+)/index.php$ main/course_home/course_home.php?cDir=$1 [QSA,L] RewriteRule ^courses/([^/]+)/scorm/(.*([\.js|\.css|\.png|\.jpg|\.jpeg|\.gif]))$ app/courses/$1/scorm/$2 [QSA,L] RewriteRule ^courses/([^/]+)/scorm/(.*)$ main/document/download_scorm.php?doc_url=/$2&cDir=$1 [QSA,L] RewriteRule ^courses/([^/]+)/document/certificates/(.*)$ app/courses/$1/document/certificates/$2 [QSA,L] RewriteRule ^courses/([^/]+)/document/(.*)$ main/document/download.php?doc_url=/$2&cDir=$1 [QSA,L] RewriteRule ^courses/([^/]+)/upload/course_home_icons/(.*([\.js|\.css|\.png|\.jpg|\.jpeg|\.gif]))$ app/courses/$1/upload/course_home_icons/$2 [QSA,L] RewriteRule ^courses/([^/]+)/upload/([^/]+)/(.*)$ main/document/download_uploaded_files.php?code=$1&type=$2&file=$3 [QSA,L] RewriteRule ^courses/([^/]+)/work/(.*)$ main/work/download.php?file=work/$2&cDir=$1 [QSA,L] RewriteRule ^courses/([^/]+)/course-pic85x85.png$ main/inc/ajax/course.ajax.php?a=get_course_image&code=$1&image=course_image_source [QSA,L] RewriteRule ^courses/([^/]+)/course-pic.png$ main/inc/ajax/course.ajax.php?a=get_course_image&code=$1&image=course_image_large_source [QSA,L] RewriteRule ^courses/([^/]+)/(.*)$ app/courses/$1/$2 [QSA,L] RewriteRule ^session/(\d{1,})/about/?$ main/session/about.php?session_id=$1 [L] RewriteRule ^course/(\d{1,})/about/?$ main/course_info/about.php?course_id=$1 [L] RewriteRule ^badge/(\d{1,}) main/badge/issued.php?issue=$1 [L] RewriteRule ^skill/(\d{1,})/user/(\d{1,}) main/badge/issued_all.php?skill=$1&user=$2 [L] RewriteRule ^badge/(\d{1,})/user/(\d{1,}) main/badge/issued_all.php?skill=$1&user=$2 [L] RewriteRule ^main/exercice/(.*)$ main/exercise/$1 [QSA,L] RewriteRule ^main/newscorm/(.*)$ main/lp/$1 [QSA,L] RewriteRule ^service/(\d{1,})$ plugin/buycourses/src/service_information.php?service_id=$1 [L] RewriteRule ^lti/os$ plugin/ims_lti/outcome_service.php [L] RewriteRule ^([^/.]+)/?$ user.php?$1 [L] RewriteRule ^(tests|.git) - [F,L,NC] </Directory> AddType application/font-woff .woff .woff2 <IfModule mod_expires.c> ExpiresActive On ExpiresByType application/font-woff "access plus 1 month" </IfModule>
# Add your own "server {" header here with listen, server_name, access_log, error_log, index, root and error_page params charset utf-8; location @rewrite{ rewrite ^certificates/$ certificates/index.php last; rewrite ^/courses/([^/]+)/$ /main/course_home/course_home.php?cDir=$1 last; rewrite ^/courses/([^/]+)/index.php$ /main/course_home/course_home.php?cDir=$1 last; rewrite ^/courses/([^/]+)/scorm/(.*([\.js|\.css|\.png|\.jpg|\.jpeg|\.gif]))$ app/courses/$1/scorm/$2 last; rewrite ^/courses/([^/]+)/scorm/(.*)$ /main/document/download_scorm.php?doc_url=/$2&cDir=$1 last; # Alternatively, you can choose to give direct access to all SCORM files, which is much faster but less secure # rewrite "^/courses/([^/]+)/scorm/(.*)$" /app/courses/$1/scorm/$2 break; rewrite "^/courses/([^/]+)/document/certificates/(.*)$" /app/courses/$1/document/certificates/$2 last; rewrite ^/courses/([^/]+)/document/(.*)$ /main/document/download.php?doc_url=/$2&cDir=$1 last; rewrite ^/courses/([^/]+)/upload/([^/]+)/(.*)$ /main/document/download_uploaded_files.php?code=$1&type=$2&file=$3 last; rewrite ^/courses/([^/]+)/work/(.*)$ /main/work/download.php?file=work/$2&cDir=$1 last; rewrite ^/courses/([^/]+)/upload/course_home_icons/(.*([\.png|\.jpg|\.jpeg|\.gif]))$ app/courses/$1/upload/course_home_icons/$2 last; rewrite ^/courses/([^/]+)/(.*)$ /app/courses/$1/$2 last; rewrite ^/session/([^/]+)/about/?$ /main/session/about.php?session_id=$1 last; rewrite ^/course/([^/]+)/about/?$ /main/course_info/about.php?course_id=$1 last; rewrite ^/badge/(\d+) /main/badge/issued.php?issue=$1 last; rewrite ^/skill/(\d+)/user/(\d+)$ /main/badge/issued_all.php?skill=$1&user=$2 last; rewrite ^/badge/(\d+)/user/(\d+)$ /main/badge/issued_all.php?skill=$1&user=$2 last; rewrite ^/main/exercice/(.*)$ /main/exercise/$1 last; rewrite ^/main/newscorm/(.*)$ /main/lp/$1 last; rewrite ^/service/(\d+)$ /plugin/buycourses/src/service_information.php?service_id=$1 last; rewrite "^/main/upload/users/(.*)/(.*)/my_files/(.*)$" /app/upload/users/$1/$2/my_files/$3 last; try_files $uri /index.php$is_args$args; break; } location / { try_files $uri @rewrite; } location /main { rewrite ^/main/admin/?$ /main/admin/index.php last; } location ~ \.php$ { client_max_body_size 20M; try_files $uri @rewrite; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_split_path_info ^(.+\.php)(/.*)$; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param HTTPS off; } # Serve static files directly location ~* \.(png|jpe?g|gif|ico|js|css|mp3|swf|flv|mp4|ogg|woff|woff2)$ { rewrite ^/courses/([^/]+)/course-pic85x85.png$ /app/courses/$1/course-pic85x85.png last; rewrite ^/courses/([^/]+)/course-pic.png$ /app/courses/$1/course-pic.png last; rewrite ^/courses/([^/]+)/scorm/(.*)$ /main/document/download_scorm.php?doc_url=/$2&cDir=$1 last; rewrite ^/courses/([^/]+)/document/(.*)$ /main/document/download.php?doc_url=/$2&cDir=$1 last; rewrite ^/courses/([^/]+)/work/(.*)$ /main/work/download.php?file=work/$2&cDir=$1 last; rewrite ^/courses/([^/]+)/upload/(.*)$ /app/courses/$1/upload/$2 last; # For all these media resources not treated by previous rewrites, give direct access (no permission check) rewrite ^/courses/(.*)$ /app/courses/$1 break; expires 30d; access_log off; try_files $uri @rewrite; } location ~ ~\.(ht|git){ deny all; } location ^~ /tests/ { deny all; }
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <rewrite> <rules> <rule name="rule 1v" stopProcessing="true"> <match url="^certificates/$" /> <action type="Rewrite" url="/certificates/index.php?id=%1" /> </rule> <rule name="rule 2v" stopProcessing="true"> <match url="^courses/([^/]+)/?$" /> <action type="Rewrite" url="/main/course_home/course_home.php?cDir={R:1}" appendQueryString="true" /> </rule> <rule name="rule 3v" stopProcessing="true"> <match url="^courses/([^/]+)/index.php$" /> <action type="Rewrite" url="/main/course_home/course_home.php?cDir={R:1}" appendQueryString="true" /> </rule> <rule name="rule 4v" stopProcessing="true"> <match url="^courses/([^/]+)/scorm/(.*)$" /> <action type="Rewrite" url="/main/document/download_scorm.php?doc_url=/{R:2}&cDir={R:1}" appendQueryString="true" /> </rule> <rule name="rule 5v" stopProcessing="true"> <match url="^courses/([^/]+)/document/certificates/(.*)$" /> <action type="Rewrite" url="/app/courses/{R:1}/document/certificates/{R:2}" appendQueryString="true" /> </rule> <rule name="rule 6v" stopProcessing="true"> <match url="^courses/([^/]+)/document/(.*)$" /> <action type="Rewrite" url="/main/document/download.php?doc_url=/{R:2}&cDir={R:1}" appendQueryString="true" /> </rule> <rule name="rule 7v" stopProcessing="true"> <match url="^courses/([^/]+)/upload/([^/]+)/(.*)$" /> <action type="Rewrite" url="/main/document/download_uploaded_files.php?code={R:1}&type={R:2}&file={R:3}" appendQueryString="true" /> </rule> <rule name="rule 8v" stopProcessing="true"> <match url="^courses/([^/]+)/work/(.*)$" /> <action type="Rewrite" url="/main/work/download.php?file=work/{R:2}&cDir={R:1}" appendQueryString="true" /> </rule> <rule name="rule 9v" stopProcessing="true"> <match url="^courses/([^/]+)/course-pic85x85.png$" /> <action type="Rewrite" url="/main/inc/ajax/course.ajax.php?a=get_course_image&code={R:1}&image=course_image_source" appendQueryString="true" /> </rule> <rule name="rule 10v" stopProcessing="true"> <match url="^courses/([^/]+)/course-pic.png$" /> <action type="Rewrite" url="/main/inc/ajax/course.ajax.php?a=get_course_image&code={R:1}&image=course_image_large_source" appendQueryString="true" /> </rule> <rule name="rule 11v" stopProcessing="true"> <match url="^courses/([^/]+)/(.*)$" /> <action type="Rewrite" url="/app/courses/{R:1}/{R:2}" appendQueryString="true" /> </rule> <rule name="rule 12v" stopProcessing="true"> <match url="^session/(\d{1,})/about/?$" /> <action type="Rewrite" url="/main/session/about.php?session_id={R:1}" /> </rule> <rule name="rule 13v" stopProcessing="true"> <match url="^badge/(\d{1,})" /> <action type="Rewrite" url="/main/badge/issued.php?issue={R:1}" /> </rule> <rule name="rule 14v" stopProcessing="true"> <match url="^skill/(\d{1,})/user/(\d{1,})" /> <action type="Rewrite" url="/main/badge/issued_all.php?skill={R:1}&user={R:2}" /> </rule> <rule name="rule 15v" stopProcessing="true"> <match url="^badge/(\d{1,})/user/(\d{1,})" /> <action type="Rewrite" url="/main/badge/issued_all.php?skill={R:1}&user={R:2}" /> </rule> <rule name="rule 16v" stopProcessing="true"> <match url="^main/exercice/(.*)$" /> <action type="Rewrite" url="/main/exercise/{R:1}" appendQueryString="true" /> </rule> <rule name="rule 17v" stopProcessing="true"> <match url="^main/newscorm/(.*)$" /> <action type="Rewrite" url="/main/lp/{R:1}" appendQueryString="true" /> </rule> <rule name="rule 18v" stopProcessing="true"> <match url="^service/(\d{1,})$" /> <action type="Rewrite" url="/plugin/buycourses/src/service_information.php?service_id={R:1}" /> </rule> <rule name="rule 19v" stopProcessing="true"> <match url="^([^/.]+)/?$" /> <action type="Rewrite" url="/user.php?{R:1}" /> </rule> <rule name="rule 20v" stopProcessing="true"> <match url="^(tests|.git)" ignoreCase="true" /> <action type="Rewrite" url="/-" /> </rule> </rules> </rewrite> </system.webServer> </configuration>
Contact address
Mail: info@chamilo.org