User Guide

What is GLOSI?

GLOSI is an offering from Lineaje that serves as an intelligence data platform for open source components and vulnerabilities. GLOSI enables customers to lookup open source intelligence in their own environment. GLOSI supports a variety of environments – from cloud to on-prem. GLOSI releases new intelligence data on a regular basis to keep up the changes.

How is GLOSI shipped?

GLOSI is shipped as a container image (tarball) and it can be deployed using docker compose.

What does GLOSI contain?

GLOSI image bundles the open source data and open source vulnerability data along with a set of services and a UI. It includes the following elements:

· Front end UI React Next App to access and query the open source components and vulnerabilities

· Data-service FastAPI as an API layer to access the data

· Orchestration service FastAPI app to manage the DB

· Elastic Search DB 7.17.0 that holds the open source data

How can I get access to GLOSI?

GLOSI image is hosted in Lineaje registry. Please get in touch with Lineaje support ([email protected]) to get access to the GLOSI image.

GLOSI Setup

System Configuration

All containers can be setup in one single VM (Ubuntu, Alpine) or in distributed fashion. If all applications are being setup in one single vm below configuration is recommended.

Deployment Type

services

Ram

vCPU

DiskSize

SingleNode

data-service

32GB

8

300GB

Pre-requisite

1. You should have the tarball containing the installation guide, API documentation along with Resource folder containing the docker-compose.yaml file which contains GLOSI image hosted within Lineaje ECR. The tarball can also be found here.

2. You should have access to Lineaje ECR hosting the GLOSI docker image, in case you don’t have access, then please reach out to Lineaje Support on [email protected] for requesting ECR access along with your AWS Account Id. Once ECR access is granted on your AWS Account, you are good to move forward with next steps.

3. Docker installed on the host vm

4. Install AWS CLI on vm

5. For automated installation, services being installed using the GLOSI vm should have access to gold.lineaje.com domain. Whitelisting

Deployment

1. Add a config in ~/.aws/config with below info

[profile LineajeGlosiRole]
role_arn = arn:aws:iam::<Lineaje AWS Account>:role/lineajeGlosiPullRole
credential_source = Ec2InstanceMetadata

2. Login to aws ecr using below command. glosi repository id can be found in docker-compose.yaml file present under Resource folder of tarball.

aws ecr get-login-password --region us-east-1 --profile LineajeGlosiRole | sudo docker login --username AWS --password-stdin <Lineaje AWS Account>.dkr.ecr.us-east-1.amazonaws.com

2. Pull the image in your host vm using below command

docker pull <Lineaje AWS Account>.dkr.ecr.us-east-1.amazonaws.com/glosi:latest

3. Use below command to deploy all services with docker-compose.yaml and image pulled in previous step. This will deploy all services in one single vm.

sudo docker compose -f <docker-compose.yaml> up -d

Custom Deployment

The deployment can be customized. Here are the configuration files that can be customized.

ElasticSearch configuration

To start elastic search separately elasticsearch container can be spawned in separate vm and a port needs to be exposed to make it accessible through data service. With below configuration the container runs at recommended 9200 port, which can be changed as per requirement.

elasticsearch:
    image: <Lineaje AWS Account Id>.dkr.ecr.us-east-1.amazonaws.com/glosi:latest
    container_name: elasticsearch
    command: ["/bin/sh", "-c", "/usr/share/elasticsearch/bin/elasticsearch"]
    user: "1001:1001"  # Run as UID/GID defined in Dockerfile
    environment:      
      - discovery.type=single-node
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
    volumes:
      - elasticsearch_data:/usr/share/elasticsearch/data
    ports:
      - "9200:9200"
    restart: no
    healthcheck:
      test: ["CMD-SHELL", "curl --silent --fail http://elasticsearch:9200/_cluster/health || exit 1"]
      interval: 5s
      retries: 10
      timeout: 3s

Data Service configuration

Data service is the data access API using FastAPI and connects to Elasticsearch. Converts client requests into Elasticsearch queries. This container runs on recommended port 8000 which can be customised with below configuration. This service also exposed a swagger docs endpoint at url: http://<data-service:VM_IP>:<port:8000>/docs

