Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.jitera.ai/llms.txt

Use this file to discover all available pages before exploring further.

Jitera Self-Hosted records audit logs for security-relevant user and system actions. Logs are written in JSON format to a file inside the Sidekiq pod and can be forwarded to external storage via FluentBit.

Enabling Audit Logs

Audit logging is disabled by default. Enable it in your Helm values:
auditLogs:
  enabled: true
When enabled, a FluentBit sidecar is deployed alongside the Sidekiq container. The sidecar tails the audit log file and forwards entries to the configured output destinations.

Log Structure

Each audit log entry is a JSON object written to /var/log/audit.log inside the Sidekiq pod:
{
  "severity": "AUDIT_ENTERPRISE",
  "timestamp": "2024-10-20T12:00:00.000Z",
  "ip": "192.168.1.100",
  "browser": "Chrome",
  "browser_version": "118.0.5993.88",
  "os": "Mac OS X",
  "event": "signup",
  "user_id": "12345",
  "host": "app.example.com",
  "project_id": "67890",
  "resources": "{\"block_id\":\"123\",\"api_id\":\"456\"}"
}

Required Fields

Every log entry contains these fields:
FieldTypeDescription
eventStringEvent type from the predefined list
user_idStringUser ID who triggered the event
timestampDateTimeISO 8601 timestamp

Optional Fields

FieldTypeDescription
severityStringLog severity (AUDIT_ENTERPRISE)
ipStringClient IP address, or Internal Service for internal calls
browserStringBrowser name, or Internal Service
browser_versionStringBrowser version
osStringOperating system
hostStringRequest host/domain
project_idStringProject ID associated with the event
detailsStringAdditional event details
resourcesString (JSON)Affected resources (serialized JSON)

Event Types

The system tracks the following event categories. The complete list of events is defined in the application source code and may be updated across releases.

Authentication & User

EventDescription
signupUser registration
loginUser login
logoutUser logout
ssoSingle Sign-On login
sso_signupSSO registration
user_settings_updatedUser settings changed
user_password_changedPassword changed
user_mfa_enabledMFA enabled
user_mfa_disabledMFA disabled
user_mfa_verifiedMFA verification succeeded
user_mfa_failedMFA verification failed

Integrations

EventDescription
git_connectedGit repository connected
gitlab_connectedGitLab connected
gitlab_conn_failedGitLab connection failed

Project Operations

EventDescription
project_createdProject created
project_deletedProject deleted
project_member_invitedProject member invited
project_member_addedProject member added
git_project_importedProject imported from Git
trigger_project_syncProject sync triggered
trigger_project_import_page_exploreProject import page exploration
update_project_import_pageProject import page updated
configure_project_pluginProject plugin configured

Code Generation & Sync

EventDescription
code_to_erd_triggerCode to ERD conversion
code_to_natural_language_triggerCode to natural language conversion
trigger_frontend_code_generateFrontend code generation
trigger_api_syncAPI sync triggered
trigger_business_logic_syncBusiness logic sync triggered

Business Logic & API

EventDescription
business_logic_to_apiBusiness logic added to API
remove_business_logic_from_apiBusiness logic removed from API
create_new_apiNew API created

Documents

EventDescription
docs_createdDocument created
docs_updatedDocument updated
docs_deletedDocument deleted
docs_movedDocument moved
docs_renamedDocument renamed
docs_folder_deletedDocument folder deleted
export_documentDocument exported
export_folderFolder exported
import_documentsDocuments imported
triggered_translateTranslation triggered
ui_ux_document_triggerUI/UX document triggered
trigger_document_syncDocument sync triggered

Tickets & Testing

EventDescription
create_ticketTicket created
update_ticket_use_casesTicket use cases updated
trigger_ticket_syncTicket sync triggered
generate_test_casesTest cases generated
regenerate_test_casesTest cases regenerated
generate_project_import_page_test_casesProject import page test cases generated
delete_testTest deleted

UI/Screens

EventDescription
create_screen_previewScreen preview created
create_screenScreen created

Data Management

EventDescription
create_table_definitionTable definition created
bulk_delete_blockBulk block deletion

Organization Management

EventDescription
deactive_organizationOrganization deactivated
organization_member_invitedOrganization member invited
organization_member_addedOrganization member added
organization_member_removedOrganization member removed
organization_owner_changedOrganization owner changed
organization_integration_configuredOrganization integration configured

Team Management

EventDescription
team_createdTeam created
team_updatedTeam updated
team_deletedTeam deleted
team_member_invitedTeam member invited
team_member_addedTeam member added
team_member_removedTeam member removed
add_members_to_teamMembers added to team

LLM & AI

EventDescription
create_llmLLM created
update_llmLLM updated
delete_llmLLM deleted
organization_llm_available_updatedOrganization LLM availability updated
default_company_model_changedDefault company model changed

Agents & MCP

