Installation instructions

Requirements

Python (2.7)
https://www.python.org/
Django (>= 1.6)
https://www.djangoproject.com/
Translate-toolkit (>= 1.10.0)
http://toolkit.translatehouse.org/
Git (>= 1.6)
http://git-scm.com/
Mercurial (>= 2.8) (optional for Mercurial repositories support)
http://mercurial.selenic.com/
python-social-auth (>= 0.2.0)
http://psa.matiasaguirre.net/
Whoosh (>= 2.5, 2.5.2 is recommended, 2.6.0 is broken)
http://bitbucket.org/mchaput/whoosh/
PIL or Pillow library
https://python-pillow.github.io/
lxml (>= 3.1.0)
http://lxml.de/
South (>= 1.0) (needed for Django 1.6)
http://south.aeracode.org/
dateutil
http://labix.org/python-dateutil
libravatar (optional for federated avatar support)
https://pypi.python.org/pypi/pyLibravatar
pyuca (optional for proper sorting of strings)
https://github.com/jtauber/pyuca
babel (optional for Android resources support)
http://babel.pocoo.org/
Database backend
Any database supported in Django will work, check their documentation for more details.

Requirements on Debian or Ubuntu

On Debian or Ubuntu, most of requirements are already packaged, to install them you can use apt-get:

apt-get install python-django translate-toolkit \
    python-whoosh python-pil python-django-south python-libravatar \
    python-babel Git mercurial python-social-auth

# Optional for database backend

apt-get install python-mysqldb   # For MySQL
apt-get install python-psycopg2  # For PostgreSQL

For Debian 7.0 (Wheezy) or older, you need to install several Python modules manually using pip as versions shipped in distribution are too old:

# Dependencies for python-social-auth
apt-get install python-requests-oauthlib python-six python-openid

pip install python-social-auth Django Whoosh

For proper sorting of a unicode strings, it is recommended to install pyuca:

pip install https://github.com/SmileyChris/pyuca/archive/master.zip

Depending on how you intend to run Weblate and what you already have installed, you might need additional components:

# Web server option 1: nginx and uwsgi
apt-get install nginx uwsgi uwsgi-plugin-python

# Web server option 2: Apache with mod_wsgi
apt-get install apache2 libapache2-mod-wsgi

# Caching backend: memcached
apt-get install memcached

# Database option 1: mariadb
apt-get install mariadb-server

# Database option 2: mysql
apt-get install mysql-server

# Database option 3: postgresql
apt-get install postgresql

Requirements on openSUSE

Most of requirements are available either directly in openSUSE or in devel:languages:python repository:

zypper install python-Django translate-toolkit \
    python-Whoosh python-Pillow python-South python-python-social-auth \
    python-babel Git mercurial

For proper sorting of a unicode strings, it is recommended to install pyuca:

pip install https://github.com/SmileyChris/pyuca/archive/master.zip

Depending on how you intend to run Weblate and what you already have installed, you might need additional components:

# Web server option 1: nginx and uwsgi
zypper install nginx uwsgi uwsgi-plugin-python

# Web server option 2: Apache with mod_wsgi
zypper install apache2 apache2-mod_wsgi

# Caching backend: memcached
zypper install memcached

# Database option 1: mariadb
zypper install mariadb

# Database option 2: mysql
zypper install mysql

# Database option 3: postgresql
zypper install postgresql

Requirements on OSX

If your python was not installed using brew, make sure you have this in your .bash_profile file or executed somehow:

export PYTHONPATH="/usr/local/lib/python2.7/site-packages:$PYTHONPATH"

This configuration make available the installed libraries to python

Requirements using pip installer

Most requirements can be also installed using pip installer:

pip install -r requirements.txt

Also you will need header files for python-dev, libxml2, libxslt and libfreetype6 to compile some of the required Python modules.

All optional dependencies (see above) can be installed using:

