Alfresco
Alfresco in Docker
- prepare_acs.sh
apt install git docker docker-compose maven
mkdir myrepos
cd myrepos
# you need proxy for git,docker and wget ?
# git config --global http.proxy http://myproxy:3128
# git config --global https.proxy http://myproxy:3128
# export https_proxy='myproxy:3128'
# echo "HTTPS_PROXY=http://myproxy:3128" >>/etc/default/docker
# echo "HTTP_PROXY=http://myproxy:3128" >>/etc/default/docker
systemctl restart docker
git clone https://github.com/Alfresco/acs-deployment.git
cd acs-deployment-master/docker-compose
wget https://borwinius.de/wiki/lib/exe/fetch.php?media=linux:alfresco:acs_dk-compose.tar.gz -O acs_dk-compose.tar.gz
tar xvfz acs_dk-compose.tar.gz
# im tgz sind javascript-,totp-,systemmessages-AMPs drin.
# einmaliges Einsetzen des fqdn für SSl nötig
sed -i -e 's|mysrv.my.dom.ain|meintollerServer.meineDomain.com|g' share/Dockerfile
docker build share -t docker.io/alfresco/alfresco-share:25.2.0 -t docker.io/alfresco/alfresco-share-mytest:25.2.0
docker build repository -t alfresco/alfresco-content-repository-community:25.2.0 -t alfresco/acr-community-mytest:25.2.0
jetzt die Imagebezeichnungen und andere Einträge in compose.yaml
entsprechend abändern
sowie eigene Zertifikate konfigurieren.
compose.yaml:
alfresco:
...
-Dshare.host=meintollerServer.meineDomain.com
-Dshare.port=443
-Dshare.protocol=https
-Dalfresco.host=meintollerServer.meineDomain.com
-Dalfresco.port=8080
...
proxy:
image: alfresco/alfresco-acs-nginx:3.4.2
environment:
DOMAIN: "meintollerServer.meineDomain.com"
USE_SSL: "true"
ports:
- "443:443"
volumes:
- /var/dockerconfigs/nginx/etc/nginx/ssl/meintollerServer.key:/etc/nginx/ssl/cert.key
- /var/dockerconfigs/nginx/etc/nginx/ssl/meintollerServer.crt:/etc/nginx/ssl/cert.crt
dann probieren ob der Dockercontainer hochfährt.
docker-compose up
webseite: https://meintollerServer.meineDomain.com
acs_dk-compose.tar.gz
Anleitung: Sofort nach https://meintollerServer/share springen
Voraussetzung: Du hast als proxy das Image „alfresco/alfresco-acs-nginx:3.4.2“ installiert
Downloade, entpacke die Datei entrypoint.zip nach /var/dockerconfigs/nginx/
und mache sie ausführbar.
füge in der Datei compose.yaml
unter proxy
die Umgebungsvariable REWRITE_TO „/share“
unter environment:
hinzu.
proxy:
...
environment:
...
REWRITE_TO "/share"
...
füge in der Datei compose.yaml
die Zeile /var/dockerconfigs/nginx/entrypoint.sh:/entrypoint.sh
unter volumes:
hinzu.
volumes:
...
/var/dockerconfigs/nginx/entrypoint.sh:/entrypoint.sh
...
starte docker neu und prüfe ob die Umleitung von https://myalfsrv nach https://myalfsrv/share funktioniert.
Ende
Projektseiten erstellen
AMP-Datei für die Erstellung von Projektseiten:

