{ "module": "mssql", "version": "1", "provides": [ { "name": "mssql-database", "scope": "mesh" } ], "capabilities": [ "container-runtime" ], "emits": [ "database.provisioned", "database.deprovisioned" ], "consumes": [ "mssql.database.provisioned", "mssql.database.deprovisioned" ], "listens": [ { "name": "database", "port": 1433, "protocol": "tcp", "from": "mesh", "why": "modules on any machine that were granted a database, and the people who were given its address; the machine port is the assignment's to pin" } ], "serves": { "mssql-database": {} }, "receives": { "mssql-database": "${dir:grants}/mesh.json" }, "grants": { "mssql-database": "${dir:grants}" }, "own-secrets": { "sa": "${dir:state}/sa.secret", "reader": "${dir:state}/reader.secret" }, "resources": [ { "id": "state", "type": "directory", "mode": "0700", "place": "." }, { "id": "grants", "type": "directory", "mode": "0700" }, { "id": "sa-env", "type": "file", "path": "${dir:state}/sa.env", "mode": "0600", "content": "ACCEPT_EULA=Y\nMSSQL_SA_PASSWORD=${secret:sa}\n" }, { "id": "data", "type": "directory", "mode": "0700", "owner": "10001:0" }, { "id": "dumps", "type": "directory", "path": "${dir:data}/backup", "mode": "0700", "owner": "10001:0" }, { "id": "net", "type": "network", "name": "mssql" }, { "id": "server", "type": "container", "name": "mssql", "image": "mcr.microsoft.com/mssql/server@sha256:4402d880dd4c34bfa7d8705e56a86cd6c88da80a1f6bbbe741f999e76264a090", "network": "mssql", "env-file": [ "${dir:state}/sa.env" ], "ports": [ "1433" ], "volumes": [ "${dir:data}:/var/opt/mssql" ], "secrets-in-environment": "the image documents only MSSQL_SA_PASSWORD, no _FILE and no configuration field; not convertible without a wrapper entrypoint" }, { "id": "backup-sql", "type": "file", "path": "${dir:state}/backup.sql", "mode": "0600", "content": "SET NOCOUNT ON;\nDECLARE @n sysname, @s nvarchar(max);\nDECLARE c CURSOR LOCAL FAST_FORWARD FOR\n SELECT name FROM sys.databases WHERE database_id > 4 AND state = 0 AND source_database_id IS NULL;\nOPEN c;\nFETCH NEXT FROM c INTO @n;\nWHILE @@FETCH_STATUS = 0\nBEGIN\n SET @s = N'BACKUP DATABASE ' + QUOTENAME(@n) + N' TO DISK = N''/var/opt/mssql/backup/' + REPLACE(@n, N'''', N'''''') + N'.bak'' WITH INIT, COPY_ONLY, CHECKSUM';\n EXEC (@s);\n FETCH NEXT FROM c INTO @n;\nEND\nCLOSE c;\nDEALLOCATE c;\n" } ], "build": { "artifacts": [ { "name": "code", "kind": "bundle", "language": "typescript", "entrypoints": [ "index.js", "tools/index.js", "provisioner/index.js" ], "loads": [ "index.js", "tools/index.js", "provisioner/index.js" ], "env": { "MESH_PROVISION_MSSQL": "mssql://sa@127.0.0.1:${port:1433}/master", "MESH_PROVISION_PASSWORD_FILE": "${dir:state}/sa.secret", "MESH_RECEIVES": "${dir:grants}/mesh.json", "MESH_MSSQL_READER_PASSWORD_FILE": "${dir:state}/reader.secret" } } ] }, "contributions": [ { "seat": "node-backup", "kind": "backup", "content": "run { cat ${dir:state}/sa.secret; echo; cat ${dir:state}/backup.sql; } | docker exec -i mssql sh -c 'read -r p; SQLCMDPASSWORD=\"$p\" exec /opt/mssql-tools18/bin/sqlcmd -C -b -S localhost -U sa -i /dev/stdin'\npath ${dir:dumps}\n" } ] }