Skip to main content

Advanced Configuration

1. Overview​

A default installation may not meet production-grade requirements. Additional operations such as TLS encryption, Instance resource definition, and external infrastructure integration are often necessary.

2. TLS Encryption​

To enhance security, it is highly recommended to configure TLS. The steps in CSGHub Helm Chart are straightforward:

2.1 Prepare Certificates​

Prepare your domain certificates based on your deployment method. Note that wildcard certificates (e.g., *.csghub.example.com) are required if you use multiple subdomains.

2.2 Create TLS Secret​

kubectl -n csghub create secret tls csghub-tls-certs \
--cert=fullchain.pem \
--key=privkey.pem

2.3 Upgrade to Apply Certificates​

helm upgrade --install csghub csghub/csghub \
--namespace csghub \
--set global.gateway.external.domain="csghub.example.com" \
--set global.gateway.tls.enabled=true \
--set global.gateway.tls.secretName="csghub-tls-certs"

If you use multiple independent certificates for different services, specify them as follows:

--set portal.gateway.tls.secretName="portal-tls-certs" \
--set minio.gateway.tls.secretName="minio-tls-certs" \
--set casdoor.gateway.tls.secretName="casdoor-tls-certs"

3. Instance Resource Definition​

After instance readiness, defining resource specifications (flavors) is required before using GPU resources for inference or fine-tuning.

  • Enterprise Edition: Add resources directly via the Admin Console under Resource Management or Computing Power Management.
  • Community Edition: Initialize resource specifications directly in the backend database.

4. Using External Infrastructure​

By default, CSGHub deploys built-in services (PostgreSQL, Redis, MinIO, etc.). For production, using external managed resources is recommended for better availability and performance.

4.1 Disabling Built-in Resources​

Use the following logic to disable internal components:

global:<component>.enabled: false

For example, setting global.postgresql.enabled=false will stop Helm from deploying the built-in PostgreSQL.

4.2 Naming Conventions​

Default database and bucket names follow the format csghub-{service}.

To override these, specify them in the local service configuration:

server:
objectStore:
bucket: "my-custom-bucket"

4.3 Configuration Priority​

PriorityLevelExample
🥇 1Service-level (Local)server.objectStore.bucket
🥈 2Global-level (Global)global.objectStore.external.endpoint

Tips: Service-level configurations always take precedence over global configurations.

5. Configuration Examples​

The following examples demonstrate how to use external resources such as PostgreSQL, Redis, MinIO, and Registry.

5.1 External PostgreSQL​

global:
postgresql:
enabled: false
external:
host: "postgres.example.com"
port: 5432
user: "csghub"
password: "StrongPassword"
timezone: "Asia/Shanghai"
sslmode: "prefer"

The following configurations are examples of the default database configurations for each resource. You can specify a new database name by modifying `database`.
casdoor:
postgresql:
database: "new_casdoor_database"

temporal:
postgresql:
database: "new_temporal_database"

server:
postgresql:
database: "new_server_database"
portal:
postgresql:
database: "new_portal_database"
dataflow:
dataflow:
postgresql:
database: "new_dataflow_database"
labelStudio:
postgresql:
database: "new_label_studio_database"
csgship:
web:
postgresql:
database: "new_csgship_database"

5.2 External Redis​

global:
redis:
enabled: false
external:
host: "redis.example.com"
port: 6379
password: "RedisStrongPassword"

5.3 External MinIO / S3​

global:
objectStore:
enabled: false
external:
endpoint: "https://s3.amazonaws.com"
accessKey: "AKIAxxxx"
secretKey: "xxxx"
region: "us-east-1"
secure: true
pathStyle: false

## The following configurations are examples of default bucket configurations for each resource. You can specify a new bucket name by modifying `bucket`.
registry:
objectStore:
bucket: "new-registry-bucket"

server:
objectStore:
bucket: "new-server-bucket"

