{"id": 607026, "username": "linode", "user_gravatar_id": "7adb12099328b8b81dbf5787e5c4185b", "label": "MySQL/MariaDB One-Click", "description": "MySql One Click", "ordinal": 77, "logo_url": "assets/mysql.svg", "images": ["linode/ubuntu24.04"], "deployments_total": 6001, "deployments_active": 292, "is_public": true, "mine": false, "created": "2019-10-29T19:03:33", "updated": "2026-05-04T23:46:37", "rev_note": "", "script": "#!/bin/bash\n# STACKSCRIPT_ID: 607026\n\n# enable logging\nexec > >(tee /dev/ttyS0 /var/log/stackscript.log) 2>&1\n\n# BEGIN CI-MODE\n# modes\n# DEBUG=\"NO\"\nif [[ -n ${DEBUG} ]]; then\n  if [ \"${DEBUG}\" == \"NO\" ]; then\n    trap \"cleanup $? $LINENO\" EXIT\n  fi\nelse\n  trap \"cleanup $? $LINENO\" EXIT\nfi\n\n# cleanup will always happen. If DEBUG is passed and is anything\n# other than NO, it will always trigger cleanup. This is useful for\n# ci testing and passing vars to the instance.\n\nif [ \"${MODE}\" == \"staging\" ]; then\n  trap \"provision_failed $? $LINENO\" ERR\nelse\n  set -e\nfi\n# END CI-MODE\n\n## Linode/SSH security settings\n#<UDF name=\"user_name\" label=\"The limited sudo user to be created for the Linode: *No Capital Letters or Special Characters*\">\n#<UDF name=\"disable_root\" label=\"Disable root access over SSH?\" oneOf=\"Yes,No\" default=\"No\">\n\n## MySQL settings\n#<UDF name=\"database\" label=\"Install either MySQL-Server or MariaDB-Server\" oneOf=\"mariadb,mysql\" default=\"mariadb\">\n\n# BEGIN CI-ADDONS\n## Addons\n#<UDF name=\"add_ons\" label=\"Optional data exporter Add-ons for your deployment\" manyOf=\"node_exporter,mysqld_exporter,newrelic,opentelemetry_collector,alloy, none\"  default=\"none\">\n\n# git user and branch\nif [[ -n ${GH_USER} && -n ${BRANCH} ]]; then\n        echo \"[info] git user and branch set..\"\n        export GIT_REPO=\"https://github.com/${GH_USER}/marketplace-apps.git\"\n\nelse\n        export GH_USER=\"akamai-compute-marketplace\"\n        export BRANCH=\"main\"\n        export GIT_REPO=\"https://github.com/${GH_USER}/marketplace-apps.git\"\nfi\n\nexport WORK_DIR=\"/tmp/marketplace-apps\" \nexport MARKETPLACE_APP=\"apps/linode-marketplace-mysql\"\n\n# BEGIN CI-PROVISION-FUNC\nfunction provision_failed {\n  echo \"[info] Provision failed. Sending status..\"\n\n  # dep\n  apt install jq -y\n\n  # set token\n  local token=($(curl -ks -X POST ${KC_SERVER} \\\n     -H \"Content-Type: application/json\" \\\n     -d \"{ \\\"username\\\":\\\"${KC_USERNAME}\\\", \\\"password\\\":\\\"${KC_PASSWORD}\\\" }\" | jq -r .token) )\n\n  # send pre-provision failure\n  curl -sk -X POST ${DATA_ENDPOINT} \\\n     -H \"Authorization: ${token}\" \\\n     -H \"Content-Type: application/json\" \\\n     -d \"{ \\\"app_label\\\":\\\"${APP_LABEL}\\\", \\\"status\\\":\\\"provision_failed\\\", \\\"branch\\\": \\\"${BRANCH}\\\", \\\n        \\\"gituser\\\": \\\"${GH_USER}\\\", \\\"runjob\\\": \\\"${RUNJOB}\\\", \\\"image\\\":\\\"${IMAGE}\\\", \\\n        \\\"type\\\":\\\"${TYPE}\\\", \\\"region\\\":\\\"${REGION}\\\", \\\"instance_env\\\":\\\"${INSTANCE_ENV}\\\" }\"\n\n  exit $?\n}\n# END CI-PROVISION-FUNC\n\nfunction cleanup {\n  if [ -d \"${WORK_DIR}\" ]; then\n    rm -rf ${WORK_DIR}\n  fi\n\n}\n\nfunction udf {\n  \n  local group_vars=\"${WORK_DIR}/${MARKETPLACE_APP}/group_vars/linode/vars\"\n  sed 's/  //g' <<EOF > ${group_vars}\n\n  # sudo username\n  username: ${USER_NAME}\n  # database install option\n  database: ${DATABASE}\n  # BEGIN CI-UDF-ADDONS\n  # addons\n  add_ons: [${ADD_ONS}]\n  # END CI-UDF-ADDONS  \nEOF\n\n  if [ \"$DISABLE_ROOT\" = \"Yes\" ]; then\n    echo \"disable_root: yes\" >> ${group_vars};\n  else echo \"Leaving root login enabled\";\n  fi\n\n  if [[ -n ${DOMAIN} ]]; then\n    echo \"domain: ${DOMAIN}\" >> ${group_vars};\n  else\n    echo \"default_dns: $(hostname -I | awk '{print $1}'| tr '.' '-' | awk {'print $1 \".ip.linodeusercontent.com\"'})\" >> ${group_vars};\n  fi\n\n  if [[ -n ${SUBDOMAIN} ]]; then\n    echo \"subdomain: ${SUBDOMAIN}\" >> ${group_vars};\n  else echo \"subdomain: www\" >> ${group_vars};\n  fi\n\n  if [[ -n ${TOKEN_PASSWORD} ]]; then\n    echo \"token_password: ${TOKEN_PASSWORD}\" >> ${group_vars};\n  else echo \"No API token entered\";\n  fi\n\n  if [[ -n ${SOA_EMAIL_ADDRESS} ]]; then\n    echo \"soa_email_address: ${SOA_EMAIL_ADDRESS}\" >> ${group_vars};\n  fi\n\n  # staging or production mode (ci)\n  if [[ \"${MODE}\" == \"staging\" ]]; then\n    echo \"[info] running in staging mode...\"\n    echo \"mode: ${MODE}\" >> ${group_vars}\n  else\n    echo \"[info] running in production mode...\"\n    echo \"mode: production\" >> ${group_vars}\n  fi\n}\n\nfunction run {\n  # install dependancies\n  apt-get update\n  apt-get install -y git python3 python3-pip\n\n  # clone repo and set up ansible environment\n  #git -C /tmp clone ${GIT_REPO}\n  # for a single testing branch\n  git -C /tmp clone -b ${BRANCH} ${GIT_REPO}\n\n  # venv\n  cd ${WORK_DIR}/${MARKETPLACE_APP}\n  apt install python3-venv -y\n  python3 -m venv env\n  source env/bin/activate\n  pip install pip --upgrade\n  pip install -r requirements.txt\n  ansible-galaxy install -r collections.yml\n\n  # populate group_vars\n  udf\n  # run playbooks\n  ansible-playbook -v provision.yml && ansible-playbook -v site.yml\n\n}\n\nfunction installation_complete {\n  echo \"Installation Complete\"\n}\n# main\nrun\ninstallation_complete", "user_defined_fields": [{"name": "user_name", "label": "The limited sudo user to be created for the Linode: *No Capital Letters or Special Characters*"}, {"name": "disable_root", "label": "Disable root access over SSH?", "oneof": "Yes,No", "default": "No"}, {"name": "database", "label": "Install either MySQL-Server or MariaDB-Server", "oneof": "mariadb,mysql", "default": "mariadb"}, {"name": "add_ons", "label": "Optional data exporter Add-ons for your deployment", "manyof": "node_exporter,mysqld_exporter,newrelic,opentelemetry_collector,alloy, none", "default": "none"}]}