Styx - Shared installation

  •  Embedding
  • « Shared installation »
  • « End of guided Tour »

Shared installation

(WARNING: This feature is nothing new - but still marked “EXPERIMENTAL”!)

You can install ONE s9y distribution and manage multiple users on it by sharing the core files and then deploying specially crafted files in each user’s directory.

Let’s do this using an example. You own the domain ‘s9yblogs.org’. You want to have multiple virtual hosts for as many users as you like. They are going to be called ‘username.s9yblogs.org’. We choose the users ‘garvin’, ‘j’ and ‘tom’ for example hosts. We assume that your webserver runs as user ‘www’, group ‘www’. We also assume that all your users are called like the subdomains, and they are also in group ‘www’. We further assume that PHP’s safe_mod is turned off. Give secured sFTP access to your deployment users for the tokenized deployment installs.

Of course, for security reasons, you should set the open_basedir directive to the user’s document root, so he can’t access other installations on your host.

So your Apache-Webserver should contain Virtual Hosts like this:

-- httpd.conf
<VirtualHost 42.42.42.42:80>
    ServerName garvin.s9yblogs.org
    DocumentRoot /home/www/garvin.s9yblogs.org/htdocs
    <Directory "/home/www/garvin.s9yblogs.org/htdocs">
        AllowOverride All
        Require all granted
    </Directory>
    php_value include_path ".:/usr/local/lib/php:/usr/local/lib/php/s9y/:/usr/local/lib/php/s9y/bundled-libs/"
    php_admin_value open_basedir "/usr/local/lib/php/:/usr/local/lib/php/s9y/:/home/www/garvin.s9yblogs.org/"
</VirtualHost>

<VirtualHost 42.42.42.42:80>
    ServerName j.s9yblogs.org
    DocumentRoot /home/www/j.s9yblogs.org/htdocs
    <Directory "/home/www/j.s9yblogs.org/htdocs">
        AllowOverride All
        Require all granted
    </Directory>
    php_value include_path ".:/usr/local/lib/php:/usr/local/lib/php/s9y/:/usr/local/lib/php/s9y/bundled-libs/"
    php_admin_value open_basedir "/usr/local/lib/php/:/usr/local/lib/php/s9y/:/home/www/j.s9yblogs.org/"
</VirtualHost>

<VirtualHost 42.42.42.42:80>
    ServerName tom.s9yblogs.org
    DocumentRoot /home/www/tom.s9yblogs.org/htdocs
    <Directory "/home/www/tom.s9yblogs.org/htdocs">
        AllowOverride All
        Require all granted
    </Directory>
    php_value include_path ".:/usr/local/lib/php:/usr/local/lib/php/s9y/:/usr/local/lib/php/s9y/bundled-libs/"
    php_admin_value open_basedir "/usr/local/lib/php/:/usr/local/lib/php/s9y/:/home/www/tom.s9yblogs.org/"
</VirtualHost>
-- httpd.conf

You will unpack the default s9y distribution files in “/usr/local/lib/php/s9y/”. Where you store the directory ‘s9y’ is not important, as long as you adjust the include_path setting in the Virtual Hosts. But the directory name ‘s9y’ is significant.

Now you can either copy or link the following subcategories:

  • “/usr/local/lib/php/s9y/deployment/” [core redirection files]
  • “/usr/local/lib/php/s9y/docs/” [for maintenance section access]
  • “/usr/local/lib/php/s9y/templates/” [templates so that users can change them - depends on your plugin usage!]
  • “/usr/local/lib/php/s9y/plugins/” [certain plugins refer to HTTP-images]

to each of the user’s subdirectories:

$ cp -r /usr/local/lib/php/s9y/deployment/* /home/www/garvin.s9yblogs.org/htdocs/

/* Either COPY: */
$ cp -r /usr/local/lib/php/s9y/docs /home/www/garvin.s9yblogs.org/htdocs/
$ cp -r /usr/local/lib/php/s9y/templates /home/www/garvin.s9yblogs.org/htdocs/
$ cp -r /usr/local/lib/php/s9y/plugins /home/www/garvin.s9yblogs.org/htdocs/

/* Or LINK: */
$ ln -s -d /usr/local/lib/php/s9y/docs /home/www/garvin.s9yblogs.org/htdocs/docs
$ ln -s -d /usr/local/lib/php/s9y/templates /home/www/garvin.s9yblogs.org/htdocs/templates
$ ln -s -d /usr/local/lib/php/s9y/plugins /home/www/garvin.s9yblogs.org/htdocs/plugins

