How to Build a Free SharePoint Alternative: Intranet Setup with Joomla, Document Management & Calendar Integration


2 views

When organizations migrate from Windows Small Business Server (SBS) to standalone Server 2003, they often lose built-in SharePoint functionality. Many teams suddenly find themselves without:

  • Centralized document repositories
  • Internal communication channels
  • Collaboration calendars
  • Standard Operating Procedure (SOP) access points

Joomla provides a robust CMS framework for intranet development. Here's a basic LAMP stack setup for Ubuntu:

# Install prerequisites
sudo apt update
sudo apt install apache2 mysql-server php libapache2-mod-php php-mysql

# Download Joomla
wget https://downloads.joomla.org/cms/joomla4/4-3-4/Joomla_4-3-4-Stable-Full_Package.zip
unzip Joomla_*.zip -d /var/www/html/intranet
chown -R www-data:www-data /var/www/html/intranet

These Joomla extensions recreate core SharePoint functionality:

Feature Extension Cost
Document Management DOCman Free
Calendar JEvents Free/Paid
News Management K2 Free
User Permissions AdminExile Free

DOCman provides versioning similar to SharePoint. Sample PHP hook for document upload notifications:

// In your custom plugin
defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\Mail\Mail;

class plgContentDocNotifier extends JPlugin
{
    public function onDocmanAfterUpload($document)
    {
        $mailer = Factory::getMailer();
        $config = Factory::getConfig();
        
        $mailer->setSender($config->get('mailfrom'));
        $mailer->addRecipient('team@company.com');
        $mailer->setSubject('New Document: ' . $document->docname);
        $mailer->setBody("A new version of {$document->docname} was uploaded");
        
        $mailer->Send();
    }
}

JEvents can be configured to show department-specific calendars using SQL overrides:

// In jevents_overrides.php
function getCalendarsByDepartment($dept)
{
    $db = JFactory::getDbo();
    $query = $db->getQuery(true)
        ->select('*')
        ->from('#__jevents_icsfile')
        ->where($db->quoteName('access') . ' = ' . $db->quote($dept));
        
    $db->setQuery($query);
    return $db->loadObjectList();
}

Create a cron job to check SOP document freshness:

#!/bin/bash
# /etc/cron.weekly/sop_checker

DB_USER="joomla_user"
DB_PASS="yourpassword"
DB_NAME="joomla_db"

outdated_docs=$(mysql -u$DB_USER -p$DB_PASS $DB_NAME -Bse \
"SELECT id, title FROM jos_docman 
WHERE modified_time < DATE_SUB(NOW(), INTERVAL 90 DAY) 
AND category_id = 'SOP_CATEGORY_ID'")

if [ -n "$outdated_docs" ]; then
    echo "Outdated SOPs:" >> /var/log/sop_check.log
    echo "$outdated_docs" >> /var/log/sop_check.log
    # Add email notification logic here
fi

html

Many organizations face budget constraints when migrating from SharePoint, especially after moving away from bundled solutions like SBS Server. A self-hosted intranet using open-source tools can provide document management, calendars, and news feeds at minimal cost.

  • CMS Platform: Joomla (as mentioned) or WordPress
  • Document Management: Alfresco Community Edition
  • Calendar: Nextcloud's Calendar app
  • Authentication: LDAP integration with Active Directory

1. Server Setup

For a Windows Server 2003 environment:

# Install WAMP stack (Windows/Apache/MySQL/PHP)
choco install wamp-server -y

2. Joomla Configuration

After installing Joomla, enable these extensions:

// Sample PHP snippet for document links
function generateDocLink($docPath) {
    return '<a href="'.JURI::root().'docs/'.$docPath.'" class="sop-link">'.basename($docPath).'</a>';
}

3. Document Management Integration

Alfresco configuration snippet for REST API:

// JavaScript fetch example
fetch('http://alfresco:8080/alfresco/api/-default-/public/alfresco/versions/1/nodes', {
  headers: new Headers({
    'Authorization': 'Basic ' + btoa('admin:admin')
  })
})
.then(response => response.json())
.then(data => displayDocuments(data));

For a SharePoint-like interface:

/* CSS for dashboard layout */
.intranet-dashboard {
  display: grid;
  grid-template-columns: 25% 50% 25%;
  grid-gap: 15px;
}
.news-widget, .calendar-widget {
  border: 1px solid #e1e1e1;
  padding: 10px;
}

Set up automated backups using PowerShell:

# Backup script for Joomla
$date = Get-Date -Format "yyyyMMdd"
Compress-Archive -Path "C:\wamp\www\intranet" -DestinationPath "D:\backups\intranet_$date.zip"
  • Implement HTTPS using Let's Encrypt
  • Regularly update Joomla components
  • Use Active Directory for centralized auth