GeoServer "data dir" versioning

GeoServer stores its configuration files in a special directory, which everyone calls the "data dir" (but really, no GIS data should be stored in here ...). When someone updates the GeoServer configuration, XML files are modified in this directory, and the updateSequence value is incremented.

Why would you want to version this directory ?
Well, we found several advantages to this, and now, we're doing it everytime we deploy a new GeoServer instance: * it's a way to track changes when several people have admin rights, * it's so much easier to rollback to a previous state, * one gets a better insight of what happens behind the scene, * it can turn into a backup solution, * it can fork a GeoServer instance into a testing one, then pull back the changes once OK, * it can distribute a config among a distributed stack of GeoServers * ...

Setting up the repository

From the template one

If you're creating a new geoserver instance, you should really start from the "data dir" we provide:

sudo mkdir /opt/geoserver_data_dir
sudo chown tomcat /opt/geoserver_data_dir
sudo -u tomcat git clone /opt/geoserver_data_dir
cd /opt/geoserver_data_dir
sudo -u tomcat git remote rename origin upstream

At this stage, you already have a local repository for your geoserver "data dir".

From an existing "data dir"

In case you're starting from an existing "data dir":

cd /path/to/your/geoserver_data_dir
sudo -u tomcat git init
sudo -u tomcat git add --all .
sudo -u tomcat git commit -m "initial repository state"

Let's also ignore the changes to the logs, temp, gwc folders:

sudo -u tomcat cat > /path/to/your/geoserver_data_dir/.gitignore << EOF

Also exclude folders containing datas if you don't want them to be versioned.


cd /path/to/your/geoserver_data_dir
sudo -u tomcat git add .gitignore
sudo -u tomcat git commit -m "git ignores temp, logs and gwc folders"

Managing the repository

Easy steps if you're familiar with git ...

Commiting changes

There are two strategies: either you're doing it manually (but this may soon become a pain), or you leave it to a cron task.

cd /path/to/your/geoserver_data_dir
sudo -u tomcat git add --all .
sudo -u tomcat git commit -m "my commit message"

Viewing changes

To view the commit history:

sudo -u tomcat git log

To identify the changes introduced by a revision:

sudo -u tomcat git diff xxxxxx

... where xxxxxx is the commit hash.

Temporary rollback

Let's say you want to temporarily rollback to a given revision. First commit your working state (see above). Then:

sudo -u tomcat git checkout xxxxxx

Don't forget you have to reload the geoserver catalog from the data dir. This is done in the geoserver web interface with the "reload config" button.

To go back to the latest state:

sudo -u tomcat git checkout master

... and reload the configuration again.

Complete rollback

This is achieved with:

sudo -u tomcat git reset --hard xxxxxx --force

... where xxxxxx is the revision hash you want to go to.

Note that the --force option will also discard any uncommited change.

Git as a backup solution

If your repository has a remote where you have the right to push to, git can easily turn into a backup solution for your data dir.

Check your remotes with:

cd /path/to/your/geoserver_data_dir
sudo -u tomcat git remote -v

Either you have no remote or you may see something like this (in case you're starting from our minimal data dir):

upstream (fetch)
upstream (push)

Once your "origin" remote is setup, you don't have to do this anymore.
Just push the changes with:

sudo -u tomcat git push origin

In case you opt for automatic backups with git, a cron job should regularly: - add the changes - commit them - push the master branch to the remote repository