2019-05-07 11:41:17 -04:00
overleaf/clsi
2014-02-18 11:58:21 -05:00
===============
A web api for compiling LaTeX documents in the cloud
2018-11-22 04:13:23 -05:00
The Common LaTeX Service Interface (CLSI) provides a RESTful interface to traditional LaTeX tools (or, more generally, any command line tool for composing marked-up documents into a display format such as PDF or HTML). The CLSI listens on the following ports by default:
2018-10-22 11:01:17 -04:00
* TCP/3009 - the RESTful interface
2018-10-22 12:52:38 -04:00
* TCP/3048 - reports load information
2018-10-22 11:01:17 -04:00
* TCP/3049 - HTTP interface to control the CLSI service
These defaults can be modified in `config/settings.defaults.coffee` .
2018-10-22 12:52:38 -04:00
The provided `Dockerfile` builds a docker image which has the docker command line tools installed. The configuration in `docker-compose-config.yml` mounts the docker socket, in order that the CLSI container can talk to the docker host it is running in. This allows it to spin up `sibling containers` running an image with a TeX distribution installed to perform the actual compiles.
2018-10-22 11:01:17 -04:00
The CLSI can be configured through the following environment variables:
2018-10-22 11:03:50 -04:00
* `DOCKER_RUNNER` - Set to true to use sibling containers
* `SYNCTEX_BIN_HOST_PATH` - Path to SyncTeX binary
* `COMPILES_HOST_DIR` - Working directory for LaTeX compiles
* `SQLITE_PATH` - Path to SQLite database
* `TEXLIVE_IMAGE` - The TEXLIVE docker image to use for sibling containers, e.g. `gcr.io/overleaf-ops/texlive-full:2017.1`
* `TEXLIVE_IMAGE_USER` - When using sibling containers, the user to run as in the TEXLIVE image. Defaults to `tex`
* `TEX_LIVE_IMAGE_NAME_OVERRIDE` - The name of the registry for the docker image e.g. `gcr.io/overleaf-ops`
* `FILESTORE_DOMAIN_OVERRIDE` - The url for the filestore service e.g.`http://$FILESTORE_HOST:3009`
* `STATSD_HOST` - The address of the Statsd service (used by the metrics module)
* `LISTEN_ADDRESS` - The address for the RESTful service to listen on. Set to `0.0.0.0` to listen on all network interfaces
* `SMOKE_TEST` - Whether to run smoke tests
2018-10-22 11:01:17 -04:00
2014-02-18 11:58:21 -05:00
Installation
------------
2019-05-07 11:41:17 -04:00
The CLSI can be installed and set up as part of the entire [Overleaf stack ](https://github.com/overleaf/overleaf ) (complete with front end editor and document storage), or it can be run as a standalone service. To run is as a standalone service, first checkout this repository:
2014-02-18 11:58:21 -05:00
2019-05-07 11:41:17 -04:00
$ git clone git@github.com:overleaf/clsi.git
2014-02-18 11:58:21 -05:00
Then install the require npm modules:
$ npm install
Then compile the coffee script source files:
2014-02-26 10:09:18 -05:00
$ grunt install
2014-02-18 11:58:21 -05:00
Finally, (after configuring your local database - see the Config section), run the CLSI service:
$ grunt run
The CLSI should then be running at http://localhost:3013.
Config
------
You will need to set up a database in mysql to use with the CLSI, and then fill in the database name, username and password in the config file at `config/settings.development.coffee` .
API
---
The CLSI is based on a JSON API.
#### Example Request
2014-02-18 12:08:26 -05:00
(Note that valid JSON should not contain any comments like the example below).
2014-02-26 10:13:09 -05:00
POST /project/< project-id > /compile
2014-02-18 12:08:26 -05:00
```javascript
{
2014-02-26 10:13:09 -05:00
"compile": {
2014-02-18 12:08:26 -05:00
"options": {
// Which compiler to use. Can be latex, pdflatex, xelatex or lualatex
2014-02-26 10:13:09 -05:00
"compiler": "lualatex",
2014-02-18 12:08:26 -05:00
// How many seconds to wait before killing the process. Default is 60.
"timeout": 40
},
// The main file to run LaTeX on
"rootResourcePath": "main.tex",
// An array of files to include in the compilation. May have either the content
2014-02-21 07:29:06 -05:00
// passed directly, or a URL where it can be downloaded.
2014-02-18 12:08:26 -05:00
"resources": [{
"path": "main.tex",
"content": "\\documentclass{article}\n\\begin{document}\nHello World\n\\end{document}"
}, {
"path": "image.png",
"url": "www.example.com/image.png",
"modified": 123456789 // Unix time since epoch
}]
}
}
```
2020-10-27 11:53:10 -04:00
With `curl` , if you place the above json in a file called `data.json` , the request would look like this:
``` shell
$ curl -X POST -d @data .json localhost:3013/project/< id > /compile
```
2014-02-18 12:08:26 -05:00
You can specify any project-id in the URL, and the files and LaTeX environment will be persisted between requests.
URLs will be downloaded and cached until provided with a more recent modified date.
#### Example Response
2014-02-18 11:58:21 -05:00
```javascript
2014-02-18 12:08:26 -05:00
{
"compile": {
"status": "success",
"outputFiles": [{
"type": "pdf",
"url": "http://localhost:3013/project/< project-id > /output/output.pdf"
}, {
"type": "log",
"url": "http://localhost:3013/project/< project-id > /output/output.log"
}]
2014-02-18 11:58:21 -05:00
}
2014-02-18 12:08:26 -05:00
}
2014-02-18 11:58:21 -05:00
```
2014-02-18 12:11:52 -05:00
License
-------
The code in this repository is released under the GNU AFFERO GENERAL PUBLIC LICENSE, version 3. A copy can be found in the `LICENSE` file.
2019-05-07 11:41:17 -04:00
Copyright (c) Overleaf, 2014-2019.