Skip to content

Commit 449b477

Browse files
committed
Merge branch 'dev' into app_versioning
2 parents 2d08d1e + 67643f6 commit 449b477

File tree

926 files changed

+145740
-50224
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

926 files changed

+145740
-50224
lines changed

.github/workflows/docker-images.yml

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ on:
1010
default: 'latest'
1111
options:
1212
- latest
13+
- stable
1314
- test
14-
- 2.4.6
1515
build_allinone:
1616
type: boolean
1717
description: 'Build the All-In-One image'
@@ -41,24 +41,60 @@ jobs:
4141
build:
4242
runs-on: ubuntu-latest
4343
steps:
44+
- name: 'Setup jq'
45+
uses: dcarbone/install-jq-action@v3
46+
with:
47+
version: '1.7'
48+
4449
- name: Set environment variables
4550
shell: bash
4651
run: |
4752
# Get the short SHA of last commit
4853
echo "SHORT_SHA=$(echo ${{ github.sha }} | cut -c1-7)" >> "${GITHUB_ENV}"
49-
54+
5055
# Get branch name - we don't use github.ref_head_name since we don't build on PRs
5156
echo "BRANCH_NAME=${{ github.ref_name }}" >> "${GITHUB_ENV}"
52-
57+
5358
# Set docker image tag
54-
echo "IMAGE_TAG=${{ inputs.imageTag || github.ref_name }}" >> "${GITHUB_ENV}"
55-
59+
IMAGE_TAG=${{ inputs.imageTag || github.ref_name }}
60+
61+
# Check whether it's a release
62+
LATEST_TAG=$(
63+
curl -s -L \
64+
-H "Accept: application/vnd.github+json" \
65+
-H "Authorization: Bearer ${{ github.token }}" \
66+
https://api.github.com/repos/${{ github.repository }}/releases/latest \
67+
| jq -r '.tag_name'
68+
)
69+
IS_LATEST="false"
70+
if [[ "${LATEST_TAG}" == "${{ github.event.release.tag_name }}" ]]; then
71+
IS_LATEST="true"
72+
fi;
73+
5674
# Control which images to build
5775
echo "BUILD_ALLINONE=${{ inputs.build_allinone || true }}" >> "${GITHUB_ENV}"
5876
echo "BUILD_FRONTEND=${{ inputs.build_frontend || true }}" >> "${GITHUB_ENV}"
5977
echo "BUILD_NODESERVICE=${{ inputs.build_nodeservice || true }}" >> "${GITHUB_ENV}"
6078
echo "BUILD_APISERVICE=${{ inputs.build_apiservice || true }}" >> "${GITHUB_ENV}"
6179
80+
# Image names
81+
ALLINONE_IMAGE_NAMES=lowcoderorg/lowcoder-ce:${IMAGE_TAG}
82+
FRONTEND_IMAGE_NAMES=lowcoderorg/lowcoder-ce-frontend:${IMAGE_TAG}
83+
APISERVICE_IMAGE_NAMES=lowcoderorg/lowcoder-ce-api-service:${IMAGE_TAG}
84+
NODESERVICE_IMAGE_NAMES=lowcoderorg/lowcoder-ce-node-service:${IMAGE_TAG}
85+
86+
if [[ "${IS_LATEST}" == "true" ]]; then
87+
ALLINONE_IMAGE_NAMES="lowcoderorg/lowcoder-ce:latest,${ALLINONE_IMAGE_NAMES}"
88+
FRONTEND_IMAGE_NAMES="lowcoderorg/lowcoder-ce-frontend:latest,${FRONTEND_IMAGE_NAMES}"
89+
APISERVICE_IMAGE_NAMES="lowcoderorg/lowcoder-ce-api-service:latest,${APISERVICE_IMAGE_NAMES}"
90+
NODESERVICE_IMAGE_NAMES="lowcoderorg/lowcoder-ce-node-service:latest,${NODESERVICE_IMAGE_NAMES}"
91+
fi;
92+
93+
echo "ALLINONE_IMAGE_NAMES=${ALLINONE_IMAGE_NAMES}" >> "${GITHUB_ENV}"
94+
echo "FRONTEND_IMAGE_NAMES=${FRONTEND_IMAGE_NAMES}" >> "${GITHUB_ENV}"
95+
echo "APISERVICE_IMAGE_NAMES=${APISERVICE_IMAGE_NAMES}" >> "${GITHUB_ENV}"
96+
echo "NODESERVICE_IMAGE_NAMES=${NODESERVICE_IMAGE_NAMES}" >> "${GITHUB_ENV}"
97+
6298
- name: Checkout lowcoder source
6399
uses: actions/checkout@v4
64100
with:
@@ -91,7 +127,7 @@ jobs:
91127
linux/amd64
92128
linux/arm64
93129
push: true
94-
tags: lowcoderorg/lowcoder-ce:${{ env.IMAGE_TAG }}
130+
tags: ${{ env.ALLINONE_IMAGE_NAMES }}
95131

