Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 51 additions & 36 deletions .github/workflows/docker-images.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,18 @@ on:
workflow_dispatch:
inputs:
imageTag:
type: choice
description: 'Choose a tag for built docker image(s)'
type: string
description: 'Docker image tag, for example 3.0.0 or latest'
required: true
default: 'latest'
options:
- latest
- stable
- test
sourceRef:
type: string
description: 'Source tag, branch or commit (empty uses the workflow commit)'
required: false
publish_latest:
type: boolean
description: 'Also publish the same images as latest'
default: false
build_allinone:
type: boolean
description: 'Build the All-In-One image'
Expand Down Expand Up @@ -41,41 +45,52 @@ jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout lowcoder source
uses: actions/checkout@v4
with:
ref: ${{ inputs.sourceRef || github.sha }}

- name: 'Setup jq'
uses: dcarbone/install-jq-action@v3
with:
version: '1.7'

- name: Set environment variables
shell: bash
env:
IMAGE_TAG: ${{ inputs.imageTag || github.ref_name }}
PUBLISH_LATEST: ${{ inputs.publish_latest || false }}
RELEASE_TAG: ${{ github.event.release.tag_name }}
GH_TOKEN: ${{ github.token }}
run: |
# Get the short SHA of last commit
echo "SHORT_SHA=$(echo ${{ github.sha }} | cut -c1-7)" >> "${GITHUB_ENV}"

# Get branch name - we don't use github.ref_head_name since we don't build on PRs
echo "BRANCH_NAME=${{ github.ref_name }}" >> "${GITHUB_ENV}"

# Set docker image tag
IMAGE_TAG=${{ inputs.imageTag || github.ref_name }}

# Check whether it's a release
LATEST_TAG=$(
curl -s -L \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ github.token }}" \
https://api.github.com/repos/${{ github.repository }}/releases/latest \
| jq -r '.tag_name'
)
IS_LATEST="false"
if [[ "${LATEST_TAG}" == "${{ github.event.release.tag_name }}" ]]; then
# Use the checked-out source commit, which may differ from the workflow.
echo "SHORT_SHA=$(git rev-parse --short=7 HEAD)" >> "${GITHUB_ENV}"
if [[ ! "${IMAGE_TAG}" =~ ^[a-zA-Z0-9_][a-zA-Z0-9_.-]{0,127}$ ]]; then
echo "::error::Invalid Docker image tag"
exit 1
fi

# Stable releases keep their existing latest-tag behavior. Manual runs
# can publish latest without changing a GitHub pre-release's status.
IS_LATEST="${PUBLISH_LATEST}"
if [[ -n "${RELEASE_TAG}" ]]; then
LATEST_TAG=$(
curl --fail --silent --show-error --location \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${GH_TOKEN}" \
"https://api.github.com/repos/${GITHUB_REPOSITORY}/releases/latest" \
| jq -r '.tag_name'
)
if [[ "${LATEST_TAG}" == "${RELEASE_TAG}" ]]; then
IS_LATEST="true"
fi;
fi
fi

# Control which images to build
echo "BUILD_ALLINONE=${{ inputs.build_allinone || true }}" >> "${GITHUB_ENV}"
echo "BUILD_FRONTEND=${{ inputs.build_frontend || true }}" >> "${GITHUB_ENV}"
echo "BUILD_NODESERVICE=${{ inputs.build_nodeservice || true }}" >> "${GITHUB_ENV}"
echo "BUILD_APISERVICE=${{ inputs.build_apiservice || true }}" >> "${GITHUB_ENV}"
echo "BUILD_ALLINONE=${{ github.event_name != 'workflow_dispatch' || inputs.build_allinone }}" >> "${GITHUB_ENV}"
echo "BUILD_FRONTEND=${{ github.event_name != 'workflow_dispatch' || inputs.build_frontend }}" >> "${GITHUB_ENV}"
echo "BUILD_NODESERVICE=${{ github.event_name != 'workflow_dispatch' || inputs.build_nodeservice }}" >> "${GITHUB_ENV}"
echo "BUILD_APISERVICE=${{ github.event_name != 'workflow_dispatch' || inputs.build_apiservice }}" >> "${GITHUB_ENV}"