/* Adjust permissions */
$ chown -R garvin.www /home/www/garvin.s9yblogs.org/htdocs/*
$ chmod ug+rwx /home/www/garvin.s9yblogs.org/htdocs
$ chmod ug+rwx /home/www/garvin.s9yblogs.org/htdocs/uploads/

/* See above if you only want to link the subdirectories */
$ cp -r /usr/local/lib/php/s9y/deployment/* /home/www/j.s9yblogs.org/htdocs/
$ cp -r /usr/local/lib/php/s9y/docs /home/www/j.s9yblogs.org/htdocs/
$ cp -r /usr/local/lib/php/s9y/templates /home/www/j.s9yblogs.org/htdocs/
$ chown -R j.www /home/www/j.s9yblogs.org/htdocs/*
$ chmod ug+rwx /home/www/j.s9yblogs.org/htdocs
$ chmod ug+rwx /home/www/j.s9yblogs.org/htdocs/uploads/

/* See above if you only want to link the subdirectories */
$ cp -r /usr/local/lib/php/s9y/deployment/* /home/www/tom.s9yblogs.org/htdocs/
$ cp -r /usr/local/lib/php/s9y/docs /home/www/tom.s9yblogs.org/htdocs/
$ cp -r /usr/local/lib/php/s9y/templates /home/www/tom.s9yblogs.org/htdocs/
$ chown -R tom.www /home/www/tom.s9yblogs.org/htdocs/*
$ chmod ug+rwx /home/www/tom.s9yblogs.org/htdocs
$ chmod ug+rwx /home/www/tom.s9yblogs.org/htdocs/uploads/

The difference between copying or linking the templates or plugins folder is a maintenance issue. Whenever you upgrade the core s9y libraries, it could happen that the distributed templates or plugins code could have changed. Now you only copied those directories, you need to copy the new files inside each of the user’s directories. If you only linked them, it will be instantly all the same for every user. It is recommended to link the directories, but that depends on your OS and permission structure. Of course this way a “shared library user” cannot store his own templates or plugins inside the linked directory, so this is a definite loss of individualization. It is recommended to install (mkdir) an empty, accessible and writable plugins directory for each deployment, to give access for custom Spartacus plugin installations.

For later management access, it is advised you keep a list of all URLs for your s9y-managed blogs. We suggest to create a SQL table like ‘my_managed_s9y_blogs’:

sql> CREATE TABLE my_managed_s9y_blogs (url varchar(255) default null);
sql> INSERT INTO my_managed_s9y_blogs (url) VALUES ('http://garvin.s9yblogs.org/');
sql> INSERT INTO my_managed_s9y_blogs (url) VALUES ('http://j.s9yblogs.org/');
sql> INSERT INTO my_managed_s9y_blogs (url) VALUES ('http://tom.s9yblogs.org/');

Now you are almost ready for take-off. We assume that every user has access to a separate SQL database where his blog-data is later stored in. You can already see, that the steps needed above shouldn’t be to hard to put into a customized script.sh file for use in your setup.

Open up your http://garvin.s9yblogs.org/ file. You should now see s9y’s installation screen. Enter the database- and username and the corresponding password. Everything else can be left to the user.

Now every user can manage his/her blog just as if it were a standalone installation.

Up from Serendipity Styx 3.9.0 - which fixes issues with tokenized installs - and singular users deployment updates via the autoupdate event plugin (v.1.9.0+) the 2 possible symlink'ed directories docs and templates will return into independent install dirs, assuming there are no others (see the Book :: Chapter 10 :: Shared installations). This turns a deployment install into an independent and fully fletched Serendipity installation.

Special Notes

  • Each blog is still a standalone blog.
  • If you update the core library files from version 0.5 to 0.6 (for example) every user of your core library will get the default s9y-Upgrader script to see and needs to update his local configuration.

As a provider for s9y blogs to your users, you are advised to migrate the user’s blogs on your own. To do so, it is best that you always have a “spare” testing blog installed just like your user’s blogs.

Open that installation and look at the upgrader. Execute it and see that it completes without errors. If that happened, you should cycle through a list of ALL your s9y-managed blogs like this:

<?php
$sql = mysqli_query($mysqli, 'SELECT url FROM my_managed_s9y_blogs');
while ($row = mysqli_fetch_array($sql, MYSQLI_ASSOC)) {
    $fp = fopen($row['url'] . 'serendipity_admin.php?serendipity[action]=upgrade');
}
?>

So basically all you need to do is call that script for every s9y-powered blog you host.