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


Alfrescofooter (in Docker) ändern

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

Transformation auf lokales libreoffice und inagmagick umstellen
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:

ändern der rowsPerPage von 50 auf 100 in Datei tomcatshare/webapps/share/components/console/trashcan.js und der trashcan-min.js .
dann auf https://myalfrescosrv/alfresco/service/index Refresh Webscripts und Clear Cache.

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