Esta guía utiliza MySQL 8.4 LTS y dos procesos nativos de Speedle: PMS escribe políticas y ADS lee la misma base de datos con una cuenta independiente de solo lectura. El ejemplo local utiliza Docker y HTTP en texto plano en la interfaz de bucle invertido (loopback). Para un despliegue remoto, utilice su servidor MySQL existente y consulte la guía de Seguridad.
1. Compilar Speedle con el backend MySQL
Instale Git, Bash, curl, Docker y una versión compatible de Go (Go 1.26.10 o Go 1.27.3). Docker debe estar en ejecución. Compile desde el código fuente actual para que ambos binarios contengan el almacenamiento mysql; una versión anterior instalada podría no incluirlo.
git clone --depth 1 https://github.com/teramoby/speedle-plus.git
cd speedle-plus
mkdir -p bin
go build -o ./bin/ ./cmd/spctl ./cmd/speedle-pms ./cmd/speedle-adsEjecute los comandos restantes desde este directorio speedle-plus. Mantenga libres los puertos 3306, 6733 y 6734, o modifique las direcciones correspondientes en cada comando y archivo de configuración a continuación.
2. Iniciar MySQL 8.4
Las contraseñas fijas a continuación son credenciales de demostración local. Utilice sus propias credenciales y mecanismos de gestión de secretos al desplegar. El volumen con nombre de Docker conserva la base de datos cuando este contenedor se detiene o se vuelve a crear.
docker run --name speedle-mysql --detach \
--publish 127.0.0.1:3306:3306 \
--volume speedle-mysql-data:/var/lib/mysql \
--env MYSQL_ROOT_PASSWORD=SpeedleDemoRoot84 \
mysql:8.4Espere a que finalice la inicialización:
until docker exec speedle-mysql mysqladmin ping \
--host=127.0.0.1 --user=root --password=SpeedleDemoRoot84 --silent
do
sleep 1
doneSi ya dispone de MySQL 8.4, omita estos comandos de Docker y ejecute el código SQL del siguiente paso utilizando el cliente de su administrador de base de datos. La imagen de Docker inicializa credenciales únicamente cuando su directorio de datos está vacío; cambiar una variable de entorno no restablece la contraseña en un volumen existente.
3. Crear la base de datos y las cuentas de servicio
Speedle crea las tablas de forma predeterminada, pero no crea la base de datos. Utilice una cuenta de administrador para crear speedle y dos cuentas:
docker exec -i speedle-mysql mysql --user=root --password=SpeedleDemoRoot84 <<'SQL'
CREATE DATABASE speedle CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_bin;
CREATE USER 'speedle_pms'@'%' IDENTIFIED BY 'SpeedleDemoPms84';
CREATE USER 'speedle_ads'@'%' IDENTIFIED BY 'SpeedleDemoAds84';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, REFERENCES ON speedle.* TO 'speedle_pms'@'%';
GRANT SELECT ON speedle.* TO 'speedle_ads'@'%';
SQLPMS necesita CREATE y REFERENCES para la inicialización automática del esquema, además de SELECT, INSERT, UPDATE y DELETE para la gestión de políticas. ADS solo necesita SELECT y debe tener la inicialización automática del esquema desactivada. El host de cuenta % permite conexiones desde el host a través de Docker; restrinja los hosts de las cuentas a las máquinas reales donde se ejecutan PMS/ADS en despliegues remotos.
4. Escribir los archivos de configuración de PMS y ADS
Ambos DSN deben seleccionar el mismo servidor y base de datos. Un DSN sigue la sintaxis del controlador user:password@tcp(host:port)/database.
mkdir -p mysql-demo
cat > mysql-demo/pms.json <<'JSON'
{
"storeConfig": {
"storeType": "mysql",
"storeProps": {
"MySQLDSN": "speedle_pms:SpeedleDemoPms84@tcp(127.0.0.1:3306)/speedle",
"MySQLInitSchema": true,
"MySQLPollInterval": "1s",
"MySQLQueryTimeout": "10s"
}
}
}
JSON
cat > mysql-demo/ads.json <<'JSON'
{
"storeConfig": {
"storeType": "mysql",
"storeProps": {
"MySQLDSN": "speedle_ads:SpeedleDemoAds84@tcp(127.0.0.1:3306)/speedle",
"MySQLInitSchema": false,
"MySQLPollInterval": "1s",
"MySQLQueryTimeout": "10s"
}
},
"enableWatch": true
}
JSON
chmod 600 mysql-demo/pms.json mysql-demo/ads.jsonMySQLInitSchema: false hace que el inicio verifique el esquema existente sin ejecutar comandos DDL. enableWatch: true permite a ADS seguir los cambios confirmados. No confirme estos archivos de configuración que contienen credenciales en el control de versiones.
5. Iniciar PMS y luego ADS
En la terminal A, inicie PMS primero para que pueda crear las tablas:
./bin/speedle-pms --config-file mysql-demo/pms.json --endpoint 127.0.0.1:6733 --insecure=trueDeje PMS en ejecución. En la terminal B, desde el mismo directorio, confirme la inicialización:
docker exec speedle-mysql mysql --user=speedle_ads --password=SpeedleDemoAds84 speedle -e 'SHOW TABLES;'Debería ver cinco tablas:
| Tabla | Contenido |
|---|---|
speedle_services |
Servicios y metadatos de servicios |
speedle_policies |
Políticas de autorización |
speedle_role_policies |
Políticas de roles |
speedle_functions |
Definiciones de funciones personalizadas |
speedle_store_meta |
Versión del esquema y revisión confirmada de políticas |
Luego inicie ADS en la terminal B y déjelo en ejecución:
./bin/speedle-ads --config-file mysql-demo/ads.json --endpoint 127.0.0.1:6734 --insecure=trueEspere a que se inicie el agente de escucha REST de cada servicio antes de continuar. Los servidores gRPC permanecen desactivados a menos que también pase --grpc-endpoint.
6. Crear una política y comprobar la autorización
En la terminal C, cree un servicio con una política que conceda a Alice permiso para leer book:
curl -fsS -X POST http://127.0.0.1:6733/policy-mgmt/v1/service \
-H 'Content-Type: application/json' \
-d '{"name":"mysql-demo","type":"application","policies":[{"name":"alice-read","effect":"grant","principals":[["user:alice"]],"permissions":[{"resource":"book","actions":["read"]}]}]}'Espere un intervalo de sondeo (1 segundo por defecto), más el tiempo de reconstrucción de consulta/caché, para que ADS cargue el cambio. Repita la solicitud si la sincronización aún está en curso:
curl -fsS -X POST http://127.0.0.1:6734/authz-check/v1/is-allowed \
-H 'Content-Type: application/json' \
-d '{"subject":{"principals":[{"type":"user","name":"alice"}]},"serviceName":"mysql-demo","resource":"book","action":"read"}'Respuesta esperada: {"allowed":true,"reason":0}. Bob no tiene ninguna concesión coincidente:
curl -fsS -X POST http://127.0.0.1:6734/authz-check/v1/is-allowed \
-H 'Content-Type: application/json' \
-d '{"subject":{"principals":[{"type":"user","name":"bob"}]},"serviceName":"mysql-demo","resource":"book","action":"read"}'Respuesta esperada: {"allowed":false,"reason":3}.
7. Verificar actualizaciones automáticas y persistencia
Agregue una denegación explícita para Alice mediante PMS, sin reiniciar ADS:
curl -fsS -X POST http://127.0.0.1:6733/policy-mgmt/v1/service/mysql-demo/policy \
-H 'Content-Type: application/json' \
-d '{"name":"alice-deny","effect":"deny","principals":[["user:alice"]],"permissions":[{"resource":"book","actions":["read"]}]}'Tras la sincronización, repita la solicitud de Alice del paso 6. Ahora debería devolver {"allowed":false,"reason":1}: la denegación explícita tiene prioridad. Puede detener PMS y ADS con Ctrl+C, reiniciarlos con los comandos del paso 5 y repetir la misma solicitud. La política y la denegación almacenadas persisten en MySQL.
Los cambios de políticas deben realizarse a través de PMS o de la interfaz de almacenamiento para que los datos y la revisión avancen en la misma transacción. Las modificaciones directas en SQL no activan automáticamente una recarga de ADS. Durante una interrupción de la base de datos, ADS permanece en ejecución y reintenta la sincronización, pero devuelve allowed:false y un error una vez detectado el fallo de forma predeterminada. Se debe cargar con éxito una instantánea completa antes de reanudar la autorización. Consulte la política compartida de fallos del almacenamiento y período de gracia. Iniciar ADS sigue requiriendo una base de datos accesible.
Crear previamente el esquema sin privilegios DDL en tiempo de ejecución
Como alternativa a la creación automática de tablas, ejecute el script schema.sql del repositorio con una cuenta de aprovisionamiento antes de iniciar cualquiera de los servicios:
docker exec -i speedle-mysql mysql --user=root --password=SpeedleDemoRoot84 speedle < pkg/store/mysql/schema.sqlEstablezca MySQLInitSchema en false en ambos archivos de configuración. Si siguió la demostración anterior, revoque los privilegios adicionales de inicialización:
docker exec speedle-mysql mysql --user=root --password=SpeedleDemoRoot84 -e "REVOKE CREATE, REFERENCES ON speedle.* FROM 'speedle_pms'@'%';"PMS luego se ejecuta con permisos SELECT, INSERT, UPDATE, DELETE; ADS permanece en solo lectura. Reinicie ambos servicios tras cambiar su configuración. La inicialización del esquema no migra tablas existentes; las versiones de esquema no compatibles impiden el inicio.
Referencia de configuración y resolución de problemas
| Propiedad | Indicador | Variable de entorno | Valor predeterminado |
|---|---|---|---|
MySQLDSN |
--mysqlstore-dsn |
SPDL_MYSQLSTORE_DSN |
Obligatorio, incluido el nombre de la base de datos |
MySQLInitSchema |
--mysqlstore-init-schema |
SPDL_MYSQLSTORE_INIT_SCHEMA |
true |
MySQLPollInterval |
--mysqlstore-poll-interval |
SPDL_MYSQLSTORE_POLL_INTERVAL |
1s |
MySQLQueryTimeout |
--mysqlstore-query-timeout |
SPDL_MYSQLSTORE_QUERY_TIMEOUT |
10s |
El indicador de selección es --store-type mysql (SPDL_STORE_TYPE=mysql). Los indicadores explícitos anulan las variables de entorno no vacías, luego los archivos de configuración y finalmente los valores predeterminados. Para MySQL remoto, utilice un nombre de host con un certificado de servidor de confianza y agregue ?tls=true al DSN; la configuración personalizada de CA sigue la documentación TLS del controlador.
| Síntoma | Comprobación |
|---|---|
Almacenamiento o indicador mysql desconocido |
Recompile ambos binarios desde el código fuente que contiene pkg/store/mysql. |
| Conexión rechazada / acceso denegado | Disponibilidad de la base de datos, host/puerto del DSN, contraseña y restricciones de host de la cuenta MySQL. |
| Base de datos desconocida | Cree la base de datos primero; Speedle solo crea tablas. |
| Faltan tablas o DDL denegado | Inicie PMS primero, o cree previamente el esquema; el proceso ADS de solo lectura debe tener MySQLInitSchema en false. |
| El cambio de política no es visible | Misma base de datos en ambos DSN, watch habilitado en ADS, retraso de sondeo y ninguna variable SPDL_* anulando la configuración. |
MySQL no admite la recopilación de solicitudes de Discover ni la generación de políticas. Consulte Almacenamiento conectable para obtener detalles sobre transacciones, instantáneas y recuperación.