Add Libredesk service (#327)

* Add Libredesk blueprint with `template.toml`, `docker-compose.yml`, and meta data updates for self-hosted customer support desk

* Update `meta.json` links for Libredesk blueprint

* Update meta.json

* Reorganize Libredesk entry in meta.json

Moved the Libredesk metadata entry to a new position in the file while maintaining its details, including description, links, and tags. This change ensures consistency in the structure of the metadata entries.

---------

Co-authored-by: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com>
This commit is contained in:
Vincent Niehues
2025-09-21 07:16:22 +02:00
committed by GitHub
parent 8b329705cf
commit dde4099d4c
4 changed files with 233 additions and 0 deletions

View File

@@ -0,0 +1,54 @@
services:
libredesk:
image: libredesk/libredesk:latest
restart: unless-stopped
ports:
- 9000
environment:
# If the password is set during first docker-compose up, the system user password will be set to this value.
# You can always set system user password later by running `docker exec -it libredesk_app ./libredesk --set-system-user-password`.
LIBREDESK_SYSTEM_USER_PASSWORD: ${LIBREDESK_SYSTEM_USER_PASSWORD:-}
depends_on:
- db
- redis
volumes:
- ../files/uploads:/libredesk/uploads:rw
- ../files/config.toml:/libredesk/config.toml
command: [ sh, -c, "./libredesk --install --idempotent-install --yes --config /libredesk/config.toml && ./libredesk --upgrade --yes --config /libredesk/config.toml && ./libredesk --config /libredesk/config.toml" ]
# PostgreSQL database
db:
image: postgres:17-alpine
restart: unless-stopped
ports:
# Only bind on the local interface. To connect to Postgres externally, change this to 0.0.0.0
- 5432
environment:
# Set these environment variables to configure the database, defaults to libredesk.
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
healthcheck:
test: [ "CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-libredesk} -d ${POSTGRES_DB:-libredesk}" ]
interval: 10s
timeout: 5s
retries: 6
volumes:
- postgres-data:/var/lib/postgresql/data
# Redis
redis:
image: redis:7-alpine
restart: unless-stopped
ports:
# Only bind on the local interface.
- 6379
volumes:
- redis-data:/data
networks:
libredesk:
volumes:
postgres-data:
redis-data:

View File

@@ -0,0 +1,11 @@
<svg xmlns="http://www.w3.org/2000/svg" width="215" height="32" viewBox="0 0 215 32" fill="none">
<path d="M190.958 31V1.2H196.398V16.72L194.918 16.2L207.598 1.2H214.438L202.558 15.28L202.878 11.44L214.798 31H208.398L200.398 17.88L196.398 22.64V31H190.958Z" fill="white"/>
<path d="M175.7 31.48C173.806 31.48 172.046 31.1333 170.42 30.44C168.82 29.7467 167.433 28.7867 166.26 27.56C165.113 26.3067 164.273 24.8533 163.74 23.2L168.26 21.24C168.98 22.9467 170.02 24.2933 171.38 25.28C172.74 26.24 174.273 26.72 175.98 26.72C176.94 26.72 177.766 26.5733 178.46 26.28C179.18 25.96 179.726 25.5333 180.1 25C180.5 24.4667 180.7 23.8267 180.7 23.08C180.7 22.2 180.433 21.48 179.9 20.92C179.393 20.3333 178.62 19.88 177.58 19.56L171.86 17.72C169.54 17 167.793 15.92 166.62 14.48C165.446 13.04 164.86 11.3467 164.86 9.4C164.86 7.69333 165.273 6.18667 166.1 4.88C166.953 3.57333 168.126 2.56 169.62 1.84C171.14 1.09333 172.873 0.720001 174.82 0.720001C176.606 0.720001 178.246 1.04 179.74 1.68C181.233 2.29333 182.513 3.16 183.58 4.28C184.673 5.37333 185.486 6.66667 186.02 8.16L181.54 10.16C180.953 8.66667 180.073 7.52 178.9 6.72C177.726 5.89333 176.366 5.48 174.82 5.48C173.913 5.48 173.113 5.64 172.42 5.96C171.726 6.25333 171.18 6.68 170.78 7.24C170.406 7.77333 170.22 8.41334 170.22 9.16C170.22 9.98667 170.486 10.72 171.02 11.36C171.553 11.9733 172.366 12.4533 173.46 12.8L178.94 14.52C181.313 15.2933 183.086 16.36 184.26 17.72C185.46 19.08 186.06 20.76 186.06 22.76C186.06 24.4667 185.62 25.9733 184.74 27.28C183.86 28.5867 182.646 29.6133 181.1 30.36C179.553 31.1067 177.753 31.48 175.7 31.48Z" fill="white"/>
<path d="M141.271 31V1.2H161.071V6H146.711V13.64H160.271V18.44H146.711V26.2H161.071V31H141.271Z" fill="white"/>
<path d="M111.661 31V1.2H121.381C124.528 1.2 127.261 1.84 129.581 3.12C131.928 4.37333 133.741 6.12 135.021 8.36C136.301 10.5733 136.941 13.1467 136.941 16.08C136.941 18.9867 136.301 21.5733 135.021 23.84C133.741 26.08 131.928 27.84 129.581 29.12C127.261 30.3733 124.528 31 121.381 31H111.661ZM117.101 26.2H121.501C123.528 26.2 125.275 25.7867 126.741 24.96C128.235 24.1067 129.395 22.9333 130.221 21.44C131.048 19.92 131.461 18.1333 131.461 16.08C131.461 14 131.048 12.2133 130.221 10.72C129.395 9.22667 128.235 8.06666 126.741 7.24C125.275 6.41333 123.528 6 121.501 6H117.101V26.2Z" fill="white"/>
<path d="M87.8722 31V1.2H107.672V6H93.3122V13.64H106.872V18.44H93.3122V26.2H107.672V31H87.8722Z" fill="white"/>
<path d="M61.4269 31V1.2H72.5069C74.5335 1.2 76.3202 1.57333 77.8669 2.32C79.4402 3.04 80.6669 4.10666 81.5469 5.52C82.4269 6.90666 82.8669 8.6 82.8669 10.6C82.8669 12.6533 82.3735 14.4 81.3869 15.84C80.4269 17.28 79.1202 18.3467 77.4669 19.04L84.3069 31H78.1469L70.8269 17.92L74.3469 20H66.8669V31H61.4269ZM66.8669 15.2H72.5869C73.5735 15.2 74.4269 15.0133 75.1469 14.64C75.8669 14.24 76.4269 13.6933 76.8269 13C77.2269 12.3067 77.4269 11.5067 77.4269 10.6C77.4269 9.66667 77.2269 8.86666 76.8269 8.2C76.4269 7.50666 75.8669 6.97333 75.1469 6.6C74.4269 6.2 73.5735 6 72.5869 6H66.8669V15.2Z" fill="white"/>
<path d="M33.7706 31V1.2H46.3306C48.304 1.2 49.984 1.54666 51.3706 2.24C52.784 2.90667 53.864 3.86667 54.6106 5.12C55.384 6.34667 55.7706 7.84 55.7706 9.6C55.7706 10.96 55.3973 12.24 54.6506 13.44C53.9306 14.6133 52.7706 15.5867 51.1706 16.36V13.84C52.6373 14.4 53.7973 15.0933 54.6506 15.92C55.504 16.7467 56.104 17.6667 56.4506 18.68C56.7973 19.6933 56.9706 20.76 56.9706 21.88C56.9706 24.7333 56.024 26.9733 54.1306 28.6C52.264 30.2 49.664 31 46.3306 31H33.7706ZM39.2106 26.2H46.8906C48.304 26.2 49.424 25.8133 50.2506 25.04C51.104 24.24 51.5306 23.1867 51.5306 21.88C51.5306 20.5733 51.104 19.52 50.2506 18.72C49.424 17.92 48.304 17.52 46.8906 17.52H39.2106V26.2ZM39.2106 12.76H46.6106C47.7306 12.76 48.624 12.44 49.2906 11.8C49.9573 11.1333 50.2906 10.28 50.2906 9.24C50.2906 8.2 49.9573 7.37333 49.2906 6.76C48.624 6.14667 47.7306 5.84 46.6106 5.84H39.2106V12.76Z" fill="white"/>
<path d="M22.5988 31V1.2H28.0388V31H22.5988Z" fill="white"/>
<path d="M0.880005 31V1.2H6.32V26.2H19.08V31H0.880005Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@@ -0,0 +1,152 @@
[variables]
libredesk_domain = "${domain}"
libredesk_system_user_password = "${base64:32}"
pg_username = "${username}"
pg_password = "${password:16}"
pg_database = "libredesk"
[config]
env = [
"LIBREDESK_SYSTEM_USER_PASSWORD=${libredesk_system_user_password}",
"POSTGRES_USER=${pg_username}",
"POSTGRES_PASSWORD=${pg_password}",
"POSTGRES_DB=${pg_database}",
]
[[config.domains]]
serviceName = "libredesk"
port = 9000
host = "${libredesk_domain}"
[[config.mounts]]
filePath = "config.toml"
content = """
[app]
# Log level: info, debug, warn, error, fatal
log_level = "debug"
# Environment: dev, prod.
# Setting to "dev" will enable color logging in terminal.
env = "dev"
# Whether to automatically check for application updates on start up, app updates are shown as a banner in the admin panel.
check_updates = true
# HTTP server.
[app.server]
# Address to bind the HTTP server to.
address = "0.0.0.0:9000"
# Unix socket path (leave empty to use TCP address instead)
socket = ""
# Do NOT disable secure cookies in production environment if you don't know exactly what you're doing!
disable_secure_cookies = false
# Request read and write timeouts.
read_timeout = "5s"
write_timeout = "5s"
# Maximum request body size in bytes (100MB)
# If you are using proxy, you may need to configure them to allow larger request bodies.
max_body_size = 104857600
# Size of the read buffer for incoming requests
read_buffer_size = 4096
# Keepalive settings.
keepalive_timeout = "10s"
# File upload provider to use, either `fs` or `s3`.
[upload]
provider = "fs"
# Filesystem provider.
[upload.fs]
# Directory where uploaded files are stored, make sure this directory exists and is writable by the application.
upload_path = 'uploads'
# S3 provider.
[upload.s3]
# S3 endpoint URL (required only for non-AWS S3-compatible providers like MinIO).
# Leave empty to use default AWS endpoints.
url = ""
# AWS S3 credentials, keep empty to use attached IAM roles.
access_key = ""
secret_key = ""
# AWS region, e.g., "us-east-1", "eu-west-1", etc.
region = "ap-south-1"
# S3 bucket name where files will be stored.
bucket = "bucket-name"
# Optional prefix path within the S3 bucket where files will be stored.
# Example, if set to "uploads/media", files will be stored under that path.
# Useful for organizing files inside a shared bucket.
bucket_path = ""
# S3 signed URL expiry duration (e.g., "30m", "1h")
expiry = "30m"
# Postgres.
[db]
# If running locally, use `localhost`.
host = "db"
# Database port, default is 5432.
port = 5432
# Update the following values with your database credentials.
user = "${pg_username}"
password = "${pg_password}"
database = "${pg_database}"
ssl_mode = "disable"
# Maximum number of open database connections
max_open = 30
# Maximum number of idle connections in the pool
max_idle = 30
# Maximum time a connection can be reused before being closed
max_lifetime = "300s"
# Redis.
[redis]
# If running locally, use `localhost:6379`.
address = "redis:6379"
password = ""
db = 0
[message]
# Number of workers processing outgoing message queue
outgoing_queue_workers = 10
# Number of workers processing incoming message queue
incoming_queue_workers = 10
# How often to scan for outgoing messages to process, keep it low to process messages quickly.
message_outgoing_scan_interval = "50ms"
# Maximum number of messages that can be queued for incoming processing
incoming_queue_size = 5000
# Maximum number of messages that can be queued for outgoing processing
outgoing_queue_size = 5000
[notification]
# Number of concurrent notification workers
concurrency = 2
# Maximum number of notifications that can be queued
queue_size = 2000
[automation]
# Number of workers processing automation rules
worker_count = 10
[autoassigner]
# How often to run automatic conversation assignment
autoassign_interval = "5m"
[webhook]
# Number of webhook delivery workers
workers = 5
# Maximum number of webhook deliveries that can be queued
queue_size = 10000
# HTTP timeout for webhook requests
timeout = "15s"
[conversation]
# How often to check for conversations to unsnooze
unsnooze_interval = "5m"
[sla]
# How often to evaluate SLA compliance for conversations
evaluation_interval = "5m"
"""

View File

@@ -2898,6 +2898,22 @@
"productivity"
]
},
{
"id": "libredesk",
"name": "Libredesk",
"logo": "libredesk.svg",
"version": "latest",
"description": "Open source, self-hosted customer support desk. Single binary app.",
"links": {
"github": "https://github.com/abhinavxd/libredesk",
"website": "https://libredesk.io",
"docs": "https://docs.libredesk.io/introduction"
},
"tags": [
"storage",
"object-storage"
]
},
{
"id": "linkding",
"name": "Linkding",