96132
- name: Build and push the frontend image
97133
if: ${{ env.BUILD_FRONTEND == 'true' }}
@@ -108,7 +144,7 @@ jobs:
108144
linux/amd64
109145
linux/arm64
110146
push: true
111-
tags: lowcoderorg/lowcoder-ce-frontend:${{ env.IMAGE_TAG }}
147+
tags: ${{ env.FRONTEND_IMAGE_NAMES }}
112148

113149
- name: Build and push the node service image
114150
if: ${{ env.BUILD_NODESERVICE == 'true' }}
@@ -120,7 +156,7 @@ jobs:
120156
linux/amd64
121157
linux/arm64
122158
push: true
123-
tags: lowcoderorg/lowcoder-ce-node-service:${{ env.IMAGE_TAG }}
159+
tags: ${{ env.NODESERVICE_IMAGE_NAMES }}
124160

125161
- name: Build and push the API service image
126162
if: ${{ env.BUILD_APISERVICE == 'true' }}
@@ -132,5 +168,5 @@ jobs:
132168
linux/amd64
133169
linux/arm64
134170
push: true
135-
tags: lowcoderorg/lowcoder-ce-api-service:${{ env.IMAGE_TAG }}
171+
tags: ${{ env.APISERVICE_IMAGE_NAMES }}
136172

.github/workflows/sonarcloud.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,4 @@ jobs:
3030
env:
3131
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any
3232
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
33+
SONAR_SCANNER_OPTS: "-Dsonar.javascript.node.maxspace=8192 -Xmx8192m"

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,6 @@ server/api-service/lowcoder-server/src/main/resources/application-local-dev.yaml
1919
translations/locales/node_modules/
2020
server/api-service/lowcoder-server/src/main/resources/application-local-dev-ee.yaml
2121
node_modules
22+
23+
# Local Netlify folder
24+
.netlify

.vscode/settings.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@
55
"titleBar.activeForeground": "#F9FAF2"
66
},
77
"java.debug.settings.onBuildFailureProceed": true,
8-
"java.configuration.updateBuildConfiguration": "automatic"
8+
"java.configuration.updateBuildConfiguration": "automatic",
9+
"terminal.integrated.scrollback": 100000000,
910
}

app.json