pip install -r requirements-optional.txt

On Debian or Ubuntu you can install them using:

apt-get install libxml2-dev libxslt-dev libfreetype6-dev python-dev

On openSUSE or SLES you can install them using:

zypper install libxslt-devel libxml2-devel freetype-devel python-devel

Filesystem permissions

Weblate process needs to be able to read and write to the directory where it keeps data - DATA_DIR.

The default configuration places them in same tree as Weblate sources, however you might prefer to move these to better location such as /var/lib/weblate.

Weblate tries to create these directories automatically, but it will fail when it does not have permissions to do so.

You should also take care when running Management commands, as they should be run under same user as Weblate itself is running, otherwise permissions on some files might be wrong.

Creating database for Weblate

It is recommended to run Weblate on some database server. Using SQLite backend is really good for testing purposes only.

Creating database in PostgreSQL

It is usually good idea to run Weblate in separate database and separate user:

# If PostgreSQL was not installed before, set the master password
sudo -u postgres psql postgres -c "\password postgres"

# Create database user called "weblate"
sudo -u postgres createuser -D -A -P weblate

# Create database "weblate" owned by "weblate"
sudo -u postgres createdb -O weblate weblate

Creating database in MySQL

When using MySQL, don’t forget to create database with UTF-8 encoding:

# Grant all privileges to  weblate user
GRANT ALL PRIVILEGES ON weblate.* TO 'weblate'@'localhost'  IDENTIFIED BY 'password';

# Create database
CREATE DATABASE weblate CHARACTER SET utf8;

Installation

Copy weblate/settings_example.py to weblate/settings.py and adjust it to match your setup. You will probably want to adjust following options:

ADMINS

List of site administrators to receive notifications when something goes wrong, for example notifications on failed merge or Django errors.

ALLOWED_HOSTS

If you are running Django 1.5 or newer, you need to set this to list of hosts your site is supposed to serve. For example:

ALLOWED_HOSTS = ['demo.weblate.org']

DATABASES

Connectivity to database server, please check Django’s documentation for more details.

DEBUG

Disable this for production server. With debug mode enabled, Django will show backtraces in case of error to users, when you disable it, errors will go by email to ADMINS (see above).

Debug mode also slows down Weblate as Django stores much more information internally in this case.

DEFAULT_FROM_EMAIL

Email sender address for outgoing email, for example registration emails.

SECRET_KEY

Key used by Django to sign some information in cookies, see Django secret key for more information.

SERVER_EMAIL

Email used as sender address for sending emails to administrator, for example notifications on failed merge.

Filling up the database

After your configuration is ready, you can run ./manage.py syncdb and ./manage.py migrate to create database structure. Now you should be able to create translation projects using admin interface.

In case you want to run installation non interactively, you can use ./manage.py syncdb --noinput and then create admin user using createadmin command.

You should also login to admin interface (on /admin/ URL) and adjust default site name to match your domain by clicking on Sites and there changing the example.com record to match your real domain name.

Once you are done, you should also check Performance report in the admin interface which will give you hints for non optimal configuration on your site.

Note

If you are running version from Git, you should also regenerate locale files every time you are upgrading. You can do this by invoking script ./scripts/generate-locales.

Production setup

For production setup you should do following adjustments:

Disable debug mode

Disable Django’s debug mode by:

DEBUG = False

With debug mode Django stores all executed queries and shows users backtraces of errors what is not desired in production setup.

See also

Installation

Properly configure admins

Set correct admin addresses to ADMINS setting for defining who will receive mail in case something goes wrong on the server, for example:

ADMINS = (
    ('Your Name', 'your_email@example.com'),
)

See also

Installation

Set correct site name

Adjust site name in admin interface, otherwise links in RSS or registration emails will not work.

Enable indexing offloading

Enable OFFLOAD_INDEXING to prevent locking issues and improve performance. Don’t forget to schedule indexing in background job to keep the index up to date.