createprojectsites_share.amp.zip
tomcat stoppen
backup des tomcat/webapps/share*
die AMP-Datei downloaden und das .zip
am Ende der Datei entfernen.
Datei in das Alfresco-verzeichnis unter amps_share
kopieren und mit /bin/apply_amps.sh
oder mit
java -jar bin/alfresco-mmt.jar install amps_share/createprojectsites_share.amp tomcat/webapps/share.war
installieren.
Es sollte kein Neustart von tomcat erforderlich sein.
AMP-Datei getestet mit acs 6.2, 7.0, 25.2.0(auf docker).
wenn benötigt, sollte die Site RM für Recordsmanagement vorher installiert worden sein.
cmisabfrage nach Projektseiten:
SELECT P.cmis:name FROM st:site AS P
JOIN st:sites AS S on P.st:sitePreset = S.st:sitePreset
WHERE P.st:sitePreset = 'Projectsite'
Siteerstellung nur durch Admin
Die einfachen Benutzer sollen selbst keine Sites erstellen können.
Die AMPS von https://github.com/jpotts/share-site-creators funktionieren manchmal nicht.
Dann muss man sich mit der Anleitung von http://blog.ingen.at/2014/02/alfresco-share-remove-create-site-link.html?m=1 behelfen.
Dadurch wird der Menüpunkt entfernt.
Die vier Dateien müssen in das Verzeichnis docker-compose/share/configs/
kopiert werden.
- remove-create-site-extension.xml
<extension>
<modules>
<module>
<id>Remove create site menu option for non admin users</id>
<version>1.0</version>
<customizations>
<customization>
<targetPackageRoot>org.alfresco.share.header</targetPackageRoot>
<sourcePackageRoot>rmcreatesite.header</sourcePackageRoot>
</customization>
<customization>
<targetPackageRoot>org.alfresco.components.dashlets</targetPackageRoot>
<sourcePackageRoot>rmcreatesite.dashlets</sourcePackageRoot>
</customization>
</customizations>
</module>
</modules>
</extension>
- share-header.get.js
//Find the "Sites" menu...
var sitesMenu = widgetUtils.findObject(model.jsonModel, "id", "HEADER_SITES_MENU");
if (sitesMenu != null) {
if (!user.isAdmin) {
sitesMenu.config.showCreateSite = false;
}
}
- my-sites.get.js
if (!user.isAdmin) {
model.showCreateSite = false;
}
- dynamic-welcome.get.js
if (args.dashboardType == "user" && !user.isAdmin) {
model.columns[1].actionMsg = null;
model.columns[1].actionHref = null;
}
anschließend muss das share/Dockerfile
angepasst werden damit die Dateien richtig platziert werden:
...
RUN mkdir -p $TOMCAT_DIR/shared/classes/alfresco/web-extension/site-data/extension
RUN mkdir -p $TOMCAT_DIR/shared/classes/alfresco/web-extension/site-webscripts/rmcreatesite/header
RUN mkdir -p $TOMCAT_DIR/shared/classes/alfresco/web-extension/site-webscripts/rmcreatesite/dashlets
ADD ./configs/remove-create-site-extension.xml $TOMCAT_DIR/shared/classes/alfresco/web-extension/site-data/extension/
ADD ./configs/share-header.get.js $TOMCAT_DIR/shared/classes/alfresco/web-extension/site-webscripts/rmcreatesite/header/
ADD ./configs/my-sites.get.js $TOMCAT_DIR/shared/classes/alfresco/web-extension/site-webscripts/rmcreatesite/dashlets/
ADD ./configs/dynamic-welcome.get.js $TOMCAT_DIR/shared/classes/alfresco/web-extension/site-webscripts/rmcreatesite/dashlets/
...
dann muss natürlich noch ein docker build
erfolgen.
cd mygitrepos/acs-deployment-master/docker-compose/
docker build share -t docker.io/alfresco/alfresco-share:25.2.0 -t docker.io/alfresco/alfresco-share-mytest:25.2.0
docker-compose up -d
Damit kann ein versierter benutzer aber immer noch per Curl einen neue Site erstellen.
Ende
Die Datei „mytomcat/webapps/share/WEB-INF/classes/alfresco/site-webscripts/org/alfresco/components/footer/footer.get_de.properties“
rauskopieren, anpassen und angepasste Datei kopieren nach:
mygitrepos/acs-deployment-master/docker-compose/share/configs/
Datei in share-Dockerfile integrieren mittels:
ADD ./conf/footer.get_de.properties $TOMCAT_DIR/webapps/share/WEB-INF/classes/alfresco/site-webscripts/org/alfresco/components/footer/
dann noch ein Docker build durchführen:
cd acs-deployment-master/docker-compose
docker build share -t docker.io/alfresco/alfresco-share:25.2.0 -t docker.io/alfresco/alfresco-share-mytest:25.2.0
docker-compose down
docker-compose up -d
Ende
Alfresco cronjob: Aspect einer Datei zufügen
alle 10 Minuten Dateien ermitteln, die den Aspect „generalclassifiable“ noch nicht haben und diesen zufügen.
Dazu die folgende Datei in das Verzeichnis mytomcat/shared/classes/alfresco/extension/
reinkopieren und neustarten.
- my-scheduled-action-services-context.xml
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>
<beans>
<!--
Define the model factory used to generate object models suitable for use with freemarker templates.
-->
<bean id="templateActionModelFactory" class="org.alfresco.repo.action.scheduled.FreeMarkerWithLuceneExtensionsModelFactory">
<property name="serviceRegistry">
<ref bean="ServiceRegistry"/>
</property>
</bean>
<!--
An example action template that defines an action to add the generalclassifiable aspect to all nodes that do not have
and add a category defined by path.
-->
<bean id="addClassifiableAspectAction" class="org.alfresco.repo.action.scheduled.SimpleTemplateActionDefinition">
<property name="actionName">
<value>add-features</value>
</property>
<property name="parameterTemplates">
<map>
<entry>
<key>
<value>aspect-name</value>
</key>
<value>{http://www.alfresco.org/model/content/1.0}generalclassifiable</value>
</entry>
<entry>
<key>
<value>{http://www.alfresco.org/model/content/1.0}categories</value>
</key>
<!-- Note - FreeMarker ${..} entries must be escaped in Spring context files
<value>\$\{selectSingleNode('workspace://SpacesStore', 'lucene', 'PATH:"/cm:generalclassifiable/cm:Languages/cm:English"' )\}</value>
-->
<value>\$\{selectSingleNode('workspace://SpacesStore', 'lucene', 'PATH:"/cm:generalclassifiable"' )\}</value>
</entry>
</map>
</property>
<property name="templateActionModelFactory">
<ref bean="templateActionModelFactory"/>
</property>
<property name="dictionaryService">
<ref bean="DictionaryService"/>
</property>
<property name="actionService">
<ref bean="ActionService"/>
</property>
<property name="templateService">
<ref bean="TemplateService"/>
</property>
</bean>
<!-- ######################################################################### -->
<bean id="addClassifiableAspectEveryTenMinutes" class="org.alfresco.repo.action.scheduled.CronScheduledQueryBasedTemplateActionDefinition">
<property name="transactionMode">
<value>UNTIL_FIRST_FAILURE</value>
</property>
<property name="compensatingActionMode">
<value>IGNORE</value>
</property>
<property name="searchService">
<ref bean="SearchService"/>
</property>
<property name="templateService">
<ref bean="TemplateService"/>
</property>
<property name="queryLanguage">
<value>lucene</value>
</property>
<property name="stores">
<list>
<value>workspace://SpacesStore</value>
</list>
</property>
<!-- Find all nodes that do not have the aspect -->
<property name="queryTemplate">
<value>PATH:"//\*" -ASPECT:"{http://www.alfresco.org/model/content/1.0}generalclassifiable"</value>
</property>
<property name="cronExpression">
<value>0 0/10 * * * ?</value>
</property>
<property name="jobName">
<value>jobeveryTenMinutes</value>
</property>
<property name="jobGroup">
<value>jobGroup</value>
</property>
<property name="triggerName">
<value>triggerA</value>
</property>
<property name="triggerGroup">
<value>triggerGroup</value>
</property>
<property name="scheduler">
<ref bean="schedulerFactory"/>
</property>
<property name="actionService">
<ref bean="ActionService"/>
</property>
<property name="templateActionModelFactory">
<ref bean="templateActionModelFactory"/>
</property>
<property name="templateActionDefinition">
<ref bean="addClassifiableAspectAction"/>
</property>
<property name="transactionService">
<ref bean="TransactionService"/>
</property>
<property name="runAsUser">
<value>System</value>
</property>
</bean>
</beans>
Ende
Alfresco (in Docker) reparieren
Fehler: nach einer Alfresoanpassung startet Docker nicht mehr. Auch die Rücknahme der Anpassung bringt keine Änderung.
Lösung: alle Volumes löschen und neu aus dem Internet ziehen.
docker volume prune
docker system prune -a
dann repository und share neu builden und wieder starten.
cd acs-deployment-master/docker-compose
docker build repository -t alfresco/alfresco-content-repository-community:25.2.0 -t alfresco/acr-community-mytest:25.2.0
docker build share -t docker.io/alfresco/alfresco-share:25.2.0 -t docker.io/alfresco/alfresco-share-mytest:25.2.0
docker-compose down
docker-compose up -d
—-
alter Kram
midnightcommander öffnet keine amp- und jar-Dateien mehr
/etc/mc/mc.ext.ini
erweitern mit:
- mc.ext.ini
[jar-by-shell]
Shell=.jar
ShellIgnoreCase=true
Open=%cd %p/uzip://
View=%view{ascii} /usr/lib/mc/ext.d/archive.sh view zip
[amp-by-shell]
Shell=.amp
ShellIgnoreCase=true
Open=%cd %p/uzip://
View=%view{ascii} /usr/lib/mc/ext.d/archive.sh view zip
wie lange läuft der Alfresco schon?
ps -eo pid,comm,lstart,args | grep java
Solrwebseite:
https://localhost:8443/solr
Vorsicht ! soll neuen Index aufbauen:
http://localhost:8080/solr4/admin/cores?action=FIX
http://localhost:8080/solr4/admin/cores?action=REINDEX&txid=1&acltxid=2&nodeid=3&aclid=4
Solr6 aktivieren
../solr/bin/solr start -a "-Dcreate.alfresco.defaults=alfresco,archive"
Alfresco7x
apt install libreoffice imagemagick-6.q16hdri
start und restart der Datei localTransformationService.sh
anpassen:
...
LOCAL_LIBREOFFICE=/usr/lib/libreoffice
LOCAL_IMAGEMAGICK=/usr/lib/x86_64-linux-gnu/ImageMagick-6.9.11
...
nohup java -XX:MinRAMPercentage=30 -XX:MaxRAMPercentage=50 \
-DPDFRENDERER_EXE="$LOCAL_TRANSFORM_SERVICE_HOME/alfresco-pdf-renderer/alfresco-pdf-renderer" \
-DLIBREOFFICE_HOME="$LOCAL_LIBREOFFICE" \
-DIMAGEMAGICK_ROOT="$LOCAL_IMAGEMAGICK" \
-DIMAGEMAGICK_DYN="$LOCAL_IMAGEMAGICK" \
-DIMAGEMAGICK_EXE="/usr/bin/convert" \
-DIMAGEMAGICK_CODERS="$LOCAL_IMAGEMAGICK/modules-Q16HDRI/coders" \
-DIMAGEMAGICK_CONFIG="$LOCAL_IMAGEMAGICK/config-Q16HDRI" \
-DACTIVEMQ_URL="failover:(tcp://localhost:61616)?timeout=3000" \
-jar $LOCAL_TRANSFORM_SERVICE_HOME/bin/alfresco-transform-core-aio-boot-2.4.0.jar /tmp 2>> /dev/null >>/dev/null & echo $! > $PID_PATH_NAME
...
Sonstiges
Lizenz einspielen/erneuern
Backup ?
neue Lizenzdatei nach /usr/share/tomcat6/shared/alfresco/extension/license
verschieben.
für neue Lizenzdatei den Eigentümer auf tomcat ändern.
über die Admin-Webseite neue Lizenz übernehmen.
Alfrescomodule anzeigen
java -jar /opt/alfresco/bin/alfresco-mmt.jar list /opt/alfresco/tomcat/webapps/alfresco.war
CMIS-QUERIES
Abfrage auf 20000 vergrößern: in Datei alfresco-global.properties
2 Zeilen einfügen und alfresco neustarten
Achtung! die Abfragen belasten das System
system.acl.maxPermissionChecks=20000
solr.query.maqximumResultsFromUnlimitedQuery=20000
Benutzer-Synchronisierung
synchronization.import.cron=0 0/30 * * 1-5 ?
SOLR-Konfiguration
alf_data/solr/archive-SpaceStore/conf/solrcore.properties
alf_data/solr/workspace-SpaceStore/conf/solrcore.properties
solr testweise im Vordergrund starten:
alfresco-search-service/solr/bin/solr start -f -force
solr status anzeigen:
alfresco-search-service/solr/bin/solr status
CMIS-Download
- Filedownload.groovy
import org.apache.chemistry.opencmis.commons.*
import org.apache.chemistry.opencmis.commons.data.*
import org.apache.chemistry.opencmis.commons.enums.*
import org.apache.chemistry.opencmis.client.api.*
import org.apache.chemistry.opencmis.client.util.*
Document file = (Document) session.GetObject("workspace://SpaceStore/abcde1234-5678-hijk-...");
def cmis = new scripts.CMIS(session)
cmis.download(file, "c:\\test\\DOKTEST.docx")
Datei löschen
curl -v -X DELETE "http://myadmin:mypassword@myalfresco:8080/alfresco/service/slingshot/doclib/action/file/site/mysite/documentLibrary/myfile.txt"
oder über selenium:
- DelMyFile.java
//vorher: export CLASSPATH=".:selenium-server-standalone-3.13.0.jar"
import java.io.IOException;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.*;
public class DelMyFile {
public static void main(String[] args) throws IOException, InterruptedException {
String sPage = "https://myalfresco.my.dom.ain/share/page/";
String sUser = "myuser";
String sPass = "mypassword";
String sDokp = "https://myalfresco.my.dom.ain/share/page/site/mysite/document-details?nodeRef=workspace://SpacesStore/abcd1234-76de-444b-9ff5-4e93faaa2c35";
String delbutton = "/html/body/div[2]/div[1]/div[3]/span/span[1]/span/button";
System.setProperty("webdriver.chrome.driver", "/usr/bin/chromedriver");
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addArguments("--headless");
chromeOptions.addArguments("--no-sandbox");
WebDriver driver = new ChromeDriver(chromeOptions);
driver.get(sPage);
String titlelogin = driver.getTitle();
System.out.println("The title of the Webpage is: " +titlelogin);
WebElement userfield = driver.findElement(By.id("username"));
WebElement passfield = driver.findElement(By.id("password"));
WebElement loginbutton = driver.findElement(By.id("btn-login"));
if (driver.getPageSource().contains("username")) {
System.out.println("enter username");
userfield.clear();
userfield.sendKeys(sUser);
System.out.println("enter password");
passfield.clear();
passfield.sendKeys(sPass);
System.out.println("enter loginbutton");
Thread.sleep(1000);
loginbutton.click();
String title = driver.getTitle();
System.out.println("The title of the Webpage is: " +title);
System.out.println("User "+sUser+" logged in successfully");
// öffne Dokumentenwebseite und lösche diese
driver.get(sDokp);
title = driver.getTitle();
System.out.println("The title of the Webpage is: " +title);
System.out.println("Deleting file : " +sDokp);
WebElement deletefield = driver.findElement(By.linkText("Delete Document"));
deletefield.click();
deletefield = driver.findElement(By.xpath(delbutton));
deletefield.click();
}
else {
System.out.println("Fail");
}
driver.close();
driver.quit();
}
}
gelöschte Dateien anzeigen
Anzeige der gelöschten Dateien pro Seite von 50 auf 100 erhöhen:
ganze Verzeichnisse uploaden
* auf dem alfrescoserver im tmp/-Verzeichnis ein Unterverzeichnis(z.B. import/) erstellen und mit Verzeichnissen und Dateien füllen und dafür Leserechte für tomcat konfigurieren.
* Website https://myecms.my.dom.ain/alfresco/service/bulkfsimport aufrufen und anmelden
"Import directory:" /tmp/import/
"Target space(Noderef or Path):" /Company Home/Sites/exitierendeSite/documentLibrary/
[Initiate Bulk import]
* Prüfen ob die Verzeichnisse und Dateien in die Site importiert wurden.
* importierte Verzeichnisse in „import“ wieder löschen.
oder
* auf dem alfrescoserver im …contentstore/-Verzeichnis ein Unterverzeichnis(z.B. import/) erstellen und mit Verzeichnissen und Dateien füllen und dafür Leserechte für tomcat konfigurieren.
* Webseite https://myecms.my.dom.ain/alfresco/service/bulkfsimport/inplace aufrufen und anmelden
"Importverzeichnispath, relativ zum Store:" import
"Content Store:" default
"Pfad im Ziel Repository:" /Company Home/Sites/exitierendeSite/documentLibrary/
[Massenimport starten]
* Prüfen ob die Verzeichnisse und Dateien in die Site importiert wurden.
* importierte Verzeichnisse in „import“ wieder löschen.
Ist Auditing eingeschaltet?
curl -u admin:geheim "http://localhost:8080/alfresco/service/api/audit/control"
Alfresco-Server schreibgeschützt
Eintrag in alfresco-global.properties
:
server.allowWrite=false
Alfresco-Serverbenutzer einschränken
Eintrag in alfresco-global.properties
:
server.allowedusers=John,Paul,George,Ringo
LDAP alle 4 Stunden einmal synchronisieren
ldap.synchronization.full=true
ldap.synchronization.full.cronExpression 0 0/4 * * ?
Suche nach ausgechekten Dateien:
SELECT D.* FROM cmis:document as D JOIN cm:checkedOut as T ON D.cmis:objectID = T.cmis.objectId
oder in der Website nach „Arbeitskopie“ suchen und das Bearbeiten abbrechen
ausgecheckte Datei als admin wieder einchecken:
in Webseite „View Working Copy“ / „Cancel Editing“
Anzahl der Benutzer
curl -u admin:meinpasswort "http://localhost:8080/alfresco/s/api/people?maxResults=2500"
curl -u admin:admin "http://localhost:8080/alfresco/s/api/people?maxResults=2500" | grep userName | wc -l
Mimetypes