userops-acid-test.html 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. title: Userops Acid Test v0.1
  2. date: 2015-09-27 11:20
  3. author: Christine Lemmer-Webber
  4. tags: userops, foss
  5. slug: userops-acid-test
  6. ---
  7. <p>Hello all!</p>
  8. <p>
  9. So a while ago we started talking about this
  10. <a href="http://mediagoblin.org/news/userops.html">userops</a> thing.
  11. Basically, the idea is "deployment for the people", focusing on user
  12. computing / networking freedom (in contrast to "devops", benefits to
  13. large institutions are sure to come as a side effect, but are not the
  14. primary focus. There's kind of a loose community surrounding the term
  15. now, and a number of us are working towards solutions. But I think
  16. something that has been missing for me at least is something to test
  17. against. Everyone in the group wants to make deployment easiser. But
  18. what does that mean?
  19. </p>
  20. <p>
  21. This is an attempt to sketch out requirements. Keep in mind that I'm
  22. writing out this draft on my own, so it might be that I'm missing some
  23. things. And of course, some of this can be interpreted in multiple
  24. ways. But it seems to me that if we want to make running servers
  25. something for mere mortals to do for themselves, their friends, and
  26. their families, these are some of the things that are needed:
  27. </p>
  28. <ol>
  29. <li>
  30. <b>Free as in Freedom:</b>
  31. </li></ol><p>
  32. I think this one's a given. If your solution isn't free and
  33. open source software, there's no way it can deliver proper
  34. network freedoms. I feel like this goes without saying, but
  35. it's not considered a requirement in the "devops" world... but
  36. the focus is different there. We're aiming to liberate users,
  37. so your software solution should of course itself start with a
  38. foundation of freedom.
  39. </p>
  40. <li>
  41. <b>Reproducible:</b>
  42. </li><p>
  43. It's important to users that they be able to have the same
  44. system produced over and over again. This is important for
  45. experimenting with a setup before deployment, for ensuring that
  46. issues are reproducible and friends and communities helping each
  47. other debug problems when they run into them. It's also
  48. important for security; you should be able to be sure that the
  49. system you have described is the system you are really running,
  50. and that if someone has compromised your system, that you are
  51. able to rebuild it. And you shouldn't be relying on someone to
  52. build a binary version of your system for you, unless there's a
  53. way to rebuild that binary version yourself and you have a way
  54. to be sure that this binary version corresponds to the system's
  55. description and source. (Use the source, Luke!)
  56. </p>
  57. <p>
  58. Nonetheless, I've noticed that when people talk about
  59. reproducibility, they sometimes are talking about two distinct
  60. but highly related things.
  61. </p>
  62. <ol type="a">
  63. <li>
  64. <b>Reproducible packages:</b>
  65. </li></ol><p>
  66. The ability to compile from source any given package in a
  67. distribution, and to have clear methods and procedures to do
  68. so. While has been a given in the free software world for a
  69. long time, there's been a trend in the devops-type world
  70. towards a determination that packaging and deployment in
  71. modern languages has gotten too complex, so simply rely on
  72. some binary deployment. For reasons described above and
  73. more, you should be able to rebuild your packages... *and*
  74. all of your packages' dependencies... and their dependencies
  75. too. If you can't do this, it's not really reproducible.
  76. </p>
  77. <p>
  78. An even better goal is to guarantee not only that packages
  79. can be built, but that they are byte-for-byte identical to
  80. each other when built upon all their previous dependencies
  81. on the same architecture. The
  82. <a href="https://wiki.debian.org/ReproducibleBuilds">Debian Reproducibility
  83. Project</a> is a clear example of this principle in action.
  84. </p>
  85. <li>
  86. <b>Reproducible systems:</b>
  87. </li><p>
  88. Take the package reproducibility description above, and
  89. apply it to a whole system. It should be possible to, one
  90. way or another, either describe or keep record of (or even
  91. better, both) the system that is to be built, and rebuild it
  92. again. Given selected packages, configuration files, and
  93. anything else that is not "user data" (which is addressed in
  94. the next section), it should be possible to have the very
  95. same system that existed previously.
  96. </p>
  97. <p>
  98. As with many things on this list, this is somewhat of a
  99. gradient. But one extrapoliation, if taken far enough, I
  100. believe is a useful one (and ties in with the "recoverable
  101. sytem" part): systems should not be necessarily dependent
  102. upon the date and time they are deployed. That is to say,
  103. if I deployed a system yesterday, I should be able to
  104. redeploy that same system today on an entirely new system
  105. using all the packages that were installed yesterday, even
  106. if my distribution now has newer, updated packages. It
  107. should be possible for a system to be reproducible towards
  108. any state, no matter what fixed point in time we were
  109. originally referring to.
  110. </p>
  111. <li>
  112. <b>Recoverable:</b>
  113. </li><p>
  114. Few things are more stressful than having a computer that works,
  115. is doing something important for you, and then something
  116. happens... and suddenly it doesn't, and you can't get back to
  117. the point where your computer was working anymore. Maybe you
  118. even lost important data!
  119. </p>
  120. <p>
  121. If something goes wrong, it should be possible to set things
  122. right again. A good userops system should do this. There are
  123. two domains to which this applies:
  124. </p>
  125. <ol type="a">
  126. <li>
  127. <b>Recoverable data:</b>
  128. </li></ol><p>
  129. In other words, backups. Anything that's special, mutable
  130. data that the user wants to keep fits in this territory. As
  131. much as possible, a userops system should seek to make
  132. running backups easy. Identifying based on system
  133. configuration which files to copy and helping to provide
  134. this information to a backup system, or simply only leaving
  135. all mutable user data in an easy-to-back-up location would
  136. help users from having to determine what to back up on their
  137. own, which can be easily overwhelming and error-prone for an
  138. individual.
  139. </p>
  140. <p>
  141. Some data (such as data in many SQL databases) is a bit more
  142. complex than just copying over files. For something like
  143. this, it would be best if a system could help with setting
  144. up this data to be moved to a more appropriate backup
  145. serialization.
  146. </p>
  147. <li>
  148. <b>Recoverable system:</b>
  149. </li><p>
  150. Linking somewhat to the "reproducible system" concept, a
  151. user should be able to upgrade without fear of becoming
  152. stuck. Upgrade paralysis is something I know I and many
  153. others have experienced. Sometimes it even appears that an
  154. upgrade will go totally fine, and you may have tested
  155. carefully to make sure it will, but you do an upgrade, and
  156. suddenly things are broken. The state of the system has
  157. moved to a point where you can't get back! This is a
  158. problem.
  159. </p>
  160. <p>
  161. If a user experiences a problem in upgrading their system
  162. software and configuration, they should have a good means of
  163. rolling back. I believe this will remove much of the
  164. anxiety out of server administration especially for smaller
  165. scale deployments... I know it would for me.
  166. </p>
  167. <li>
  168. <b>Friendly GUI</b>
  169. </li><p>
  170. It should be possible to install the system via a friendly GUI.
  171. This probably should be optional; there may be lower level
  172. interfaces to the deployment system that some users would prefer
  173. to use. But many things probably can be done from a GUI, and
  174. thus should be able to be.
  175. </p>
  176. <p>
  177. Many aspects of configuring a system require filling in shared
  178. data between components; a system should generally follow a
  179. Don't Repeat Yourself type philosophy. A web application may
  180. require the configuration details of a mail transfer agent, and
  181. the web application may also need to provide its own details to
  182. a web server such as Nginx or Apache. Users should have to fill
  183. in these details in one place each, and they should propagate
  184. configuration to the other components of the system.
  185. </p>
  186. <li>
  187. <b>Scriptable</b>
  188. </li><p>
  189. Not everyone should have to work with this layer directly, but
  190. everyone benefits from scriptability. Having your system be
  191. scriptable means that users can properly build interfaces on top
  192. of your system and additional components that extend it beyond
  193. directions you may be able to do directly. For example, you
  194. might not have to build a web interface yourself; if your system
  195. exposes its internals in a language capable enough of building
  196. web applications, someone else can do that for you. Similarly
  197. with provisioning, etc.
  198. </p>
  199. <p>
  200. Working with the previous section, bonus points if the GUI can
  201. "guide users" into learning how to work with more lower level
  202. components; the Blender UI is a good example of this, with most
  203. users being artists who are not programmers, but hovering over
  204. user interface elements exposes their Python equivalents, and so
  205. many artists do not start out as developers, but become so in
  206. working to extend the program for their needs bit by bit.
  207. (Emacs has similar behavior, but is already built for
  208. developers, so is not as good of an example.)
  209. <a href="http://lists.mediagoblin.org/pipermail/userops/2015-September/000131.html">"Self Extensibility"</a>
  210. is another way to look at this.
  211. </p>
  212. <li>
  213. <b>Collaboration friendly:</b>
  214. </li><p>
  215. Though many individuals will be deploying on their own, many
  216. server deployments are set up to serve a community. It should
  217. be possible for users to help each other collaborate on
  218. deployment. This may mean a variety of things, from being able
  219. to collaborate on configuration, to having an easy means to
  220. reproduce a system locally.
  221. </p>
  222. <p>
  223. Additionally, many deployments share steps. Users should be
  224. able to help each other out and share "recipes" of deployment
  225. steps. The most minimalist (and least useful) version of this
  226. is something akin to snippet sharing on a wiki. Most likely,
  227. wikis already exist, so more interestingly, it should be
  228. possible to share deployment strategies via code that is
  229. proceduralized in some form. As such, in an ideal form,
  230. deployment recipes should be made available similar to how
  231. packages are in present distributions, with the appropriate
  232. slots left open for customization for a particular deployment.
  233. </p>
  234. <li>
  235. <b>Fleet manageable:</b>
  236. </li><p>
  237. Many users have not one but many computers to take care of these
  238. days. Keeping so many systems up to date can be very hard;
  239. being able to do so for many systems at once (especially if your
  240. system allows them to share configuration components) can help
  241. a user actually keep on track of things and lead to less
  242. neglected systems.
  243. </p>
  244. <p>
  245. There may be different sets, or "fleets", of computers to take
  246. care of... you may find that a user discovers that she needs to
  247. both take care of a set of computers for her (and maybe her
  248. loved ones') personal use, but she also has servers to take care
  249. of for a hobby project, and another set of servers for work.
  250. </p>
  251. <p>
  252. Not all users require this, and perhaps this can be provided on
  253. another layer via some other scripting. But enough users are in
  254. "maintainance overload" of keeping track of too many computers
  255. that this should probably be provided.
  256. </p>
  257. <li>
  258. <b>Secure</b>
  259. </li><p>
  260. One of the most important and yet open ended requirements,
  261. proper security is critical. Security decisions usually involve
  262. tradeoffs, so what security decisions are made is left somewhat
  263. open ended, but there should be a focus of security within your
  264. system. Most importantly, good security hygeine should be made
  265. easy for your users, ideally as easy or easier than not
  266. following good hygeiene.
  267. </p>
  268. <p>
  269. Particular areas of interest include: encrypted communication,
  270. preferring or enforcing key based authentication over passwords,
  271. isolating and sandboxing applications.
  272. </p>
  273. <p>
  274. To my knowledge, at this time no system provides all the features
  275. above in a way that is usable for many everyday users. (I've also
  276. left some ambiguity in <i>how</i> to achieve these properties above,
  277. so in a sense, this is not a pass/fail type test, but rather a set
  278. of properties to measure a system against.) In an ideal future,
  279. more Userops type systems will provide the above properties, and
  280. ideally not all users will have to think too much about their
  281. benefits. (Though it's always great to give the opportunity to
  282. users who are interested in thinking about these things!) In the
  283. meanwhile, I hope this document will provide a useful basis for
  284. implementing and thinking about mapping one's implementation
  285. against!
  286. </p>