EventDescription
agent_createdAgent created
agent_updatedAgent updated
agent_deletedAgent deleted
agent_model_changedAgent model changed
agent_context_updatedAgent context updated
thread_createdThread created
thread_message_sentThread message sent
subthread_createdSubthread created
mcp_server_configuredMCP server configured
mcp_tool_registeredMCP tool registered
mcp_tool_unregisteredMCP tool unregistered

Apps

EventDescription
apps_installedApp installed
apps_uninstalledApp uninstalled
apps_configuredApp configured
apps_trigger_registerApp trigger registered

API Keys & Feature Management

EventDescription
create_api_keyAPI key created
revoke_api_keyAPI key revoked
update_feature_toggleFeature toggle updated
export_token_usage_csvToken usage CSV exported

Billing & Subscriptions

EventDescription
subscription_checkoutSubscription checkout
subscription_upgradedSubscription upgraded
subscription_canceledSubscription canceled
subscription_payment_failedSubscription payment failed
seat_quantity_changedSeat quantity changed
billing_portal_accessedBilling portal accessed
plan_config_createdPlan config created
plan_config_updatedPlan config updated

Admin Operations

EventDescription
admin_organization_activateAdmin activated organization
admin_organization_deactivateAdmin deactivated organization
admin_organization_createAdmin created organization
admin_user_activateAdmin activated user
admin_user_deactivateAdmin deactivated user
admin_user_deleteAdmin deleted user

Log Forwarding

FluentBit collects audit logs from the Sidekiq pod and forwards them to one or more external destinations. All output destinations are disabled by default.

AWS S3

auditLogs:
  enabled: true
  outputs:
    awsS3:
      enabled: true
      env:
        AWS_REGION: "ap-northeast-1"
        AWS_BUCKET: "your-audit-logs-bucket"
The AWS S3 output uses the same AWS credentials configured in storage.secret.aws. Logs are stored with the key format /%Y/%m/%d.log.

Azure Data Explorer

Forwarding audit logs to Azure Data Explorer (ADX / Kusto) requires Azure-side resources that must exist before the FluentBit sidecar starts. Configuring only the Helm values produces a deployment that looks healthy — the sidecar runs and ingestion calls succeed — but no usable rows appear in the table until every prerequisite below is in place.
ADX is a paid Azure service that bills hourly even when idle. Confirm the cost before enabling — see the Azure Data Explorer pricing page.

Prerequisites

The following must exist on the Azure side before enabling the output. Treat the commands below as examples — refer to the linked Azure documentation for the authoritative procedure for each resource.
1

Kusto cluster

Provision an Azure Data Explorer cluster. See Create an Azure Data Explorer cluster.
2

Database

Create a database inside the cluster. The database name is used in AZURE_DATA_EXPLORER_DB_NAME.
3

Table with the audit-log schema

Run the following KQL inside the database. Column names and types must match exactly — wrong types cause FluentBit to silently drop rows.
.create-merge table audit_logs (
  severity:        string,
  timestamp:       datetime,
  ip:              string,
  browser:         string,
  browser_version: string,
  os:              string,
  event:           string,
  user_id:         string,
  host:            string,
  project_id:      string,
  details:         string,
  resources:       string
)
4

JSON ingestion mapping

Create an ingestion mapping that tells Kusto how to extract each column from the incoming FluentBit payload. The mapping name is used in AZURE_INGESTION_MAPPING_REFERENCE.
.create-or-alter table audit_logs ingestion json mapping 'audit_logs_mapping'
'['
'{"column":"severity",        "Properties":{"Path":"$.log.severity"}},'
'{"column":"timestamp",       "Properties":{"Path":"$.log.timestamp"}},'
'{"column":"ip",              "Properties":{"Path":"$.log.ip"}},'
'{"column":"browser",         "Properties":{"Path":"$.log.browser"}},'
'{"column":"browser_version", "Properties":{"Path":"$.log.browser_version"}},'
'{"column":"os",              "Properties":{"Path":"$.log.os"}},'
'{"column":"event",           "Properties":{"Path":"$.log.event"}},'
'{"column":"user_id",         "Properties":{"Path":"$.log.user_id"}},'
'{"column":"host",            "Properties":{"Path":"$.log.host"}},'
'{"column":"project_id",      "Properties":{"Path":"$.log.project_id"}},'
'{"column":"details",         "Properties":{"Path":"$.log.details"}},'
'{"column":"resources",       "Properties":{"Path":"$.log.resources"}}'
']'
Paths must start with $.log. (not $.). The Jitera chart’s FluentBit output block sets Log_Key log, which wraps each parsed record under a top-level log key before sending it to Kusto. A mapping that uses $.severity, $.ip, and so on will accept the rows, but every column except timestamp will be empty — with no error in FluentBit logs or in Kusto.
5

Enable streaming ingestion (recommended)

Without streaming ingestion, rows are batched on a multi-minute schedule. For near-real-time audit visibility, enable the policy on the table:
.alter table audit_logs policy streamingingestion enable
Streaming ingestion must also be enabled at the cluster level. See Streaming ingestion policy.
6

Entra ID application and database role