Lines changed: 52 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,16 @@
22
"name": "lowcoder",
33
"description": "A Visual App builder with 120+ built-in components. Create software applications (internal and customer-facing!) and Meeting/Collaboration tools for your Company and your Customers with minimal coding experience.",
44
"repository": "https://github.com/lowcoder-org/lowcoder",
5-
"logo": "https://lowcoder.cloud/images/webclip.png",
5+
"logo": "https://raw.githubusercontent.com/lowcoder-org/lowcoder-media-assets/refs/heads/main/images/Lowcoder%20Logo%20512.png",
66
"keywords": [
77
"LowCode",
88
"Low code",
99
"develop tool",
1010
"Fast Application Development",
1111
"Rapid development",
1212
"Collaboration tool",
13-
"Video conferencing"
13+
"Video conferencing",
14+
"AI User Interface"
1415
],
1516
"stack": "container",
1617
"formation": {
@@ -22,11 +23,11 @@
2223
"env": {
2324
"LOWCODER_DB_ENCRYPTION_PASSWORD": {
2425
"description": "The encryption password used to encrypt all sensitive credentials in the database. You can use any random string (eg abcd).",
25-
"required": false
26+
"required": true
2627
},
2728
"LOWCODER_DB_ENCRYPTION_SALT": {
2829
"description": "The encryption salt used to encrypt all sensitive credentials in the database. You can use any random string (eg abcd).",
29-
"required": false
30+
"required": true
3031
},
3132
"LOWCODER_CORS_DOMAINS": {
3233
"description": "The domains supported for CORS requests. All domains are allowed by default. If there are multiple domains, please separate them with commas.",
@@ -61,12 +62,12 @@
6162
"required": false
6263
},
6364
"LOWCODER_API_SERVICE_URL": {
64-
"description": "Lowcoder API service URL",
65+
"description": "Lowcoder API service URL (main backend) - for multi-docker image installations.",
6566
"value": "http://localhost:8080",
6667
"required": false
6768
},
6869
"LOWCODER_NODE_SERVICE_URL": {
69-
"description": "Lowcoder Node service (js executor) URL",
70+
"description": "Lowcoder Node Service URL (data execution server) - for multi-docker image installations",
7071
"value": "http://localhost:6060",
7172
"required": false
7273
},
@@ -96,9 +97,9 @@
9697
"required": false
9798
},
9899
"LOWCODER_WORKSPACE_MODE": {
99-
"description": "SAAS to activate, ENTERPRISE to switch off - Workspaces",
100+
"description": "SAAS (MULTIWORKSPACE) to activate, SINGLEWORKSPACE (ENTERPRISE) to switch off - Workspaces",
100101
"value": "SAAS",
101-
"required": false
102+
"required": true
102103
},
103104
"LOWCODER_EMAIL_SIGNUP_ENABLED": {
104105
"description": "Control if users create their own Workspace automatic when Sign Up",
@@ -118,16 +119,16 @@
118119
"LOWCODER_SUPERUSER_USERNAME": {
119120
"description": "Username of the Super-User of an Lowcoder Installation",
120121
"value": "admin@localhost",
121-
"required": false
122+
"required": true
122123
},
123124
"LOWCODER_SUPERUSER_PASSWORD": {
124125
"description": "Password of the Super-User, if not present or empty, it will be generated",
125126
"value": "`generated and printed into log file",
126-
"required": false
127+
"required": true
127128
},
128129
"LOWCODER_API_KEY_SECRET": {
129130
"description": "String to encrypt/sign API Keys that users may create",
130-
"required": false
131+
"required": true
131132
},
132133
"LOWCODER_ADMIN_SMTP_HOST": {
133134
"description": "SMTP Hostname of your Mail Relay Server",
@@ -170,6 +171,45 @@
170171
"description": "\"from\" Email address of the password Reset Email Sender",
171172
"value": "service@lowcoder.cloud",
172173
"required": false
174+
},
175+
"LOWCODER_REDIS_ENABLED": {
176+
"description": "If true redis server is started in the single docker image container",
177+
"required": true
178+
},
179+
"LOWCODER_MONGODB_ENABLED": {
180+
"description": "If true mongo database is started in the single docker image container",
181+
"required": true
182+
},
183+
"LOWCODER_MONGODB_EXPOSED": {
184+
"description": "If true mongo database accept connections from outside the docker in the single docker image container",
185+
"required": false
186+
},
187+
"LOWCODER_API_SERVICE_ENABLED": {
188+
"description": "If true lowcoder api-service is started in the container",
189+
"required": false
190+
},
191+
"LOWCODER_NODE_SERVICE_ENABLED": {
192+
"description": "If true lowcoder node-service is started in the container",
193+
"required": false
194+
},
195+
"LOWCODER_FRONTEND_ENABLED": {
196+
"description": "If true lowcoder web frontend is started in the container",
197+
"required": false
198+
},
199+
"LOWCODER_PUID": {
200+
"description": "ID of user running services. It will own all created logs and data.",
201+
"value": "9001",
202+
"required": false
203+
},
204+
"LOWCODER_PGID": {
205+
"description": "ID of group of the user running services.",
206+
"value": "9001",
207+
"required": false
208+
},
209+
"LOWCODER_PUBLIC_URL": {
210+
"description": "The URL of the public User Interface",
211+
"value": "localhost:3000",
212+
"required": false
173213
}
174-
}
214+
}
175215
}

