bundlewrap/bundles/nextcloud/metadata.py
CroneKorkN f1fc79269d
fix(nextcloud): enable the concrete image preview providers
OC\Preview\Image is only the base class, so since 2899cd5 no JPEG or
PNG preview could be generated ("No provider successfully handled the
preview generation").

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RywMtsL8qXG7GDY3MHq9Uh
2026-10-23 14:11:46 +02:00

221 lines
6.7 KiB
Python

from shlex import quote
defaults = {
'apt': {
'packages': {
'php': {},
'php-redis': {},
'php-fpm': {},
'php-curl': {},
'php-gd': {},
'php-json': {},
'php-xml': {},
'php-mbstring': {},
'php-cli': {},
'php-cgi': {},
'php-zip': {},
'php-pgsql': {},
'php-intl': {},
'php-imagick': {},
'libmagickcore-6.q16-6-extra': {},
'php-gmp': {},
'php-bcmath': {},
},
},
'archive': {
'paths': {
'/var/lib/nextcloud': {
'exclude': [
'^appdata_',
'^updater-',
'^nextcloud\\.log',
'^updater\\.log',
'^[^/]+/cache',
'^[^/]+/files_versions',
'^[^/]+/files_trashbin',
],
},
},
},
'backup': {
'paths': {
'/etc/nextcloud/config.php',
},
},
'nextcloud': {
'admin_user': 'admin',
'admin_pass': repo.vault.password_for(f'{node.name} nextcloud admin pw').value,
'config': {},
},
'php': {
'post_max_size': '32G',
'www.conf': {
'env[HOSTNAME]': '$HOSTNAME',
'env[PATH]': '/usr/local/bin:/usr/bin:/bin',
'env[TMP]': '/tmp',
'env[TMPDIR]': '/tmp',
'env[TEMP]': '/tmp',
},
'php.ini': {
'PHP': {
'memory_limit': '3G', # face recognition requires 2G
},
},
},
'postgresql': {
'roles': {
'nextcloud': {
'password': repo.vault.password_for(f'{node.name} nextcloud db pw').value,
},
},
'databases': {
'nextcloud': {
'owner': 'nextcloud',
},
},
},
'redis': {
'nextcloud': {},
},
'systemd-timers': {
'nextcloud-cron': {
'command': '/usr/bin/php -f /opt/nextcloud/cron.php',
'when': '*:0/5',
'user': 'www-data',
'kill_mode': 'process',
},
'nextcloud-scan-app-data': {
'command': '/usr/bin/php /opt/nextcloud/occ files:scan-app-data',
'when': 'yearly',
'user': 'www-data',
},
'nextcloud-scan-files': {
'command': '/usr/bin/php /opt/nextcloud/occ files:scan --all',
'when': 'weekly',
'user': 'www-data',
'after': {
'nextcloud-scan-app-data.service',
},
},
'nextcloud-generate-all-previews': {
'command': '/bin/bash -c ' + quote('php /opt/nextcloud/occ preview:generate-all --workers="$(nproc)" --no-interaction -vvv'),
'when': 'monthly',
'user': 'www-data',
'after': {
'nextcloud-scan-files.service',
},
},
'nextcloud-generate-new-previews': {
'command': '/usr/bin/php /opt/nextcloud/occ preview:pre-generate --no-interaction -vvv',
'when': '*:0/5', # every 5 minutes
'user': 'www-data',
'after': {
'nextcloud-generate-all-previews.service',
},
},
},
}
@metadata_reactor.provides(
'nextcloud/config',
)
def config(metadata):
return {
'nextcloud': {
'config': {
'dbuser': 'nextcloud',
'dbpassword': metadata.get('postgresql/roles/nextcloud/password'),
'dbname': 'nextcloud',
'dbhost': 'localhost',
'dbtype': 'pgsql',
'dbtableprefix': 'oc_',
'datadirectory': '/var/lib/nextcloud',
'dbport': '5432',
'apps_paths': [
{
'path': '/opt/nextcloud/apps',
'url': '/apps',
'writable': False
},
{
'path': '/var/lib/nextcloud/.userapps',
'url': '/userapps',
'writable': True
}
],
'cache_path': '/var/lib/nextcloud/.cache',
'upgrade.disable-web': True,
'memcache.local': '\\OC\\Memcache\\Redis',
'memcache.locking': '\\OC\\Memcache\\Redis',
'memcache.distributed': '\\OC\\Memcache\\Redis',
'redis': {
'host': '/var/run/redis/nextcloud.sock'
},
'trusted_domains': [
'localhost',
'127.0.0.1',
metadata.get('nextcloud/hostname'),
],
# concrete provider classes; OC\Preview\Image is only their base class
'enabledPreviewProviders': [
'OC\\Preview\\BMP',
'OC\\Preview\\GIF',
'OC\\Preview\\HEIC',
'OC\\Preview\\JPEG',
'OC\\Preview\\Movie',
'OC\\Preview\\PNG',
'OC\\Preview\\WebP',
],
'preview_max_x': 1920,
'preview_max_y': 1920,
'preview_max_scale_factor': 4,
'log_type': 'syslog',
'syslog_tag': 'nextcloud',
'logfile': '',
'loglevel': 2,
'default_phone_region': 'DE',
'versions_retention_obligation': 'auto, 90',
'simpleSignUpLink.shown': False,
'allow_local_remote_servers': True, # FIXME?
'maintenance_window_start': 1, # https://docs.nextcloud.com/server/29/admin_manual/configuration_server/background_jobs_configuration.html#maintenance-window-start
},
},
}
@metadata_reactor.provides(
'zfs/datasets',
)
def zfs(metadata):
return {
'zfs': {
'datasets': {
f"{metadata.get('zfs/storage_classes/hdd')}/nextcloud": {
'mountpoint': '/var/lib/nextcloud',
'needed_by': [
'bundle:nextcloud',
],
},
},
},
}
@metadata_reactor.provides(
'nginx/vhosts'
)
def vhost(metadata):
return {
'nginx': {
'vhosts': {
metadata.get('nextcloud/hostname'): {
'content': 'nextcloud/vhost.conf',
'context': {
'root': '/opt/nextcloud',
},
},
},
},
}