data-service:
    image: <Lineaje AWS Account Id>.dkr.ecr.us-east-1.amazonaws.com/glosi:latest
    container_name: data-service
    working_dir: /app/data-service
    command: ["gunicorn", "main:app", "-w", "4", "-k", "uvicorn.workers.UvicornWorker", "-b", "0.0.0.0:8000", "--timeout", "2", "--graceful-timeout", "15", "--keep-alive", "10"]    
    environment:
      - PATH=/app/data-service/venv/bin:$PATH
      - ELASTIC_AUTH_METHOD=NO_AUTH
      - OPENSEARCH_HOST=elasticsearch   
      - OPENSEARCH_PORT=9200
      - USER_SSL=False
      - VERIFY_CERT=False
    depends_on:
      elasticsearch:
        condition: service_healthy
    ports:
      - "8000:8000"
    restart: always

FrontEnd

The frontend using which user interact with this service through their browsers. It calls backend APIs and displays data visually. It runs on recommended 3000 port (http://localhost:3000) which can be customized with below container definition.

risklensui:
    image: <Lineaje AWS Account Id>.dkr.ecr.us-east-1.amazonaws.com/glosi:latest
    container_name: risklensui
    working_dir: /app/risklensui
    command: ["npm", "run", "start"]    
    ports:
      - "3000:3000"
    restart: always

GLOSI Orchestration Service

Orchestration service handles workflows and connects UI actions with the data-service. Adds logic, routing, and validation. It runs on recommended 8500 port (http://<orchestration-service:VM_IP>:<port:8000>/docs) which can be customised with below container definition. Here link to elastic search needs to be provided along with port as this service interacts with elastic search directly with data synchronisation.

orchestration-service:
    image: <Lineaje AWS Account Id>.dkr.ecr.us-east-1.amazonaws.com/glosi:latest
    container_name: orchestration-service
    working_dir: /app/glosi-orchestration-service
    command: ["gunicorn", "main:app", "-w", "4", "-k", "uvicorn.workers.UvicornWorker", "-b", "0.0.0.0:8500", "--timeout", "2", "--graceful-timeout", "15", "--keep-alive", "10"]    
    environment:
      - PATH=/app/glosi-orchestration-service/venv/bin:$PATH
      - DATA_SERVICE_HOST=data-service
      - DATA_SERVICE_PORT=8000
      - ELASTIC_AUTH_METHOD=NO_AUTH
      - OPENSEARCH_HOST=elasticsearch   
      - OPENSEARCH_PORT=9200
      - USER_SSL=False
      - VERIFY_CERT=False
      - OSS_TENANT_ID=vdna_994mgmr65tculnfy
    depends_on:
      - data-service
    ports:
      - "8500:8500"
    restart: always

Data Persistence, Networking, and Volumes

Volumes ensure data inside containers isn’t lost when containers restart or rebuild. For instance, the elasticsearch_data volume stores all search and analytics data.

Volumes used:

· elasticsearch_data: Stores data generated by Elasticsearch post package and vulnerability index data synchronisation

Networking

Docker Compose automatically creates an internal bridge network. Containers communicate using service names. This abstraction avoids hardcoding IPs and simplifies scaling or relocating services.

Healthchecks ensure each service is only marked healthy once it responds to a specific URL or command, improving reliability.

Service Interaction

Here’s how the services communicate:

1. Frontend Interaction

The user opens the UI at http://localhost:3000. This sends API requests (like search queries) to the orchestration-service at http://localhost:8500.

2. Orchestration-Service

Validates the request and forwards it to the appropriate backend (usually the data-service).

3. Data-Service

Receives requests from orchestration-service. Transforms them into Elasticsearch-compatible queries and sends them to Elasticsearch.

4. Elasticsearch

Performs search/indexing operations and returns results to the data-service.

5. Response Propagation

The data-service formats Elasticsearch results and returns them to orchestration-service, which may further process or log it.

6. Frontend Rendering

The ui receives the final result and displays it to the user.

The architecture follows this loop:

UI ➝ Orchestration ➝ Data-service ➝ Elasticsearch ➝ Data-service ➝ Orchestration ➝ UI

Compose ensures services are started in this dependency chain, meaning each service waits for its required backend to be healthy before starting.

Access URLs

· Frontend: http://localhost:3000

· Data-Service Swagger Docs: http://<data-service:localhost>:<data-service-port:8000>/docs i.e. http://localhost:8000/docs

· Glosi Orchestration Service Swagger Docs: http://<glosi-orchestration-service:localhost>:<glosi-orchestration-service-port:8500>/docs i.e. http://localhost:8500/docs

GLOSI API reference

This section provides a comprehensive overview of all available endpoints, request formats, and response structures. All APIs follow the OpenAPI 3.1.0 specification and are served via FastAPI. Swagger documentation is available at:

API Docs: http://<glosi-orchestration-service-host>:<port>/docs

API Summary

Method

Route

Purpose

Input Type

Response Summary

POST

/component

Search component (package/image) info

ComponentRequest

Components list, totals, sample

POST

/search/packages

Search packages

SearchRequest

List of packages with pagination

POST

/search/cves

Search CVEs

SearchRequest

List of CVEs with pagination

POST

/search/images

Search images

SearchRequest

List of images with pagination

POST

/catalog/search

Search catalog entries

CatalogSearchRequest

Catalog search results

API Details

1. POST /component

Description: Retrieves detailed component information (package/image).

Request Body: ComponentRequest

{
  "type": "package",  // or "image"
  "packageName": "example",
  "manager": "npm",
  "version": "1.0.0",
  "gos": ["gold", "premium"],
  "page": 0,
  "page_size": 20
}

Behavior:

· If type = package, provides packages info

· If type = image,provides images info

Response:

{
  "status": true,
  "components": [...],
  "total": 120,
  "gos_total": 80,
  "sample_document": {...}
}

2. POST /search/packages

Description: Searches for packages with filters and overrides.

Request Body: SearchRequest

{
  "searchQuery": "openssl",
  "gos_type": ["gold"],
  "page": 0,
  "page_size": 3,
  "overide_gos_filter": true
}

Response:

{
  "status": true,
  "packages": [...],
  "pagination": { "packages": 30 }
}

3. POST /search/cves

Description: Searches for CVEs based on query, severity, and timeframe.

Request Body: SearchRequest

{
  "searchQuery": "CVE-2023",
  "severity": ["high"],
  "timeframe": "2024-01-01",
  "page": 0,
  "page_size": 5
}

Response:

{
  "status": true,
  "cves": [...],
  "pagination": { "cves": 50 }
}

4. POST /search/images

Description: Searches for container images.

Request Body: SearchRequest

{
  "searchQuery": "ubuntu",
  "gos_type": ["premium"],
  "overide_gos_filter": true
}

Response:

{
  "status": true,
  "images": [...],
  "pagination": { "images": 17 }
}

5. POST /catalog/search

Description: Searches the full catalog with extended filters.

Request Body: CatalogSearchRequest

{
  "searchQuery": "django",
  "managers": ["pypi"],
  "type": "package",
  "gos": ["gold"],
  "page": 0,
  "page_size": 10
}

Response:

{
  "status": true,
  "catalog": [...],
  "pagination": { "catalog": 55 }
}

Schema Overview

All endpoints expect input types as defined in OpenAPI schemas:

· ComponentRequest: For /component

· SearchRequest: For /search/*

· CatalogSearchRequest: For catalog-based queries

· FixRequest, FixStatusRequest, CVERequest, etc.: Used in fix and CVE resolution APIs

Example of SearchRequest schema:

{
  "searchQuery": "string",
  "page": 0,
  "page_size": 3,
  "severity": ["low", "medium"],
  "gos_type": ["gold"],
  "overide_gos_filter": true
}

Notes

· All routes are served under FastAPI with auto-generated Swagger UI.

· Swagger Docs available at http://<glosi-orchestration-service-host>:<port>/docs

· Supports flexible filtering, pagination, and override logic.

Maintenance and Troubleshooting

An admin panel is provided to check the status of data index status.

Maintenance Tips

· Clean up unused resources:

docker system prune -a

· Restart specific service:

docker-compose restart data-service

Troubleshooting

· Check container status: docker ps

· Access container shell: docker exec -it <container-name> /bin/sh

· Watch logs for errors.

Last updated