{"id":451,"date":"2025-05-05T20:58:45","date_gmt":"2025-05-05T20:58:45","guid":{"rendered":"https:\/\/www.aran.cat\/wp\/?p=451"},"modified":"2025-05-05T21:09:24","modified_gmt":"2025-05-05T21:09:24","slug":"liferay-portal","status":"publish","type":"post","link":"https:\/\/www.aran.cat\/wp\/?p=451","title":{"rendered":"Liferay Portal"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">Instal\u00b7laci\u00f3 de Liferay Portal per a Intranet\/Extranet amb WildFly, PostgreSQL i Debian 12<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Aquesta guia detallada us ajudar\u00e0 a configurar un entorn Liferay per a la vostra organitzaci\u00f3 amb les caracter\u00edstiques sol\u00b7licitades.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Requisits previs<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">1.1. Requisits del sistema<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Servidor Debian 12 (recomanat m\u00ednim 8GB RAM, 4 cores, 100GB d&#8217;emmagatzematge)<\/li>\n\n\n\n<li>Java JDK 11 (recomanat OpenJDK)<\/li>\n\n\n\n<li>WildFly 26+<\/li>\n\n\n\n<li>PostgreSQL 14+<\/li>\n\n\n\n<li>Liferay DXP 7.4 (recomanat \u00faltima versi\u00f3 estable)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">1.2. Paquets necessaris<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt update\nsudo apt install -y openjdk-11-jdk postgresql postgresql-client unzip<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">2. Instal\u00b7laci\u00f3 de PostgreSQL<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">2.1. Configuraci\u00f3 de la base de dades<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo -u postgres psql<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dins de PostgreSQL:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE DATABASE liferaydb WITH ENCODING 'UTF8';\nCREATE USER liferayuser WITH PASSWORD 'P@ssw0rdComplex';\nGRANT ALL PRIVILEGES ON DATABASE liferaydb TO liferayuser;\n\\q<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">2.2. Configuraci\u00f3 de PostgreSQL<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Editeu <code>\/etc\/postgresql\/14\/main\/postgresql.conf<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>max_connections = 500\nshared_buffers = 2GB\nwork_mem = 16MB<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Reiniciar PostgreSQL:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl restart postgresql<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">3. Instal\u00b7laci\u00f3 de WildFly<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">3.1. Descarrega i instal\u00b7laci\u00f3<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>wget https:\/\/download.jboss.org\/wildfly\/26.1.1.Final\/wildfly-26.1.1.Final.zip\nunzip wildfly-26.1.1.Final.zip\nsudo mv wildfly-26.1.1.Final \/opt\/wildfly<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">3.2. Configuraci\u00f3 com a servei<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo groupadd -r wildfly\nsudo useradd -r -g wildfly -d \/opt\/wildfly -s \/sbin\/nologin wildfly\nsudo chown -R wildfly:wildfly \/opt\/wildfly<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Creeu <code>\/etc\/systemd\/system\/wildfly.service<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;Unit]\nDescription=WildFly Application Server\nAfter=syslog.target network.target\n\n&#91;Service]\nUser=wildfly\nGroup=wildfly\nExecStart=\/opt\/wildfly\/bin\/standalone.sh -b=0.0.0.0 -bmanagement=0.0.0.0\nRestart=on-abnormal\n\n&#91;Install]\nWantedBy=multi-user.target<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Inicieu el servei:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl daemon-reload\nsudo systemctl enable wildfly\nsudo systemctl start wildfly<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">4. Instal\u00b7laci\u00f3 de Liferay DXP<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">4.1. Preparaci\u00f3 de l&#8217;entorn<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>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\nunzip liferay-portal-tomcat-bundle-7.4.3.112-ga113.zip\nmv liferay-portal-7.4.3.112-ga113 \/opt\/liferay<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">4.2. Configuraci\u00f3 per a WildFly<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Copieu els arxius WAR necessaris al directori de desplegament de WildFly:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cp \/opt\/liferay\/osgi\/war\/*.war \/opt\/wildfly\/standalone\/deployments\/<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">4.3. Configuraci\u00f3 de Liferay<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Creeu <code>\/opt\/liferay\/portal-ext.properties<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>jdbc.default.driverClassName=org.postgresql.Driver\njdbc.default.url=jdbc:postgresql:\/\/localhost:5432\/liferaydb\njdbc.default.username=liferayuser\njdbc.default.password=P@ssw0rdComplex\n\nliferay.home=\/opt\/liferay<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">4.4. Iniciar Liferay<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>\/opt\/liferay\/tomcat-9.0.56\/bin\/startup.sh<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">5. Integraci\u00f3 amb Active Directory<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">5.1. Configuraci\u00f3 inicial<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Accediu a http:\/\/localhost:8080<\/li>\n\n\n\n<li>Completeu l&#8217;assistent d&#8217;instal\u00b7laci\u00f3 inicial<\/li>\n\n\n\n<li>Anar a Control Panel \u2192 Configuration \u2192 System Settings \u2192 Authentication<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">5.2. Configuraci\u00f3 LDAP<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>A System Settings, busqueu \u00abLDAP\u00bb<\/li>\n\n\n\n<li>Configureu les connexions LDAP:<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Enabled: Yes<\/li>\n\n\n\n<li>Base Provider URL: ldap:\/\/your-ad-server:389<\/li>\n\n\n\n<li>Base DN: DC=yourdomain,DC=com<\/li>\n\n\n\n<li>Principal: CN=ldapuser,OU=ServiceAccounts,DC=yourdomain,DC=com<\/li>\n\n\n\n<li>Credentials: password<\/li>\n\n\n\n<li>User Mapping:\n<ul class=\"wp-block-list\">\n<li>Screen Name: sAMAccountName<\/li>\n\n\n\n<li>Email Address: mail<\/li>\n\n\n\n<li>First Name: givenName<\/li>\n\n\n\n<li>Last Name: sn<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Group Mapping:\n<ul class=\"wp-block-list\">\n<li>Group Name: cn<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Import Method: User Groups<\/li>\n\n\n\n<li>User Custom Attributes: (map any additional needed attributes)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">5.3. Sincronitzaci\u00f3 de grups<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>A LDAP Groups, configureu:<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Group Search Filter: (objectClass=group)<\/li>\n\n\n\n<li>Groups DN: OU=Organitzacio,DC=yourdomain,DC=com<\/li>\n\n\n\n<li>Group Name: cn<\/li>\n\n\n\n<li>Import Group: Yes<\/li>\n\n\n\n<li>Create Role per Group Type: Yes<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">5.4. Configuraci\u00f3 d&#8217;autenticaci\u00f3<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>A System Settings \u2192 Authentication \u2192 LDAP, configureu:<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Required: Yes<\/li>\n\n\n\n<li>Password Policy: Use LDAP Password Policy<\/li>\n\n\n\n<li>Import on Login: Yes<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">6. Configuraci\u00f3 dels llocs departamentals<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">6.1. Plantilla de lloc<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Creeu una plantilla de lloc (Site Template) per als llocs p\u00fablics:<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Control Panel \u2192 Sites \u2192 Site Templates<\/li>\n\n\n\n<li>Creeu una plantilla amb les p\u00e0gines necess\u00e0ries (Home, News, Resources, etc.)<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Creeu una altra plantilla per als llocs privats<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">6.2. Automatitzaci\u00f3 de creaci\u00f3 de llocs<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Podeu utilitzar un script Groovy per automatitzar la creaci\u00f3 de llocs:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import com.liferay.portal.kernel.service.*\nimport com.liferay.portal.kernel.model.*\n\n\/\/ Obtenir serveis\ngroupLocalService = GroupLocalServiceUtil\nroleLocalService = RoleLocalServiceUtil\nuserGroupLocalService = UserGroupLocalServiceUtil\n\n\/\/ Obtenir plantilles\npublicTemplate = groupLocalService.getGroup(companyId, \"PUBLIC_TEMPLATE_NAME\")\nprivateTemplate = groupLocalService.getGroup(companyId, \"PRIVATE_TEMPLATE_NAME\")\n\n\/\/ Obtenir tots els grups LDAP que comencen amb \"Organitzacio_\"\nldapGroups = userGroupLocalService.getUserGroups(-1, -1).findAll { \n    it.name.startsWith(\"Organitzacio_\") \n}\n\nldapGroups.each { group -&gt;\n    deptName = group.name.replace(\"Organitzacio_\", \"\")\n\n    \/\/ Crear lloc p\u00fablic\n    publicSite = groupLocalService.addGroup(\n        userId, GroupConstants.DEFAULT_PARENT_GROUP_ID, \n        Group.class.getName(), 0, GroupConstants.DEFAULT_LIVE_GROUP_ID,\n        \"Organitzaci\u00f3 ${deptName}\", null, 0, true, \n        GroupConstants.DEFAULT_MEMBERSHIP_RESTRICTION, \n        \"\/${deptName.toLowerCase()}\", true, true, null)\n\n    \/\/ Crear lloc privat\n    privateSite = groupLocalService.addGroup(\n        userId, GroupConstants.DEFAULT_PARENT_GROUP_ID, \n        Group.class.getName(), 0, GroupConstants.DEFAULT_LIVE_GROUP_ID,\n        \"Organitzaci\u00f3 ${deptName} (Privat)\", null, 0, true, \n        GroupConstants.DEFAULT_MEMBERSHIP_RESTRICTION, \n        \"\/private-${deptName.toLowerCase()}\", true, true, null)\n\n    \/\/ Aplicar plantilles\n    LayoutLocalServiceUtil.copyLayouts(\n        publicTemplate.getGroupId(), false, publicSite.getGroupId(), false)\n    LayoutLocalServiceUtil.copyLayouts(\n        privateTemplate.getGroupId(), false, privateSite.getGroupId(), false)\n\n    \/\/ Assignar permisos\n    \/\/ (afegiu aqu\u00ed la l\u00f2gica per assignar permisos als grups LDAP corresponents)\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">7. Creaci\u00f3 del Theme personalitzat<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">7.1. Crear un nou theme<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>cd \/opt\/liferay\nblade create -t theme my-custom-theme\ncd my-custom-theme<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">7.2. Configuraci\u00f3 del theme<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Editeu <code>src\/WEB-INF\/liferay-plugin-package.properties<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>name=My Custom Theme\nmodule-group-id=liferay\nmodule-incremental-version=1\ntags=\nshort-description=\nchange-log=\npage-url=http:\/\/www.liferay.com\nauthor=Your Name\nlicenses=LGPL\nliferay-versions=7.4.3.112\ntheme.parent=classic<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">7.3. Implementaci\u00f3 del men\u00fa din\u00e0mic<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Editeu <code>src\/META-INF\/resources\/_diffs\/templates\/portal_normal.ftl<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;#assign public_sites = restClient.get(\"\/sites?filter=name+eq+'Organitzaci\u00f3*'&amp;fields=name,friendlyURL\") \/&gt;\n&lt;#assign user_sites = restClient.get(\"\/user\/me\/sites?fields=name,friendlyURL\") \/&gt;\n\n&lt;nav class=\"navbar navbar-expand-lg navbar-dark bg-dark\"&gt;\n    &lt;div class=\"collapse navbar-collapse\"&gt;\n        &lt;ul class=\"navbar-nav mr-auto\"&gt;\n            &lt;li class=\"nav-item dropdown\"&gt;\n                &lt;a class=\"nav-link dropdown-toggle\" href=\"#\" id=\"publicSitesDropdown\" role=\"button\" data-toggle=\"dropdown\"&gt;\n                    Departaments P\u00fablics\n                &lt;\/a&gt;\n                &lt;div class=\"dropdown-menu\"&gt;\n                    &lt;#list public_sites.items as site&gt;\n                        &lt;a class=\"dropdown-item\" href=\"${site.friendlyURL}\"&gt;${site.name}&lt;\/a&gt;\n                    &lt;\/#list&gt;\n                &lt;\/div&gt;\n            &lt;\/li&gt;\n            &lt;li class=\"nav-item dropdown\"&gt;\n                &lt;a class=\"nav-link dropdown-toggle\" href=\"#\" id=\"privateSitesDropdown\" role=\"button\" data-toggle=\"dropdown\"&gt;\n                    Els meus espais\n                &lt;\/a&gt;\n                &lt;div class=\"dropdown-menu\"&gt;\n                    &lt;#list user_sites.items as site&gt;\n                        &lt;a class=\"dropdown-item\" href=\"${site.friendlyURL}\"&gt;${site.name}&lt;\/a&gt;\n                    &lt;\/#list&gt;\n                &lt;\/div&gt;\n            &lt;\/li&gt;\n        &lt;\/ul&gt;\n    &lt;\/div&gt;\n&lt;\/nav&gt;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">7.4. Desplegar el theme<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>blade deploy<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">8. Configuraci\u00f3 de les condicions d&#8217;\u00fas<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">8.1. Crear un formulari personalitzat<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Anar a Control Panel \u2192 Forms<\/li>\n\n\n\n<li>Creeu un nou formulari amb els camps necessaris (Acceptaci\u00f3 de condicions)<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">8.2. Configuraci\u00f3 del proc\u00e9s d&#8217;acceptaci\u00f3<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Creeu un hook personalitzat per interceptar el primer login:<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>@Component(\n    immediate = true,\n    service = ServletContextFilter.class\n)\npublic class TermsAcceptanceFilter implements ServletContextFilter {\n    @Override\n    public void doFilter(\n        ServletRequest servletRequest, ServletResponse servletResponse,\n        FilterChain filterChain)\n        throws IOException, ServletException {\n\n        HttpServletRequest request = (HttpServletRequest)servletRequest;\n        HttpServletResponse response = (HttpServletResponse)servletResponse;\n\n        try {\n            User user = PortalUtil.getUser(request);\n\n            if (user != null &amp;&amp; !isTermsAccepted(user)) {\n                if (!request.getRequestURI().contains(\"\/accept-terms\")) {\n                    response.sendRedirect(\"\/accept-terms\");\n                    return;\n                }\n            }\n        } catch (Exception e) {\n            _log.error(e);\n        }\n\n        filterChain.doFilter(servletRequest, servletResponse);\n    }\n\n    private boolean isTermsAccepted(User user) {\n        \/\/ Implementar l\u00f2gica per comprovar si l'usuari ha acceptat les condicions\n    }\n\n    private static final Log _log = LogFactoryUtil.getLog(TermsAcceptanceFilter.class);\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">8.3. P\u00e0gina d&#8217;acceptaci\u00f3 de condicions<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Creeu una p\u00e0gina personalitzada amb el formulari i la l\u00f2gica per registrar l&#8217;acceptaci\u00f3.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">9. Configuraci\u00f3 de notificacions<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">9.1. Crear un servei de notificacions<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Implementeu un servei per gestionar notificacions:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Component(service = NotificationService.class)\npublic class NotificationServiceImpl implements NotificationService {\n\n    @Reference\n    private UserNotificationEventLocalService _userNotificationEventLocalService;\n\n    public void sendNotification(long userId, String message) {\n        JSONObject payload = JSONFactoryUtil.createJSONObject();\n        payload.put(\"message\", message);\n\n        _userNotificationEventLocalService.addUserNotificationEvent(\n            userId,\n            \"notification-portlet\",\n            System.currentTimeMillis(),\n            userId,\n            payload.toString(),\n            false,\n            null);\n    }\n\n    public void markAsRead(long notificationId) {\n        UserNotificationEvent notification = \n            _userNotificationEventLocalService.getUserNotificationEvent(notificationId);\n\n        notification.setArchived(true);\n        _userNotificationEventLocalService.updateUserNotificationEvent(notification);\n    }\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">9.2. Registrar acceptacions<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Creeu una taula personalitzada per registrar les acceptacions de notificacions:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE TABLE notification_acceptance (\n    acceptanceId BIGSERIAL PRIMARY KEY,\n    userId BIGINT NOT NULL,\n    notificationId BIGINT NOT NULL,\n    acceptanceDate TIMESTAMP NOT NULL,\n    FOREIGN KEY (userId) REFERENCES User_(userId)\n);<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">10. Configuraci\u00f3 final<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">10.1. Configuraci\u00f3 de seguretat<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Assegureu-vos que totes les p\u00e0gines requereixen autenticaci\u00f3:<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Control Panel \u2192 Configuration \u2192 System Settings \u2192 Security \u2192 SSO<\/li>\n\n\n\n<li>Marqueu \u00abRequire Authentication to Access the Site\u00bb<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">10.2. Configuraci\u00f3 de mem\u00f2ria per a WildFly<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Editeu <code>\/opt\/wildfly\/bin\/standalone.conf<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>JAVA_OPTS=\"-Xms4g -Xmx8g -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=1024M\"<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">10.3. Reiniciar i verificar<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo systemctl restart wildfly\n\/opt\/liferay\/tomcat-9.0.56\/bin\/shutdown.sh\n\/opt\/liferay\/tomcat-9.0.56\/bin\/startup.sh<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">11. Manteniment i monitoritzaci\u00f3<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">11.1. Tasques programades<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Configureu tasques programades per:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Sincronitzaci\u00f3 regular amb AD<\/li>\n\n\n\n<li>Neteja de notificacions antigues<\/li>\n\n\n\n<li>Backups regulars<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">11.2. Monitoritzaci\u00f3<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Configureu eines com:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Prometheus + Grafana per a m\u00e8triques<\/li>\n\n\n\n<li>ELK Stack per a logs<\/li>\n\n\n\n<li>Alertes per a problemes de rendiment<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Aquesta configuraci\u00f3 proporcionar\u00e0 una plataforma robusta per a la vostra intranet\/extranet amb totes les caracter\u00edstiques sol\u00b7licitades. Recordeu adaptar les contrasenyes i els valors espec\u00edfics del vostre entorn AD abans de posar en producci\u00f3 el sistema.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Instal\u00b7laci\u00f3 de Liferay Portal per a Intranet\/Extranet amb WildFly, PostgreSQL i Debian 12 Aquesta guia detallada us ajudar\u00e0 a configurar un entorn Liferay per a la vostra organitzaci\u00f3 amb les caracter\u00edstiques sol\u00b7licitades. 1. Requisits previs 1.1. Requisits del sistema 1.2. Paquets necessaris 2. Instal\u00b7laci\u00f3 de PostgreSQL 2.1. Configuraci\u00f3 de la [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[8,5,16,18,4,9],"tags":[],"class_list":["post-451","post","type-post","status-publish","format-standard","hentry","category-apache","category-debian","category-informatica","category-java","category-programari-lliure","category-tomcat"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.aran.cat\/wp\/index.php?rest_route=\/wp\/v2\/posts\/451","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.aran.cat\/wp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.aran.cat\/wp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.aran.cat\/wp\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.aran.cat\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=451"}],"version-history":[{"count":1,"href":"https:\/\/www.aran.cat\/wp\/index.php?rest_route=\/wp\/v2\/posts\/451\/revisions"}],"predecessor-version":[{"id":452,"href":"https:\/\/www.aran.cat\/wp\/index.php?rest_route=\/wp\/v2\/posts\/451\/revisions\/452"}],"wp:attachment":[{"href":"https:\/\/www.aran.cat\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=451"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.aran.cat\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=451"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.aran.cat\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=451"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}