Content Management Over The Horizon


Part I: Installing and Configuring the Dependencies

Thanks to the hard-working developers at UC Berkeley, organizations that use the CollectionSpace platform, “a web-based, open source collections management and information system for museums and other collecting institutions,” can now deploy and extend their very own web applications.  We are going to show you how on a production server

Built on Python’s popular web framework, Django, the web applications are highly customizable. By default, they provide two core features. These are:

  1. the public searching or browsing of an institution's collections (authorized ip-addresses can be specified by the host server if necessary), and
  2. separate internal applications for authorized users only (e.g. search applications returning sensitive collections information, reporting, or bulk image uploading).

Most of what you need to know, and things you would like to know, can be found on UC Berkeley’s GitHub repository. For deploying the default webapp specifically, you will need to go to their CSpace Django Project. Be sure read what’s published in the readme as familiarizing yourself with the many terms and processes will only help make deployment easier.

We assume that you already have an instance of CollectionSpace running on your desired server. If not, please refer to the CollectionSpace Installation Wiki to learn how.

Installing Dependencies

Step 1: Install the Apache2 web server

Before you do anything, make sure to update any existing packages:

$ sudo apt-get update

In a terminal window, assuming that your current user has sudo permission, run the command:  

$ sudo apt install apache2

This will install the Apache2 web server at the directory /etc/apache2.

Start up the Apache2 web server by executing:

$ service apache2 start

You should be prompted with:

“* Starting web server apache2”

Other helpful, self explanatory, commands include:

$ service apache2 [ status | stop | restart ]

By default, the Apache2 web server runs on port 80. With that said, if the installation was successful, navigating to http://<your ip-address> will display the default Apache2 web server page. Use http://localhost if the installation was done on your local machine.

Step 2: Install Apache Solr

Apache Solr is what UC Berkeley web applications use to search and navigate through your CollectionSpace instance. We recommend that you go beyond the documentation we provide here and what has been provided at the CSpace Django Project GitHub repository. You can download and view the full Apache Solr guide at:

In brief:

“Solr is highly reliable, scalable and fault tolerant, providing distributed indexing, replication and load-balanced querying, automated failover and recovery, centralized configuration and more.”

Continuing with the installation, in your terminal window, go to your home directory:

$ cd ~

Download the latest version of Apache Solr from Solr's downloads into your home directory.  As of June 2016, the latest version is 6.1.0.

The file name should be remotely similar to this:


Copy the link location and execute the following command in your terminal window:

$ wget [paste link here]

For example:

$ wget

Once downloaded, go ahead and extract the tar file, replacing “x.y.z” with your downloaded version, specifically extracting the Solr installation script:

$ tar zxf solr-x.y.z.tgz solr-x.y.z/bin/ --strip-components=2

Next, install Solr as a service:

$ sudo bash ./ solr-x.y.z.tgz

Note: make sure that the current Java version being used by your system meets the dependency requirements for your Solr instance. For release 6.1.0, Solr requires Java version 8. The script will fail otherwise. If you have multiple Java version installed, you can execute the command: sudo update-alternatives --config java to change the version.

If you would like, you can specify various options for the installation.

For example:

$ sudo bash ./ solr-x.y.z.tgz -i /opt -d /var/solr -u solr -s solr -p 8983

i = install directory for Solr installation archive

d = install directory for logs, etc (live writable files)

u = user who owns the Solr files

s = the service name, which is solr by default

p = the port solr should bind to

f = for upgrading Solr, overwrites the symlinks and init scripts of old installations. You may need this option if you run into problems with your initial install and would like to try again.

If the command executed successfully, you should be prompted accordingly. For instance:

“ Waiting up to 30 seconds to see Solr running on port 8983 [/]  

Started Solr server on port 8983 (pid=10320). Happy searching!

Found 1 Solr nodes:

