diff --git a/nextcloud/PKGBUILD b/nextcloud/PKGBUILD new file mode 100644 index 0000000..4af3751 --- /dev/null +++ b/nextcloud/PKGBUILD @@ -0,0 +1,144 @@ +# Maintainer: Sergej Pupykin +# Maintainer: David Runge + +pkgname=nextcloud +# NOTE: always check first whether the version is supposed to be packaged: +# https://github.com/nextcloud/server/wiki/Maintenance-and-Release-Schedule +pkgver=25.0.2 +pkgrel=4 +pkgdesc="A cloud server to store your files centrally on a hardware controlled by you" +arch=(any) +url="https://nextcloud.com" +license=(AGPL3) +makedepends=(php) +optdepends=( + 'curl: for webcron jobs from within uwsgi' + 'ffmpeg: for preview generation' + 'libreoffice: for preview generation' + 'mariadb: to use a local MariaDB server' + 'memcached: to use a local memcached server' + 'mod_itk: to use the Apache web server' + 'postgresql: to use a local PostgreSQL server' + 'redis: to use a local Redis server' + 'smbclient: for SMB/CIFS integration' + 'sudo: for privilege elevation in occ command when not run as root' +) +backup=( + etc/webapps/$pkgname/config/config.php + etc/webapps/$pkgname/.htaccess + etc/uwsgi/$pkgname.ini +) +# there are no elf files, no need to strip anything +options=(!strip) +install=$pkgname.install +source=( + https://download.nextcloud.com/server/releases/$pkgname-$pkgver.tar.bz2{,.asc} + apache.example.conf + $pkgname.config.php + $pkgname.hook + $pkgname.occ.sh + $pkgname.sysusers + $pkgname.tmpfiles + $pkgname.uwsgi + $pkgname-cron.service + $pkgname-cron.timer +) +sha512sums=('e65147825cce7c645f552c683426b96c802c513eabbf90122e713fb5a5d341f816b0928b2af72876fdcd245b49b72bfd60f0fafb793deace3a686e13eca918bb' + 'SKIP' + '5f9be223225e6ad2772989c440df8585a852ea0be697274384064ec73df47dab2f5d0847c275732fab26c419a713911d8f77ebc2b639bf6e8ede76272b752cde' + '92592f9a76ee534d0ae6d3aedf2257c147337debe7e2d6dbec1daff66a682e3abc74611e08662058de314bf3ea6ff1c85efd678674b782d71251c38786e446f9' + '2791382d7b005c64cd6938695f273e83435cc5f1b785fe7d44d6dbd69864c502847e45d93c4a5f6752a759a660118279e3e22e5bc32f79b8775693fde603a9c5' + '0bd4fc8f80b36ad40cfd6475aa3bb82c6055b8349bac0a6904f5b829932dbab08ff9f11596f274ef5d5efccd579edff984607170bee970dd8d49375d8fdd2ea1' + '1d06f339c43d57e5f5406c2698b815241fd9e39039a9e55f777face510c9a5ddae5ccd4e051393e8f16f391301a6aa03fff2462837a2d3441d969ea7195e7d84' + '919008a2bf6cf2492cb1e9c8e28c1e082d74e45da5a96e6669f8971d6cf721e36d23625c89918fe10d8bc1b202c0340aa897849d9ec501a26f3f4572ccb57a98' + '532737bc6c9fb4af4c6d34ac5ce488451d21847b89acbfe74ce9775b038ace274bb0039ed59e76ab48269c444248b7c906a79d3f327a6cc09a766f81b2270dd2' + '66f542d8b84701d81e6f6d896163faa232996ee081bcabe4acc121064ef538b5c1ea43728222b5cadc60a5d433b1e54ad7c1fe9d1d188ffa8eaf331fd4cd8ec0' + 'eb69785a5b0df0e2a11f53f9c2e2dbf75681d7c698e88cbcc5ceed713a558d528511cc576813cc083cbaa28a2c83d543a39436ad4805670348ef22634305b1c8') +b2sums=('8980fa45dcfa1f9cc70434f0bdd15154a2ef42b80bb4e57b5cb2792afa9ad77867640bc6a6d266b88e52a12aae829d34bd55d5c46fd2ba74acde0bea7b4c028e' + 'SKIP' + '7d40d120c28291f1a7537f3e1b5049fa83c9c0af949371345ea9ccdf3de4a0f3a3a06edbc52d9254dba483e4d11acf562cf679b9e379c5dfc2f61dfbfc2e4cef' + '4ad061efbc20b4d0e9f8cfd01c5e8e612fa5af29bce754b77f90c1835b98ee445ef4de3d8c83da91461053622620af14d880eb9014b51f2383c75f1860d479f4' + 'c69f18de513562e32f0f655fee7ef81877d74a76717e2eaad9a13882bf8edd0dad99bec5958e460a4ec32eecfdd425ae009d11ac27af16a3ad1d6498282be32f' + '43aeee02f45335088f9e4bb3893c8344ae63f0e7504246c033e74a785de07a661a78eb791f4313bf1d51f4dffacb3a14876c7f5ea4e339af9d199d1a501d6588' + '1a61a89531636b65dade03cd7edca8747b3e1e880f9bbd4d5a53cffa452d70fe17e345cfed739ae92e99e336d4c1f2633c84a5c84a4ee6da518762bf1396b1db' + 'd132044cb7f1d61a1ce87800d2e1142e3ac385acdec25e2f5ad685603a0ffa88e105f4c35688584d65d287adbb40b8d9a02d6a80d7a0b58bb8801a6769405218' + '2b73e7bed7d1a0e5eb735fe4168708a46aa00cf4d56241d0e3b4e5cf753f4f6a1f259875011a30a764ac43c5cb051ba311bbf3e4ea7e4e2b21595ca7bf1419b9' + 'a84fbdc9b5caf28eae6bfb147ea0c77e4cfc5a42f29b3fe93c0ecf8414f95ed20999a131efb7c7ba49041304fe7104813c574e6b5aaa6b03881aea3428144f33' + 'e6214351ca16bfe97683e838e727d6b5eaa62194878272204034c62aac4a632c9b33cd31aa0570c2eb936d7e9e7ff60190ac05a3a8cc2e27eda423a7d89b6d39') +validpgpkeys=('28806A878AE423A28372792ED75899B9A724937A') # Nextcloud Security + +prepare() { + local _file + + truncate -s 0 nextcloud/lib/versioncheck.php + + # setup custom files with default PHP interpreter, etc. + install -vDm 644 nextcloud.{occ.sh,uwsgi} nextcloud-cron.service -t custom_files/ + for _file in custom_files/*; do + sed -e "s/PHP_INTERPRETER/php/g;s/UWSGI_PLUGIN/php/g" -i $_file + done +} + +package() { + depends=("php") + + # NOTE: this sets a custom php postfix based on whether php-legacy needs to be used + depends+=("php-gd") + + # NOTE: due to weird makepkg checks we can't add optdepends with dynamically derived contents directly + _optdepends=( + "php-apcu: for caching with APCU" + "php-apache: to use the Apache web server" + "php-fpm: to run in fastCGI process manager" + "php-imagick: for preview generation" + "php-imap: for external user authentication" + "php-intl: to increase language translation performance and fix sorting" + "php-memcached: for caching with memcached" + "php-pgsql: to use the PostgreSQL database backend" + "php-redis: for caching with redis" + "php-sqlite: to use the SQLite database backend" + "uwsgi-plugin-php: run as application container" + ) + optdepends+=("${_optdepends[@]}") + + cd $pkgname + # sysusers.d integration + install -vDm 644 ../$pkgname.sysusers "$pkgdir/usr/lib/sysusers.d/$pkgname.conf" + # tmpfiles.d integration + install -vDm 644 ../$pkgname.tmpfiles "$pkgdir/usr/lib/tmpfiles.d/$pkgname.conf" + # state dir for data and writable apps + install -vdm 755 "$pkgdir/var/lib/$pkgname/" + install -vdm 770 "$pkgdir/var/lib/$pkgname/data" + install -vdm 755 "$pkgdir/var/lib/$pkgname/apps" + # log dir + install -vdm 755 "$pkgdir/var/log/$pkgname/" + # uwsgi integration + install -vDm 644 ../custom_files/$pkgname.uwsgi "$pkgdir/etc/uwsgi/$pkgname.ini" + # config dir + install -vDm 644 .htaccess -t "$pkgdir/etc/webapps/$pkgname/" + install -vDm 640 ../$pkgname.config.php "$pkgdir/etc/webapps/$pkgname/config/config.php" + find config -type f -exec install -vDm 644 {} "$pkgdir/etc/webapps/$pkgname/"{} \; + # remove config dir and .htaccess from source so that it is not installed to default location + rm -rf config .htaccess + + # webapp + find . -type f -not -iname "*.orig" -exec install -vDm 644 {} "$pkgdir/usr/share/webapps/$pkgname/"{} \; + + # symlink config directory into place + ln -sv /etc/webapps/$pkgname/config "$pkgdir/usr/share/webapps/$pkgname/" + # symlink .htaccess file into place + ln -sv /etc/webapps/$pkgname/.htaccess "$pkgdir/usr/share/webapps/$pkgname/" + # add symlink to default writable apps directory + ln -sv /var/lib/$pkgname/apps "$pkgdir/usr/share/webapps/$pkgname/wapps" + # install occ command + install -vDm 755 occ -t "$pkgdir/usr/share/webapps/$pkgname/" + # occ script + install -vDm 755 ../custom_files/$pkgname.occ.sh "$pkgdir/usr/bin/occ" + # optional pacman hook + install -vDm 644 ../$pkgname.hook -t "$pkgdir/usr/share/doc/$pkgname/" + # apache example conf + install -vDm 644 ../apache.example.conf -t "$pkgdir/usr/share/doc/$pkgname/" + # systemd service + install -vDm 644 ../custom_files/$pkgname-cron.service -t "$pkgdir/usr/lib/systemd/system/" + install -vDm 644 ../$pkgname-cron.timer -t "$pkgdir/usr/lib/systemd/system/" +} diff --git a/nextcloud/apache.example.conf b/nextcloud/apache.example.conf new file mode 100644 index 0000000..56c9c46 --- /dev/null +++ b/nextcloud/apache.example.conf @@ -0,0 +1,21 @@ + + Alias /nextcloud /usr/share/webapps/nextcloud/ + + + + Options FollowSymlinks + AllowOverride all + Require all granted + + + + ServerAdmin foo@foofarm.com + DocumentRoot /usr/share/webapps/nextcloud + ServerName nextcloud.foo.com + ErrorLog /var/log/httpd/nextcloud.foo.info-error_log + CustomLog /var/log/httpd/nextcloud.foo.info-access_log common + + + + AssignUserId nextcloud nextcloud + diff --git a/nextcloud/nextcloud-cron.service b/nextcloud/nextcloud-cron.service new file mode 100644 index 0000000..8370aaf --- /dev/null +++ b/nextcloud/nextcloud-cron.service @@ -0,0 +1,7 @@ +[Unit] +Description=Nextcloud; run cron.php + +[Service] +KillMode=mixed +User=nextcloud +ExecStart=/usr/bin/PHP_INTERPRETER -f /usr/share/webapps/nextcloud/cron.php diff --git a/nextcloud/nextcloud-cron.timer b/nextcloud/nextcloud-cron.timer new file mode 100644 index 0000000..b9d2a91 --- /dev/null +++ b/nextcloud/nextcloud-cron.timer @@ -0,0 +1,9 @@ +[Unit] +Description=Nextcloud; run cron.php periodically + +[Timer] +OnBootSec=5min +OnUnitActiveSec=5min + +[Install] +WantedBy=timers.target \ No newline at end of file diff --git a/nextcloud/nextcloud.config.php b/nextcloud/nextcloud.config.php new file mode 100644 index 0000000..8d8ce7d --- /dev/null +++ b/nextcloud/nextcloud.config.php @@ -0,0 +1,17 @@ + '/var/lib/nextcloud/data', +'logfile' => '/var/log/nextcloud/nextcloud.log', +'apps_paths' => [ + [ + 'path'=> '/usr/share/webapps/nextcloud/apps', + 'url' => '/apps', + 'writable' => false, + ], + [ + 'path'=> '/var/lib/nextcloud/apps', + 'url' => '/wapps', + 'writable' => true, + ], +], +); diff --git a/nextcloud/nextcloud.hook b/nextcloud/nextcloud.hook new file mode 100644 index 0000000..33cd4db --- /dev/null +++ b/nextcloud/nextcloud.hook @@ -0,0 +1,13 @@ +# Update Nextcloud when core or -apps are touched + +[Trigger] +Operation = Install +Operation = Upgrade +Type = Package +Target = nextcloud +Target = nextcloud-app-* + +[Action] +Description = Updating Nextcloud installation +When = PostTransaction +Exec = /usr/bin/occ upgrade diff --git a/nextcloud/nextcloud.install b/nextcloud/nextcloud.install new file mode 100644 index 0000000..efa0f18 --- /dev/null +++ b/nextcloud/nextcloud.install @@ -0,0 +1,16 @@ +# arg 1: the new package version +# arg 2: the old package version +post_upgrade() { + if (( "$(vercmp "$2" '21.0.0-6')" < 0 )); then + printf "WARNING: Major changes introduced to package!\n" + printf " The application is now run as its own user - nextcloud.\n" + printf " Default directories for runtime, state and log files are provided.\n" + printf " A convenience wrapper around occ is provided in /usr/bin/occ.\n" + # directories below /usr/share/webapps/nextcloud are still group-owned by the + # nextcloud user due to nextcloud < 21.0.0 + find /usr/share/webapps/nextcloud -type d -exec chgrp root {} \; + fi + if (( "$(vercmp "$2" '22.0.0-1')" < 0 )); then + printf "NOTE: The application's .htaccess file is now located in /etc/webapps/nextcloud/.\n" + fi +} diff --git a/nextcloud/nextcloud.occ.sh b/nextcloud/nextcloud.occ.sh new file mode 100644 index 0000000..61316d4 --- /dev/null +++ b/nextcloud/nextcloud.occ.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash + +readonly default_config="/etc/PHP_INTERPRETER/php.ini" +readonly default_php_command="/usr/bin/PHP_INTERPRETER" +readonly default_user="nextcloud" +readonly preserved_environment_vars="NEXTCLOUD_CONFIG_DIR" + +config="" +php_command="" +user="" + +check_sudo() { + if ! command -v sudo > /dev/null; then + printf "The sudo command is not available.\n" + exit 1 + fi +} + +# allow overriding the php.ini +if [[ -n "${NEXTCLOUD_PHP_CONFIG}" ]] && [[ -f "${NEXTCLOUD_PHP_CONFIG}" ]]; then + config="${NEXTCLOUD_PHP_CONFIG}" +else + config="${default_config}" +fi + +# allow overriding the php executable +if [[ -n "${NEXTCLOUD_PHP}" ]] && command -v "${NEXTCLOUD_PHP}" > /dev/null; then + php_command="${NEXTCLOUD_PHP}" +else + php_command="${default_php_command}" +fi + +# allow overriding the user to run as +if [[ -n "${NEXTCLOUD_USER}" ]] && id "${NEXTCLOUD_USER}" > /dev/null 2>&1; then + user="${NEXTCLOUD_USER}" +else + user="${default_user}" +fi + +if [[ "${UID}" -eq 0 ]]; then + runuser --whitelist-environment="${preserved_environment_vars}" -u "$user" -- "$php_command" -c "${config}" /usr/share/webapps/nextcloud/occ "$@" +else + check_sudo + sudo --preserve-env="${preserved_environment_vars}" -u "$user" "$php_command" -c "${config}" /usr/share/webapps/nextcloud/occ "$@" +fi diff --git a/nextcloud/nextcloud.sysusers b/nextcloud/nextcloud.sysusers new file mode 100644 index 0000000..241ef2e --- /dev/null +++ b/nextcloud/nextcloud.sysusers @@ -0,0 +1 @@ +u nextcloud - "Nextcloud user" - - diff --git a/nextcloud/nextcloud.tmpfiles b/nextcloud/nextcloud.tmpfiles new file mode 100644 index 0000000..f854eaf --- /dev/null +++ b/nextcloud/nextcloud.tmpfiles @@ -0,0 +1,9 @@ +Z /etc/webapps/nextcloud/config - nextcloud nextcloud +z /etc/webapps/nextcloud/.htaccess 0644 nextcloud nextcloud +z /etc/webapps/nextcloud/ 0755 root root +Z %C/nextcloud - nextcloud nextcloud +d %t/nextcloud 0755 nextcloud nextcloud +z %L/nextcloud 0755 nextcloud nextcloud +d %S/nextcloud 0755 nextcloud nextcloud +d %S/nextcloud/apps 0755 nextcloud nextcloud +d %S/nextcloud/data 0770 nextcloud nextcloud diff --git a/nextcloud/nextcloud.uwsgi b/nextcloud/nextcloud.uwsgi new file mode 100644 index 0000000..07de951 --- /dev/null +++ b/nextcloud/nextcloud.uwsgi @@ -0,0 +1,82 @@ +[uwsgi] +procname-master = %n +plugins = UWSGI_PLUGIN +master = true +socket = /run/%n/%n.sock +# uncomment for a stats socket, that can be used with uwsgitop +# stats = /run/%n/%n-stats.sock +uid = nextcloud +gid = nextcloud +processes = 10 +cheaper = 4 +cheaper-step = 1 +idle = 600 +die-on-idle = true + +; reload whenever this config file changes +touch-reload = %p + +cloud_data_dir = /var/lib/nextcloud/data +cloud_writable_apps_dir = /var/lib/nextcloud/apps +chdir = %(cloud_data_dir) + +php-allowed-ext = .php +php-docroot = /usr/share/webapps/%n +php-index = index.php +php-set = date.timezone=Europe/Berlin +php-set = open_basedir=%(cloud_data_dir):%(cloud_writable_apps_dir):/var/lib/%n:/tmp/:/usr/share/webapps/%n:/etc/webapps/%n:/dev/urandom:/usr/lib/PHP_INTERPRETER/modules:/run/redis/redis.sock:/var/log/%n/%n.log:/proc/meminfo +php-set = session.save_path=/tmp +php-set = session.gc_maxlifetime 21600 +php-set = session.gc_divisor 500 +php-set = session.gc_probability 1 +php-set = post_max_size=1000M +php-set = upload_max_filesize=1000M +php-set = always_populate_raw_post_data=-1 +php-set = max_input_time=120 +php-set = max_execution_time=60 +php-set = memory_limit=768M +php-set = zend_extension=opcache +php-set = opcache.enable=1 +php-set = opcache.enable_cli=1 +php-set = opcache.interned_strings_buffer=8 +php-set = opcache.max_accelerated_files=10000 +php-set = opcache.memory_consumption=128 +php-set = opcache.save_comments=1 +php-set = opcache.revalidate_freq=1 + +# uncomment if php-apcu is installed and used +# php-set = extension=apcu +php-set = extension=bcmath +php-set = extension=bz2 +php-set = extension=curl +php-set = extension=exif +php-set = extension=ftp +php-set = extension=gd +php-set = extension=gmp +# uncomment if php-imagick is installed and used +# php-set = extension=imagick +# uncomment if php-imap is installed and used +# php-set = extension=imap +# uncomment if php-intl is installed and used +# php-set = extension=intl +php-set = extension=iconv +php-set = extension=ldap +# uncomment if php-memcached is installed and used +# php-set = extension=memcached +php-set = extension=pdo_mysql +# uncomment if php-pgsql is installed and used +# php-set = extension=pdo_pgsql +php-set = extension=pdo_sqlite +# uncomment if php-igbinary is installed and used +# php-set = extension=igbinary +# uncomment if php-redis is installed and used (requires php-igbinary) +# php-set = extension=redis +php-set = extension=sockets +# uncomment if php-xsl is installed and used +# php-set = extension=xsl +php-set = extension=zip + +# change the URL to your own address and uncomment to run a webcron job every five minutes +# cron = -5 -1 -1 -1 -1 curl --silent https://change.me.tld/cron.php 1>/dev/null +# uncomment to run a cron job every five minutes +# cron = -5 -1 -1 -1 -1 PHP_INTERPRETER -f /usr/share/webapps/%n/cron.php