Create an Entra ID app registration with a client secret, then grant its service principal the Ingestor role on the database. Database User is not sufficient — Kusto’s ingestion path requires Ingestor specifically.
.add database <db-name> ingestors ('aadapp=<client-id>;<tenant-id>') 'Jitera audit ingestion'
See Manage database security roles for the authoritative procedure.
If your Kusto cluster restricts public network access, add the egress IP of the Kubernetes cluster running Jitera (typically the NAT Gateway public IP) to the cluster’s allowed sources.

Helm values

Once the prerequisites are in place, enable the output:
auditLogs:
  enabled: true
  outputs:
    azureDataExplorer:
      enabled: true
      env:
        # Entra ID tenant of the Kusto cluster.
        # NOTE: The key is misspelled "TANANT" in the current chart — keep it
        # as-is until the chart accepts AZURE_TENANT_ID.
        AZURE_TANANT_ID: "<TENANT_ID>"

        # Use the **ingestion** URI with the `ingest-` prefix —
        # not the query URI shown under "URI" in the Azure portal.
        AZURE_INGESTION_ENDPOINT: "https://ingest-<cluster>.<region>.kusto.windows.net"

        AZURE_DATA_EXPLORER_DB_NAME:       "<DATABASE_NAME>"
        AZURE_INGESTION_TABLE:             "audit_logs"
        AZURE_INGESTION_MAPPING_REFERENCE: "audit_logs_mapping"

        AZURE_DATA_EXPLORER_CLIENT_ID:     "<ENTRA_APP_CLIENT_ID>"
        AZURE_DATA_EXPLORER_CLIENT_SECRET: "<ENTRA_APP_CLIENT_SECRET>"
AZURE_INGESTION_ENDPOINT must use the ingest- prefix — https://ingest-<cluster>.<region>.kusto.windows.net. The query URI shown under “URI” in the Azure portal (without ingest-) returns HTTP 404 from the ingestion API.
The environment variable name AZURE_TANANT_ID is a known misspelling in the Helm chart. Keep this spelling in your values file until the chart is updated; using AZURE_TENANT_ID will leave the FluentBit output unconfigured and silently disable ingestion.

Verifying ingestion

After deploying, confirm rows are arriving:
audit_logs
| take 10
| project timestamp, event, user_id, ip, host
If timestamp is populated but every other column is empty, the ingestion mapping is using $.<field> paths instead of $.log.<field> — re-create the mapping with the corrected paths from the JSON ingestion mapping step above. For FluentBit-side diagnosis:
kubectl -n <namespace> logs <sidekiq-pod> -c fluentbit | grep -i kusto
Reference: FluentBit Azure Kusto output.

Azure Blob Storage

auditLogs:
  enabled: true
  outputs:
    azureBlob:
      enabled: true
      env:
        AZURE_STORAGE_ACCOUNT_NAME: "<STORAGE_ACCOUNT_NAME>"
        AZURE_BLOB_KEY: "<STORAGE_KEY>"
        AZURE_BLOB_CONTAINER: "<CONTAINER_NAME>"
You can enable multiple output destinations simultaneously. For example, you can forward audit logs to both AWS S3 and Azure Data Explorer at the same time.

How It Works

  1. Event trigger - GraphQL mutations or controllers call the audit logging helper
  2. Job queuing - The event is queued to a Sidekiq background job
  3. Processing - The job extracts user agent and IP details from the request context
  4. Validation - Required fields (event, user_id, timestamp) are validated
  5. Logging - A JSON entry is appended to /var/log/audit.log inside the Sidekiq pod
  6. Collection - The FluentBit sidecar tails the log file
  7. Filtering - FluentBit extracts the event field for dynamic tagging
  8. Forwarding - Logs are forwarded to the configured output destinations

Example Log Entries

{
  "severity": "AUDIT_ENTERPRISE",
  "timestamp": "2024-10-20T10:30:00.000Z",
  "ip": "203.0.113.45",
  "browser": "Chrome",
  "browser_version": "120.0.0.0",
  "os": "Windows",
  "event": "signup",
  "user_id": "usr_abc123",
  "host": "app.example.com"
}
{
  "severity": "AUDIT_ENTERPRISE",
  "timestamp": "2024-10-20T11:45:00.000Z",
  "ip": "198.51.100.200",
  "browser": "Firefox",
  "browser_version": "119.0",
  "os": "Mac OS X",
  "event": "trigger_frontend_code_generate",
  "user_id": "usr_xyz789",
  "host": "app.example.com",
  "project_id": "proj_123456",
  "resources": "{\"block_id\":\"blk_789\",\"component_type\":\"button\"}"
}
{
  "severity": "AUDIT_ENTERPRISE",
  "timestamp": "2024-10-20T12:00:00.000Z",
  "ip": "Internal Service",
  "browser": "Internal Service",
  "browser_version": "Internal Service",
  "os": "Internal Service",
  "event": "trigger_business_logic_sync",
  "user_id": "usr_def456",
  "project_id": "proj_789012"
}