Solr process 10320 running on port 8983



  "version":"6.1.0 4726c5b2d2efa9ba160b608d46a977d0a6b83f94 - jpountz - 2016-06-13 09:46:58",


  "uptime":"0 days, 0 hours, 0 minutes, 11 seconds",

  "memory":"16.9 MB (%3.4) of 490.7 MB"}

Service solr installed.”

To make sure Solr installed correctly, visit http://<your ip-address>:8983/solr/#/

If you see the Solr Admin page, you are in great shape!

Again, we recommend taking some time to review the Solr documentation in order to understand how to leverage the full potential of Solr.

Step 3: Install Python’s Package Manager, PIP and VirtualEnvWrapper

Chances are that you already have pip and Python installed on your machine. You can check by executing:

$ python -V

Returning, “Python 2.7.6” (or similar).

Note: For the default UC Berkeley web applications, you’ll need Python 2.7, not 3+.


$ pip -V

Returning, “pip 8.1.1 from /usr/local/python2.7/dist-packages (2.7)” (or similar)

If you discover that you do not have one or more of the above, check out the Hitchhiker's Guide to Python for instructions on how to resolve these dependencies.

Finally, once you have both Python and pip, do:

$ sudo pip install virtualenvwrapper

This installs Python’s virtualenvwrapper globally, which we will be using in the second part of this blog post.

To summarize the above, you should now have the following dependencies properly installed and running on your server:

  1. A CollectionSpace instance (assumed and not covered in this post)
  2. An Apache2 web server
  3. An Apache Solr instance
  4. Python 2.7.*
  5. Python’s package manager, pip 8.1+
  6. Python’s VirtualEnvWrapper

In part II of this blog series, we will show you how to successfully configure Solr, Apache2, the default web application, and its corresponding virtual environment. Until then, if you have any questions regarding CollectionSpace or need help deploying your default web application, please feel free to reach out to us.


By Yousuf Nejati03/29/2016 09:32 am

Yousuf Nejati photo

Congratulations on acquiring your new Nuxeo platform, a feature-rich and highly-customizable place to manage all of your enterprise content. Let’s take a brief tour of your default Nuxeo platform, including accessing your platform, changing your password, and familiarizing yourself with the default layout.

By now, you should be holding the credentials to access your new Nuxeo platform and account, including a link or URL to the platform, username, and password. If not, we suggest contacting your system administrator in order to obtain this information. If you happen to be the system administrator or owner, the default username and password is ’Administrator’, as detailed in the Nuxeo documentation center found on Nuxeo’s website.

When you initially receive your credentials, the first task is to access the platform by clicking on the link provided to you by your system administrator, or going there directly by copying the URL into your web browser bar. Again, check with your system administrator for details. If all goes well, you will be seeing the Nuxeo Platform login page (Figure 1).

Figure 1: Logging into your Nuxeo Platform

Once on the login page, enter the username and password provided to you, while paying close attention to capitalization. This should get you into the Platform.  Before you begin exploring, we recommend changing your password from the one that was provided for you. To do this, use the sidebar to the left, containing a list of options starting with ‘Dashboard’. Select ‘Profile’ (Figure 2).

Figure 2: Changing your password, selecting ‘Profile’

Your profile should contain information regarding your account, such as username, first name, last name, company, and email address. In the upper right corner you’ll find a dropdown button labeled ‘Actions’, select this to activate the drop down menu (Figure 3). Then, select ‘Change Password’. Here you can change your current password to a new, more secure, password.

Figure 3: Changing your password, ‘Actions’ button

When you’ve confirmed your new password, select ‘Save’, and you’re done (Figure 4). Changing your password is just that easy. We recommend that you do this often to prevent unwanted users accessing your account.

Figure 4: Changing your password, confirm and ‘Save’

Now that you’ve secured your password, let's begin our brief tour of your new default Nuxeo Platform. At the very top of the page (Figure 5), you’ll notice the three main spaces to help with managing your enterprise content, ‘HOME’, ‘WORKSPACE’, and ‘SEARCH’. 

