Conversation
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## master #967 +/- ##
==========================================
+ Coverage 74.46% 74.68% +0.21%
==========================================
Files 62 67 +5
Lines 3008 3314 +306
==========================================
+ Hits 2240 2475 +235
- Misses 605 658 +53
- Partials 163 181 +18 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
|
@eternal-flame-AD If you have time, could you have a look at this? (It's not urgent) |
eternal-flame-AD
left a comment
There was a problem hiding this comment.
To be frank I'm not super sold on this .. could you clarify what is the problem we are solving by "standalone and understandable"?
Biggest concerns:
- It looks like the library has a .Marshal function so I would say we should at least try to make an automated config migration utility to decrease the friction to users.
- It looks like you basically unrolled the entire config parsing in config.go. Could we have achieved all the benefits you listed by adding special cases to help configor (AND achieved backwards compatibility with YAML syntax) anyways?
- The entire config discovery is done relative to the executable in a "python venv" style with only option to add one file to the front of the config list, which IMO strongly bias towards one kind of deployment, and moving the environment means the gotify executable has to move with the config file as well.
- The switch to dotenv format from YAML would encourage users to run "lean" configs with only specific items overriden. This can lead to complex problems when they are running multiple configs on the same system.
|
Ahh, I understand. It's your project so in terms of what should be done I completely defer to you. I think I the only thing I hope could be sorted out before merging is the friction. It's true that an average set-up require only several options to be overridden, but what's more than likely for an existing user to see is they copied the example.yml into an custom file and have modified and tuned over months or years. I don't like that suddenly you have to figure out which option you flipped and which you did not and manually transliterate it into env format. One concrete change in the current arrangement that should work better (and aligned with other software with overlay config system like openssh): Move the default values into the code itself, comment all lines out for the default config file, like this: A migration utility should be simple that just emits the default config file except uncommented overridden value when the input YAML file has a non default value for that item. We currently don't have a command line interface so how that could be integrated is uncertain. We can defer this into a separate PR but this should be doable and smooth. This has the additional benefit of making config inheritance more simple. You no longer have A -> default -> C result in C being completely masked by a fully filled default file. |
Yes, but I'd like your opinion on if you think this improves things. If not, I'd rather not merge this (:.
Okay, sounds good. Maybe we can add a cli, like this This would also allow us to add other actions to the cli, like creating an admin users.
Yeah, let's do this separately.
My reasoning for embedding the defaults values directly is, that this basically explicitly defines the default values, so when we later change the default values, they continue to have the old default values, at the time they've setup the config. But you right, with config inheritance this makes it more easier to misconfiguration. I'll comment out all the options. Do we then allow config inheritance, or only read the first found config file like described in #967 (comment)? |
|
@eternal-flame-AD could you answer the first question so we can continue or stop with this PR? |
|
Sorry for the delay this fell off my notifications . It's okay we can proceed and I can review it as is, I'm on a sleeper train tonight so I won't be able to review code until tomorrow. |
|
Thanks and no problem, I've made these changes as fixup commits:
|
| return nil | ||
| } | ||
|
|
||
| func parseList(target *[]string, env string) error { |
There was a problem hiding this comment.
I don't think the current setup requires this but would be nice to support escaping comma literals as value.
There was a problem hiding this comment.
I've changed this to use csv parsing for the list. See last fixup commit.
|
One final thing to consider, not a blocker just what I have been thinking about. If we use env variables instead of "proprietary" config files is that it some systems use /etc/default/gotify to put the environment variables for global services (like on Alpine and Arch and Ubuntu), I am not sure whether it might be beneficial to use that instead of /etc/gotify/server.env |
Do you have resources recommending to do this, instead of using /etc/gotify? I've looked a bit but didn't found many resources about this. The only thing using this I know of is grub, but I feel like this is an edge-case. If gotify is packaged with a systemd unit file, they packager can already define /etc/default/gotify or similar in the unit file, I don't think gotify/server itself should read from /etc/default. |
This will make testing easier, as it's more similar to the actual prod deployment. We don't have to rewrite anything in vite, as the host and origin is the same.
serving the server now requires the serve action
See the gotify-server.env.example for how it works. The new https://gotify.net/docs/config will just reference gotify-server.env.example, so it should be standalone and understandable.
I've initially wanted to use a library (https://github.com/caarlos0/env) for the env parsing, but it didn't support _FILE natively. and manually implementing it doesn't seems to complex.
Fixes #366
Fixes #392