Deployment

Deployment

Visage can run standalone, but Docker is the recommended approach. There are no pre-built Docker images: Visage ships with a small build script that produces a Docker image locally.

Everything starts by cloning the Visage repository.

# Clone the repository
git clone https://github.com/butterhosting/visage.git
cd visage

# Specify a version or commit hash (optional)
git checkout 1.0.0

Docker image

To create a Docker image, execute the following command in the project's root folder.

# This script only requires the availability of `docker`
./visage image create

Docker examples

After successfully building a Visage image via ./visage image create, you can verify it starts correctly via this command:

docker run --rm -p 3000:3000 visage:latest

A more realistic setup mounts a persistent volume for /opt/visage/data and /opt/visage/maxmind, so the SQLite database and the MaxMind GeoIP database survive container restarts:

services:
  visage:
    image: visage:latest
    ports:
      - "3000:3000"
    volumes:
      - ./.htpasswd:/opt/visage/.htpasswd:ro
      - visage-data:/opt/visage/data
      - visage-maxmind:/opt/visage/maxmind
    environment:
      VISAGE_TIMEZONE: "Europe/Amsterdam"
      VISAGE_TRUST_PROXY: "true"
      MAXMIND_ACCOUNT_ID: "<ACCOUNT_ID>"
      MAXMIND_LICENSE_KEY: "XXXXXXXXXXXX"

volumes:
  visage-data:
  visage-maxmind:

Standalone

To run Visage without Docker, please make sure Bun is installed on your system.

After cloning the respository, Visage can be started as follows.

# Install dependencies
bun install --production

# Build the tracker script
bun tracker:build

# Start the application on port 3000
bun start:prod

Environment vars

When starting Visage, the following environment variables can be specified.

VariableOptionsDescription
VISAGE_LOGGINGdebug, info, warn, error (default info)Specifies Visage's logging level
VISAGE_TIMEZONEIANA time zone (default UTC)Specifies the timezone used for interface localization, log timestamps and stats bucketing
VISAGE_TRUST_PROXYtrue, false (default false)Specifies whether the X-Forwarded-For request headers can be trusted to contain visitors' IP addresses
VISAGE_SUPPORT_TOKENoptionalSpecifies a Visage support token; click here for more information
MAXMIND_ACCOUNT_IDoptionalMaxMind account ID
MAXMIND_LICENSE_KEYoptionalMaxMind license key