## In addition, another bucket `{service}-public` is needed here. It should be automatically named according to the service name; custom naming is not currently supported.

## Because this bucket needs to be publicly accessible, the `-public` identifier is defined.
portal:
objectStore:
bucket: "new-portal-bucket"

runner:
objectStore:
bucket: "new-runner-bucket"

## csgship currently does not expose a MinIO bucket field in the chart; the object storage is shared via the global configuration.

5.4 External Registry​

global:
registry:
enabled: false
external:
registry: "registry.example.com"
repository: "csghub"
username: "user"
password: "pass"

5.5 External Gitaly​

global:
gitaly:
enabled: false
external:
scheme: "tcp"
host: "gitaly.example.com"
port: 8075
token: "gitaly_token"
storage: "default"
jwtSecret: "signing-key" # shared secret for gitlab-shell <-> server JWT auth

jwtSecret defaults to signing-key and is used for JWT authentication between gitlab-shell and the server. Change it only when using an external Gitaly with a custom key.

5.6 External Dataflow​

global:
dataflow:
enabled: false
external:
host: "dataflow.example.com"
port: 80

5.7 Reference existingSecret for external Secrets​

Starting with the common library chart 0.2.8, PostgreSQL / Redis / Gitaly / ObjectStore support an additional existingSecret path: when enabled=false, you can point at a pre-provisioned Kubernetes Secret and the chart will read connection info from its data keys instead of requiring plaintext credentials in values.yaml.

global:
postgresql:
enabled: false
existingSecret: "my-pg-secret"
redis:
enabled: false
existingSecret: "my-redis-secret"
gitaly:
enabled: false
existingSecret: "my-gitaly-secret"
objectStore:
enabled: false
existingSecret: "my-s3-secret"

The Secret must be pre-created in the release namespace and contain the following keys (optional ones are bracketed):

ComponentSecret data keys
PostgreSQLPOSTGRES_HOST / POSTGRES_PORT / POSTGRES_USER / POSTGRES_PASSWORD / [POSTGRES_SSLMODE]
RedisREDIS_HOST / REDIS_PORT / REDIS_PASSWORD / [REDIS_USER] / [REDIS_DATABASE]
ObjectStoreOBJECT_STORE_ENDPOINT / OBJECT_STORE_ACCESS_KEY / OBJECT_STORE_SECRET_KEY / [OBJECT_STORE_REGION] / [OBJECT_STORE_BUCKET]
GitalyGITALY_HOST / GITALY_PORT / GITALY_TOKEN / [GITALY_STORAGE] / [GITALY_SCHEME]
RegistryREGISTRY_HOST / [REGISTRY_REPOSITORY] / [REGISTRY_USERNAME] / [REGISTRY_PASSWORD]

A service-level existingSecret overrides the global one:

global:
postgresql:
enabled: false
existingSecret: "shared-pg-secret"

portal:
postgresql:
existingSecret: "portal-pg-secret" # overrides the global value

Notes:

  • existingSecret and external are mutually exclusive at runtime; when existingSecret is non-empty, the chart uses the Secret values and external.* is ignored (kept only for backward compatibility).
  • The database name is still defined per service by the chart, so one shared Secret can back multiple services.
  • When enabled=true (built-in mode), existingSecret is ignored — the chart deploys its own instance and uses an auto-generated password.

6. Summary Table​

ComponentDisable CommandExternal Config PathDefault Naming
PostgreSQLglobal.postgresql.enabled=falseglobal.postgresql.externalcsghub_<service>
Redisglobal.redis.enabled=falseglobal.redis.external—
MinIO / S3global.objectStore.enabled=falseglobal.objectStore.externalcsghub-<service>
Registryglobal.registry.enabled=falseglobal.registry.external—
Gitalyglobal.gitaly.enabled=falseglobal.gitaly.external—
Dataflowglobal.dataflow.enabled=falseglobal.dataflow.external—