client/README.md

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,4 +116,73 @@ When you finish developing and testing the plugin, you can publish it into the n
116116
yarn build --publish
117117
```
118118

119-
You can check a code demo here: [Code Demo on Github](https://github.com/lowcoder-org/lowcoder/tree/main/client/packages/lowcoder-plugin-demo)
119+
You can check a code demo here: [Code Demo on Github](https://github.com/lowcoder-org/lowcoder/tree/main/client/packages/lowcoder-plugin-demo)
120+
121+
# Deployment of the Lowcoder Frontend to Netlify (Local Build Flow)
122+
123+
## ⚙️ Prerequisites
124+
125+
* Node.js & Yarn installed
126+
* Netlify CLI installed:
127+
128+
```bash
129+
npm install -g netlify-cli
130+
```
131+
132+
* Netlify CLI authenticated:
133+
134+
```bash
135+
netlify login
136+
```
137+
138+
* The project is linked to the correct Netlify site:
139+
140+
```bash
141+
cd client
142+
netlify link
143+
```
144+
145+
---
146+
147+
## 🛠 Setup `netlify.toml` (only once)
148+
149+
Inside the `client/` folder, create or update `netlify.toml`:
150+
151+
```toml
152+
[build]
153+
base = "client"
154+
command = "yarn workspace lowcoder build"
155+
publish = "client/packages/lowcoder/build"
156+
```
157+
158+
This ensures Netlify uses the correct build and publish paths when building locally.
159+
160+
---
161+
162+
## 🚀 Deployment Steps
163+
164+
1️⃣ Navigate into the `client` folder:
165+
166+
```bash
167+
cd client
168+
```
169+
170+
2️⃣ Run local build (with Netlify environment variables injected):
171+
172+
```bash
173+
netlify build
174+
```
175+
176+
3️⃣ Deploy to production:
177+
178+
```bash
179+
netlify deploy --prod --dir=packages/lowcoder/build
180+
```
181+
182+
---
183+
184+
## 🔧 Notes
185+
186+
* This local build flow fully honors the environment variables configured in Netlify.
187+
* No build happens on Netlify servers — only the deploy step runs on Netlify.
188+
* This approach avoids Netlify’s build memory limits.

client/VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2.6.5
1+
2.7.2

client/config/test/jest.setup-after-env.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// expect(element).toHaveTextContent(/react/i)
44
// learn more: https://github.com/testing-library/jest-dom
55
import "@testing-library/jest-dom";
6+
import { URL } from 'url';
67

78
// implementation of window.resizeTo for dispatching event
89
window.resizeTo = function resizeTo(width, height) {
@@ -53,4 +54,6 @@ class Worker {
5354
}
5455
}
5556

56-
window.Worker = Worker;
57+
window.Worker = Worker;
58+
59+
global.URL = URL;

client/netlify.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,7 @@
22
from = "/*"
33
to = "/"
44
status = 200
5+
[build]
6+
base = "client"
7+
command = "yarn workspace lowcoder build"
8+
publish = "client/packages/lowcoder/build"

client/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "lowcoder-frontend",
3-
"version": "2.6.5",
3+
"version": "2.7.2",
44
"type": "module",
55
"private": true,
66
"workspaces": [
@@ -83,6 +83,7 @@
8383
"flag-icons": "^7.2.1",
8484
"number-precision": "^1.6.0",
8585
"react-countup": "^6.5.3",
86+
"react-github-btn": "^1.4.0",
8687
"react-player": "^2.11.0",
8788
"resize-observer-polyfill": "^1.5.1",
8889
"rollup": "^4.22.5",

0 commit comments

Comments
 (0)