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
- Accediu a http://localhost:8080
- Completeu l’assistent d’instal·lació inicial
- Anar a Control Panel → Configuration → System Settings → Authentication
5.2. Configuració LDAP
- A System Settings, busqueu “LDAP”
- 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
- 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ó
- 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
- 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.)
- 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
- Anar a Control Panel → Forms
- Creeu un nou formulari amb els camps necessaris (Acceptació de condicions)
8.2. Configuració del procés d’acceptació
- 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
- 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.