packages feed

festung-0.9.1.1: README.md

# Festung

Remote multi-db SQLCipher server exposing a REST API

![](https://upload.wikimedia.org/wikipedia/commons/c/c1/SenjNehajgrad0.jpg)

## Build

The `festung` container is built with the help of an auxiliary container called `steinmetz`.
The `steinmetz` container gathers and compiles all build dependencies, so that build process
of `festung` itself is faster. You can build both containers by invoking `make` with no
target.

```sh
$ make
```

## Run

To spin up a festung instance do

```sh
$ docker run --rm --tty --interactive --publish 127.0.0.1:2728:2728 --name festung festung
```

or just do

```sh
$ make start
```

If you want to persist the vaults between multiple runs, you either have to mount a directory
from the host system or create a docker volume. The latter could be done by doing

```sh
$ docker volume create vaults
```

and then run festung like so

```sh
$ docker run --rm -it -p 127.0.0.1:2728:2728 --mount source=vaults,target=/var/festung --name festung festung
```

## Interact

Once you have a festung instance running you can interact with the API by using `curl`, `httpie` or an
HTTP client of your choice.

The databases that are handled by festung are encrypted. The key is provided through the Authorization
header whose value is base64 encoded

```sh
$ echo foo | base64
Zm9vCg==
```

The request body for issuing queries against festung contains the fields `sql` and `params`. To create a
new table `foo` in the database `1` (encrypted with the password `"foo"`) you can issue the following 
request:

```json
# http localhost:2728/1 Authorization:Zm9vCg== sql='CREATE TABLE foo (id INT, b VARCHAR)' params:='[]'
{
    "data": [],
    "headers": [],
    "last_row_id": 0,
    "rows_changed": 0
}
```

The `params` paramter can be used for parametrizing queries. Let's say we insterted some data in our
table

```json
# http localhost:2728/1 Authorization:Zm9vCg== sql='INSERT INTO foo VALUES (1, "b")' params:='[]'
{
    "data": [],
    "headers": [],
    "last_row_id": 0,
    "rows_changed": 0
}
```

then we could use `params` as follows:

```json
# http localhost:2728/1 Authorization:Zm9vCg== sql='SELECT * FROM foo WHERE id IN (?)' params:='[1]'
{
    "data": [
        [
            1,
            "b"
        ]
    ],
    "headers": [
        {
            "name": "id",
            "type": "INT"
        },
        {
            "name": "b",
            "type": "VARCHAR"
        }
    ],
    "last_row_id": 0,
    "rows_changed": -1
}
```