Berkshelf does not currently support nested Berksfiles.
I think you're correct that the metadata.rb file is used to resolve dependencies for child cookbooks. This means that you won't be able to specify a source since metadata.rb doesn't include anything beyond the name of the cookbook and the version constraints
There's an interesting discussion on a pull request in the Berkshelf repository about the reasoning for avoiding nested Berksfiles (how to resolve conflicting paths to cookbooks among other concerns).
I am using Chef in way similar to you and ran into the same problems. The workaround I'm using is to have a single "application" Berksfile. This file includes all of the dependencies for the entire application. A call to berks upload
on this file uploads all of your dependencies to the Chef server.
A workaround proposed in the pull request discussion is using chef_api :config
before site :opscode
in your Berksfile. This will look at your private Chef server before looking at the opscode community site for recipes. Onc of the effects of this is that you'll need to upload your custom cookbooks prior to attempting to upload your cookbook that requires it.