File discourse.spec of Package discourse
#
# spec file for package
#
# Copyright (c) 2014 SUSE LINUX Products GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
# Please submit bugfixes or comments via https://bugs.opensuse.org/
#
Name: discourse
Version: 0
Release: 0
#
%define vhosts_dir /srv/www/vhosts/
%define app_dir %{vhosts_dir}/%{name}/
%define home_dir %{app_dir}
License: GPL-2.0+
Summary: A platform for community discussion. Free, open, simple
Url: http://www.discourse.org/
Group: Productivity/Networking/Web/Frontends
Source: _service
Source1: %{name}-rpmlintrc
Source2: %{name}-update
Source3: %{name}-puma.service
Source4: %{name}-sidekiq.service
Source5: %{name}.target
Source6: dump-version-info.rb
Source7: discourse-update.service
Source9: series
Source10: _servicedata
Source11: vendor.tar.xz
Patch: discourse.fix.deps.patch
Patch1: discourse.fix-puma-config.patch
Patch2: discourse.fix-nginx-config.patch
Patch3: es6.patch
Patch4: convert-git-deps-to-path.patch
Patch5: yarn-use-no-production.patch
Patch6: run-backups-with-the-correct-ruby.patch
# cant be noarch if we ship those prebuilt binaries
# BuildArch: noarch
#
ExclusiveArch: x86_64
BuildRequires: git-core
Requires: git-core
BuildRequires: glibc-locale-base
BuildRequires: strace
BuildRequires: postgresql-contrib
BuildRequires: postgresql-server
BuildRequires: rsync
BuildRequires: fdupes
BuildRequires: ruby-common-rails >= 2.6
#
%define nodejs_min_version 22
BuildRequires: timezone
Requires: timezone
BuildRequires: brotli
Requires: brotli
BuildRequires: npm%{nodejs_min_version}
BuildRequires: (pnpm >= 9 with pnpm < 10)
%requires_eq nodejs%{nodejs_min_version}
%requires_eq npm%{nodejs_min_version}
%requires_eq pnpm
#
BuildRequires: pkgconfig(systemd)
%{?systemd_requires}
Requires: ImageMagick
Requires: pngquant
Requires: oxipng
Requires: jhead
Requires: jpegoptim
Requires: patch
Provides: group(discourse)
Provides: user(discourse)
#
#define discourse_rb_build_versions ruby34
#define discourse_rb_suffix ruby3.4
#define discourse_rb_build_abi ruby:3.4.0
%define rb_build_versions %{discourse_rb_build_versions}
%define rb_build_abi %{discourse_rb_build_abi}
%define rb_suffix %{discourse_rb_suffix}
#
Provides: rubygem(%{rb_build_abi}:mail) = 2.8.0.edge
# for a better rails console
Recommends: %{rubygem php-serialize}
BuildRequires: %{rubygem pry-rails}
# generated!!!
#
BuildRequires: %{rb_suffix}-rubygem-gem2rpm
BuildRequires: %{rb_suffix}-rubygem-net-http
BuildRequires: %{rb_suffix}-rubygem-bundler >= 2.5.16
%requires_eq %{rb_suffix}-rubygem-bundler
# helper for scheduler
BuildRequires: %{rubygem redis-namespace >= 1.11.0}
BuildRequires: %{rubygem json >= 2.7.6}
BuildRequires: %{rubygem json_schemer >= 2.4}
BuildRequires: %{rubygem oj >= 3.16.1}
BuildRequires: %{rubygem webrick >= 1.9.0}
BuildRequires: %{rubygem excon >= 1}
BuildRequires: %{rubygem benchmark >= 0.4}
BuildRequires: %{rubygem csv >= 3.3}
BuildRequires: %{rubygem uri >= 1}
# we can not use this as this conflicts with the ruby 3.3 package.
#BuildRequires: %{rubygem irb >= 1.15}
BuildRequires: %{rubygem date >= 3.4}
BuildRequires: %{rubygem digest >= 3.2}
BuildRequires: %{rubygem drb >= 2.2.1}
BuildRequires: %{rubygem ostruct >= 0.6.1}
BuildRequires: %{rubygem io-console >= 0.8}
BuildRequires: %{rubygem net-smtp >= 0.5.0}
BuildRequires: %{rubygem net-imap >= 0.5.5}
BuildRequires: %{rubygem psych >= 5.2.3}
BuildRequires: %{rubygem rake >= 13.2}
BuildRequires: %{rubygem rexml >= 3.4}
BuildRequires: %{rubygem reline >= 0.6}
BuildRequires: %{rubygem stringio >= 3.1.2}
BuildRequires: %{rubygem timeout >= 0.4.3}
BuildRequires: %{rubygem securerandom >= 0.4.1}
BuildRequires: %{rubygem minitest >= 5.25}
BuildRequires: %{rubygem openssl >= 3.3}
BuildRequires: %{rubygem logger >= 1.6.5}
BuildRequires: %{rubygem bigdecimal >= 3.1.9}
BuildRequires: %{rubygem json >= 2.10}
# /helper for scheduler
#
%define rails_version 7.2.0
BuildRequires: %{rubygem bootsnap}
BuildRequires: %{rubygem actionmailer:7.2 >= %{rails_version}}
BuildRequires: %{rubygem actionpack:7.2 >= %{rails_version}}
BuildRequires: %{rubygem actionview:7.2 >= %{rails_version}}
BuildRequires: %{rubygem activemodel:7.2 >= %{rails_version}}
BuildRequires: %{rubygem activerecord:7.2 >= %{rails_version}}
BuildRequires: %{rubygem activesupport:7.2 >= %{rails_version}}
BuildRequires: %{rubygem railties:7.2 >= %{rails_version}}
BuildRequires: %{rubygem sprockets-rails}
BuildRequires: %{rubygem json}
BuildRequires: %{rubygem sprockets:3.7 >= 3.7.3}
BuildRequires: %{rubygem actionview_precompiler}
BuildRequires: %{rubygem discourse-seed-fu}
BuildRequires: %{rubygem mail}
BuildRequires: %{rubygem mini_mime}
BuildRequires: %{rubygem mini_suffix}
BuildRequires: %{rubygem redis < 5.0}
BuildRequires: %{rubygem redis-namespace}
BuildRequires: %{rubygem active_model_serializers:0.8 >= 0.8.3}
BuildRequires: %{rubygem http_accept_language}
BuildRequires: %{rubygem discourse-fonts}
BuildRequires: %{rubygem message_bus}
BuildRequires: %{rubygem rails_multisite}
BuildRequires: %{rubygem fastimage}
BuildRequires: %{rubygem aws-sdk-s3}
BuildRequires: %{rubygem aws-sdk-sns}
BuildRequires: %{rubygem excon}
BuildRequires: %{rubygem unf}
BuildRequires: %{rubygem email_reply_trimmer}
BuildRequires: %{rubygem image_optim}
BuildRequires: %{rubygem multi_json}
BuildRequires: %{rubygem mustache}
BuildRequires: %{rubygem nokogiri}
BuildRequires: %{rubygem loofah}
BuildRequires: %{rubygem css_parser}
BuildRequires: %{rubygem omniauth}
BuildRequires: %{rubygem omniauth-facebook}
BuildRequires: %{rubygem omniauth-twitter}
BuildRequires: %{rubygem omniauth-github}
BuildRequires: %{rubygem omniauth-oauth2}
BuildRequires: %{rubygem omniauth-google-oauth2}
BuildRequires: %{rubygem oj}
BuildRequires: %{rubygem pg}
BuildRequires: %{rubygem mini_sql}
BuildRequires: %{rubygem pry-rails}
BuildRequires: %{rubygem pry-byebug}
BuildRequires: %{rubygem rtlcss}
BuildRequires: %{rubygem messageformat-wrapper}
BuildRequires: %{rubygem rake}
BuildRequires: %{rubygem thor}
BuildRequires: %{rubygem diffy}
BuildRequires: %{rubygem rinku}
BuildRequires: %{rubygem sidekiq}
BuildRequires: %{rubygem mini_scheduler}
BuildRequires: %{rubygem execjs}
BuildRequires: %{rubygem mini_racer = 0.17.0.pre13}
BuildRequires: %{rubygem highline}
BuildRequires: %{rubygem rack}
BuildRequires: %{rubygem rack-protection}
BuildRequires: %{rubygem cbor}
BuildRequires: %{rubygem cose}
BuildRequires: %{rubygem addressable}
BuildRequires: %{rubygem json_schemer}
BuildRequires: %{rubygem net-smtp}
BuildRequires: %{rubygem net-imap}
BuildRequires: %{rubygem net-pop}
BuildRequires: %{rubygem digest}
BuildRequires: %{rubygem uglifier}
BuildRequires: %{rubygem fast_blank}
BuildRequires: %{rubygem lru_redux}
BuildRequires: %{rubygem htmlentities}
BuildRequires: %{rubygem rack-mini-profiler}
BuildRequires: %{rubygem unicorn}
BuildRequires: %{rubygem puma}
BuildRequires: %{rubygem rbtrace}
BuildRequires: %{rubygem ruby-readability}
BuildRequires: %{rubygem rss}
BuildRequires: %{rubygem stackprof}
BuildRequires: %{rubygem memory_profiler}
BuildRequires: %{rubygem cppjieba_rb}
BuildRequires: %{rubygem lograge}
BuildRequires: %{rubygem logstash-event}
BuildRequires: %{rubygem logster}
BuildRequires: %{rubygem sassc-embedded}
BuildRequires: %{rubygem rotp}
BuildRequires: %{rubygem rqrcode}
BuildRequires: %{rubygem rubyzip}
BuildRequires: %{rubygem sshkey}
BuildRequires: %{rubygem rchardet}
BuildRequires: %{rubygem lz4-ruby}
BuildRequires: %{rubygem sanitize}
BuildRequires: %{rubygem sqlite3}
BuildRequires: %{rubygem redcarpet}
BuildRequires: %{rubygem web-push}
BuildRequires: %{rubygem colored2}
BuildRequires: %{rubygem maxminddb}
BuildRequires: %{rubygem rails_failover}
BuildRequires: %{rubygem faraday}
BuildRequires: %{rubygem faraday-retry}
BuildRequires: %{rubygem net-http}
BuildRequires: %{rubygem cgi >= 0.4.2}
BuildRequires: %{rubygem csv}
BuildRequires: %{rubygem iso8601}
BuildRequires: %{rubygem rrule}
BuildRequires: %{rubygem extralite-bundle}
BuildRequires: %{rubygem zeitwerk}
BuildRequires: %{rubygem trilogy}
BuildRequires: %{rubygem ruby-progressbar}
BuildRequires: %{rubygem digest-xxhash}
BuildRequires: %{rubygem dry-initializer:3 >= 3.1}
BuildRequires: %{rubygem parallel}
BuildRequires: %{rubygem rtlcss = 0.2.1}
# Importer deps:
BuildRequires: %{rubygem sqlite3:2}
BuildRequires: %{rubygem redcarpet}
# helper for scheduler
BuildRequires: %{rubygem rexml >= 3.3.2}
BuildRequires: %{rubygem openssl >= 3.2.0}
BuildRequires: %{rubygem racc >= 1.8.0}
BuildRequires: %{rubygem rake >= 13.1.0}
BuildRequires: %{rubygem rack-session:1}
BuildRequires: %{rubygem rack-test >= 2.0.2}
BuildRequires: %{rubygem rackup:1}
BuildRequires: %{rubygem rack:2.2 >= 2.2.9}
BuildRequires: %{rubygem rubyzip >= 2.3.2}
BuildRequires: %{rubygem bigdecimal >= 3.1.6}
BuildRequires: %{rubygem date >= 3.3.4}
BuildRequires: %{rubygem sanitize >= 6.1}
BuildRequires: %{rubygem jwt >= 2.6.0}
BuildRequires: %{rubygem mail >= 2.8.1}
BuildRequires: %{rubygem json >= 2.7.0}
BuildRequires: %{rubygem sidekiq:6.5 >= 6.5.8}
BuildRequires: %{rubygem oauth >= 1.1}
BuildRequires: %{rubygem digest >= 3.1.1}
BuildRequires: %{rubygem minitest >= 5.17.0}
BuildRequires: %{rubygem net-http >= 0.4.1}
BuildRequires: %{rubygem net-imap >= 0.4}
BuildRequires: %{rubygem net-smtp >= 0.4}
BuildRequires: %{rubygem net-pop >= 0.1.2}
BuildRequires: %{rubygem net-protocol >= 0.2.2}
BuildRequires: %{rubygem timeout >= 0.4}
BuildRequires: %{rubygem uri >= 0.12.2}
BuildRequires: %{rubygem omniauth:1}
BuildRequires: %{rubygem mini_mime >= 1.1}
BuildRequires: %{rubygem faraday >= 2}
BuildRequires: %{rubygem faraday-retry >= 2}
BuildRequires: %{rubygem omniauth-oauth2:1.7}
BuildRequires: %{rubygem oauth2 >= 2}
BuildRequires: %{rubygem puma >= 6.4.2}
BuildRequires: %{rubygem omniauth-google-oauth2:0.8}
BuildRequires: %{rubygem omniauth-github:1}
BuildRequires: %{rubygem rotp >= 6.3}
BuildRequires: %{rubygem rqrcode >= 2}
BuildRequires: %{rubygem lograge >= 0.14}
BuildRequires: %{rubygem rss >= 0.3}
BuildRequires: %{rubygem cgi >= 0.4}
BuildRequires: %{rubygem base64 >= 0.2}
BuildRequires: %{rubygem json >= 2.7.2}
BuildRequires: %{rubygem rdoc >= 6.7.0}
BuildRequires: %{rubygem request_store >= 1.7.0}
#
# /generated
%description
Discourse is the 100% open source discussion platform built for the next decade
of the Internet. It works as:
- a mailing list
- a discussion forum
- a long-form chat room
%prep
mv %{_sourcedir}/%{name}-%{version} %{_builddir}/%{name}-%{version}
%setup -q -D -T 0 -a 11
%rails_save_gemfile
%autopatch -p1
#generate_buildrequires
#{_bindir}/bundler-dumpdeps
%build
# 1.9.0.beta6~git14.d29fc781fb -> v1.9.0.beta6-14-gd29fc781fb
ruby.%{rb_suffix} %{S:6} %{version}
%rails_fix_ruby_shebang bin/* qa/bin/qa script/* script/*/*
%rails_regen_gemfile_lock
%rails_fix_ruby_suffix
%rails_write_appinfo
pushd $RPM_SOURCE_DIR
perl -p -i -e "s|BUNDLER_REPLACE|%{_bindir}/bundler.%{rb_suffix}|g" discourse-puma.service discourse-sidekiq.service discourse-update
popd
perl -p -i -e 's|/usr/bin/env rake|/usr/bin/rake.%{rb_suffix}|g' Rakefile
#RAILS_ENV="production" \
#DATABASE_URL=postgresql://none:none@127.0.0.1/none \
#./bin/bundle exec ./bin/rake assets:clean assets:precompile
cp -v config/database.yml{,.example}
mkdir -p tmp/{sockets,pids} public/uploads/ public/plugins/ public/backups/default/ app/assets/javascripts/plugins/ log/
chmod -R u=rwX,g=rX,o= .
chmod -R o+rX public/ config.ru
chmod -R go=X public/backups/
chmod go+X .
chmod -R go+X tmp/
chmod go+X plugins/ plugins/*/
chmod -R go+rX plugins/*/public/
chmod -R u=rwX,go= log/
if [[ -e .gitattributes ]] ; then
echo "Error: .gitattributes still exists"
rm -rv .gitattributes
fi
#find -name \*.swp -print -delete
find -type f \( -name .gitkeep -o -name .gitignore \) -print -delete
chmod a-x \
bin/docker/README.md \
public/javascripts/pikaday/1.8.2/pikaday.js
rm -rv tmp/cache/bootsnap*
# not sure why the symlink targets are missing but we will find out
for link in $(find -path "*/node_modules/.bin/*" -type l) ; do
target="$(readlink $link)" ;
if [ ! -e "${target}" ] ; then
rm -v "${link}" ;
fi
done
%install
install -D -d -m 0751 %{buildroot}%{app_dir}/
rsync -a $PWD/ %{buildroot}%{app_dir}/
install -D -m 0755 %{S:2} %{buildroot}%{_sbindir}/%{name}-update
install -D -m 0644 %{S:3} %{buildroot}%{_unitdir}/%{name}-puma.service
install -D -m 0644 %{S:4} %{buildroot}%{_unitdir}/%{name}-sidekiq.service
install -D -m 0644 %{S:7} %{buildroot}%{_unitdir}/%{name}-update.service
install -D -m 0644 %{S:5} %{buildroot}%{_unitdir}/%{name}.target
grep -h -r 'CREATE EXT' db/migrate/* | sed -e 's|.*"\(.*\)".*|\1;|g' | tee discourse.setup.extensions.sql
for i in puma sidekiq update ; do
ln -s /sbin/service %{buildroot}%{_sbindir}/rc%{name}-$i
done
#%%fdupes -s %%{buildroot}%%{app_dir}/
%pre
/usr/sbin/groupadd -r %{name} &>/dev/null || :
/usr/sbin/useradd -g %{name} -s /bin/false -r -c "Discourse" -d %{home_dir} %{name} &>/dev/null || :
%service_add_pre %{name}-update.service %{name}-puma.service %{name}-sidekiq.service discourse.target
%if 0
for dir in /srv/www/vhosts/discourse/app/assets/javascripts/float-kit/node_modules /srv/www/vhosts/discourse/app/assets/javascripts/custom-proxy/node_modules /srv/www/vhosts/discourse/app/assets/javascripts/discourse-hbr/node_modules /srv/www/vhosts/discourse/app/assets/javascripts/discourse-widget-hbs/node_modules /srv/www/vhosts/discourse/app/assets/javascripts/discourse-plugins/node_modules /srv/www/vhosts/discourse/app/assets/javascripts/discourse/node_modules /srv/www/vhosts/discourse/app/assets/javascripts/bootstrap-json/node_modules /srv/www/vhosts/discourse/app/assets/javascripts/discourse-markdown-it/node_modules /srv/www/vhosts/discourse/app/assets/javascripts/dialog-holder/node_modules /srv/www/vhosts/discourse/app/assets/javascripts/theme-transpiler/node_modules /srv/www/vhosts/discourse/app/assets/javascripts/wizard/node_modules /srv/www/vhosts/discourse/app/assets/javascripts/pretty-text/node_modules /srv/www/vhosts/discourse/app/assets/javascripts/admin/node_modules /srv/www/vhosts/discourse/app/assets/javascripts/truth-helpers/node_modules /srv/www/vhosts/discourse/app/assets/javascripts/select-kit/node_modules /srv/www/vhosts/discourse/app/assets/javascripts/discourse-common/node_modules ; do
if [ -d "${dir}" ] ; then
rm -r "${dir}" ||:
fi
done
if [ ! -d /srv/www/vhosts/discourse/node_modules/.pnpm -a -d /srv/www/vhosts/discourse/node_modules/ ] ; then
rm -r /srv/www/vhosts/discourse/node_modules/ ||:
fi
%endif
%post
%service_add_post %{name}-update.service %{name}-puma.service %{name}-sidekiq.service discourse.target
%preun
%service_del_preun %{name}-update.service %{name}-puma.service %{name}-sidekiq.service discourse.target
%postun
touch %{app_dir}/tmp/rebuild.txt
%service_del_postun %{name}-update.service %{name}-puma.service %{name}-sidekiq.service discourse.target
%files
%dir /srv/www
%doc discourse.setup.extensions.sql
%{_unitdir}/%{name}.target
%{_unitdir}/%{name}-puma.service
%{_unitdir}/%{name}-sidekiq.service
%{_unitdir}/%{name}-update.service
%{_sbindir}/%{name}-update
%{_sbindir}/rc%{name}*
%dir %{vhosts_dir}
%defattr(-,root,%{name})
%dir %{app_dir}/
%dir %{app_dir}/app
%dir %{app_dir}/app/assets
%dir %{app_dir}/app/assets/javascripts
%config(noreplace) %{app_dir}/config/
%{app_dir}/.appinfo.yml
%{app_dir}/.devcontainer/
%{app_dir}/app/assets/images
%{app_dir}/app/assets/javascripts/*.js*
%{app_dir}/app/assets/javascripts/admin/
%{app_dir}/app/assets/javascripts/deprecation-silencer/
%{app_dir}/app/assets/javascripts/dialog-holder/
%{app_dir}/app/assets/javascripts/discourse-hbr/
%{app_dir}/app/assets/javascripts/discourse-i18n/
%{app_dir}/app/assets/javascripts/discourse-markdown-it/
%{app_dir}/app/assets/javascripts/discourse-plugins/
%{app_dir}/app/assets/javascripts/discourse-widget-hbs/
%{app_dir}/app/assets/javascripts/discourse/
%{app_dir}/app/assets/javascripts/custom-proxy/
%{app_dir}/app/assets/javascripts/docs/
%{app_dir}/app/assets/javascripts/ember-addons/
%{app_dir}/app/assets/javascripts/ember-cli-progress-ci/
%{app_dir}/app/assets/javascripts/float-kit/
%{app_dir}/app/assets/javascripts/locales/
%{app_dir}/app/assets/javascripts/pretty-text/
%{app_dir}/app/assets/javascripts/select-kit/
%{app_dir}/app/assets/javascripts/theme-transpiler/
%{app_dir}/app/assets/javascripts/truth-helpers/
%{app_dir}/app/assets/stylesheets
%{app_dir}/app/controllers
%{app_dir}/app/helpers
%{app_dir}/app/jobs
%{app_dir}/app/mailers
%{app_dir}/app/models
%{app_dir}/app/serializers
%{app_dir}/app/services
%{app_dir}/app/views
%{app_dir}/bin
%{app_dir}/Brewfile
%{app_dir}/config.ru
%{app_dir}/CONTRIBUTING.md
%{app_dir}/CODEOWNERS
%{app_dir}/d
%{app_dir}/db
%{app_dir}/discourse.*
%{app_dir}/docs
%{app_dir}/.editorconfig
%{app_dir}/.prettierrc.cjs
%{app_dir}/.template-lintrc.cjs
%{app_dir}/.git-blame-ignore-revs
%{app_dir}/.github/
%{app_dir}/Gemfile
%{app_dir}/Gemfile.upstream
%{app_dir}/Gemfile*.lock
%{app_dir}/Gemfile*.lock.upstream
%{app_dir}/images
%{app_dir}/jsconfig.json
%{app_dir}/lefthook.yml
%{app_dir}/.licensed.yml
%{app_dir}/.licensee.json
%{app_dir}/lib
%{app_dir}/LICENSE.txt
%{app_dir}/migrations/
%{app_dir}/node_modules/
%{app_dir}/package.json
%{app_dir}/patches/
%{app_dir}/.prettierignore
%{app_dir}/public/*.html
%{app_dir}/public/*.json
%{app_dir}/public/images/
%{app_dir}/public/javascripts/
#{app_dir}/public/
%{app_dir}/plugins
%{app_dir}/Rakefile
%{app_dir}/README.md
%{app_dir}/.rspec
%{app_dir}/.rspec_parallel
%{app_dir}/.rubocop.yml
%{app_dir}/.ruby-gemset.sample
%{app_dir}/.ruby-version.sample
%{app_dir}/.jsdoc
%{app_dir}/script
%{app_dir}/spec
%{app_dir}/.streerc
%{app_dir}/test
%{app_dir}/translator.yml
%{app_dir}/.ignore
%{app_dir}/.pnpmfile.cjs
%{app_dir}/.vscode/
%{app_dir}/eslint.config.mjs
%{app_dir}/pnpm-lock.yaml
%{app_dir}/pnpm-workspace.yaml
%{app_dir}/stylelint.config.mjs
%dir %{app_dir}/vendor
%{app_dir}/vendor/data
%{app_dir}/vendor/gems
%{app_dir}/.npmrc
%{app_dir}/COPYRIGHT.md
%{app_dir}/app/assets/javascripts/.npmrc
%defattr(-,%{name},%{name})
%{app_dir}/vendor/assets
%{app_dir}/app/assets/javascripts/plugins/
%{app_dir}/public/plugins/
%{app_dir}/public/backups/
%{app_dir}/public/uploads/
%{app_dir}/tmp/
%{app_dir}/log/
%dir %{app_dir}/public
%changelog