Figure 5: Main spaces

Every user has a 'HOME' space that provides access to various tabs in the left navigation pane, that are user specific. Appropriately named, this is your home on the Nuxeo Platform. Tabs in this space include (Figure 6):

  • Dashboard - allows quick access to your content, including favorites, shared content, assigned tasks, your documents, and a timeline of changes to all shared content made by users
  • Profile - your profile information, including your username, first name, last name, etc. If you just changed your password by following the steps above, you’ll recognize this tab.
  • Workflow - view tasks that have been assigned to you, including their current state
  • Alerts - when you subscribe to follow a particular artifact or document, you’ll find your subscription news feed here
  • Authorized Applications -  lists any external applications that can access content
  • Users & Groups - you can search for users and groups here, and view their existing profile. Searching for ‘ * ’ will provide a list of all users or groups, up to 50.
  • Searches - any searches that you performed and saved are listed here for easy access
  • Collections - you’ll find all of your collections listed here

Figure 6: Your Nuxeo ‘HOME’

Moving on we have your 'WORKSPACE'. Here you can easily browse your enterprise content repository, access content, collaborate, follow, share, export, and print (Figure 7). On the left, you’ll find the navigation tree, which is a hierarchical folder structure containing your enterprise content. Depending on your content permissions and how your personal workspace is set up, what you see may differ from what is actually available. This is where you'll be preforming the bulk of your work. Here you can create and manage new or existing content, and collaborate with fellow users. Like the Nuxeo Platform itself, your personal workspace is rich in features and highly-customizable. Take some time familiarizing yourself with the available features as they are tools to help make managing your enterprise content quick and easy.

Figure 7: Your Nuxeo ‘WORKSPACE’

Last, we have our 'SEARCH' space. This is a very powerful feature of the Nuxeo Platform. Here you have the ability to search your content using a variety of filters (Figure 8). By default, you will have the filters ‘Faceted Search’, ‘Quick Search’, and ‘NXQL Search’. Other filters can be added by your Nuxeo developer or Platform administrator. For example, an ‘Editing’ search filter, as seen in the provided image. The capabilities of the default content search filters include:

  • Faceted Search - provides the ability to search for keywords, metadata, and other precise terms such as, creator, creation date, modification date, tags, location, etc.
  • Quick Search - a standard text search, which is the search filter that is available in the top right corner of every page within the platform. This filter is not very precise and is known to return many, possibly irrelevant, results.
  • NXQL Search - uses Nuxeo’s database querying language, similar to SQL, to query the contents of the platform

Figure 8: Your Nuxeo ‘SEARCH’ space

Thus concludes our brief tour of your new default Nuxeo Platform. To summarize, we covered how to access the Platform, how to change your password, and the three main spaces of the Platform. We hope that you found this post useful, and we encourage you to explore and familiarize yourself with your new Nuxeo Platform.

As was mentioned before, the Nuxeo Platform is rich in features to help manage your enterprise content. We recommend reviewing Nuxeo’s User Documentation as you’ll find a lot of useful information, tips, and tricks. Feel free to contact us, and our dedicated team of Nuxeo developers, with any questions on how to leverage the power of Nuxeo to meet your Enterprise Content Management (ECM) needs.

1 comment

By Peter Tucker05/28/2015 11:29 am

Peter Tucker headshot

This blog post in intended for anyone who is familiar with Nuxeo Studio and is interested to learn a bit more about automation chains. As noted in my previous post, creation of automation chains is a prominent feature in Nuxeo Studio which allows users to set a series of instructions that can be executed.


Automation chains are made up of multiple bits of instructions called 'operations'. There are many operations that are already defined in Studio that are generally sufficient for most situations. These operations can include fetching a document, creating a task, and logging in as a specific user to name just a few. When creating an automation chain, a user simply needs to add one operation at a time for the task they have in mind. For example, if they want to have a chain where you login as the administrator and create a new document, they would only need to add the corresponding operations for logging in and creating a document.

