My boring Blog

Home page di Mauro Frigerio

Creare il proprio office online con Nextcloud

27-02-2022 Tempo di lettura 4 minuti article

TL;DR

Nextcloud è la soluzione opensource che permette di trasformare molti device nella propria soluzione di storage online (come Dropbox). Ma non solo perchè grazie a molti app è possibile espandere le funzionalità e creare la propria soluzione di office online, come Office 365 di Microsoft o Drive di Google.

In questa guida veloce ho cercato di descrivere i passaggi per ottenere un’istanza di base di Nextcloud e sfruttare ONLYOFFICE per poter modificare i documenti online. Il tutto reso disponibile tramite Traefik reverse proxy, così da garantire una connessione sicura tramite https.

Tutti i file necessari sono disponibili sul mio repository GitHub.

Requisiti

Non è possibile in un unico articolo mostrare tutti i dettagli legati ai vari sistemi, alcune conoscenze di base sono richieste.

  • sistema Linux con Docker e diriti amministrativi
  • configurazione di base di Traefik (guida)
  • due sotto dominio che punti all’istanza di Traefik, per esempio drive.example.com e office.example.com. Se Nextcloud deve essere raggiungibile da internet, entrambi i domini devo essere raggiungibili.

Nextcloud

ATTENZIONE: seguire i passaggi così come sono indicati. Se il file di configurazione viene creato le variabili di docker non sono più elaborate.

  1. Il primo passo dopo aver configurato Traefik con l’accesso alla rete net_nextcloud

  2. Prima di creare il container Nextcloud e il relativo database, si devono completare tutte le variabili nel file .env

...
NEXTCLOUD_TRUSTED_DOMAINS="drive.example.com drive.example2.com"
NEXTCLOUD_TRUSTED_PROXIES=172.20.0.3/32
NEXTCLOUD_DB_PASSWORD=Super$ecretPassword12345
...
  1. Il valore del campo NEXTCLOUD_TRUSTED_PROXIES può essere individuato con il comando seguente. Nel risultato del comando eseguito cercate l’indirizzo ip della rete xyz_net_nextcloud e aggiungete /32
sudo docker inspect reverse-proxy
  1. Adesso è possibile creare il container Nextcloud e il suo database con il comando
sudo docker-compose up -d nextcloud
  1. Accedendo al dominio https://drive.example.com è possibile verificare se Nextcloud funziona correttamente

Passaggi da eseguire dopo aver creato il container Nextcloud

Ammesso che il vostro Nextcloud sia raggiungibile è possibile procedere con i prossimi passaggi. I seguenti passaggi non sono obbligatori, ma consigliati da Nextcloud.

Prefisso telefonico

Sotto le impostazioni nel menu Riepilogo appare un avviso che vi chiedere di aggiungere il condice di default per la tua regione, questo passaggio (non si può fare tramite docker-compose) e richiede un’aggiunta manuale al file di configurazione config.php.

È possibile aggiungere il codice con il seguente comando (potrebbe essere necessario anteporre sudo al comando), oppure aggiungere al file di configurazione la chiave default_phone_region e relativo valore.

docker-compose exec --user www-data nextcloud php occ config:system:set default_phone_region --value="CH"

Installare php-imagick

Sempre nel menu Riepilogo sotto impostazioni appare un messaggio per la mancanza della libreria php-imagick. Eseguire i comandi seguinti per risolvere il messaggio (anche qui può essere necessario aggiungere sudo).

docker-compose exec nextcloud apt -y update

docker-compose exec nextcloud apt -y install libmagickcore-6.q16-6-extra

Aggiungere un server email

L’ultimo messaggio che appare nel menu Riepilogo richiede l’inserimento di un server per poter inviare notifiche agli amministratori o il reset della password per gli utenti.

Attivare cron job con uptime-kuma

Questo forse è l’unica impostazione utile da eseguire, ma qui non posso descrivere completamente la soluzione. Io ho sfruttato un servizio già a disposizione nel mio docker: uptime-kuma (vedi guida).

ONLYOFFICE

  1. Adesso che Nexcloud è funzionante si può procedere con la creazione del server ONLYOFFICE , con il comando:
sudo docker-compose up -d onlyoffice
  1. Verificare che il server ONLYOFFICE sia funzionante, provare a collegarsi all’indirizzo: https://office.example.com. Se appare una pagina di ONLYOFFICE è tutto ok.

Collegare Nextcloud al server ONLYOFFICE

In Nextcloud si deve installare una app dallo “store” per poter aprire i documenti office direttamente in Nextcloud. Per farlo si deve aprire lo store cliccando in alto a destra e cliccare su + Applicazioni e poi cercare ONLYOFFICE. Cliccare su scarica e installa e poi passare alle impostazioni.

Nel tab ONLYOFFICE sulla sinistra e inserire i valori in questi campi:

  1. indirizzo di ONLYOFFICE DOCS: https://office.example.com
  2. aprire le impostazioni avanzate
  3. indirizzo per richieste interne: https://office.example.com
  4. Salvare

nextcloud-onlyoffice-configuration.png

