Pup

v1.x

The BasicsDeployment

A common question that comes up in relation to Pup is how do we recommend developers deploy their app? This depends on a few things, but typically our answer will be to use Meteor's Galaxy hosting service. The reason why is that—especially for beginners—it's a very gentle introduction to dev ops.

One side-effect of using Galaxy is that you will also need to provide your own database. For this, we recommend using a third-party hosting solution like Compose (this is what we use at Clever Beagle) or mLab.

For convenience, Pup includes two deployment scripts for use with Galaxy within its package.json file: staging and production. By default, these are not usable and only intended as an example. You will need to customize these to match the region that you choose to host your application in and the domain name where you wish to deploy your app. We use Galaxy's free <subdomain>.meteorapp.com domain as an example, but you can place any domain you'd like here (e.g., app.cleverbeagle.com).

In-depth tutorial on using Galaxy

Want to speed things up? Take a look at this detailed tutorial from our sibling site on deploying with Galaxy and its follow-up post on monitoring performance with Galaxy's APM tool.

Additionally, these scripts suggest the creation of additional settings files for each environment that you deploy to. The settings-development.json file that's included with Pup should also have a settings-staging.json and settings-production.json counterpart (if you deploy to both a staging and production environment). Note: It's recommended that you use separate keys for each environment to avoid mistakes or major issues if you have a security leak.

/package.json
{
  "name": "pup",
  "private": true,
  "scripts": {
    "start": "meteor --settings settings-development.json",
    "staging": "DEPLOY_HOSTNAME=us-east-1.galaxy-deploy.meteor.com meteor deploy <staging-subdomain>.meteorapp.com --settings settings-staging.json",
    "production": "DEPLOY_HOSTNAME=us-east-1.galaxy-deploy.meteor.com meteor deploy <production-subdomain>.meteorapp.com --settings settings-production.json",
    "test": "jest"
  },
  "dependencies": {
    "@cleverbeagle/seeder": "^1.3.1",
    "b64-to-blob": "^1.2.19",
    "babel-runtime": "^6.26.0",
    "bcrypt": "^1.0.3",
    "commonmark": "^0.28.1",
    "core-js": "^2.5.1",
    "file-saver": "^1.3.3",
    "handlebars": "^4.0.11",
    "jquery": "^2.2.4",
    "jquery-validation": "^1.17.0",
    "jszip": "^3.1.5",
    "juice": "^4.2.2",
    "lodash": "^4.17.4",
    "meteor-node-stubs": "^0.3.2",
    "moment": "^2.19.1",
    "moment-timezone": "^0.5.14",
    "prop-types": "^15.6.0",
    "react": "^16.0.0",
    "react-addons-pure-render-mixin": "^15.6.2",
    "react-autobind": "^1.0.6",
    "react-bootstrap": "^0.31.5",
    "react-dom": "^16.0.0",
    "react-markdown": "^3.1.5",
    "react-router-bootstrap": "^0.24.4",
    "react-router-dom": "^4.2.2",
    "simpl-schema": "^0.3.2"
  },
  "devDependencies": {
    "babel-jest": "^21.2.0",
    "babel-plugin-lodash": "^3.2.11",
    "babel-preset-env": "^1.6.1",
    "babel-preset-react": "^6.24.1",
    "enzyme": "^3.1.0",
    "eslint": "^4.10.0",
    "eslint-config-airbnb": "^16.1.0",
    "eslint-import-resolver-meteor": "^0.4.0",
    "eslint-plugin-import": "^2.8.0",
    "eslint-plugin-jsx-a11y": "^6.0.2",
    "eslint-plugin-meteor": "^4.1.6",
    "eslint-plugin-react": "^7.4.0",
    "jest": "^21.2.1"
  },
  "eslintConfig": {
    "parserOptions": {
      "ecmaFeatures": {
        "jsx": true
      }
    },
    "plugins": [
      "meteor",
      "react"
    ],
    "extends": [
      "airbnb",
      "plugin:meteor/recommended",
      "plugin:react/recommended"
    ],
    "env": {
      "browser": true
    },
    "globals": {
      "expect": false
    },
    "rules": {
      "import/no-unresolved": 0,
      "import/no-extraneous-dependencies": 0,
      "import/extensions": 0,
      "jsx-a11y/anchor-is-valid": [
        "error",
        {
          "components": [
            "Link"
          ],
          "specialLink": [
            "to"
          ]
        }
      ],
      "max-len": 0,
      "no-alert": 0,
      "no-console": 0,
      "no-restricted-globals": 0,
      "no-return-assign": [
        "error",
        "except-parens"
      ],
      "no-underscore-dangle": [
        "error",
        {
          "allow": [
            "_id",
            "_ensureIndex",
            "_verifyEmailToken",
            "_resetPasswordToken",
            "_name"
          ]
        }
      ],
      "class-methods-use-this": 0,
      "react/jsx-filename-extension": 0,
      "react/forbid-prop-types": 0
    },
    "settings": {
      "import/resolver": "meteor"
    }
  }
}