2012-11-14 78 views
0

Grails在本地非常適用於mongodb插件,但我在AppFog上遇到了問題。如何在AppFog/CloudFoundry上使用MongoDB部署Grails?

在AppFog上部署Grails的說明對於MongoDB以外的數據庫來說相當清楚。該文件似乎暗指MongoDB的自動配置,但如果我的配置設置爲以下,它不起作用。

//DataSource.groovy 

grails { 
    mongo { 
    host = "localhost" 
    port = 27017 
    databaseName = "dbname" 
    } 
} 

自動配置似乎沒有用適當的主機名替換localhost。似乎我需要從VCAP_SERVICES中設置值。

+0

什麼是downvote沒有評論?我以爲你不能這樣做? –

回答

2

您的Grails項目中是否安裝了CloudFoundry plugin?該插件爲Grails應用程序中的MongoDB和其他數據源執行自動重新配置。

如果由於某些原因您不能或不想使用Grails CloudFoundry插件,則使用上面顯示的環境變量的另一種替代方法是使用cloudfoundry-runtime Java API。這個API使您可以訪問存儲在環境變量中的相同信息,但它比直接解析環境變量更簡潔。

+0

你在AppFog上試過這個嗎?我不確定AppFog運行的是什麼版本。它支持這種技術嗎? –

+0

我在AppFog上沒有嘗試過這個,但我希望它能夠工作。 Grails CF插件包含隨您的應用程序一起部署的代碼。此代碼檢測CF環境並在應用程序啓動時配置服務,因此它不依賴於CF中的分段支持。而且,Mongo的AppFog文檔(https://docs.appfog.com/services/mongodb#node)表示它提供了Grails CF插件和CF運行時Java API依賴的常見CF環境變量。 –

2

聯繫支持後,答案是使用VCAP_SERVICE環境變量。在網上挖掘之後,我想出瞭如何在配置中檢索和使用VCAP_SERVICES。

grails { 
    def vcap = System.env.VCAP_SERVICES 
    def credentials = vcap ? grails.converters.JSON.parse(vcap)["mongodb-1.8"][0]["credentials"] : null 
    mongo { 
     host = credentials ? credentials.hostname : "localhost" 
     port = credentials ? credentials.port : "27017" 
     username = credentials ? credentials.username : null 
     password = credentials ? credentials.password : null 
     databaseName = credentials ? credentials.db : "dbname" 
    } 
} 

我也創建了a github gist this configuration