Skip to content

Manual Install

The installer and the strawly command are optional. If you already run Docker with your own reverse proxy, you can use the compose file directly.

1. Get the deployment files

git clone https://git.strawly.app/Strawly/deployment.git strawly
cd strawly
cp .env.example .env
chmod 600 .env

2. Fill in .env

Set at least these values. Environment Variables describes every one.

Variable Value
STRAWLY_VERSION, OPTIMIZATIONS_AZURE_VERSION Versions from versions.json that work together
COMPOSE_PROFILES azure to run the Azure module, none to run without modules
STRAWLY_PUBLIC_URL The address people type, for example https://strawly.example.com
STRAWLY_HTTP_PORT, STRAWLY_BIND Where the instance proxy listens, for example 8080 on 127.0.0.1
ADMIN_EMAIL, ADMIN_PASSWORD The first admin account
POSTGRES_PASSWORD, CREDENTIALS_ENCRYPTION_KEY, INTERNAL_API_TOKEN openssl rand -hex 32 each
JWT_SECRET openssl rand -hex 48

3. Start Strawly

docker compose up -d
docker compose ps

Strawly listens on http://<STRAWLY_BIND>:<STRAWLY_HTTP_PORT>. That one port serves both the web interface and the API, so your reverse proxy needs a single upstream.

4. Put your reverse proxy in front

Forward your domain to the Strawly port, and pass the X-Forwarded-Proto header so Strawly knows the browser used HTTPS. Strawly marks its login cookie Secure only when that header says https.

An Nginx example:

server {
    listen 443 ssl;
    server_name strawly.example.com;
    # ssl_certificate and ssl_certificate_key as usual

    client_max_body_size 0;   # backups can be large

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_read_timeout 600s;
    }
}

Strawly trusts forwarded headers from private network addresses. If your proxy reaches Strawly from a public address, run it on the same host or network instead.

Upgrading

Choose new versions that work together from versions.json, back up, then:

docker compose exec -T postgres sh -c 'pg_dump -U "$POSTGRES_USER" -d "$POSTGRES_DB" -Fc' > backup.dump
# edit STRAWLY_VERSION and OPTIMIZATIONS_AZURE_VERSION in .env
docker compose pull
docker compose up -d

The migrations container updates the database before the new backend starts.