# Sites

## Sites Directory

Frappe is a multitenant platform and each tenant is called a site. Sites exist
in a directory called `sites_dir`, assumed as the current working directory when
running a frappe command or other services like Celery worker or a WSGI server.

You can set `sites_dir` with an environment variable `SITES_DIR` or pass
`--sites_dir` option to the frappe command.

Apart from the sites, the `sites_dir` should contain the following.

#### apps.txt

`apps.txt` contain a list of Python packages to treat as Frappe apps. Every
frappe app that you intend to use in you site should have an entry in this file.
Also, they should be in the `PYTHONPATH`. For more information, refer
[Frappe Apps](/help/apps).

#### common\_site\_config.json

`common_site_config.json` is an optional file. Configuration common to all sites
can be put in this file.

#### assets

Assets contain files that are required to be served for the browser client.
These generally include *.js, *.css, *.png files. This directory is auto
generated using the `bench build` command.

#### languages.txt

`languages.txt` is an autogenerated file which maps every language to it's code.

## Site

A site is a directory in `sites_dir` which represents a tenant in Frappe Platform.


### Directory Structure

	site
	├── locks
	├── private
	│   └── backups
	├── public
	│   └── files
	│		└── testfile.txt
	└── site_config.json

* `locks` directory is used by the scheduler to synchronize various jobs using
the [file locking concept](http://en.wikipedia.org/wiki/File_locking).

* `private` directory contains files that require authentication to access.
Presently, it is limited only to backups.

* `public` directory contains files that can directly served. In the above
 example, `testfile.txt` can be accessed by the URL,
	 http://site/files/testfile.txt

* `site_config.json` contains site specific configuration

### Site Config

[See configuration options for `site_config.json`](/docs/user-guide/site_config.md)

### Site Resolution

While responding to an HTTP request, a site is automatically selected based on,

* `Host` header in the HTTP request matches a site
* `X-Frappe-Site-Name` header in the HTTP request matches a site

It is also possible to force the development server to serve a specific site by
starting it with the following command.
	`bench --site SITENAME serve`


### Adding a new site

`frappe new-site SITENAME`
