{"id": 607433, "username": "linode", "user_gravatar_id": "7adb12099328b8b81dbf5787e5c4185b", "label": "Docker One-Click", "description": "Docker One Click App", "ordinal": 34, "logo_url": "assets/docker.svg", "images": ["linode/ubuntu24.04"], "deployments_total": 46398, "deployments_active": 1470, "is_public": true, "mine": false, "created": "2019-10-31T20:14:04", "updated": "2026-05-13T15:50:18", "rev_note": "", "script": "#!/bin/bash\n# STACKSCRIPT_ID: 607433\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## Domain Settings\n#<UDF name=\"token_password\" label=\"Your Linode API token. This is needed to create your server's DNS records\" default=\"\">\n#<UDF name=\"subdomain\" label=\"Subdomain\" example=\"The subdomain for the DNS record: www (Requires Domain)\" default=\"\">\n#<UDF name=\"domain\" label=\"Domain\" example=\"The domain for the DNS record: example.com (Requires API token)\" default=\"\">\n#<UDF name=\"soa_email_address\" label=\"Email address for new DNS zone\" example=\"user@domain.tld (Requires API token)\" default=\"\">\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,none\" default=\"none\">\n# END CI-ADDONS\n\n#GH_USER=\"\"\n#BRANCH=\"\"\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-docker\"\n\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\nfunction cleanup {\n  if [ -d \"${WORK_DIR}\" ]; then\n    rm -rf ${WORK_DIR}\n  fi\n}\n\nfunction udf {\n  local group_vars=\"${WORK_DIR}/${MARKETPLACE_APP}/group_vars/linode/vars\"\n  sed 's/  //g' <<EOF > ${group_vars}\n  # sudo username\n  username: ${USER_NAME}\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 dependencies\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 -b ${BRANCH} ${GIT_REPO}\n\n  # set up python virtual environment\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\nfunction installation_complete {\n  echo \"Installation Complete\"\n}\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": "token_password", "label": "Your Linode API token. This is needed to create your server's DNS records", "default": ""}, {"name": "subdomain", "label": "Subdomain", "example": "The subdomain for the DNS record: www (Requires Domain)", "default": ""}, {"name": "domain", "label": "Domain", "example": "The domain for the DNS record: example.com (Requires API token)", "default": ""}, {"name": "soa_email_address", "label": "Email address for new DNS zone", "example": "user@domain.tld (Requires API token)", "default": ""}, {"name": "add_ons", "label": "Optional data exporter Add-ons for your deployment", "manyof": "node_exporter,mysqld_exporter,newrelic,none", "default": "none"}]}