Refactor: properties instead of environment variables
This PR introduces the set sub command which you will need to use to set certain configuration options instead of using the dokku config:set command. I'm creating this as per @josegonzalez request on #257 .
@josegonzalez Should all config-get bits be replaced with the property-get? Is there a distinguishing trait which I need to take in account when deciding what will be property and what remains as a global env var/config?
E.g. the email can be global and app specific too, but from here it's clear that there can't be global properties. Can the email be a property?
Yeah basically. You can pass --global instead of the app name for global properties.
But I can't do that I think, because of the following in properties.go:
func CommandPropertySet(pluginName, appName, property, value string, properties map[string]string, globalProperties map[string]bool) {
if appName != "--global" {
if err := VerifyAppName(appName); err != nil {
LogFailWithError(err)
}
}
if appName == "--global" && !globalProperties[property] {
LogFail("Property cannot be specified globally")
}
Or am I misinterpreting the !globalProperties[property] bit?
OK I've tested it, now I know how it works. 😸

I've tested this in a VM/Ubuntu 20.04 with the following steps:
- create the example app from the getting started documentation of dokku. (ruby-getting-started)
- ran
dokku letsencrypt:enable ruby-getting-startedand it ran without issues.
Only one problem left which I can't figure out. In the standard output you can see the following message:
! Unable to read letsencrypt property --global.
Any update on this merge?
Now I've synced this with master branch, and I've applied the recommendations. Sorry for the delay on this. 😸
@pushrbx I ran with your changes and did a somewhat major refactor in #294. Thanks for doing the majority of the hard parts and getting this going!