diff --git a/app/server/management/commands/create_admin.py b/app/server/management/commands/create_admin.py new file mode 100644 index 00000000..a6b8c413 --- /dev/null +++ b/app/server/management/commands/create_admin.py @@ -0,0 +1,27 @@ +from django.contrib.auth.management.commands import createsuperuser +from django.core.management import CommandError + + +class Command(createsuperuser.Command): + help = 'Non-interactively create an admin user' + + def add_arguments(self, parser): + super(Command, self).add_arguments(parser) + parser.add_argument('--password', default=None, + help='The password for the admin.') + + def handle(self, *args, **options): + password = options.get('password') + username = options.get('username') + + if password and not username: + raise CommandError('--username is required if specifying --password') + + super(Command, self).handle(*args, **options) + + if password: + database = options.get('database') + db = self.UserModel._default_manager.db_manager(database) + user = db.get(username=username) + user.set_password(password) + user.save() diff --git a/azuredeploy.json b/azuredeploy.json index b44b7ed6..bdf845b4 100644 --- a/azuredeploy.json +++ b/azuredeploy.json @@ -20,14 +20,21 @@ "type": "string", "minLength": 1, "metadata": { - "description": "The user name for the Postgres administrator" + "description": "The user name for the admin account." + } + }, + "adminContactEmail":{ + "type": "string", + "minLength": 1, + "metadata": { + "description": "The contact email address for the admin account." } }, "adminPassword":{ "type": "securestring", "minLength": 16, "metadata": { - "description": "The password for the Postgres administrator" + "description": "The password for the admin account." } }, "appServiceSku": { @@ -93,6 +100,7 @@ "databaseConnectionString": "[concat('pgsql://', parameters('adminUserName'), '@', variables('databaseServerName'), ':', parameters('adminPassword'), '@', variables('databaseServerName'), '.postgres.database.azure.com:5432/', parameters('databaseName'))]", "databaseVersion": "9.6", "databaseServerName": "[concat(parameters('appName'),'-state')]", + "setupScriptName": "[concat(parameters('appName'),'-setup')]", "appServicePlanName": "[concat(parameters('appName'),'-hosting')]" }, "resources": [ @@ -156,6 +164,53 @@ } ] }, + { + "name": "[variables('setupScriptName')]", + "type": "Microsoft.ContainerInstance/containerGroups", + "apiVersion": "2018-10-01", + "location": "[variables('location')]", + "properties": { + "containers": [ + { + "name": "createadmin", + "properties": { + "image": "[parameters('dockerImageName')]", + "command": [ + "tools/create-admin.sh", + "[parameters('adminUserName')]", + "[parameters('adminContactEmail')]", + "[parameters('adminPassword')]" + ], + "environmentVariables": [ + { + "name": "DEBUG", + "value": "False" + }, + { + "name": "SECRET_KEY", + "value": "[parameters('secretKey')]" + }, + { + "name": "DATABASE_URL", + "value": "[variables('databaseConnectionString')]" + } + ], + "resources": { + "requests": { + "cpu": "1", + "memoryInGb": "1.5" + } + } + } + } + ], + "osType": "Linux", + "restartPolicy": "Never" + }, + "dependsOn": [ + "[resourceId('Microsoft.DBforPostgreSQL/servers/', variables('databaseServerName'))]" + ] + }, { "type": "Microsoft.Web/sites", "apiVersion": "2016-08-01", diff --git a/tools/create-admin.sh b/tools/create-admin.sh new file mode 100755 index 00000000..d17e4ddd --- /dev/null +++ b/tools/create-admin.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +if [[ "$#" -ne 3 ]]; then echo "Usage: $0 " >&2; exit 1; fi + +set -o errexit + +python app/manage.py wait_for_db +python app/manage.py migrate +python app/manage.py create_admin --noinput --username="$1" --email="$2" --password="$3"