# Image names
ALLINONE_IMAGE_NAMES=lowcoderorg/lowcoder-ce:${IMAGE_TAG}
Expand All @@ -84,7 +99,7 @@ jobs:
APISERVICE_IMAGE_NAMES=lowcoderorg/lowcoder-ce-api-service:${IMAGE_TAG}
NODESERVICE_IMAGE_NAMES=lowcoderorg/lowcoder-ce-node-service:${IMAGE_TAG}

if [[ "${IS_LATEST}" == "true" ]]; then
if [[ "${IS_LATEST}" == "true" && "${IMAGE_TAG}" != "latest" ]]; then
ALLINONE_IMAGE_NAMES="lowcoderorg/lowcoder-ce:latest,${ALLINONE_IMAGE_NAMES}"
FRONTEND_IMAGE_NAMES="lowcoderorg/lowcoder-ce-frontend:latest,${FRONTEND_IMAGE_NAMES}"
FRONTEND_EE_IMAGE_NAMES="lowcoderorg/lowcoder-enterprise-frontend:latest,${FRONTEND_EE_IMAGE_NAMES}"
Expand All @@ -98,11 +113,6 @@ jobs:
echo "APISERVICE_IMAGE_NAMES=${APISERVICE_IMAGE_NAMES}" >> "${GITHUB_ENV}"
echo "NODESERVICE_IMAGE_NAMES=${NODESERVICE_IMAGE_NAMES}" >> "${GITHUB_ENV}"

- name: Checkout lowcoder source
uses: actions/checkout@v4
with:
ref: ${{ env.BRANCH_NAME }}

- name: Log into Docker Hub
uses: docker/login-action@v3
with:
Expand All @@ -122,6 +132,7 @@ jobs:
env:
NODE_ENV: production
with:
context: .
file: ./deploy/docker/Dockerfile
build-args: |
REACT_APP_ENV=production
Expand All @@ -138,6 +149,7 @@ jobs:
env:
NODE_ENV: production
with:
context: .
file: ./deploy/docker/Dockerfile
target: lowcoder-ce-frontend
build-args: |
Expand All @@ -155,6 +167,7 @@ jobs:
env:
NODE_ENV: production
with:
context: .
file: ./deploy/docker/Dockerfile
target: lowcoder-enterprise-frontend
build-args: |
Expand All @@ -171,6 +184,7 @@ jobs:
if: ${{ env.BUILD_NODESERVICE == 'true' }}
uses: docker/build-push-action@v6
with:
context: .
file: ./deploy/docker/Dockerfile
target: lowcoder-ce-node-service
platforms: |
Expand All @@ -183,6 +197,7 @@ jobs:
if: ${{ env.BUILD_APISERVICE == 'true' }}
uses: docker/build-push-action@v6
with:
context: .
file: ./deploy/docker/Dockerfile
target: lowcoder-ce-api-service
platforms: |
Expand Down
4 changes: 4 additions & 0 deletions client/packages/lowcoder/src/api/licenseRequestApi.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import Api from "api/api";
import { isPublicLowcoderCloud } from "util/enterpriseHosting";

