diff --git a/deploy/docker-compose/docker-compose.yml b/deploy/docker-compose/docker-compose.yml index 5d2564fafe..778a6e38e7 100644 --- a/deploy/docker-compose/docker-compose.yml +++ b/deploy/docker-compose/docker-compose.yml @@ -53,7 +53,7 @@ services: - laf_shared_network system-server: - image: system-server + image: lafyun/system-server:0.8.0 user: root working_dir: /app environment: @@ -98,21 +98,20 @@ services: SYS_CLIENT_HOST: ${SYS_CLIENT_HOST:?err} SYSTEM_EXTENSION_APPID: ${SYSTEM_EXTENSION_APPID} volumes: - - ./apisix_conf.yaml:/usr/local/apisix/conf/config.yaml:ro + - ./gateway_conf.yaml:/usr/local/apisix/conf/config.yaml:ro ports: - ${PUBLISH_PORT:-8080}:9080 networks: - laf_shared_network gateway-controller: - image: gateway-controller + image: lafyun/gateway-controller:0.8.0 depends_on: - gateway environment: DEPLOY_DOMAIN: "${DEPLOY_DOMAIN:?err}" DEPLOY_OSS_DOMAIN: ${OSS_DOMAIN} SYS_CLIENT_HOST: ${SYS_CLIENT_HOST:?err} - SYSTEM_EXTENSION_APPID: ${SYSTEM_EXTENSION_APPID} LOG_LEVEL: debug SERVICE_DRIVER: docker GATEWAY_TYPE: apisix @@ -121,16 +120,6 @@ services: networks: - laf_shared_network - apisix-dashboard: - image: apache/apisix-dashboard:2.13-alpine - restart: always - volumes: - - ./dashboard_conf.yaml:/usr/local/apisix-dashboard/conf/conf.yaml - ports: - - "9000:9000" - networks: - - laf_shared_network - instance-controller: image: lafyun/instance-controller:0.8.0 user: root diff --git a/deploy/docker-compose/apisix_conf.yaml b/deploy/docker-compose/gateway_conf.yaml similarity index 100% rename from deploy/docker-compose/apisix_conf.yaml rename to deploy/docker-compose/gateway_conf.yaml diff --git a/docker-compose.yml b/docker-compose.yml index 6b542e9035..c97a043db0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -20,6 +20,19 @@ services: networks: - laf_shared_network + etcd: + image: 'bitnami/etcd:3.5.4' + environment: + - ALLOW_NONE_AUTHENTICATION=yes + - ETCD_ADVERTISE_CLIENT_URLS=http://etcd:2379 + volumes: + - etcd-data:/bitnami/etcd/data + ports: + - 2379 + - 2380 + networks: + - laf_shared_network + oss: image: 'bitnami/minio:2022.4.12' environment: @@ -104,21 +117,47 @@ services: - laf_shared_network gateway: - image: openresty/openresty:latest + image: apache/apisix:2.14.1-alpine depends_on: - - mongo - - system-server + - etcd + volumes: + - ./gateway_conf.yaml:/usr/local/apisix/conf/config.yaml:ro + ports: + - 8080:9080 + networks: + - laf_shared_network + + gateway-controller: + build: ./packages/gateway-controller + user: root + working_dir: /app environment: - DEPLOY_DOMAIN: "*.127-0-0-1.nip.io" # `*.127-0-0-1.nip.io` always resolved to 127.0.0.1, used to local development - DEPLOY_OSS_DOMAIN: "oss.127-0-0-1.nip.io" + DEPLOY_DOMAIN: 127-0-0-1.nip.io + DEPLOY_OSS_DOMAIN: oss.127-0-0-1.nip.io SYS_CLIENT_HOST: console.127-0-0-1.nip.io - SYSTEM_EXTENSION_APPID: '000000' + LOG_LEVEL: debug + SERVICE_DRIVER: docker + GATEWAY_TYPE: apisix + SYS_DB_URI: mongodb://my_user:password123@mongo:27017/?authSource=laf-sys&replicaSet=laf&writeConcern=majority + API_SIX_KEY: edd1c9f034335f136f87ad84b625c8f1 + command: node ./dist/index.js + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - ./packages/gateway-controller:/app + depends_on: + - gateway + restart: always + networks: + - laf_shared_network + + + apisix-dashboard: + image: apache/apisix-dashboard:2.13-alpine + restart: always volumes: - - ./packages/gateway/scripts:/scripts - - ./packages/gateway/conf.docker:/conf.docker - command: "sh /scripts/start.sh" + - ./gateway_dashboard_conf.yaml:/usr/local/apisix-dashboard/conf/conf.yaml ports: - - 8080:80 + - "9000:9000" networks: - laf_shared_network diff --git a/gateway_conf.yaml b/gateway_conf.yaml new file mode 100644 index 0000000000..366898ba09 --- /dev/null +++ b/gateway_conf.yaml @@ -0,0 +1,26 @@ +apisix: + node_listen: 9080 # APISIX listening port + enable_ipv6: false + + allow_admin: # http://nginx.org/en/docs/http/ngx_http_access_module.html#allow + - 0.0.0.0/0 # We need to restrict ip access rules for security. 0.0.0.0/0 is for test. + + admin_key: + - name: "admin" + key: edd1c9f034335f136f87ad84b625c8f1 + role: admin # admin: manage all configuration data + # viewer: only can view configuration data + - name: "viewer" + key: 4054f7cf07e344346cd3f287985e76a2 + role: viewer + + enable_control: true + control: + ip: "0.0.0.0" + port: 9092 + +etcd: + host: # it's possible to define multiple etcd hosts addresses of the same etcd cluster. + - "http://etcd:2379" # multiple etcd address + prefix: "/apisix" # apisix configurations prefix + timeout: 30 # 30 seconds \ No newline at end of file diff --git a/deploy/docker-compose/dashboard_conf.yaml b/gateway_dashboard_conf.yaml similarity index 100% rename from deploy/docker-compose/dashboard_conf.yaml rename to gateway_dashboard_conf.yaml diff --git a/packages/gateway-controller/src/support/apisix-gateway.ts b/packages/gateway-controller/src/support/apisix-gateway.ts index 44b45abf3b..715efc0b40 100644 --- a/packages/gateway-controller/src/support/apisix-gateway.ts +++ b/packages/gateway-controller/src/support/apisix-gateway.ts @@ -55,7 +55,11 @@ async function createAppRoute(url: string, route: IRouteData) { connect: 600, send: 600, read: 600, - } + }, + plugins: { + cors: {} + }, + enable_websocket: true } return await ApiSixHttpUtils.put(url, route.appid, data) } diff --git a/packages/gateway/.gitignore b/packages/gateway/.gitignore deleted file mode 100644 index 0c3c5ea1ee..0000000000 --- a/packages/gateway/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -docs - -system-client -app-console \ No newline at end of file diff --git a/packages/gateway/Dockerfile b/packages/gateway/Dockerfile deleted file mode 100644 index cc7c60b65e..0000000000 --- a/packages/gateway/Dockerfile +++ /dev/null @@ -1,9 +0,0 @@ -FROM openresty/openresty:latest - -WORKDIR /app -EXPOSE 80 - -ADD ./conf.docker /conf.docker -ADD ./scripts /scripts - -CMD [ "sh", "/scripts/start.sh" ] diff --git a/packages/gateway/README.md b/packages/gateway/README.md deleted file mode 100644 index be62c875c1..0000000000 --- a/packages/gateway/README.md +++ /dev/null @@ -1,6 +0,0 @@ - -# Gateway - -> This gateway service ONLY worked for docker deployment. - -> Using ingress instead in kubernetes deployment. \ No newline at end of file diff --git a/packages/gateway/conf.docker/app.conf b/packages/gateway/conf.docker/app.conf deleted file mode 100644 index c54c2a4e6b..0000000000 --- a/packages/gateway/conf.docker/app.conf +++ /dev/null @@ -1,51 +0,0 @@ - -# for app service -server { - listen 80; - server_name ${DEPLOY_DOMAIN}; - client_max_body_size 0; - - gzip on; - gzip_min_length 10k; - gzip_comp_level 1; - gzip_vary on; - gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/json font/ttf font/otf image/svg+xml; - - - location / { - - # Allow CORS - add_header Access-Control-Allow-Origin * always; - add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,PATCH,OPTIONS always; - add_header Access-Control-Allow-Headers * always; - add_header Access-Control-Expose-Headers * always; - add_header Access-Control-Max-Age 3600 always; - - if ($request_method = 'OPTIONS') { - return 204; - } - - # Resolve app service - resolver 127.0.0.11; - if ($host ~* "^([0-9a-z]{3,32})\.(.+)$") { - set $appid $1; - set $service_id app-$appid; - } - - proxy_pass http://$service_id:8000; - add_header appid $appid; - proxy_read_timeout 600s; - proxy_set_header Host $host; - proxy_http_version 1.1; - - # Upgrade websocket - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - - - # Logging - log_by_lua_block { - ngx.log(ngx.ERR, ngx.var.appid, ',', ngx.var.service_id, ',', ngx.var.request_uri) - } - } -} \ No newline at end of file diff --git a/packages/gateway/conf.docker/oss.conf b/packages/gateway/conf.docker/oss.conf deleted file mode 100644 index 8ff426374d..0000000000 --- a/packages/gateway/conf.docker/oss.conf +++ /dev/null @@ -1,93 +0,0 @@ - -server { - listen 80; - server_name ${DEPLOY_OSS_DOMAIN}; - - # To allow special characters in headers - # ignore_invalid_headers off; - # Allow any size file to be uploaded. - # Set to a value such as 1000m; to restrict file size to a specific value - client_max_body_size 0; - # To disable buffering - proxy_buffering off; - - gzip on; - gzip_min_length 10k; - gzip_comp_level 1; - gzip_vary on; - gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/json font/ttf font/otf image/svg+xml; - - location / { - - # Allow CORS - if ($request_method = 'OPTIONS') { - add_header Access-Control-Allow-Origin * always; - add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,PATCH,OPTIONS always; - add_header Access-Control-Allow-Headers * always; - add_header Access-Control-Expose-Headers * always; - add_header Access-Control-Max-Age 3600 always; - return 204; - } - - # resolve oss service - resolver 127.0.0.11; - - # proxy - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header Host $http_host; - - proxy_pass http://oss:9000; - } -} - - -# for virtual host domain access, like *.oss.domain -server { - listen 80; - server_name *.${DEPLOY_OSS_DOMAIN}; - - # To allow special characters in headers - # ignore_invalid_headers off; - # Allow any size file to be uploaded. - # Set to a value such as 1000m; to restrict file size to a specific value - client_max_body_size 0; - # To disable buffering - proxy_buffering off; - - gzip on; - gzip_min_length 10k; - gzip_comp_level 1; - gzip_vary on; - gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/json font/ttf font/otf image/svg+xml; - - location / { - - # Allow CORS - if ($request_method = 'OPTIONS') { - add_header Access-Control-Allow-Origin * always; - add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,PATCH,OPTIONS always; - add_header Access-Control-Allow-Headers * always; - add_header Access-Control-Expose-Headers * always; - add_header Access-Control-Max-Age 3600 always; - return 204; - } - - # resolve oss service - resolver 127.0.0.11; - - # rewrite / to idnex.html - if ($uri ~ "/$") { - rewrite ^ /index.html break; - } - - # proxy - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header Host $http_host; - - proxy_pass http://oss:9000; - } -} \ No newline at end of file diff --git a/packages/gateway/conf.docker/system.conf b/packages/gateway/conf.docker/system.conf deleted file mode 100644 index d64dc45375..0000000000 --- a/packages/gateway/conf.docker/system.conf +++ /dev/null @@ -1,49 +0,0 @@ - -# for system client & server -server { - listen 80; - server_name localhost ${SYS_CLIENT_HOST}; - client_max_body_size 0; - - gzip on; - gzip_min_length 1k; - gzip_buffers 4 16k; - gzip_comp_level 2; - gzip_vary on; - gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript image/jpeg image/gif image/png application/json font/ttf font/otf image/svg+xml; - - location / { - proxy_pass http://system-client:8080/; - } - - location /app-console/ { - proxy_pass http://app-console:8080/; - } - - location /sys-api/ { - proxy_pass http://system-server:9000/; - proxy_send_timeout 600s; - proxy_read_timeout 600s; - } - - location /sys-extension-api/ { - # resolve app service - resolver 127.0.0.11; - set $appid ${SYSTEM_EXTENSION_APPID}; - set $service_id app-$appid; - - if ($uri ~* "/sys-extension-api/(.*)$") { - set $proxy_uri $1$is_args$query_string; - } - - proxy_pass http://$service_id:8000/$proxy_uri; - proxy_send_timeout 600s; - proxy_read_timeout 600s; - - # Upgrade websocket - proxy_http_version 1.1; - proxy_set_header Host $host; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - } -} \ No newline at end of file diff --git a/packages/gateway/package-lock.json b/packages/gateway/package-lock.json deleted file mode 100644 index 7485f11be7..0000000000 --- a/packages/gateway/package-lock.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "gateway", - "version": "0.8.2", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "gateway", - "version": "0.8.2" - } - } -} diff --git a/packages/gateway/package.json b/packages/gateway/package.json deleted file mode 100644 index a0b0eb0885..0000000000 --- a/packages/gateway/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "gateway", - "version": "0.8.2", - "description": "gateway service for laf.js", - "main": "index.js", - "private": true, - "scripts": {}, - "author": "Maslow(wangfugen@126.com)" -} diff --git a/packages/gateway/scripts/auto_envsubst.sh b/packages/gateway/scripts/auto_envsubst.sh deleted file mode 100644 index b6223383fa..0000000000 --- a/packages/gateway/scripts/auto_envsubst.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/sh - -set -e - -ME=$(basename $0) - -auto_envsubst() { - local template_dir="${NGINX_ENVSUBST_TEMPLATE_DIR:-/etc/nginx/templates}" - local suffix="${NGINX_ENVSUBST_TEMPLATE_SUFFIX:-.template}" - local output_dir="${NGINX_ENVSUBST_OUTPUT_DIR:-/etc/nginx/conf.d}" - - local template defined_envs relative_path output_path subdir - defined_envs=$(printf '${%s} ' $(env | cut -d= -f1)) - [ -d "$template_dir" ] || return 0 - if [ ! -w "$output_dir" ]; then - echo "$ME: ERROR: $template_dir exists, but $output_dir is not writable" - return 0 - fi - find "$template_dir" -follow -type f -name "*$suffix" -print | while read -r template; do - relative_path="${template#$template_dir/}" - output_path="$output_dir/${relative_path%$suffix}" - subdir=$(dirname "$relative_path") - # create a subdirectory where the template file exists - mkdir -p "$output_dir/$subdir" - echo "$ME: Running envsubst on $template to $output_path" - envsubst "$defined_envs" < "$template" > "$output_path" - done -} - -auto_envsubst - -exit 0 \ No newline at end of file diff --git a/packages/gateway/scripts/start.sh b/packages/gateway/scripts/start.sh deleted file mode 100644 index 28316acd4e..0000000000 --- a/packages/gateway/scripts/start.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/sh - -conf_dir=/conf.${SERVICE_DRIVER:-docker} - -template_dir="${NGINX_ENVSUBST_TEMPLATE_DIR:-/etc/nginx/templates}" - -echo "template_dir: " $template_dir -echo "conf_dir: " $conf_dir - -rm -rf $template_dir || true -mkdir -p $template_dir - -cp -n ${conf_dir}/system.conf ${template_dir}/system.conf.template || true -cp -n ${conf_dir}/app.conf ${template_dir}/app.conf.template || true -cp -n ${conf_dir}/oss.conf ${template_dir}/oss.conf.template || true - -sh /scripts/auto_envsubst.sh - -exec /usr/bin/openresty -g "daemon off;" \ No newline at end of file diff --git a/packages/system-server/src/init.ts b/packages/system-server/src/init.ts index ab8a3f35e4..dfa01bf1ab 100644 --- a/packages/system-server/src/init.ts +++ b/packages/system-server/src/init.ts @@ -4,6 +4,7 @@ import { getApplicationByAppid } from "./support/application" import { Initializer } from "./support/initializer" import Config from "./config" import { logger } from "./support/logger" +import {createApplicationRoute} from "./support/route"; /** @@ -48,6 +49,13 @@ async function main() { // run system extension server app await Initializer.startSystemExtensionApp(Config.SYSTEM_EXTENSION_APPID) logger.info('start system extension server app') + + // init system app route + let rt = await createApplicationRoute(app.name, app.appid, 0) + if (!rt) { + logger.error('Error: create route failed') + } + }