Nextcloud on Arch Linuxposted on 2021-08-06T10:10:35Z · last modified on 2021-08-10T11:57:34Z · view page on GitHub
I recently had to re-install nextcloud on my arch linux server. I decided it was time to finally document this process. It's not so difficult, but there are a lot of moving parts that need to come together.
These are all the packages you'll need to install. Go ahead and install them first with your AUR helper (like yay), we'll go over the configuration later.
apache imagemagick smbclient mariadb ffmpeg libreoffice php php-gd php-imagick php-memcached php-apcu php-imap php-smbclient php-intl php-fpm nextcloud certbot certbot-apache
Base mariadb installation¶
Mariadb is the FOSS version of MySQL. Install and enable as follows:
sudo mariadb-install-db --user=mysql --basedir=/usr --datadir=/var/lib/mysql sudo systemctl enable mariadb sudo systemctl start mariadb
This enables the mariadb service, however, it's not yet secure. Run the following to make your mariadb installation more secure:
There's no password set for the root user, so just press enter when asked for a password. Then, choose the following options for the rest of the installer.
Switch to unix_socket authentication [Y/n] y Change the root password? [Y/n] n Remove anonymous users? [Y/n] y Disallow root login remotely? [Y/n] y Remove test database and access to it? [Y/n] y Reload privilege tables now? [Y/n] y
config file is located at
/etc/my.cnf.d/server.cnf and make sure the following
mysqld section exists:
[mysqld] skip-networking = 1 log-bin = mysql-bin binlog_format = mixed
We also need to add a compatibility flag for newer mariadb versions:
nextcloud user by first starting mysql with the mysql root account:
sudo mysql -u root
Then, within the SQL prompt, create a new user called "nextcloud":
create user nextcloud@localhost identified by '<password>';
FYI, you can see all users with the following SQL command:
select user from mysql.user;
Next, create an empty database called "nextcloud":
create database nextcloud; grant all privileges on nextcloud.* to nextcloud@localhost identified by '<password>'; flush privileges;
FYI, you can see all databases with the following SQL command:
Exit the sql prompt:
For a new nextcloud installation, that's it. Your database is now correctly configured. However, when migrating your nextcloud installation from one server to another, do the following two steps as well:
First, on the old server, export your "nextcloud" database (assuming user "nextcloud" and database "nextcloud"):
sudo mysqldump -u nextcloud -p --opt nextcloud > exported_database.sql
exported_database.sql to the new server.
Then, on the new server, import
exported_database.sql into the newly created empty "nextcloud" database as follows:
sudo mysql -u root nextcloud < exported_database.sql
Note that this might take a considerable amount of time for large databases. However, this should be enough to set up MariaDB database correctly.
All dependencies should already have been installed in the "Install Dependencies" section. Now enable all php packages you need by editing the 'Dynamic Extensions' section in
/etc/php/php.ini. Make sure the following packages are uncommented/added:
;;;;;;;;;;;;;;;;;;;;;; ; Dynamic Extensions ; ;;;;;;;;;;;;;;;;;;;;;; extension=apcu extension=bcmath extension=bz2 ;extension=calendar extension=curl ;extension=dba ;extension=enchant extension=exif ;extension=ffi extension=ftp extension=gd ;extension=gettext extension=gmp extension=iconv extension=imagick extension=imap extension=intl extension=ldap extension=memcached extension=mysqli ;extension=odbc zend_extension=opcache ;extension=pdo_dblib extension=pdo_mysql ;extension=pdo_odbc ;extension=pdo_pgsql ;extension=pdo_sqlite ;extension=pgsql ;extension=pspell ;extension=shmop ;extension=snmp ;extension=soap ;extension=sockets ;extension=sodium ;extension=sqlite3 ;extension=sysvmsg ;extension=sysvsem ;extension=sysvshm ;extension=tidy ;extension=xmlrpc ;extension=xsl extension=zip
Also, don't forget to set your timezone in
/etc/php/php.ini. For example:
date.timezone = Europe/Berlin
And set the
session.save_path = "/tmp"
We also want to increase the maximum opload size:
upload_max_filesize = 25M
Finally, you'll need to set the
[opcache] opcache.enable = 1 opcache.memory_consumption = 512 opcache.interned_strings_buffer = 16 opcache.max_accelerated_files = 10000 opcache.revalidate_freq = 1 opcache.save_comments = 1
memory_limit (somewhere in the same file) to
We also want to enable apcu caching. Add the following to the end of
[apcu] apc.enabled=1 apc.shm_size=32M apc.ttl=7200 apc.enable_cli=1
/etc/php/php-fpm.d/nextcloud.conf and add the following content:
[nextcloud] user = nextcloud group = nextcloud listen = /run/nextcloud/nextcloud.sock env[PATH] = /usr/local/bin:/usr/bin:/bin:/usr/local/sbin env[TMP] = /tmp listen.owner = http listen.group = http pm = dynamic pm.max_children = 120 pm.start_servers = 12 pm.min_spare_servers = 6 pm.max_spare_servers = 18
Then edit the php-fpm service
sudo systemctl edit php-fpm
And add the path to your nextcloud data directory as follows:
[Service] # your nextcloud data directory ReadWritePaths = /var/lib/nextcloud/data # your nextcloud apps directory ReadWritePaths = /var/lib/nextcloud/apps # your config directory ReadWritePaths=/etc/webapps/nextcloud/config
Finally, enable and start the
sudo systemctl enable php-fpm sudo systemctl restart php-fpm
First, edit your nextcloud configuration file at
/etc/webapps/nextcloud/config/config.php. Here you can change the location of your data folder and the location where apps will be installed. The default locations are:
We won't be changing these locations, however make sure they match the
ReadWritePaths in your php-fpm service. We should also add the following line to enable better APCu caching:
'memcache.local' => '\OC\Memcache\APCu',
This will prevent nextcloud from overriding your settings. The only way to update the settings is by editing the file manually from now on.
Finally, we want to prevent installing updates for nextcloud via pacman (we can always manually update it by explicitly reinstalling). Edit
/etc/pacman.conf and add:
IgnorePkg = nextcloud
If you're reinstalling nextcloud, be sure to use your old config file!
We also need to install a cron job for nextcloud. We can do this using systemd timers.
[Unit] Description=nextcloud cron.php job [Service] User=nextcloud ExecStart=/usr/bin/php -f /usr/share/webapps/nextcloud/cron.php
[Unit] Description=Run Nextcloud cron.php every 5 minutes [Timer] OnBootSec=5min OnUnitActiveSec=5min Unit=nextcloudcron.service [Install] WantedBy=timers.target
then enable and start the timer
sudo systemctl enable nextcloudcron.timer sudo systemctl start nextcloudcron.timer
Make sure you have a domain name associated to your ip address. If you're currently working in a local setup and do not have a domain associated with your account you can edit
/etc/hosts to add a fake link between a domain and the local host. Let's assume we're using the
nextcloud.example.com domain, add this to your
NOTE: do this only if you do not have an actual domain pointing to your public ip!
Now, add this host to your nextcloud config at
/etc/webapps/nextcloud/config/config.php by adding the following
'trusted_domains' => array ( 0 => 'nextcloud.example.com', )
You can add as many trusted domains as you want. Nextcloud will refuse to serve to any domains not in this list.
Finally, we need to configure Apache (you can also use nginx, but in general I feel like Apache just works better and is easier to configure). Copy the default apache configuration file into
sudo cp /usr/share/doc/nextcloud/apache.example.conf /etc/httpd/conf/extra/nextcloud.conf
Then change the servername in
<VirtualHost *:80> ... ServerName nextcloud.example.com ... </VirtualHost>
And add the following configuration to the end of
DirectoryIndex index.php index.html <FilesMatch \.php$> SetHandler "proxy:unix:/run/nextcloud/nextcloud.sock|fcgi://localhost/" </FilesMatch>
Then edit the main apache config at
Uncomment the following modules:
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so LoadModule ssl_module modules/mod_ssl.so LoadModule http2_module modules/mod_http2.so LoadModule rewrite_module modules/mod_rewrite.so
And include the nextcloud configuration at the end of the same file:
NOTE: this only works for actual domain names pointing to your IP address, if you hacked the hostname into /etc/hosts, this will not work
Configuring https is easiest with certbot:
sudo certbot --apache -d nextcloud.example.com
Answer the questions of the wizard and let certbot modify your apache configuration automatically. If everything went well, the nextcloud apache config at
/etc/httpd/conf/extra/nextcloud.conf should now have a new section for port 443 (the https port). Add the following recommended HSTS settings to it:
<VirtualHost *:443> ... <IfModule mod_headers.c> Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains" </IfModule> </VirtualHost>
Nextcloud should now be correctly installed!
First nextcloud connection¶
Now go to nextcloud.example.com and create an admin user and password and connect to the mariadb nextcloud database. Once this is finished, nextcloud is completely set up!
If you like this post, consider leaving a comment or star it on GitHub.