Use powerful database engine

Use powerful database engine (SQLite is usually not good enough for production environment), for example setup for MySQL:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'weblate',
        'USER': 'weblate',
        'PASSWORD': 'weblate',
        'HOST': '127.0.0.1',
        'PORT': '',
    }
}

Enable caching

If possible, use memcache from Django by adjusting CACHES configuration variable, for example:

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
    }
}

Avatar caching

In addition to caching of Django, Weblate performs caching of avatars. It is recommended to use separate, file backed cache for this purpose:

CACHES = {
    'default': {
        # Default caching backend setup, see above
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
    },
    'avatar': {
        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
        'LOCATION': os.path.join(BASE_DIR, 'avatar-cache'),
        'TIMEOUT': 604800,
        'OPTIONS': {
            'MAX_ENTRIES': 1000,
        },
    }

Configure email addresses

Weblate needs to send out emails on several occasions and these emails should have correct sender address, please configure SERVER_EMAIL and DEFAULT_FROM_EMAIL to match your environment, for example:

SERVER_EMAIL = 'admin@example.org'
DEFAULT_FROM_EMAIL = 'weblate@example.org'

Allowed hosts setup

Django 1.5 and newer require ALLOWED_HOSTS to hold list of domain names your site is allowed to serve, having it empty will block any request.

Federated avatar support

By default, Weblate relies on <https://www.libravatar.org/> for avatars. When you install pyLibavatar, you will get proper support for federated avatars.

pyuca library

pyuca library is optionally used by Weblate to sort Unicode strings. This way language names are properly sorted even in non-ASCII languages like Japanese, Chinese or Arabic or for languages with accented letters.

Django secret key

The SECRET_KEY setting is used by Django to sign cookies and you should really use own value rather than using the one coming from example setup.

You can generate new key using examples/generate-secret-key shipped with Weblate.

Admin static files

If you see purely designed admin interface, the CSS files required for it are not loaded. This is usually if you are running in non-debug mode and have not configured your web server to serve them. Recommended setup is described in the Running server chapter.

See also

Running server

Home directory

Changed in version 2.1: This is no longer required, Weblate now stores all it’s data in DATA_DIR.

The home directory for user which is running Weblate should be existing and writable by this user. This is especially needed if you want to use SSH to access private repositories, but Git might need to access this directory as well (depends on Git version you use).

You can change the directory used by Weblate in settings.py, for example to set it to configuration directory under Weblate tree:

os.environ['HOME'] = os.path.join(BASE_DIR, 'configuration')

Note

On Linux and other UNIX like systems, the path to user’s home directory is defined in /etc/passwd. Many distributions default to non writable directory for users used for serving web content (such as apache, www-data or wwwrun, so you either have to run Weblate under different user or change this setting.

Template loading

It is recommended to use cached template loader for Django. It caches parsed templates and avoids need to do the parsing with every single request. You can configure it using following snippet:

TEMPLATE_LOADERS = (
    ('django.template.loaders.cached.Loader', (
        'django.template.loaders.filesystem.Loader',
        'django.template.loaders.app_directories.Loader',
    )),
)

Running server

Running Weblate is not different from running any other Django based application. Django is usually executed as uwsgi or fcgi (see examples for different webservers below).

For testing purposes, you can use Django builtin web server:

./manage.py runserver

Serving static files

It is recommended to serve static files directly by your web server, you should use that for following paths:

/media
Serves media directory from Weblate.
/static/admin
Serves media files for Django admin interface (eg. /usr/share/pyshared/django/contrib/admin/media/).

Additionally you should setup rewrite rule to serve media/favicon.ico as favicon.ico.

Sample configuration for Lighttpd

The configuration for Lighttpd web server might look like following (available as examples/lighttpd.conf):

fastcgi.server = (
    "/weblate.fcgi" => (
        "main" => (
            "socket" => "/var/run/django/weblate.socket",
            "check-local" => "disable",
        )
    ),
)
alias.url = (
    "/media" => "/var/lib/django/weblate/weblate/media/",
    "/static/admin" => "/usr/share/pyshared/django/contrib/admin/static/admin/",
)

url.rewrite-once = (
    "^(/*media.*)$" => "$1",
    "^(/*static.*)$" => "$1",
    "^/*favicon\.ico$" => "/media/favicon.ico",
    "^/*robots\.txt$" => "/media/robots.txt",
    "^(/.*)$" => "/weblate.fcgi$1",
)

expire.url                  = (
    "/media/" => "access 1 months",
    "/static/" => "access 1 months",
    "/favicon.ico" => "access 1 months",
)

Sample configuration for Apache

Following configuration runs Weblate as WSGI, you need to have enabled mod_wsgi (available as examples/apache.conf):

#
# VirtualHost for weblate
#
WSGIPythonPath /usr/share/weblate
<VirtualHost *:80>
    ServerAdmin admin@image.weblate.org
    ServerName image.weblate.org

    DocumentRoot /usr/share/weblate/weblate/media/

    Alias /robots.txt /usr/share/weblate/weblate/media/robots.txt
    Alias /favicon.ico /usr/share/weblate/weblate/media/favicon.ico

    Alias /media/ /usr/share/weblate/weblate/media/
    Alias /doc/ /usr/share/doc/packages/weblate/html/
    Alias /static/admin /usr/lib/python2.7/site-packages/django/contrib/admin/static/admin/

    <Directory /usr/lib/python2.7/site-packages/django/contrib/admin/static/admin/>
        Order deny,allow
        Allow from all
    </Directory>

    <Directory /usr/share/weblate/weblate/media/>
        Order deny,allow
        Allow from all
    </Directory>

    <Directory /usr/share/doc/packages/weblate/html/>
        Order deny,allow
        Allow from all
    </Directory>

    <Directory /usr/share/weblate/weblate/examples/>
        Order deny,allow
        Allow from all
    </Directory>

    WSGIScriptAlias / /usr/share/weblate/weblate/wsgi.py
    WSGIPassAuthorization On

    <Directory /usr/share/weblate/weblate>
        <Files wsgi.py>
        Order deny,allow
        Allow from all
        </Files>
    </Directory>

</VirtualHost>

Sample configuration for nginx

Following configuration runs Weblate as uwsgi under nginx webserver.

Configuration for nginx (also available as examples/weblate.nginx.conf):

server {
	listen 80;
	server_name weblate;
	root /path/to/weblate/weblate;

	location /favicon.ico {
		alias /path/to/weblate/weblate/media/favicon.ico;
		expires 30d;
	}

	location /media/ {
		alias /path/to/weblate/weblate/media/;
		expires 30d;
	}

	location /robots.txt {
		alias /path/to/weblate/weblate/media/robots.txt;
		expires 30d;
	}

	location /static/admin/ {
		alias /usr/local/lib/python2.7/dist-packages/django/contrib/admin/static/admin/;
		expires 30d;
	}

	location / {
		include uwsgi_params;
        # Needed for long running operations in admin interface
        uwsgi_read_timeout 3600;
		uwsgi_pass 127.0.0.1:8080;
	}
}

Configuration for uwsgi (also available as examples/weblate.uwsgi.ini):

[uwsgi]
plugins       = python
master        = true
protocol      = uwsgi
socket        = 127.0.0.1:8080
wsgi-file     = /path/to/weblate/weblate/wsgi.py
python-path   = /path/to/weblate
# Needed for OAuth/OpenID
buffer-size   = 8192
# Increase number of workers for heavily loaded sites
#workers       = 6
# Needed for background processing
enable-threads = true

Running Weblate under path

Minimalistic configuration to serve Weblate under /weblate (you will need to include portions of above full configuration to allow access to the files). Again using mod_wsgi (also available as examples/apache-path.conf):

# Example Apache configuration for running Weblate under /weblate path

# Path to Weblate code
WSGIPythonPath /usr/share/weblate

# Path to Weblate WSGI handler
WSGIScriptAlias /weblate "/usr/share/weblate/weblate/wsgi.py"

# Aliases to serve media and static files
Alias /weblate/media/ /usr/share/weblate/weblate/media/
Alias /static/admin /usr/lib/python2.7/site-packages/django/contrib/admin/static/admin/

Additionally you will have to adjust weblate/settings.py:

URL_PREFIX = '/weblate'

Note

This is supported since Weblate 1.3.

SUSE Studio appliance

Weblate appliance provides preconfigured Weblate running with MySQL database as backend and Apache as web server. It is provided in many formats suitable for any form of virtualization, cloud or hardware installation.

It comes with standard set of passwords you will want to change:

Username Password Scope Description
root linux System Administrator account, use for local or SSH login
root   MySQL MySQL administrator
weblate weblate MySQL Account in MySQL database for storing Weblate data
admin admin Weblate Weblate/Django admin user

The appliance is built using SUSE Studio and is based on openSUSE 12.3.

You should also adjust some settings to match your environment, namely:

Weblate on OpenShift

This repository contains a configuration for the OpenShift platform as a service product, which facilitates easy installation of Weblate on OpenShift Online (https://openshift.com), OpenShift Enterprise (https://www.openshift.com/products/enterprise) and OpenShift Origin (https://www.openshift.com/products/origin).

Prerequisites

  1. OpenShift Account

    You need an account for OpenShift Online (https://openshift.com) or another OpenShift installation you have access to.

    You can register a free account on OpenShift Online, which allows you to host up to 3 applications free of charge.

  2. OpenShift Client Tools

    In order to follow the examples given in this documentation you need to have the OpenShift Client Tools (RHC) installed: https://developers.openshift.com/en/getting-started-client-tools.html.

    While there are other possibilities to create and configure OpenShift applications, this documentation is based on the OpenShift Client Tools (RHC) because they provide a consistent interface for all described operations.

Installation

You can install Weblate on OpenShift directly from Weblate’s github repository with the following command:

rhc -aweblate app create -t python-2.7 --from-code https://github.com/nijel/weblate.git#weblate-2.1 --no-git

The -a option defines the name of your weblate installation, weblate in this instance. You are free to specify a different name. The identifier right of the # sign identifies the version of Weblate to install. For a list of available versions see here: https://github.com/nijel/weblate/tags. Please note that only version 2.0 and newer can be installed on OpenShift, as older versions don’t include the necessary configuration files. The --no-git option skips the creation of a local git repository.

Default Configuration

After installation on OpenShift Weblate is ready to use and preconfigured as follows:

  • SQLite embedded database (DATABASES)
  • Random admin password
  • Random Django secret key (SECRET_KEY)
  • Indexing offloading if the cron cartridge is installed (OFFLOAD_INDEXING)
  • Committing of pending changes if the cron cartridge is installed (commit_pending)
  • Weblate machine translations for suggestions bases on previous translations (MACHINE_TRANSLATION_SERVICES)
  • Source language for machine translations set to “en-us” (SOURCE_LANGUAGE)
  • Weblate directories (STATIC_ROOT, DATA_DIR, TTF_PATH, Avatar cache) set according to OpenShift requirements/conventions
  • Django site name and ALLOWED_HOSTS set to DNS name of your OpenShift application
  • Email sender addresses set to no-reply@<OPENSHIFT_CLOUD_DOMAIN>, where <OPENSHIFT_CLOUD_DOMAIN> is the domain OpenShift runs under. In case of OpenShift Online it’s rhcloud.com.

Retrieve Admin Password

You can retrieve the generated admin password with the following command:

rhc -aweblate ssh credentials

Indexing Offloading

To enable the preconfigured indexing offloading you need to add the cron cartridge to your application and restart it:

rhc -aweblate add-cartridge cron
rhc -aweblate app stop
rhc -aweblate app start

The fulltext search index will then be updated every 5 minutes. Restarting with rhc restart instead will not enable indexing offloading in Weblate. You can verify that indexing offloading is indeed enabled by visiting the URL /admin/performance/ of your application.

Pending Changes

Weblate’s OpenShift configuration contains a cron job which periodically commits pending changes older than a certain age (24h by default). To enable the cron job you need to add the cron cartridge and restart Weblate as described in the previous section. You can change the age parameter by setting the environment variable WEBLATE_PENDING_AGE to the desired number of hours, e.g.:

rhc -aweblate env set WEBLATE_PENDING_AGE=48

Customize Weblate Configuration

You can customize the configuration of your Weblate installation on OpenShift through environment variables. Override any of Weblate’s setting documented under Configuration using rhc env set by prepending the settings name with WEBLATE_. For example override the ADMINS setting like this:

rhc -aweblate env set WEBLATE_ADMINS='(("John Doe", "jdoe@example.org"),)'

New settings will only take effect after restarting Weblate:

rhc -aweblate app stop
rhc -aweblate app start

Restarting using rhc -aweblate app restart does not work. For security reasons only constant expressions are allowed as values. With the exception of environment variables which can be referenced using ${ENV_VAR}. For example:

rhc -aweblate env set WEBLATE_PRE_COMMIT_SCRIPTS='("${OPENSHIFT_DATA_DIR}/examples/hook-generate-mo",)'

You can check the effective settings Weblate is using by running:

rhc -aweblate ssh settings

This will also print syntax errors in your expressions. To reset a setting to its preconfigured value just delete the corresponding environment variable:

rhc -aweblate env unset WEBLATE_ADMINS

See also

Configuration

Updating

It is recommended that you try updates on a clone of your Weblate installation before running the actual update. To create such a clone run:

rhc -aweblate2 app create --from-app weblate

Visit the newly given URL with a browser and wait for the install/update page to disappear.

You can update your Weblate installation on OpenShift directly from Weblate’s github repository by executing:

rhc -aweblate2 ssh update https://github.com/nijel/weblate.git#weblate-2.1

The identifier right of the # sign identifies the version of Weblate to install. For a list of available versions see here: https://github.com/nijel/weblate/tags. Please note that the update process will not work if you modified the git repository of you weblate installation. You can force an update by specifying the --force option to the update script. However any changes you made to the git repository of your installation will be discarded:

rhc -aweblate2 ssh update --force https://github.com/nijel/weblate.git#weblate-2.1

The --force option is also needed when downgrading to an older version. Please note that only version 2.0 and newer can be installed on OpenShift, as older versions don’t include the necessary configuration files.

The update script takes care of the following update steps as described under Generic upgrade instructions.

  • Install any new requirements
  • manage.py syncdb
  • manage.py migrate
  • manage.py setupgroups –move
  • manage.py setuplang
  • manage.py rebuild_index –all

Migrating Weblate to another server

Migrating Weblate to another server should be pretty easy, however it stores data in few locations which you should migrate carefully. The best approach is to stop migrated Weblate for the migration.

Migrating database

Depending on your database backend, you might have several options to migrate the database. The most straightforward one is to dump the database on one server and import it on the new one. Alternatively you can use replication in case your database supports it.

Migrating VCS repositories

The VCS repositories stored under DATA_DIR need to be migrated as well. You can simply copy them or use rsync to do the migration more effectively.

Migrating fulltext index

For the fulltext index (stored in DATA_DIR) it is better not to migrate it, but rather to generate fresh one using rebuild_index.

Other notes

Don’t forget to move other services which Weblate might have been using like memcached, cron jobs or custom authentication backends.