Nella schermata dei file è possibile aprire un documento .docx o altri per testare se ONLYOFFICE funziona correttamente.

ATTENZIONE: anche il server di ONLYOFFICE deve essere raggiungibile tramite internet se volete usare Nextcloud e ONLYOFFICE fuori dalla vostra rete casalinga.

docker-compose

  nextcloud:
    image: nextcloud:latest
    container_name: nextcloud
    networks:
      - net_nextcloud
      - net_nextcloud_db
    labels:
      - 'traefik.enable=true'
      - 'traefik.http.routers.nextcloud.rule=Host(`drive.${DOMAIN}`)'
      - 'traefik.http.routers.nextcloud.entrypoints=web-secure'
      - 'traefik.http.routers.nextcloud.tls=true'
      - "traefik.http.routers.nextcloud.tls.certresolver=certificato"
      - "traefik.http.routers.nextcloud.tls.domains[0].main=*.${DOMAIN}"
      - "traefik.http.routers.nextcloud.service=nextclouddService"
      - "traefik.http.services.nextclouddService.loadBalancer.server.port=80"
      - "traefik.http.routers.nextcloud.middlewares=nc-rep,nc-header"
      - "traefik.http.middlewares.nc-rep.redirectregex.regex=https://(.*)/.well-known/(card|cal)dav"
      - "traefik.http.middlewares.nc-rep.redirectregex.replacement=https://$$1/remote.php/dav/"
      - "traefik.http.middlewares.nc-rep.redirectregex.permanent=true"
      - "traefik.http.middlewares.nc-header.headers.frameDeny=true"
      - "traefik.http.middlewares.nc-header.headers.sslRedirect=true"
      - "traefik.http.middlewares.nc-header.headers.contentTypeNosniff=true"
      - "traefik.http.middlewares.nc-header.headers.stsIncludeSubdomains=true"
      - "traefik.http.middlewares.nc-header.headers.stsPreload=true"
      - "traefik.http.middlewares.nc-header.headers.stsSeconds=31536000"
      - "traefik.http.middlewares.nc-header.headers.referrerPolicy=same-origin"
      - "traefik.http.middlewares.nc-header.headers.browserXssFilter=true"
      - "traefik.http.middlewares.nc-header.headers.customRequestHeaders.X-Forwarded-Proto=https"
      - "traefik.http.middlewares.nc-header.headers.customResponseHeaders.X-Robots-Tag=none"
      - "traefik.http.middlewares.nc-header.headers.customFrameOptionsValue=SAMEORIGIN"
      - "traefik.docker.network=net_nextcloud"
    volumes:
      - /path/to/docker/nextcloud/data:/var/www/html
    environment:
      - NEXTCLOUD_TRUSTED_DOMAINS=${NEXTCLOUD_TRUSTED_DOMAINS}
      - APACHE_DISABLE_REWRITE_IP=1
      - TRUSTED_PROXIES=${NEXTCLOUD_TRUSTED_PROXIES}
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_PASSWORD=${NEXTCLOUD_DB_PASSWORD}
      - MYSQL_HOST=nextcloud-db
      - OVERWRITEPROTOCOL=https
      #- DEFAULT_PHONE_REGION=CH not working see: https://github.com/nextcloud/docker/issues/1465
    depends_on:
      - nextcloud-db
    restart: unless-stopped


  nextcloud-db:
    container_name: nextcloud-db
    image: mariadb
    networks:
      - net_nextcloud_db
    environment:
      MYSQL_DATABASE: nextcloud
      MYSQL_PASSWORD: ${NEXTCLOUD_DB_PASSWORD}
      MYSQL_USER: nextcloud
      MYSQL_ROOT_PASSWORD: ${NEXTCLOUD_DB_PASSWORD}
      TZ: ${TIME_ZONE_ZUERICH}
    logging:
      driver: "none"
    restart: unless-stopped
    volumes:
      - /path/to/docker/nextcloud/db/:/var/lib/mysql


	onlyoffice:
    image: onlyoffice/documentserver
    container_name: onlyoffice
    networks:
      - net_nextcloud
    labels:
      - 'traefik.enable=true'
      - 'traefik.http.routers.onlyoffice.rule=Host(`office.${DOMAIN}`)'
      - 'traefik.http.routers.onlyoffice.entrypoints=web-secure'
      - 'traefik.http.routers.onlyoffice.tls=true'
      - "traefik.http.routers.onlyoffice.tls.certresolver=certificato"
      - "traefik.http.routers.onlyoffice.tls.domains[0].main=*.${DOMAIN}"
      - "traefik.http.routers.onlyoffice.service=onlyofficeService"
      - "traefik.http.routers.onlyoffice.middlewares=onlyoffice-headers"
      - "traefik.http.services.onlyofficeService.loadBalancer.server.port=80"

      - "traefik.http.middlewares.onlyoffice-headers.headers.customrequestheaders.X-Forwarded-Proto=https"
      - "traefik.http.middlewares.onlyoffice-headers.headers.accesscontrolalloworiginlist=*"

      - "traefik.docker.network=net_nextcloud"
    restart: unless-stopped

Crediti foto: Pix4free