Agent-ready RPA suite with out-of-the-box automation tools. Built for individuals and enterprises.
docker pull ghcr.io/iflytek/astron-rpa/ai-service
docker run -d -p 32742:32742 --name astron-rpa ghcr.io/iflytek/astron-rpa/ai-service:latest
docker compose up -d
#name: rpa-opensource-studio
x-env-file: &env_file
- .env
volumes:
mysql_data:
services:
mysql:
image: mysql:8.4.6
container_name: rpa-opensource-mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: ${DATABASE_PASSWORD}
MYSQL_DATABASE: ${DATABASE_NAME}
env_file: *env_file
# ports:
# - "${DATABASE_PORT}:3306"
volumes:
- mysql_data:/var/lib/mysql
- ./volumes/mysql/my.cnf:/etc/mysql/conf.d/my.cnf:ro
- ./volumes/mysql/schema.sql:/docker-entrypoint-initdb.d/01-schema.sql
- ./volumes/mysql/init_app_market_dict_data.sql:/docker-entrypoint-initdb.d/02-init_data.sql
- ./volumes/mysql/init_his_data_enum_data.sql:/docker-entrypoint-initdb.d/04-init_data.sql
- ./volumes/mysql/init_sample_template_data.sql:/docker-entrypoint-initdb.d/05-init_data.sql
- ./volumes/mysql/init_c_atom_meta_new_data.sql:/docker-entrypoint-initdb.d/06-init_data.sql
command: |
bash -c "
cp /etc/mysql/conf.d/my.cnf /etc/mysql/conf.d/my1.cnf &&
(
echo 'Wait for MySQL to start...';
until mysqladmin ping -h localhost -u root -p'${DATABASE_PASSWORD}' --silent; do
sleep 5;
done;
echo 'MySQL is up! Running incremental scripts...';
for f in /docker-entrypoint-initdb.d/*.sql; do
if [[ \"\$$f\" != *\"01-schema.sql\" ]]; then
echo \"Running \$$f ...\";
mysql -u root -p'${DATABASE_PASSWORD}' ${DATABASE_NAME} < \"\$$f\";
fi
done;
echo 'All scripts finished.';
) &
docker-entrypoint.sh mysqld
"
healthcheck:
test:
[
'CMD',
'mysqladmin',
'ping',
'-h',
'localhost',
'-u${DATABASE_USERNAME}',
'-p${DATABASE_PASSWORD}',
]
interval: 10s
timeout: 5s
retries: 5
start_period: 30s
networks:
- rpa-opensource-network
atlas:
image: arigaio/atlas:latest
container_name: rpa-opensource-atlas
volumes:
- ./volumes/atlas:/data/atlas
networks:
- rpa-opensource-network
depends_on:
mysql:
condition: service_healthy
command: schema apply --url "${ATLAS_URL}" --to "file:///data/atlas/schema.hcl" --auto-approve
env_file: *env_file
redis:
image: bitnami/redis:latest
container_name: rpa-opensource-redis
restart: always
user: root
privileged: true
env_file: *env_file
environment:
- REDIS_AOF_ENABLED=no
- REDIS_PORT_NUMBER=${REDIS_PORT}
- REDIS_IO_THREADS=4
- ALLOW_EMPTY_PASSWORD=yes
# ports:
# - "${REDIS_PORT}:6379"
volumes:
- ./data/bitnami/redis:/bitnami/redis/data:rw,Z
command: >
bash -c "
/opt/bitnami/scripts/redis/setup.sh
# Set proper permissions for data directories
chown -R redis:redis /bitnami/redis/data
chmod g+s /bitnami/redis/data
exec /opt/bitnami/scripts/redis/entrypoint.sh /opt/bitnami/scripts/redis/run.sh
"
healthcheck:
test: ['CMD', 'redis-cli', 'ping']
interval: 5s
timeout: 10s
retries: 10
start_period: 10s
networks:
- rpa-opensource-network
minio:
image: minio/minio:RELEASE.2025-06-13T11-33-47Z-cpuv1
container_name: rpa-opensource-minio
user: root
privileged: true
restart: always
env_file: *env_file
# ports:
# - "9000:9000"
# - "9001:9001"
volumes:
- ./data/minio:/data
environment:
MINIO_ROOT_USER: ${MINIO_AK}
MINIO_ROOT_PASSWORD: ${MINIO_SK}
MINIO_DEFAULT_BUCKETS: ${MINIO_BUCKET}
entrypoint:
- /bin/sh
- -c
- |
# Run initialization in background
(
# Wait for MinIO to be ready
until (/usr/bin/mc alias set localminio http://localhost:9000 ${MINIO_AK} ${MINIO_SK}) do
echo "Waiting for MinIO to be ready..."
sleep 1
done
# Create bucket
/usr/bin/mc mb --ignore-existing localminio/${MINIO_BUCKET}
echo "MinIO initialization complete."
) &
# Start minio server in foreground
exec minio server /data --console-address ":9001"
healthcheck:
test:
[
'CMD-SHELL',
'/usr/bin/mc alias set health_check http://localhost:9000 ${MINIO_AK} ${MINIO_SK} && /usr/bin/mc ready health_check',
]
interval: 30s
timeout: 10s
retries: 3
start_period: 30s
networks:
- rpa-opensource-network
openresty-nginx:
image: openresty/openresty:1.27.1.1-alpine
container_name: rpa-opensource-openresty-nginx
restart: always
ports:
- "32742:80"
volumes:
- ./volumes/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
- ./volumes/nginx/lua:/usr/local/openresty/nginx/lua:ro
- ./logs/nginx:/usr/local/openresty/nginx/logs
depends_on:
- resource-service
- robot-service
- ai-service
- openapi-service
- rpa-auth
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://127.0.0.1/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 10s
networks:
- rpa-opensource-network
casdoor:
image: casbin/casdoor:v2.67.0
container_name: rpa-opensource-casdoor
restart: always
env_file: *env_file
environment:
- driverName=mysql
- dataSourceName=${DATABASE_USERNAME}:${DATABASE_PASSWORD}@tcp(${DATABASE_HOST}:${DATABASE_PORT})/
- CASDOOR_ENABLE_HTTP_WEBHOOK=true
ports:
- "8000:8000"
volumes:
- ./volumes/casdoor/init_data_dump.json:/init_data.json
depends_on:
mysql:
condition: service_healthy
networks:
- rpa-opensource-network
ai-service:
image: ghcr.io/iflytek/astron-rpa/ai-service:latest
# build:
# context: ..
# dockerfile: backend/ai-service/Dockerfile
container_name: rpa-opensource-ai-service
restart: always
env_file: *env_file
environment:
- DATABASE_URL=mysql+aiomysql://${DATABASE_USERNAME}:${DATABASE_PASSWORD}@mysql:3306/${DATABASE_NAME}
- REDIS_URL=redis://${REDIS_HOST}:${REDIS_PORT}/${REDIS_DB}
- AICHAT_BASE_URL=${AICHAT_BASE_URL}
- AICHAT_API_KEY=${AICHAT_API_KEY}
# ports:
# - "8010:8010"
volumes:
- ../backend/ai-service/app:/app/app
depends_on:
mysql:
condition: service_healthy
redis:
condition: service_healthy
casdoor:
condition: service_started
networks:
- rpa-opensource-network
openapi-service:
image: ghcr.io/iflytek/astron-rpa/openapi-service:latest
# build:
# context: ..
# dockerfile: backend/openapi-service/Dockerfile
container_name: rpa-opensource-openapi-service
restart: always
env_file: *env_file
environment:
- DATABASE_URL=mysql+aiomysql://${DATABASE_USERNAME}:${DATABASE_PASSWORD}@mysql:3306/${DATABASE_NAME}
- REDIS_URL=redis://${REDIS_HOST}:${REDIS_PORT}/${REDIS_DB}
- AICHAT_BASE_URL=${AICHAT_BASE_URL}
- AICHAT_API_KEY=${AICHAT_API_KEY}
# ports:
# - "8020:8020"
volumes:
- ../backend/openapi-service/app:/app/app
depends_on:
mysql:
condition: service_healthy
redis:
condition: service_healthy
casdoor:
condition: service_started
networks:
- rpa-opensource-network
resource-service:
image: ghcr.io/iflytek/astron-rpa/resource-service:latest
# build:
# context: ..
# dockerfile: backend/resource-service/Dockerfile
container_name: rpa-opensource-resource-service
restart: always
env_file: *env_file
# ports:
# - "8030:8030"
volumes:
- ./logs/resource-service:/app/logs
depends_on:
mysql:
condition: service_healthy
redis:
condition: service_healthy
minio:
condition: service_healthy
casdoor:
condition: service_started
networks:
- rpa-opensource-network
robot-service:
image: ghcr.io/iflytek/astron-rpa/robot-service:latest
# build:
# context: ..
# dockerfile: backend/robot-service/Dockerfile
container_name: rpa-opensource-robot-service
restart: always
env_file: *env_file
# ports:
# - "8040:8040"
volumes:
- ./logs/robot-service:/app/logs
depends_on:
mysql:
condition: service_healthy
redis:
condition: service_healthy
casdoor:
condition: service_started
networks:
- rpa-opensource-network
rpa-auth:
image: ghcr.io/iflytek/astron-rpa/rpa-auth:latest
# build:
# context: ..
# dockerfile: backend/rpa-auth/Dockerfile
container_name: rpa-opensource-rpa-auth
restart: always
env_file: *env_file
# ports:
# - "10251:10251"
volumes:
- ./logs/rpa-auth:/app/logs
depends_on:
mysql:
condition: service_healthy
redis:
condition: service_healthy
casdoor:
condition: service_started
networks:
- rpa-opensource-network
networks:
rpa-opensource-network:
driver: bridge