MVEL Language

The Language is used to create the input values for the operations in an automation chain. MVEL helps determine what metadata should be extracted from specific data types, such as a document file's title by calling expr:Document[“dc:title”]. With this, you can also set up your own variable names to temporarily hold data, and use them as needed. Here are some basic MVEL scripting features to take note of:

  • If you were to type “description” it would have no special interpretation and just literally mean “description”.
  • If you were to type “expr:description” the expr means to examine “description” as a scripting expression, and not as a literal one. This allows any scripting interpretation in the expression to return their value.
  • If you were to type “expr:Description - @{description}”, and “description” is a variable that holds a string value of “a standard file”, it would return “Description – a standard file”. Having @{} means that it will interpret anything inside the brackets as a variable, which is “a standard file” in this case.
  • It's important to note that if the “expr:” part wasn't there in the above example, it would just return “Description - @{description}” since it would return as a literal.

There are many more uses of the MVEL language for automation chains, which can be found at the following link:

MVEL also has a list of operators to use, which can be found here:

If you are curious to see a sample script that uses MVEL, there's a posted example which creates a random number guessing game:

User-Created Operations

Even though the Studio provides a vast amount of useful operations, those aren't the only ones that are usable. Users are freely able to create their own operations themselves. However for this part, the user should be able to code with Java, and be able to utilize MVEL. This requires the installation of the Eclipse IDE, the Nuxeo SDK, and the Nuxeo IDE for Eclipse. The Nuxeo IDE has a wizard to help set up an operation template to give users a start. From here, the users are free to utilize the Nuxeo SDK library to code a specific operation they need. There's a tutorial to create your first operation which results in the creation of a random string generator:

To see more information related to creating an operation, refer to here too:

These are just the main features associated with automation chains, but I hope this helps anyone get a general idea about the usage of these chains with Nuxeo Studio. Next time, I'd like to elaborate on event handlers, which is the feature responsible for triggering automation chains.


By Lara Nordahl04/28/2015 02:38 pm

Lara Nordahl headshot in front of river

Nuxeo is an Enterprise Content Management ("ECM") system. Nuxeo keeps track of documents from creation to deletion. But even after deletion of a document, Nuxeo allows privileged users to manage those documents. Read on to learn how to delete a document, find a deleted document, and restore a deleted document. Simple enhancement of the delete functionality is also discussed.
In Nuxeo Platform 7.0, navigate to a document which is ready to be deleted. Then navigate back to the parent document's Content tab. Check the box next to the name of the document to be deleted. Multiple documents could be selected at this time to be deleted simultaneously. A series of buttons should appear at the bottom of the list of contents once an item is checked. Click the "Delete" button to delete this document (or documents). Then confirm by clicking "OK".

Default Delete

The parent document can also be deleted. Navigate up a level in the navigation tree, select and delete the parent as well.
Once these documents are deleted, they will no longer appear in the Content tab of the parent document. They will no longer appear on the left navigation tree, either. In order to manage the deleted documents, navigate to the parent of the document that was deleted. In this case, that parent is the Granite Horizon Workspace. Then click the "Manage" tab, and then click the "Trash" subtab.

Screenshot of Trash tab

The action button that is available is "Empty trash". Select the checkbox next to the parent document (in this case, Granite Horizon Folder) and the options "Permanent delete" and "Restore" appear. Click "Restore" to restore the parent document (Granite Horizon Folder) and all of its subitems. Or, click "Permanent delete" to permanently delete the parent document and all of its subitems. Note that the original child document(s) that were deleted are not listed. Click on the parent document (Granite Horizon Folder) to view the deleted subitems. If the subitems are restored, the parent will be restored as well.
Note that the location where the deleted documents are accessible is the immediate parent document's Manage/Trash location. In this example, the Granite Horizon Workspace contains the Granite Horizon Folder in the trash. However, the Granite Horizon Workspace's parent, Workspaces, has nothing in the trash. This may be inconvenient, as it might mean navigating through many documents to find a deleted document. One way around this is to implement a "Domain trash" or a "Workspace trash" at a high level using Nuxeo Studio. This could contain all the deleted documents for that domain and/or workspace. One simple solution to this is to create a content view that shows deleted documents where the path "STARTSWITH" the current document path. The Query filter would look like this:

ecm:mixinType != 'HiddenInNavigation' AND ecm:isCheckedInVersion = 0 AND ecm:currentLifeCycleState = 'deleted' and ecm:path STARTSWITH ?

and the Query parameter is


In order to make this behave like the default Trash tab, add a couple user actions called "Restore" and "Permanent delete". These can be added directly to the Content View by clicking on "Results" -> Enable additional actions -> Create a new action.
Then add this content view to a Tab on the document desired. Enhance this by adding a search filter.
Out of the box, Nuxeo allows users to delete documents, delete parent documents, restore subtrees and permanently delete subtrees and individual documents. With some customization, some high-level management of deleted documents can be added. Worth noting is that Nuxeo's delete feature can be controlled by ACLs. In addition, a document's versions can be deleted using the History -> Archived versions tab. This can also be managed by ACLs.
Any questions or comments? Please chime in!

1 comment


Nuxeo is an ECM system. Nuxeo keeps track of a document's history, tracking important facts about the document's creation and about each edit. Many document types in Nuxeo come with a "History" tab enabled by default. This tab displays document event and version information. Nuxeo provides the document's history information. Also, Nuxeo offers document versioning out of the box. These are useful tools in tracking the change history of a document. Customization of the Versioning feature using Nuxeo Studio may improve Nuxeo's default behavior to suit business requirements.
The document's History tab contains useful information about a document's history for every edit: the performed action, the date the action was performed, the name of the user who performed the action, and so forth. When the document is edited, a field for "Change Comment" is available. When an edit is saved, the History -> Event log tab shows the change comment and the version number both in the Comment column. As with most tables in Nuxeo, the Event log can be easily exported to Excel.

Event Log screenshot

The Nuxeo documentation on Document History is available here:
While the Event log is automatic, with the only user input being the Change Comment, the Versioning system requires direction from the user. The editor can choose to apply a version whenever they edit a versionable document. The editor can increment the version by a major or minor increment, or skip versioning altogether for that edit.

Increment Version Screenshot

One of the versionable document types that comes with a new Nuxeo installation is the File document. When a File document is edited, the Version section appears, allowing the user to either apply a Major version increment, a Minor version increment, or Skip version increment. Skip is selected by default.
It is interesting to note that the original document is not assigned a version number on creation. Therefore, the History -> Archived versions table only shows a Version if one has been assigned when the document was edited - not when it was created. This means that the original document cannot be retrieved.

Archived Version 1 Screenshot

When the document is edited again, and another version increment is applied, then true work with versions can begin.
Once a document has two or more versions, the editor can perform a variety of functions on these versions: delete, compare, view, and restore.

Archived Version 2 Screenshot

The Compare feature renders a diff of the selected versions, if the Nuxeo Diff Marketplace Package has been installed.

Diff Screenshot

Again, it is interesting to note that the original document cannot be compared, deleted, or restored.
This out of the box behavior can be customized to suit business needs.
When a client requires that a specific document type has a version assigned when the document is created, a simple event handler/automation chain can be created that does a major CheckIn when a versionable, regular document is created.
When a client requires that a certain document type, or set of document types, have a Major version assigned whenever the document is edited, the following XML Extension may be helpful:

<extension target="org.nuxeo.ecm.core.versioning.VersioningService" point="versioningRules">
    <options lifeCycleState="*">
      <major default="true"/>
  <versioningRule enabled="false" typeName="File"/>
<extension target="org.nuxeo.ecm.platform.forms.layout.WebLayoutManager"
    <layout name="document_edit_form_options">
        <template mode="any">/layouts/layout_default_template.xhtml

Any questions? Have a better solution to share? Please contact us.


By Peter Tucker04/21/2015 03:06 pm

Peter Tucker headshot

Nuxeo Studio is an online service that provides a vast array of features to help users manage their enterprise content better in Nuxeo Platform. Being a user of the service as well as a Nuxeo integration engineer myself, I'd like to list some of the big features Nuxeo Studio has got going for itself.

1. Schema Definitions

Studio allows users to define a vast lists of schemes, or collection of metadata (like a potential Football Player schema would include their name, roster number, position, etc.). These help objectify groups of data to have a defined identity so they can be used in a means that makes sense to the user.

2. Workflows and Lifecycles

Nuxeo Studio provides a nice visual Lifecycle tool to set-up all the possible document states. This includes the starting state and all the possible paths from that state. With this, the studio provides a visual workflow tool that helps users make a roadmap on how documents are handled by users, and how it affects its lifecycle state.

3. Structure Templates

This tool alleviates any unnecessary work to manually create documents, by simply creating a template that automatically produces them. The user can define rules of what type of documents can be created, along with setting up an automatic control list of permissions for the created documents.

4. Content View Customization

Here, the user can define how content is displayed on the platform, as well as define the filter rules on how content can be organized and searched for. To do this, Nuxeo provides NXQL (the Nuxeo Query Language) as a means to query data from its database. It's a handy language to pick up, and allows the content view to gain access to specific metadata so it can display them in a fashion that suits the users needs.

5. Automation Functions

Users are able to create users actions, automation chains, or event handlers, which allows top-level programming for almost everything with the users content. For automation chains, users can define a string of operations, like simply changing a document property. For user actions, users can apply those automation chains to be triggered when a user does something, like click a button. And for event handlers, users can set an automation chain to be triggered when a special document event happens, like when one is created.

While all of these are standout features of Nuxeo Studio, there are still more things the service can provide.Nuxeo has a vast amount of documentation posted online for everything above, and much more. You can find more information at

1 comment

By Greg McAvoy-Jensen10/30/2013 11:32 am

Greg McAvoy-Jensen with Mt. Reba in the background

Aleksander Farstad presented plans for eZ Systems' strategy for the coming months on eZ Sessions.

The co-founder and CEO of eZ Systems, Farstad discussed the priority of helping businesses draw economic results from their content. Recent cost-cutting measures have freed up funds which will be used to increase marketing and bring product development to its highest level yet. Some global corporate functions will be moved to New York, where one of the product managers is already based.

The presentation was part of eZ Sessions, a monthly YouTube broadcast provided by the eZ Community in North America.



By Greg McAvoy-Jensen02/11/2013 02:43 pm

Greg McAvoy-Jensen with Mt. Reba in the background

Not every edit to a website is a good one. But for users of the eZ Publish content management system, it's easy to roll back to a prior version. This video shows you how. The video is recorded in HD so feel free to select that on the player for optimal full screen viewing.


By Greg McAvoy-Jensen01/24/2013 10:00 am

Greg McAvoy-Jensen with Mt. Reba in the background

Learn how to add images to your eZ Publish content management system. Two techniques are demonstrated: using an image gallery already on the site, and uploading a new image. The video is recorded in HD so feel free to select that on the player for optimal full screen viewing.


By Greg McAvoy-Jensen01/22/2013 04:47 pm

Greg McAvoy-Jensen with Mt. Reba in the background

Ready to dive into managing your eZ Publish website? Here's the first step: learning how to log in, find the content you want to change, and make some edits.

The video is recorded in HD so feel free to select that on the player for optimal full screen viewing.



Helping web content managers extend their reach and be ready for tomorrow. The Granite Horizon blog by executive director Greg McAvoy-Jensen and guests.

Keep your eye
on the horizon.

RSS Feed Icon RSS Feed

Subscribe via email using feedburner.