export interface LicenseContactData {
companyName: string;
Expand Down Expand Up @@ -38,6 +39,9 @@ export interface EnterpriseLicenseStatus {
}

async function request<T>(action: string, body: object): Promise<T> {
if (isPublicLowcoderCloud()) {
throw new Error("Enterprise licenses are available from your self-hosted Lowcoder installation.");
}
const response = await Api.post(`/enterprise-licenses/${action}`, { ...body, returnOrigin: window.location.origin }, undefined, { timeout: 120000 });
const result = response.data?.data;
if (!result || result.success !== true) throw new Error("Enterprise licensing request was not confirmed");
Expand Down
19 changes: 19 additions & 0 deletions client/packages/lowcoder/src/i18n/locales/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2765,6 +2765,25 @@ export const de = {
"readMoreButton": "Details zur Enterprise Edition",
"requestLicense": "Lizenzen für die Enterprise Edition anfordern",
"requestLicensesBtton": "Auf Enterprise umsteigen",
"selfHosted": {
"title": "Enterprise Edition",
"about": "Über die Enterprise Edition",
"sidebarNotice": "Die Enterprise Edition ist für Ihre eigene Lowcoder-Installation verfügbar.",
"description": "Lowcoder Enterprise Edition erweitert Lowcoder auf Ihrer eigenen Infrastruktur um erweiterte Verwaltung, Anpassungsmöglichkeiten und Einblicke.",
"cloudTitle": "Die Enterprise Edition wird selbst gehostet",
"cloudDescription": "app.lowcoder.cloud ist unser öffentlicher Dienst und unsere Referenzinstallation. Wir bieten keine gehostete Enterprise Edition an. Hier können Sie daher keine Enterprise-Lizenz kaufen oder aktivieren.",
"featuresTitle": "Was die Enterprise Edition bietet",
"environments": "Verwalten Sie Umgebungen und übertragen Sie Apps von der Entwicklung über Staging in die Produktion.",
"branding": "Passen Sie Branding, Logos, Farben und das Erscheinungsbild Ihrer Installation an.",
"audit": "Prüfen Sie Audit-Protokolle, um nachzuvollziehen, wer wann was geändert hat.",
"usage": "Analysieren Sie die App-Nutzung mit integrierten Auswertungen.",
"getStartedTitle": "So erhalten Sie die Enterprise Edition",
"install": "Hosten Sie Lowcoder auf Ihrem eigenen Server oder Ihrer privaten Infrastruktur. Folgen Sie dazu der Anleitung zum Selbsthosting.",
"signIn": "Öffnen Sie Ihre eigene Installation und melden Sie sich als Workspace-Administrator an.",
"purchase": "Öffnen Sie Einstellungen → Abonnement → Enterprise licenses und wählen Sie „Request Enterprise licenses“. Auch „Auf Enterprise umsteigen“ in den Einstellungen öffnet dort den Kaufdialog.",
"activate": "Laden Sie nach der Zahlung Ihre Lizenzdatei herunter und installieren Sie sie zusammen mit dem Enterprise-Plugin auf Ihrer eigenen Installation.",
"guide": "Anleitung zum Selbsthosting öffnen"
},
"AuditLogsTitle": "Audit Logs",
"AuditLogsIntroTitle": "Leistungsstarker Einblick in die Aktivitäten Ihres Arbeitsbereichs",
"AuditLogsIntro1": "Mithilfe von Audit-Protokollen können Administratoren genau verfolgen, was auf der gesamten Lowcoder-Plattform passiert. Von Benutzeranmeldungen bis hin zu App-Änderungen wird jede relevante Aktion erfasst und gespeichert.",
Expand Down
19 changes: 19 additions & 0 deletions client/packages/lowcoder/src/i18n/locales/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3246,6 +3246,25 @@ export const en = {
"readMoreButton" : "Enterprise Edition Details",
"requestLicense" : "Request Enterprise Edition Licenses",
"requestLicensesBtton" : "Upgrade to Enterprise",
"selfHosted": {
"title": "Enterprise Edition",
"about": "About Enterprise Edition",
"sidebarNotice": "Enterprise Edition is available for your own Lowcoder installation.",
"description": "Lowcoder Enterprise Edition adds advanced administration, customization, and visibility to Lowcoder on infrastructure you control.",
"cloudTitle": "Enterprise Edition is self-hosted",
"cloudDescription": "app.lowcoder.cloud is our public service and reference installation. We do not offer hosted Enterprise Edition, so you cannot purchase or activate an Enterprise license here.",
"featuresTitle": "What Enterprise Edition includes",
"environments": "Manage environments and move apps from development through staging to production.",
"branding": "Customize branding, logos, colors, and the appearance of your installation.",
"audit": "Review audit logs to understand who changed what and when.",
"usage": "Understand app usage with built-in analytics.",
"getStartedTitle": "How to get Enterprise Edition",
"install": "Host Lowcoder on your own server or private infrastructure using the self-hosting guide.",
"signIn": "Open your own installation and sign in as a workspace administrator.",
"purchase": "Go to Settings → Subscription → Enterprise licenses and select \"Request Enterprise licenses\". The \"Upgrade to Enterprise\" button in Settings also opens the purchase flow there.",
"activate": "After payment, download your license file and install it together with the Enterprise plugin on your own installation.",
"guide": "Open the self-hosting guide"
},
"licenseRequest": {
"title": "Request Enterprise Licenses",
"companyDetails": "Company Details",
Expand Down
19 changes: 19 additions & 0 deletions client/packages/lowcoder/src/i18n/locales/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2765,6 +2765,25 @@ export const es = {
"readMoreButton": "Detalles de la edición Enterprise",
"requestLicense": "Solicitar licencias de Enterprise Edition",
"requestLicensesBtton": "Actualizar a Enterprise",
"selfHosted": {
"title": "Enterprise Edition",
"about": "Acerca de Enterprise Edition",
"sidebarNotice": "Enterprise Edition está disponible para tu propia instalación de Lowcoder.",
"description": "Lowcoder Enterprise Edition añade administración avanzada, personalización y visibilidad a Lowcoder en una infraestructura que tú controlas.",
"cloudTitle": "Enterprise Edition requiere alojamiento propio",
"cloudDescription": "app.lowcoder.cloud es nuestro servicio público e instalación de referencia. No ofrecemos Enterprise Edition alojada, por lo que aquí no puedes comprar ni activar una licencia Enterprise.",
"featuresTitle": "Qué incluye Enterprise Edition",
"environments": "Gestiona entornos y lleva tus aplicaciones de desarrollo a pruebas y producción.",
"branding": "Personaliza la marca, los logotipos, los colores y la apariencia de tu instalación.",
"audit": "Consulta los registros de auditoría para saber quién cambió qué y cuándo.",
"usage": "Comprende el uso de las aplicaciones con análisis integrados.",
"getStartedTitle": "Cómo obtener Enterprise Edition",
"install": "Aloja Lowcoder en tu propio servidor o infraestructura privada siguiendo la guía de alojamiento propio.",
"signIn": "Abre tu propia instalación e inicia sesión como administrador del espacio de trabajo.",
"purchase": "Ve a Configuración → Suscripción → Enterprise licenses y selecciona «Request Enterprise licenses». El botón «Actualizar a Enterprise» en Configuración también abre el proceso de compra en tu instalación.",
"activate": "Después del pago, descarga el archivo de licencia e instálalo junto con el plugin Enterprise en tu propia instalación.",
"guide": "Abrir la guía de alojamiento propio"
},
"AuditLogsTitle": "Registros de auditoría",
"AuditLogsIntroTitle": "Potente visibilidad de la actividad de su espacio de trabajo",
"AuditLogsIntro1": "Los registros de auditoría permiten a los administradores hacer un seguimiento exacto de lo que ocurre en toda la plataforma Lowcoder. Desde los inicios de sesión de los usuarios hasta las modificaciones de las aplicaciones, todas las acciones relevantes se capturan y almacenan.",
Expand Down
19 changes: 19 additions & 0 deletions client/packages/lowcoder/src/i18n/locales/it.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2765,6 +2765,25 @@ export const it = {
"readMoreButton": "Dettagli dell'edizione Enterprise",
"requestLicense": "Richiesta di licenze Enterprise Edition",
"requestLicensesBtton": "Passa a Enterprise",
"selfHosted": {
"title": "Enterprise Edition",
"about": "Informazioni su Enterprise Edition",
"sidebarNotice": "Enterprise Edition è disponibile per la tua installazione di Lowcoder.",
"description": "Lowcoder Enterprise Edition aggiunge amministrazione avanzata, personalizzazione e visibilità a Lowcoder su un’infrastruttura che controlli tu.",
"cloudTitle": "Enterprise Edition richiede un’installazione autonoma",
"cloudDescription": "app.lowcoder.cloud è il nostro servizio pubblico e la nostra installazione di riferimento. Non offriamo Enterprise Edition in hosting, quindi qui non puoi acquistare né attivare una licenza Enterprise.",
"featuresTitle": "Cosa include Enterprise Edition",
"environments": "Gestisci gli ambienti e trasferisci le app dallo sviluppo allo staging e alla produzione.",
"branding": "Personalizza il marchio, i loghi, i colori e l’aspetto della tua installazione.",
"audit": "Consulta i registri di audit per sapere chi ha modificato cosa e quando.",
"usage": "Analizza l’utilizzo delle app con le statistiche integrate.",
"getStartedTitle": "Come ottenere Enterprise Edition",
"install": "Installa Lowcoder sul tuo server o sulla tua infrastruttura privata seguendo la guida all’hosting autonomo.",
"signIn": "Apri la tua installazione e accedi come amministratore dello spazio di lavoro.",
"purchase": "Vai a Impostazioni → Abbonamento → Enterprise licenses e seleziona «Request Enterprise licenses». Anche il pulsante «Passa a Enterprise» nelle Impostazioni apre la procedura di acquisto nella tua installazione.",
"activate": "Dopo il pagamento, scarica il file di licenza e installalo insieme al plugin Enterprise nella tua installazione.",
"guide": "Apri la guida all’hosting autonomo"
},
"AuditLogsTitle": "Registri di controllo",
"AuditLogsIntroTitle": "Potente visibilità sull'attività del vostro spazio di lavoro",
"AuditLogsIntro1": "I registri di audit consentono agli amministratori di tracciare esattamente ciò che accade nell'intera piattaforma Lowcoder. Dall'accesso degli utenti alle modifiche delle app, ogni azione rilevante viene catturata e memorizzata.",
Expand Down
19 changes: 19 additions & 0 deletions client/packages/lowcoder/src/i18n/locales/pt.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2765,6 +2765,25 @@ export const pt = {
"readMoreButton": "Detalhes da edição Enterprise",
"requestLicense": "Solicitar licenças da Enterprise Edition",
"requestLicensesBtton": "Atualizar para Enterprise",
"selfHosted": {
"title": "Enterprise Edition",
"about": "Sobre a Enterprise Edition",
"sidebarNotice": "A Enterprise Edition está disponível para sua própria instalação do Lowcoder.",
"description": "O Lowcoder Enterprise Edition adiciona administração avançada, personalização e visibilidade ao Lowcoder em uma infraestrutura que você controla.",
"cloudTitle": "A Enterprise Edition exige hospedagem própria",
"cloudDescription": "app.lowcoder.cloud é nosso serviço público e nossa instalação de referência. Não oferecemos Enterprise Edition hospedada, portanto não é possível comprar ou ativar uma licença Enterprise aqui.",
"featuresTitle": "O que a Enterprise Edition inclui",
"environments": "Gerencie ambientes e leve seus aplicativos do desenvolvimento para testes e produção.",
"branding": "Personalize a marca, os logotipos, as cores e a aparência da sua instalação.",
"audit": "Consulte os registros de auditoria para saber quem alterou o quê e quando.",
"usage": "Entenda o uso dos aplicativos com análises integradas.",
"getStartedTitle": "Como obter a Enterprise Edition",
"install": "Hospede o Lowcoder em seu próprio servidor ou infraestrutura privada seguindo o guia de hospedagem própria.",
"signIn": "Abra sua própria instalação e entre como administrador do espaço de trabalho.",
"purchase": "Acesse Configurações → Assinatura → Enterprise licenses e selecione «Request Enterprise licenses». O botão «Atualizar para Enterprise» nas Configurações também abre o processo de compra na sua instalação.",
"activate": "Após o pagamento, baixe o arquivo de licença e instale-o junto com o plugin Enterprise na sua própria instalação.",
"guide": "Abrir o guia de hospedagem própria"
},
"AuditLogsTitle": "Registos de auditoria",
"AuditLogsIntroTitle": "Visibilidade poderosa da atividade do seu espaço de trabalho",
"AuditLogsIntro1": "Os registos de auditoria permitem aos administradores seguir exatamente o que acontece em toda a plataforma Lowcoder. Desde as entradas dos utilizadores até às modificações das aplicações, todas as acções relevantes são capturadas e armazenadas.",
Expand Down
Loading
Loading