Liferay Portal

Instal·lació de Liferay Portal per a Intranet/Extranet amb WildFly, PostgreSQL i Debian 12

Aquesta guia detallada us ajudarà a configurar un entorn Liferay per a la vostra organització amb les característiques sol·licitades.

1. Requisits previs

1.1. Requisits del sistema

  • Servidor Debian 12 (recomanat mínim 8GB RAM, 4 cores, 100GB d’emmagatzematge)
  • Java JDK 11 (recomanat OpenJDK)
  • WildFly 26+
  • PostgreSQL 14+
  • Liferay DXP 7.4 (recomanat última versió estable)

1.2. Paquets necessaris

sudo apt update
sudo apt install -y openjdk-11-jdk postgresql postgresql-client unzip

2. Instal·lació de PostgreSQL

2.1. Configuració de la base de dades

sudo -u postgres psql

Dins de PostgreSQL:

CREATE DATABASE liferaydb WITH ENCODING 'UTF8';
CREATE USER liferayuser WITH PASSWORD 'P@ssw0rdComplex';
GRANT ALL PRIVILEGES ON DATABASE liferaydb TO liferayuser;
\q

2.2. Configuració de PostgreSQL

Editeu /etc/postgresql/14/main/postgresql.conf:

max_connections = 500
shared_buffers = 2GB
work_mem = 16MB

Reiniciar PostgreSQL:

sudo systemctl restart postgresql

3. Instal·lació de WildFly

3.1. Descarrega i instal·lació

wget https://download.jboss.org/wildfly/26.1.1.Final/wildfly-26.1.1.Final.zip
unzip wildfly-26.1.1.Final.zip
sudo mv wildfly-26.1.1.Final /opt/wildfly

3.2. Configuració com a servei

sudo groupadd -r wildfly
sudo useradd -r -g wildfly -d /opt/wildfly -s /sbin/nologin wildfly
sudo chown -R wildfly:wildfly /opt/wildfly

Creeu /etc/systemd/system/wildfly.service:

[Unit]
Description=WildFly Application Server
After=syslog.target network.target

[Service]
User=wildfly
Group=wildfly
ExecStart=/opt/wildfly/bin/standalone.sh -b=0.0.0.0 -bmanagement=0.0.0.0
Restart=on-abnormal

[Install]
WantedBy=multi-user.target

Inicieu el servei:

sudo systemctl daemon-reload
sudo systemctl enable wildfly
sudo systemctl start wildfly

4. Instal·lació de Liferay DXP

4.1. Preparació de l’entorn

wget https://repository.liferay.com/nexus/service/local/repositories/liferay-public-releases/content/com/liferay/portal/liferay-portal-tomcat-bundle/7.4.3.112-ga113/liferay-portal-tomcat-bundle-7.4.3.112-ga113.zip
unzip liferay-portal-tomcat-bundle-7.4.3.112-ga113.zip
mv liferay-portal-7.4.3.112-ga113 /opt/liferay

4.2. Configuració per a WildFly

Copieu els arxius WAR necessaris al directori de desplegament de WildFly:

