Skip to content
Go to file

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time

Ghost Qiniu Storage

This Ghost custom storage module allows you to store media file at Qiniu instead of storing at local machine. It requires Ghost greater than 1.x!



  • Install Qiniu storage module

    npm install ghost-qn-store
  • Make the storage folder if it doesn't exist yet

    mkdir content/adapters/storage
  • Copy the module into the right location

    cp -vR node_modules/ghost-qn-store content/adapters/storage/qn-store

Via Git

In order to replace the storage module, the basic requirements are:

  • Create a new folder inside /content/adapters called /storage

  • Clone this repo to /storage

    cd [path/to/ghost]/content/adapters/storage
    git clone
  • Install dependencies

    cd qn-store
    npm install

The Old way

The instruction below is NOT recommended for upgrade reason:

Your install instructions require users to do an npm install --save - this modifies the package.json and makes the upgrade path for Ghost much, much harder. This was never the intention with the storage system. (via)

  • Installation from NPM.

    npm install --save ghost-qn-store
  • Create storage module.

    Create index.js file with folder path content/adapters/storage/qn-store/index.js (manually create folder if not exist).

    'use strict';
    module.exports = require('ghost-qn-store');


In your config.[env].json file, you'll need to add a new storage block to whichever environment you want to change:

  // ...
  "storage": {
    "active": "qn-store",
    "qn-store": {
      "accessKey": "your access key",
      "secretKey": "your secret key",
      "bucket": "your bucket name",
      "origin": "",
      "uploadURL": "",
      "fileKey": {
        "safeString": true,
        "prefix": "YYYYMM/"
  // ...

More options:

storage: {
  active: 'qn-store',
  'qn-store': {
    accessKey: 'your access key',
    secretKey: 'your secret key',
    bucket: 'your bucket name',
    // bucket domain
    origin: '',
    // timeout: 3600000, // default rpc timeout: one hour, optional

    // uploadURL is related with bucket
    // see:
    uploadURL: '',

    // file storage key config [optional]
    // if `fileKey` not set, Qiniu will use `SHA1` of file content as key.
    fileKey: {
      // use Qiniu hash as file basename, if set, `safeString` will be ignored
      hashAsBasename: false,
      safeString: true, // use Ghost safaString util to rename filename, e.g. Chinese to Pinyin
      prefix: 'YYYY/MM/', // {String} will be formated by moment.js, using `[]` to escape,
      suffix: '', // {String} string added before file extname.
      extname: true // keep file's extname
    // take `外面的世界 x.jpg` as example,
    // applied above options, you will get an URL like below after uploaded: