<div class="gmail_quote"><div dir="ltr">On Fri, 2 Sep 2016, 12:30 pm Mark Shuttleworth, <<a href="mailto:mark@ubuntu.com">mark@ubuntu.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
One of my colleagues wrote regarding his experimental postgres-9-6 RC1<br>
snap, and I'm replying to the list with permission, because I think he<br>
raises a lot of good points and perspectives and questions that folks<br>
here would have comments on.<br>
<br>
On 31/08/16 13:08, Stuart Bishop wrote:<br>
><br>
> PostgreSQL is well behaved and well polished, so snapping was not<br>
> problematic. Unlike what most people are recommending, I started<br>
> directly with strict confinement. My gut feeling is that it is better<br>
> to trip over issues one at a time when they come up rather than try to<br>
> deal with them in bulk once you have something working in devmode.<br>
> That said, I didn't trip over many.<br>
<br>
I think there should be a meme-generator for this. "I don't often make<br>
snaps but when I do I start strictly".<br></blockquote></div><div><br></div><div><a href="https://cdn.meme.am/instances/500x/71468200.jpg">https://cdn.meme.am/instances/500x/71468200.jpg</a> <br></div><div><br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
<br>
><br>
> The biggest problem I had was dropping privileges to a non-root user.<br>
> There is currently no way to do this (nor to create such a<br>
> non-privileged user when the snap is installed). PostgreSQL upstream<br>
> block the root user from running tools this, with deliberately no way<br>
> to disable it since they traditionally took flak from poorly managed<br>
> installs (and they still bitch about Debian using non-standard paths).<br>
> I needed to patch several places in the code, and there may be some<br>
> more lurking in there not triggered by the PostgreSQL test suite.<br>
<br>
OK, we definitely want to support this.<br>
<br>
I think the scaffolding we need is:<br>
<br>
 * such user names should be managed globally (i.e. assigned in an<br>
assertion)<br>
 * such user names should by design not conflict with real users<br>
<br>
I think this requirement has come up before and what we decided was to<br>
pre-reserve a name in Ubuntu which would be in /etc/passwd up front.<br>
Perhaps this was for LXD, I forget. That's not a scalable solution but<br>
it might work for Pg.<br>
<br>
> Usability is currently poor. PostgreSQL is cli heavy, so having all<br>
> the well known commands with munged names like<br>
> 'postgresql-9-6.pg-dump' instead of 'pg_dump' would stop adoption all<br>
> by itself. I understand that this is being addressed, and I will be<br>
> able to present the dozen or so commands with their preferred names.<br>
> But this will also cause different issues, when I snap postgresql-10.<br>
> postgresql-10 will have the same set of tools. So I'll have two sets<br>
> on my path, each only able to deal with their own confinement. I think<br>
> the search path needs a defined ordering (eg. alphabetically), and<br>
> tools need to be available in both their prefixed and unprefixed form.<br>
> I will need to have both postgresql-9-6 and postgresql-10 snaps<br>
> installed in the same container, as this is the only migration path I<br>
> can come up with (allowing postgresql-10.pg_upgrade access to the<br>
> postgresql-9-6 containment via the content interface).<br>
<br>
Yes, these are very useful practical items of feedback for the command<br>
work. Let's promise to take that up in a sprint, when it's close to the<br>
top of our priority list. As a straw man it seems that we want groups of<br>
snaps (your pg versions) to be able to overlap in command names, but<br>
have only one of them get that top-level space at a time. That's a<br>
little bit like update-alternatives but with a snap as the level of<br>
granularity. If pg-10 is your default then all the top-level commands<br>
are pg-10, others are pg-X.command.<br>
<br>
<br>
><br>
> PostgreSQL is very extensible, and I haven't worked out the best way<br>
> to handle it. This includes adding arbitrary 3rd party Python, Perl<br>
> and tcl libraries for use from the built in stored procedure<br>
> languages. This includes building, linking and installing entirely new<br>
> stored procedure languages such as Ruby and all their dependencies and<br>
> extensions. This includes building, linking and installing C stored<br>
> procedures. This includes building other PostgreSQL extensions and<br>
> installing them where they can be installed using 'CREATE EXTENSION',<br>
> such as Citus for massive scale out and sharding or BDR for multi<br>
> master replication. The ecosystem is too vast to package everything,<br>
> and a lot of people are using bespoke and proprietary tools.<br>
<br>
Yes, the general question about plugins and extensions is super<br>
interesting. Snaps offer tight and deterministic binaries on demand, and<br>
that slightly conflicts with extensible ecosystems, but we must explore<br>
the boundaries of the known world to better understand where we're going.<br>
<br>
Simplistically, a snap author could make an ecosystem of things they<br>
bring into their snap. But what you want is a little less controlled<br>
than that.<br>
<br>
><br>
> Launchpad was invaluable, as my attention span doesn't cover uploading<br>
> 100MB++ blobs over my awful 3rd world ADSL connection. Awful hacks<br>
> were used to get test suites running as part of the build process from<br>
> the static snapcraft.yaml, which in hindsite would have been done<br>
> better as a custom plugin.<br>
><br>
<br>
Yeah, a custom plugin is a much easier way to solve build issues than I<br>
expected too. We could do a much better job of helping people write such<br>
plugins, for example by documenting the BasePlugin much better, perhaps<br>
as a skeleton that 'snapcraft init-plugin' gives you.<br>
<br>
> I needed to write my own log rotation daemon. There seems to be no way<br>
> to schedule regular operations.<br>
<br>
System logging locally via syslog and systemd journal should be<br>
straightforward interfaces (I think the latter is in-progress by Jamie).<br>
The system should handle rotation of *those* logs. I like the idea of<br>
having log rotation as a capability for logs in $SNAP_DATA and cousins.<br>
<br>
> locales was tricky to get right, and I don't know if I got it right. I<br>
> need *all* the locales available, as you can declare indexes and<br>
> columns in particular locales to get particular collation orders. I<br>
> ended up pulling in locales-all from universe as a stage-package, and<br>
> my wrappers set LOCPATH to the snapped locales location.<br>
<br>
Yes, I think numerous folks have run into this. I think an official<br>
solution for locales-in-snap and locales-from-system would be most useful.<br>
<br>
> Access to dotfiles in $HOME is necessary, like most of the CLI tools<br>
> I'm interested in snapping. I suspect the use case for a home<br>
> interface that blocks 'hidden' files is small, possibly non-existent,<br>
> and it might be best to just remove the restriction than add a new<br>
> interface.<br>
<br>
Noted. I'd like to preserve the current plan, which is to extend the<br>
home interface for parameterised access to known dotfiles, but this is<br>
another good data point to consider.<br>
<br>
><br>
> Storage is going to be a problem. I can't use the snap in the<br>
> PostgreSQL juju charm, as I need to store WAL and data files on<br>
> partitions provided by Juju, outside of containment. Non-juju<br>
> production installs will also need to split WAL and datafiles onto<br>
> separate partitions (even with pure SSD you can want separate channels<br>
> for the increased bandwidth). And another potentially huge issue is<br>
> that the database gets destroyed when the snap is uninstalled. I get<br>
> the feeling that I need to be able to define arbitrary paths paths on<br>
> the host to be accessible from inside containment.<br>
<br>
Yes we will need to look again at storage for really serious<br>
data-persistence software like Postgres.<br>
<br>
> And on opening up paths on the host, unix sockets. By default,<br>
> PostgreSQL clients try to connect to the server using sockets stored<br>
> in a well known directory (/var/run/postgresql on Debian). Tools<br>
> compiled against the standard PostgreSQL packages will not find the<br>
> listening socket in /var/run/postgresql, but need to be told to look<br>
> in /var/snap/postgresql-9-6/common/run. If the server running inside<br>
> containment could write to /var/run/postgresql, then everyone could<br>
> play together happily.<br>
><br>
<br>
This should be handled pretty cleanly by an interface, and I would<br>
suggest going ahead and making one for Postgres right away as that will<br>
allow other snaps to use Postgres if they want it.<br>
<br>
> Upgrades will be slow, as data (possibly terabytes) will need to be<br>
> copied from the postgresql-9-6 container into the postgresql-10<br>
> container. Non-snap installs get to hardlink the datafiles into the<br>
> new location and migrate them quickly. This is another use case for<br>
> allowing access to areas of the host.<br>
<br>
The content interface should enable this - a snap could offer the data<br>
spaces up to different versions of postgres. I'm not sure if the content<br>
interface is yet ready for this particular use-case, but its definitely<br>
in progress.<br>
<br>
> Where is the best place to store data? I'm using $SNAP_COMMON because<br>
> I can't let the data be rolled back (it might be a good idea on a<br>
> standalone system, but rollback would desynchronize and break a<br>
> replicated system).<br>
><br>
<br>
For now that's probably best, until we have the content interface settled.<br>
<br>
> How to customize the snap? PostgreSQL can be customized by sudo vi<br>
> /var/snap/postgresql-9-6/common/data/postgresql.conf, but for snap<br>
> configuration I went with /var/snap/postgresql-9-6/common/snap.ini<br>
> (currently it just defines the log retention time).<br>
<br>
For now I think an editable config file in a known writable location is<br>
best. Later we'll have a standardised mechanism which your snap can use<br>
to hook into bigger systems.<br>
<br>
> I have lots and lots and lots of man pages not on my MANPATH. Not<br>
> urgent, but nice to expose them.<br>
><br>
<br>
Noted and I think in-progress.<br>
<br>
> For general adoption, the bar is really high. PostgreSQL running in an<br>
> machine container is exactly what people want (and what we have been<br>
> pushing on the Cloud side of things). Even if we can address all the<br>
> above issues, a PostgreSQL snap will still be more cumbersome than<br>
> running PostgreSQL in an lxd container (or a docker container for that<br>
> matter). Operators get to control and grow the environment they need,<br>
> rather than being stuck with the static one I provide and the<br>
> interfaces, plugs and canned scripts that customize it in preapproved<br>
> ways. I've been wondering if the solution is adding a new 'machine'<br>
> confinement, where the snap software is installed and updated in a<br>
> real lxd machine container on the host. Maybe the best of both worlds?<br>
<br>
Let's start with a more focused used-case: postgres as a storage engine<br>
for IoT. In that case the level of customization is much reduced, people<br>
are looking for some highly predictable behavior more than every<br>
possible degree of freedom in customization. Remember they can also<br>
build postgres INTO their own snap (and it actually might be worth<br>
exporting a shared pg part so people can do that trivially).<br>
<br>
Mark<br>
<br>
<br>
--<br>
Snapcraft mailing list<br>
<a href="mailto:Snapcraft@lists.snapcraft.io" target="_blank">Snapcraft@lists.snapcraft.io</a><br>
Modify settings or unsubscribe at: <a href="https://lists.ubuntu.com/mailman/listinfo/snapcraft" rel="noreferrer" target="_blank">https://lists.ubuntu.com/mailman/listinfo/snapcraft</a><br>
</blockquote></div>