Installation | Maintenance | Beyond Lino


This section contains some older texts that need revision.

Lino directory structure

TODO: review

At the end of this document you will have the following recommenced directory structure on your Lino production server:

├── shared/
│   ├──   # shared Django settings
│   ├── master/ # a shared virtualenv named "master"
│   │   ├── repositories/ # git repositories used by master
│   │   │   ├─── lino
│   │   │   ├─── xl
│   │   │   ├─── noi
│   │   │   └─── ...
│   └── ...
└── lino_local/
    ├── prj1 # project directory of site "prj1"
    │   ├──
    │   ├──  # Site specific settings
    │   ├── env/ # either a link to some shared virtualenv, or a subdir with a site-specific virtualenv
    │   ├── log/ -> /var/log/lino/prj1/
    │   ├──
    │   ├── media/
    │   ├── static/
    │   ├──
    │   └── ...
    └── prj2
        ├─── ...
        └─── ...

This structure is recommended even if you have only one Lino site on your server because you never know whether the site operator some day change their mind and ask e.g. for a preview site as well.

It is possible to use symbolic links for the env and repositories in order to have several sites working on the same virtual environment.

Project directories

The following is done automatically by getlino.

Every new project directory must have at least four files:

  • an empty file so that Python processes can import your settings:

    $ touch /usr/local/src/lino/prod_sites/prj1/
  • a file Note: Replace the ‘prj1’ in this file with the name of the project:

    # -*- coding: UTF-8 -*-
    from lino.projects.std.settings import *
    import logging
    logging.getLogger('weasyprint').setLevel("ERROR") # see #1462
    class Site(Site):
        title = "Lino@prj1"
        # server_url = ""
    SITE = Site(globals())
    # locally override attributes of individual plugins
    # SITE.plugins.finan.suggest_future_vouchers = True
    # MySQL
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'mysite', #database name
            'USER': 'django',
            'PASSWORD': 'my cool password',
            'HOST': 'localhost',                  
            'PORT': 3306,
            'OPTIONS': {
               "init_command": "SET storage_engine=MyISAM",
  • a file

    #!/usr/bin/env python
    if __name__ == "__main__":
        import sys ; sys.path.append('/usr/local/src/lino')
        from lino_local import manage ; manage(__file__, 'settings')
  • a file Note: Replace the ‘prj1’ in this file with the name of the project:

    import sys ; sys.path.append('/usr/local/src/lino')
    from lino_local import wsgi ; wsgi(globals(), 'lino_sites.prj1.settings')

We recommend the convention of having in each project a symbolic link named env which points to the virtualenv.

Initialize the database


$ go prj1 $ python prep

Collecting static files

Create two empty directories media and config:

$ mkdir media
$ mkdir config

One part of your cache directory are the static files. When your LINO_CACHE_ROOT is set, you should run Django’s collectstatic command:

$ cd /usr/local/src/lino/prod_sites/prj1/
$ python collectstatic

The output should be something like this:

You have requested to collect static files at the destination
location as specified in your settings:


This will overwrite existing files!
Are you sure you want to do this?

Type 'yes' to continue, or 'no' to cancel: yes

4688 static files copied to '/usr/local/src/lino/prod_sites/prj1/static/', 0 unmodified.

Which database backend to use

Our example assumes you are using Django’s MySQL backend. For other backends, adapt your DATABASES accordingly.

The database backend of your choice is not automatically installed. If you plan to use Django’s MySQL backend, see MySQL cheat sheet.

Follow the Django documentation at Get your database running

How to install mysql on your site:

$ sudo apt install mysql-server
$ sudo apt install libmysqlclient-dev
$ sudo apt install python-dev
$ sudo apt install libffi-dev libssl-dev
$ sudo apt install mysql-server

$ sudo mysql_secure_installation