AngusGM Application Installation and Deployment
Note
- AngusGM serves as a foundational application. Other Angus business applications must run after AngusGM is operational.
- The following instructions are for the
Enterprise Edition
installation. To install other versions, replace the version identifierEnterprise
withCommunity
orDatacenter
.
I. Pre-Deployment Preparation
System Requirements
- Operating System: Supports
Linux/Windows/macOS
. - Computational Resources: Minimum
2 CPU cores, 4GB RAM
; recommended4 CPU cores, 8GB RAM
. - Disk Space: Minimum 10GB free space; recommended
100GB
.
- Operating System: Supports
Runtime Environment
- ZIP Package Deployment: Requires
OpenJDK 17+
. - Docker and Compose Deployment: Requires Docker (recommended version
V20.10+
).
- ZIP Package Deployment: Requires
Middleware
- Database: Requires MySQL 5.7+.
- Redis Cache: Requires Redis 7.0+.
Application Versions
- Community Edition (Community): Permanently free version.
- Enterprise Edition (Enterprise): Paid version requiring a license. Functionally identical to the Community Edition but supports more users.
- Datacenter Edition (Datacenter): Paid version requiring a license. Functionally identical to the Community Edition but supports multi-tenancy and more users.
Note: The following instructions are for the
Enterprise Edition
. ReplaceEnterprise
withCommunity
orDatacenter
for other versions.
II. Manual Configuration and Installation
1. Download and Extract
# Download the installation package
curl -LO https://nexus.xcan.cloud/repository/release/package/AngusGM-Enterprise-1.0.0.zip
# Extract the package to the target directory
mkdir -p /opt/AngusGM
unzip -qo AngusGM-Enterprise-1.0.0.zip -d /opt/AngusGM
# Navigate to the installation directory
cd /opt/AngusGM
2. Configure the Application
# Copy the configuration template
cp conf/.priv-template.env conf/.priv.env
# Edit the configuration file
vi conf/.priv.env
Modify the following options with your settings:
# Set to `AngusGM` for initial installation or reinstallation (automatically cleared post-installation)
INSTALL_APPS=AngusGM
# Specify the database type (required)
DATABASE_TYPE=MYSQL
# Application IP (IPv4) or hostname. If unset, the system auto-detects the IPv4 address.
# Note: In Docker environments, this must be set to the host machine's IP.
GM_HOST=
# Application port (default: `8802`)
GM_PORT=8802
# Web access URL (format: `http(s)://domain_or_IP:port`). If unset, defaults to `http://GM_HOST:GM_PORT`.
GM_WEBSITE=
# Administrator email (optional)
GM_ADMIN_EMAIL=
# Administrator username (default: `admin`)
GM_ADMIN_USERNAME=admin
# Administrator password (default: `admin@123`)
GM_ADMIN_PASSWORD=admin@123
# Database IP or hostname (required)
GM_DB_HOST=127.0.0.1
# Database port (required)
GM_DB_PORT=3306
# Database name (required)
GM_DB_NAME=angus
# Database username (must have full permissions for Angus databases)
GM_DB_USER=Angus
# Database password (required)
GM_DB_PASSWORD=Angus123
# Redis deployment type (required)
REDIS_DEPLOYMENT=SINGLE
# Redis IP or hostname (required)
REDIS_HOST=127.0.0.1
# Redis port (required)
REDIS_PORT=6379
# Redis password (required)
REDIS_PASSWORD=Angus123
# ------------------------
Note
- AngusGM offers flexible deployment. The above are recommended key configurations for quick installation.
- For additional configuration options, refer to
Configuration Reference -> Application Configuration
.
3. Start the Application
# Run the startup command
./startup-gm.sh
# Monitor startup logs
tail -f -n1000 logs/gm.log
Note: This script runs the application as a background process. Installation and startup take ~2 minutes. Check
logs
for details.
Other management commands:
# Stop the application
./shutdown-gm.sh
# Check application status
./status-gm.sh
# Uninstall the application
./shutdown-gm.sh && rm -rf /opt/AngusGM
Note
- The script runs the application in the background. Startup takes ~1 minute. Check
logs
for details. - For Nginx proxy or virtual host setup, refer to
Configuration Reference -> Nginx Proxy Configuration
.
III. Docker Installation
1. Prepare Installation Directory and Permissions
# Create the main installation directory (required for volume mounting)
mkdir -p /opt/AngusGM
# Navigate to the directory
cd /opt/AngusGM
# Create subdirectories (configs, data, logs, etc.)
mkdir -p {data,logs,plugins,tmp}
# Set permissions (ensure container user has RW access)
# Note: Production environments should use finer-grained permissions (e.g., chown 1000:1000).
chmod -R 777 /opt/AngusGM
2. Pull Image and Initialize Configuration
# Pull the official Enterprise image from Docker Hub
docker pull xcancloud/angusgm-enterprise:1.0.0
# Temporarily run a container to export default configs
docker create --name temp_container xcancloud/angusgm-enterprise:1.0.0
docker cp temp_container:/opt/AngusGM/default-conf conf
docker rm -f temp_container
# Create a private config file from the template
cp conf/.priv-template.env conf/.priv.env
# Edit the config file (align with manual setup)
vi conf/.priv.env
3. Start the Application Container
# Run the container in detached mode
# Prerequisites:
# 1. Database service is running.
# 2. Redis service is running.
# 3. conf/.priv.env is correctly configured.
docker run \
--name angusgm -d \
-p 8802:8802 \
-v ./conf:/opt/AngusGM/conf \
-v ./data:/opt/AngusGM/data \
-v ./logs:/opt/AngusGM/logs \
-v ./plugins:/opt/AngusGM/plugins \
-v ./tmp:/opt/AngusGM/tmp \
xcancloud/angusgm-enterprise:1.0.0
Parameter Descriptions:
Parameter | Purpose |
---|---|
-d | Run container in detached mode. |
--name angusgm | Assign container name angusgm for management. |
-p 8802:8802 | Map host port 8802 to container port 8802 . |
-v ./conf:/opt/AngusGM/conf | Mount config directory. |
-v ./data:/opt/AngusGM/data | Mount data directory. |
-v ./logs:/opt/AngusGM/logs | Mount logs directory. |
-v ./plugins:/opt/AngusGM/plugins | Mount plugins directory. |
-v ./tmp:/opt/AngusGM/tmp | Mount temp directory. |
xcancloud/angusgm-enterprise:1.0.0 | Specify the image name and tag (repository/image:tag ). |
IV. Docker Compose Installation
1. Install Only AngusGM
Important
- This setup is for standalone middleware (MySQL/Redis).
- Ensure:
- MySQL/Redis services are deployed and running.
- Network connectivity is verified.
1) Prepare Directory and Permissions
Same as Docker Installation -> Step 1
.
2) Pull Image and Initialize Config
Same as Docker Installation -> Step 2
.
3) Create and Configure gm.yml
cat << EOF > gm.yml
services:
angusgm:
image: xcancloud/angusgm-enterprise:1.0.0
container_name: angusgm
restart: unless-stopped
volumes:
- ./conf:/opt/AngusGM/conf
- ./data:/opt/AngusGM/data
- ./logs:/opt/AngusGM/logs
- ./plugins:/opt/AngusGM/plugins
- ./tmp:/opt/AngusGM/tmp
ports:
- "8802:8802"
healthcheck:
test: [ "CMD", "sh", "-c", "wget -q -O - http://127.0.0.1:8802/actuator/health | grep '\"status\":\"UP\"'" ]
interval: 15s
timeout: 5s
retries: 20
EOF
4) Start the Container
# Start the container
docker compose -f gm.yml up -d
# Monitor logs
docker compose -f gm.yml logs -f
2. Full Installation with Middleware
Important
- Includes:
Nginx, MySQL, Redis, AngusGM
. - Requires:
- Pre-configured domain (or IP for Nginx virtual host).
- Strong passwords for MySQL/Redis.
- SSL certificates for HTTPS (configured in
./templates/nginx/gm.conf
). - Default parameters can be modified in
./templates/gm/.priv.env
.
1) Download and Extract
# Download the package
curl -LO https://nexus.xcan.cloud/repository/release/compose/AngusGM-Enterprise-1.0.0.zip
# Extract to target directory
mkdir -p /opt/AngusGM
unzip -qo AngusGM-Enterprise-1.0.0.zip -d /opt/AngusGM
2) Configure Parameters
# Navigate to the directory
cd /opt/AngusGM
# Create subdirectories
mkdir -p {nginx/conf.d,nginx/logs,mysql/data,mysql/conf,redis/data}
mkdir -p gm/{data,logs,plugins,tmp}
# Edit the environment file
vi .env
# Example configuration:
############## App Config ##############
# Server IP
APP_HOST=192.168.3.7
# Database name
APP_DATABASE_NAME=angus
# Timezone
TIMEZONE=Asia/Shanghai
# AngusGM domain (or IP)
NGINX_GM_DOMAIN=my-gm.xcan.cloud
############## Credentials ##############
# MySQL root password (change this!)
MYSQL_ROOT_PASSWORD=Angus123
# Redis password (change this!)
REDIS_PASSWORD=Angus123
3) Start Containers
# Start containers
docker compose -f gm-full.yml up -d
# Monitor logs
docker compose -f gm-full.yml logs -f
V. Deployment Verification
- Check Logs
tail -f /opt/AngusGM/logs/gm.log
Expected output: Application started successfully [PID=21601] and Http(s) port 8802 is ready
.
- Health Check Endpoint
curl http://localhost:8802/actuator/health
Expected output: {"status":"UP"}
.
- Login Verification
- URL:
http://<IP>:8802
orhttp://<domain>
- Default credentials:
- Username:
admin
- Password:
admin@123
- Username:
VI. Application Management
- Linux/MacOS
# Start
./startup-gm.sh
# Stop
./shutdown-gm.sh
# View logs
tail -f logs/gm.log
- Docker
# Start
docker start angusgm
# Stop
docker stop angusgm
# View logs
docker logs angusgm
- Docker Compose
# Start
docker compose -f gm-full.yml up -d
# Stop
docker compose -f gm-full.yml stop
# View logs
docker compose -f gm-full.yml logs
VII. Troubleshooting
1. Common Issues
Port Conflict
- Error:
Error: Port 8802 already in use
- Solution: Change
GM_PORT
or terminate the conflicting process.
- Error:
Database Connection Failure
- Error:
Connection refused to MySQL at 127.0.0.1:3306
- Solution: Verify network, firewall, and credentials.
- Error:
2. Log Analysis
- Log Paths
- Runtime logs:
/opt/AngusGM/logs/gm.log
- Error logs:
/opt/AngusGM/logs/gm-error.log
- Runtime logs:
- Keywords:
ERROR
,Connection refused
3. Technical Support
- Email:
technical_support@xcan.cloud
- Requirements: Attach error logs and environment details (e.g., deployment method, version).
VIII. Configuration Reference
Application Configuration (.priv.env)
#-----------------------------------------------------------------------------------
# Installation Configuration
#-----------------------------------------------------------------------------------
# Enable automatic initialization and installation application options, which are enabled by default and will automatically
# turn off after successful installation. Important: Enabling reinstallation will result in data loss in the database.
INSTALL_APPS=
# Installation and deploy type, default to SHARED, supporting options:
# - SHARED: shared installation, all applications share one database.
# - STANDALONE: tandalone installation, each application uses its own database.
# Note: When all applications share one database, other applications will share a database with the global management application,
# that is, all applications share the database configuration in gm.env; if each application uses an independent database,
# each application needs to configure its own independent database separately.
INSTALL_TYPE=SHARED
# Database type, default is `MYSQL`, supporting options: MYSQL, POSTGRES.
DATABASE_TYPE=MYSQL
# Application deployment and runtime environment, default is `HOST`, supporting options: CONTAINER (Docker, Kubernetes), HOST(Physical/Virtual Machine).
RUNTIME=HOST
# Application and database timezone configuration.
TIMEZONE=Asia/Shanghai
# Maximum upload file size, default value is 1000MB.
MAX_UPLOAD_FILE_SIZE=1000MB
# Maximum upload request size, limiting the total size of multiple files in batch upload, default value is 2000MB.
MAX_UPLOAD_REQUEST_SIZE=2000MB
#-----------------------------------------------------------------------------------
# AngusGM Application Configuration
#-----------------------------------------------------------------------------------
# Application IP(v4) or hostname. Automatically obtain the IPv4 address of the running environment when not configured.
GM_HOST=
# Application port, default value is `8802`.
GM_PORT=8802
# Linked website domain url. If empty, it will be set to http://GM_HOST:GM_PORT. Example value: https://gm.xcan.cloud.
GM_WEBSITE=
# Application web static resources directory, efault value is `classpath:/static/,file:./statics/`.
GM_WEB_STATICS=classpath:/static/,file:/Volumes/workspace/workspace_angus/seek/AngusGM/web/dist/
# Specify the plugins to load, only load the specified plugins when configured, load all plugins when not configured.
GM_PLUGIN_LOADED=aliyun-sms-plugin,huaweicloud-sms-plugin
# Specify the plugins to ignore, ignore loading the specified plugins when configured, load all plugins when not configured, set to * when ignoring all plugins.
GM_PLUGIN_IGNORED=
# SaaS cloud service API interface address, used to fetch data from the cloud.
GM_CLOUD_APIS_URL_PREFIX=https://bj-c1-prod-apis.xcan.cloud/gm
# Self-host service API interface address, used to read data from the current hosting service. If empty, it will be set to http://GM_HOST:GM_PORT
GM_APIS_URL_PREFIX=
#-----------------------------------------------------------------------------------
# AngusGM Administrator User Configuration
#-----------------------------------------------------------------------------------
# Administrator user email.
GM_ADMIN_EMAIL=
# Administrator user account, default value is `admin`.
GM_ADMIN_USERNAME=admin
# Administrator user password, default value is `admin@123`.
GM_ADMIN_PASSWORD=admin@123
#-----------------------------------------------------------------------------------
# AngusGM Database Configuration
#-----------------------------------------------------------------------------------
# Database IP or hostname, default value is `127.0.0.1`.
GM_DB_HOST=127.0.0.1
# Database port, default value is `3306`.
GM_DB_PORT=3306
# Database name, default value is `angus`.
GM_DB_NAME=angus
# Database authentication username, default value is `root`.
GM_DB_USER=root
# Database authentication user password, default value is `Angus123`.
GM_DB_PASSWORD=Angus123
#-----------------------------------------------------------------------------------
# Redis Configuration
#-----------------------------------------------------------------------------------
#-----------------------------------------------------------------------------------
# Redis deployment mode, default to SINGLE, supporting options: SINGLE (single instance), SENTINEL (sentinel mode), CLUSTER (cluster mode).
REDIS_DEPLOYMENT=SINGLE
# IP or hostname of Redis in single instance mode, default value is `127.0.0.1`.
REDIS_HOST=127.0.0.1
# Port of Redis in single instance mode, default value is `6379`.
REDIS_PORT=6379
# Redis authentication password, default value is `Angus123`, required when Redis security authentication is enabled.
REDIS_PASSWORD=Angus123
# Master node name in sentinel mode, configuration example: mymaster.
REDIS_SENTINEL_MASTER=
# Redis instance list in sentinel mode or cluster mode, configuration example: 192.168.0.100:6379,192.168.0.101:6379,192.168.0.102:6379.
REDIS_NODES=
#-----------------------------------------------------------------------------------
# File Storage Configuration
#-----------------------------------------------------------------------------------
# Storage type, default to `LOCAL`, supporting options: LOCAL (local storage), AWS_S3 (S3 protocol object storage).
STORAGE_TYPE=LOCAL
# File storage path in local storage, default storage location is `${INSTALL_PATH}/data/files` if not specified.
STORAGE_LOCAL_DIR=
# Region name for object storage (S3), example value: us-west-2.
STORAGE_S3_REGION=
# Service address for object storage (S3), example value: http://oss-cn-beijing.aliyuncs.com.
STORAGE_S3_ENDPOINT=
# Access key for object storage (S3) service, must have bucket creation permission, example value: ltAI5tBmg9Ym14apePKaGMfm.
STORAGE_S3_ACCESSKEY=
# Secret key for object storage (S3) service, example value: ltAI5tBmg9Ym14apePKaGMfm.
STORAGE_S3_SECRETKEY=
#-----------------------------------------------------------------------------------
# Cloud Store Configuration
#-----------------------------------------------------------------------------------
STORE_CLOUD_APIS_URL_PREFIX=https://bj-c1-prod-apis.xcan.cloud/ess
#-----------------------------------------------------------------------------------
# Eureka Configuration
#-----------------------------------------------------------------------------------
# Configure the Eureka server and dashboard username and password. The default dashboard address is http://GM_HOST:GM_PORT/eureka-dashboard.
EUREKA_USER_NAME=eureka
EUREKA_USER_PASSWORD=eureka
#-----------------------------------------------------------------------------------
# OAuth2.0 Introspect Client Configuration
#-----------------------------------------------------------------------------------
OAUTH2_INTROSPECT_CLIENT_ID=client-credentials-introspect-client
OAUTH2_INTROSPECT_CLIENT_SECRET=secret
#-----------------------------------------------------------------------------------
# Disable SSL for Self-signed certificate
#-----------------------------------------------------------------------------------
DISABLE_SSL_VERIFICATION=false
Nginx Virtual Host Configuration
- nginx.conf
worker_processes auto;
error_log /var/log/nginx/error.log;
events {
worker_connections 1024;
multi_accept on;
use epoll;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
# Set security header
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
limit_conn conn_limit 100;
gzip on;
gzip_min_length 100k;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
include /etc/nginx/conf.d/*.conf;
}
- gm.conf
server {
listen 80;
server_name my-gm.xcan.cloud;
# Health check endpoint
location = /health {
access_log off;
return 200 "OK";
}
# Caching static files
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
proxy_pass http://192.168.3.7:8802;
expires 1d;
add_header Cache-Control "public, max-age=86400, immutable";
access_log off;
}
location /ws/ {
proxy_pass http://192.168.3.7:8802;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
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_read_timeout 86400s;
proxy_send_timeout 86400s;
}
location / {
proxy_pass http://192.168.3.7:8802;
proxy_set_header Priority "";
proxy_set_header Host $host;
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_connect_timeout 10s;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
}
}