cp /opt/liferay/osgi/war/*.war /opt/wildfly/standalone/deployments/

4.3. Configuració de Liferay

Creeu /opt/liferay/portal-ext.properties:

jdbc.default.driverClassName=org.postgresql.Driver
jdbc.default.url=jdbc:postgresql://localhost:5432/liferaydb
jdbc.default.username=liferayuser
jdbc.default.password=P@ssw0rdComplex

liferay.home=/opt/liferay

4.4. Iniciar Liferay

/opt/liferay/tomcat-9.0.56/bin/startup.sh

5. Integració amb Active Directory

5.1. Configuració inicial

  1. Accediu a http://localhost:8080
  2. Completeu l’assistent d’instal·lació inicial
  3. Anar a Control Panel → Configuration → System Settings → Authentication

5.2. Configuració LDAP

  1. A System Settings, busqueu “LDAP”
  2. Configureu les connexions LDAP:
  • Enabled: Yes
  • Base Provider URL: ldap://your-ad-server:389
  • Base DN: DC=yourdomain,DC=com
  • Principal: CN=ldapuser,OU=ServiceAccounts,DC=yourdomain,DC=com
  • Credentials: password
  • User Mapping:
    • Screen Name: sAMAccountName
    • Email Address: mail
    • First Name: givenName
    • Last Name: sn
  • Group Mapping:
    • Group Name: cn
  • Import Method: User Groups
  • User Custom Attributes: (map any additional needed attributes)

5.3. Sincronització de grups

  1. A LDAP Groups, configureu:
  • Group Search Filter: (objectClass=group)
  • Groups DN: OU=Organitzacio,DC=yourdomain,DC=com
  • Group Name: cn
  • Import Group: Yes
  • Create Role per Group Type: Yes

5.4. Configuració d’autenticació

  1. A System Settings → Authentication → LDAP, configureu:
  • Required: Yes
  • Password Policy: Use LDAP Password Policy
  • Import on Login: Yes

6. Configuració dels llocs departamentals

6.1. Plantilla de lloc

  1. Creeu una plantilla de lloc (Site Template) per als llocs públics:
  • Control Panel → Sites → Site Templates
  • Creeu una plantilla amb les pàgines necessàries (Home, News, Resources, etc.)
  1. Creeu una altra plantilla per als llocs privats

6.2. Automatització de creació de llocs

Podeu utilitzar un script Groovy per automatitzar la creació de llocs:

import com.liferay.portal.kernel.service.*
import com.liferay.portal.kernel.model.*

// Obtenir serveis
groupLocalService = GroupLocalServiceUtil
roleLocalService = RoleLocalServiceUtil
userGroupLocalService = UserGroupLocalServiceUtil

// Obtenir plantilles
publicTemplate = groupLocalService.getGroup(companyId, "PUBLIC_TEMPLATE_NAME")
privateTemplate = groupLocalService.getGroup(companyId, "PRIVATE_TEMPLATE_NAME")

// Obtenir tots els grups LDAP que comencen amb "Organitzacio_"
ldapGroups = userGroupLocalService.getUserGroups(-1, -1).findAll { 
    it.name.startsWith("Organitzacio_") 
}

ldapGroups.each { group ->
    deptName = group.name.replace("Organitzacio_", "")

    // Crear lloc públic
    publicSite = groupLocalService.addGroup(
        userId, GroupConstants.DEFAULT_PARENT_GROUP_ID, 
        Group.class.getName(), 0, GroupConstants.DEFAULT_LIVE_GROUP_ID,
        "Organització ${deptName}", null, 0, true, 
        GroupConstants.DEFAULT_MEMBERSHIP_RESTRICTION, 
        "/${deptName.toLowerCase()}", true, true, null)

    // Crear lloc privat
    privateSite = groupLocalService.addGroup(
        userId, GroupConstants.DEFAULT_PARENT_GROUP_ID, 
        Group.class.getName(), 0, GroupConstants.DEFAULT_LIVE_GROUP_ID,
        "Organització ${deptName} (Privat)", null, 0, true, 
        GroupConstants.DEFAULT_MEMBERSHIP_RESTRICTION, 
        "/private-${deptName.toLowerCase()}", true, true, null)

    // Aplicar plantilles
    LayoutLocalServiceUtil.copyLayouts(
        publicTemplate.getGroupId(), false, publicSite.getGroupId(), false)
    LayoutLocalServiceUtil.copyLayouts(
        privateTemplate.getGroupId(), false, privateSite.getGroupId(), false)

    // Assignar permisos
    // (afegiu aquí la lògica per assignar permisos als grups LDAP corresponents)
}

7. Creació del Theme personalitzat

7.1. Crear un nou theme

cd /opt/liferay
blade create -t theme my-custom-theme
cd my-custom-theme

7.2. Configuració del theme

Editeu src/WEB-INF/liferay-plugin-package.properties:

name=My Custom Theme
module-group-id=liferay
module-incremental-version=1
tags=
short-description=
change-log=
page-url=http://www.liferay.com
author=Your Name
licenses=LGPL
liferay-versions=7.4.3.112
theme.parent=classic

7.3. Implementació del menú dinàmic

Editeu src/META-INF/resources/_diffs/templates/portal_normal.ftl:

<#assign public_sites = restClient.get("/sites?filter=name+eq+'Organització*'&fields=name,friendlyURL") />
<#assign user_sites = restClient.get("/user/me/sites?fields=name,friendlyURL") />

<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
    <div class="collapse navbar-collapse">
        <ul class="navbar-nav mr-auto">
            <li class="nav-item dropdown">
                <a class="nav-link dropdown-toggle" href="#" id="publicSitesDropdown" role="button" data-toggle="dropdown">
                    Departaments Públics
                </a>
                <div class="dropdown-menu">
                    <#list public_sites.items as site>
                        <a class="dropdown-item" href="${site.friendlyURL}">${site.name}</a>
                    </#list>
                </div>
            </li>
            <li class="nav-item dropdown">
                <a class="nav-link dropdown-toggle" href="#" id="privateSitesDropdown" role="button" data-toggle="dropdown">
                    Els meus espais
                </a>
                <div class="dropdown-menu">
                    <#list user_sites.items as site>
                        <a class="dropdown-item" href="${site.friendlyURL}">${site.name}</a>
                    </#list>
                </div>
            </li>
        </ul>
    </div>
</nav>

7.4. Desplegar el theme

blade deploy

8. Configuració de les condicions d’ús

8.1. Crear un formulari personalitzat

  1. Anar a Control Panel → Forms
  2. Creeu un nou formulari amb els camps necessaris (Acceptació de condicions)

8.2. Configuració del procés d’acceptació

  1. Creeu un hook personalitzat per interceptar el primer login:
@Component(
    immediate = true,
    service = ServletContextFilter.class
)
public class TermsAcceptanceFilter implements ServletContextFilter {
    @Override
    public void doFilter(
        ServletRequest servletRequest, ServletResponse servletResponse,
        FilterChain filterChain)
        throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest)servletRequest;
        HttpServletResponse response = (HttpServletResponse)servletResponse;

        try {
            User user = PortalUtil.getUser(request);

            if (user != null && !isTermsAccepted(user)) {
                if (!request.getRequestURI().contains("/accept-terms")) {
                    response.sendRedirect("/accept-terms");
                    return;
                }
            }
        } catch (Exception e) {
            _log.error(e);
        }

        filterChain.doFilter(servletRequest, servletResponse);
    }

    private boolean isTermsAccepted(User user) {
        // Implementar lògica per comprovar si l'usuari ha acceptat les condicions
    }

    private static final Log _log = LogFactoryUtil.getLog(TermsAcceptanceFilter.class);
}

8.3. Pàgina d’acceptació de condicions

Creeu una pàgina personalitzada amb el formulari i la lògica per registrar l’acceptació.

9. Configuració de notificacions

9.1. Crear un servei de notificacions

Implementeu un servei per gestionar notificacions:

@Component(service = NotificationService.class)
public class NotificationServiceImpl implements NotificationService {

    @Reference
    private UserNotificationEventLocalService _userNotificationEventLocalService;

    public void sendNotification(long userId, String message) {
        JSONObject payload = JSONFactoryUtil.createJSONObject();
        payload.put("message", message);

        _userNotificationEventLocalService.addUserNotificationEvent(
            userId,
            "notification-portlet",
            System.currentTimeMillis(),
            userId,
            payload.toString(),
            false,
            null);
    }

    public void markAsRead(long notificationId) {
        UserNotificationEvent notification = 
            _userNotificationEventLocalService.getUserNotificationEvent(notificationId);

        notification.setArchived(true);
        _userNotificationEventLocalService.updateUserNotificationEvent(notification);
    }
}

9.2. Registrar acceptacions

Creeu una taula personalitzada per registrar les acceptacions de notificacions:

CREATE TABLE notification_acceptance (
    acceptanceId BIGSERIAL PRIMARY KEY,
    userId BIGINT NOT NULL,
    notificationId BIGINT NOT NULL,
    acceptanceDate TIMESTAMP NOT NULL,
    FOREIGN KEY (userId) REFERENCES User_(userId)
);

10. Configuració final

10.1. Configuració de seguretat

  1. Assegureu-vos que totes les pàgines requereixen autenticació:
  • Control Panel → Configuration → System Settings → Security → SSO
  • Marqueu “Require Authentication to Access the Site”

10.2. Configuració de memòria per a WildFly

Editeu /opt/wildfly/bin/standalone.conf:

JAVA_OPTS="-Xms4g -Xmx8g -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=1024M"

10.3. Reiniciar i verificar

sudo systemctl restart wildfly
/opt/liferay/tomcat-9.0.56/bin/shutdown.sh
/opt/liferay/tomcat-9.0.56/bin/startup.sh

11. Manteniment i monitorització

11.1. Tasques programades

Configureu tasques programades per:

  • Sincronització regular amb AD
  • Neteja de notificacions antigues
  • Backups regulars

11.2. Monitorització

Configureu eines com:

  • Prometheus + Grafana per a mètriques
  • ELK Stack per a logs
  • Alertes per a problemes de rendiment

Aquesta configuració proporcionarà una plataforma robusta per a la vostra intranet/extranet amb totes les característiques sol·licitades. Recordeu adaptar les contrasenyes i els valors específics del vostre entorn AD abans de posar en producció el sistema.