# Class to install a Mastodon instance # # [*ensure*] # String defining if is present or absent # # [*hostname*] # String with the full qualified hostname of the instance. There must be a DNS record for it. # # [*smtp_server*] # String with the SMTP server to use. # # [*mastodon_home*] # String path to Mastodon user home directory. Default /opt/mastodon # # [*db_password*] # String with Database password. # # [*mastodon_version*] # String with Mastodon version (code tag) to install. Default v4.2.1 # class mastodon ( String $ensure = 'present', String $hostname = 'mastodon.example.org', String $smtp_server = 'mail.example.org', String $mastodon_home = '/opt/mastodon', String $db_password = '', String $mastodon_version = 'v4.2.1', ) { case $ensure { default: { $package_ensure = 'installed' $directory_ensure = 'directory' $link_ensure = 'link' $service_ensure = 'running' $file_ensure = 'present' } /^(absent|delete|uninstall|remove|unregister)$/: { $package_ensure = 'absent' $directory_ensure = 'absent' $link_ensure = 'absent' $file_ensure = 'absent' $service_ensure = 'stopped' $cron_ensure = 'absent' } } $packages = [ 'apt-transport-https', 'autoconf', 'bison', 'build-essential', 'ca-certificates', 'certbot', 'ffmpeg', 'file', 'g++', 'gcc', 'git-core', 'gnupg', 'imagemagick', 'libffi-dev', 'libgdbm-dev', 'libicu-dev', 'libidn11-dev', 'libjemalloc-dev', 'libncurses5-dev', 'libpq-dev', 'libprotobuf-dev', 'libreadline6-dev', 'libssl-dev', 'libxml2-dev', 'libxslt1-dev', 'libyaml-dev', 'lsb-release', 'nginx', # 'nodejs', 'pkg-config', # 'postgresql-contrib', # 'postgresql', 'protobuf-compiler', 'python3-certbot-nginx', # 'redis-server', # 'redis-tools', 'wget', 'zlib1g-dev', ] $packages.each | $package | { if (!defined(Package[$package])) { package { $package: ensure => $package_ensure, } } } class { 'nodejs': repo_url_suffix => '16.x', } class { 'postgresql::server': } include redis exec { 'enable_corepack': command => '/usr/bin/corepack enable', creates => '/usr/bin/yarn', require => Class['nodejs'], } exec { 'yarn_classic': command => '/usr/bin/yarn set version classic', creates => '/root/.yarnrc', require => Exec['enable_corepack'], } group { 'mastodon': } user { 'mastodon': gid => 'mastodon', home => $mastodon_home, managehome => true, system => true, require => Group['mastodon'], } # vcsrepo { 'rbenv': # path => "${mastodon_home}/.rbenv", # source => 'https://github.com/rbenv/rbenv.git', # provider => 'git', # owner => 'mastodon', # group => 'mastodon', # require => User['mastodon'], # } # exec { 'configure_rbenv': # command => "${mastodon_home}/.rbenv/src/configure", # user => 'mastodon', # cwd => "${mastodon_home}/.rbenv/", # creates => "${mastodon_home}/.rbenv/src/Makefile", # require => Vcsrepo['rbenv'], # } # exec { 'make_rbenv': # command => '/usr/bin/make -C src', # user => 'mastodon', # cwd => "${mastodon_home}/.rbenv/", # creates => "${mastodon_home}/.rbenv/libexec/rbenv-realpath.dylib", # require => Exec['configure_rbenv'], # } # file_line { 'mastodon_path': # path => "${mastodon_home}/.bashrc/", # line => 'export PATH="$HOME/.rbenv/bin:$PATH"', # match => '^export PATH="$HOME/.rbenv', # require => Vcsrepo['rbenv'], # } # file_line { 'mastodon_rbenv_init': # path => "${mastodon_home}/.bashrc/", # line => 'eval "$(rbenv init -)"', # match => '^eval "$(rbenv init -)"', # require => Vcsrepo['rbenv'], # } # vcsrepo { 'ruby_build': # path => "${mastodon_home}/.rbenv/plugins/ruby-build", # source => 'https://github.com/rbenv/ruby-build.git', # provider => 'git', # owner => 'mastodon', # group => 'mastodon', # require => Vcsrepo['rbenv'], # } # exec { 'update_ruby': # command => "${mastodon_home}/.rbenv/bin/rbenv global 3.2.2", # environment => [ # 'RUBY_CONFIGURE_OPTS=--with-jemalloc rbenv install 3.2.2', # ], # user => 'mastodon', # cwd => "${mastodon_home}/.rbenv/", # # creates => '', # require => Vcsrepo['ruby_build'], # } # exec { '':} class { 'rvm': } rvm_system_ruby { 'ruby-3.2.2': build_opts => ['--with-jemalloc'], } rvm_gemset { 'bundler': name => 'bundler', ruby_version => 'ruby-3.2.2', require => Rvm_system_ruby['ruby-3.2.2']; } postgresql::server::db { 'mastodon': user => 'mastodon', password => postgresql::postgresql_password('mastodon', $db_password), } vcsrepo { 'mastodon_code': path => "${mastodon_home}/live", source => 'https://github.com/mastodon/mastodon.git', revision => $mastodon_version, provider => 'git', owner => 'mastodon', group => 'mastodon', require => User['mastodon'], } exec { 'config_deployment': command => 'bundle config deployment \'true\'', user => 'mastodon', cwd => "${mastodon_home}/live", # creates => "${mastodon_home}/.rbenv/libexec/rbenv-realpath.dylib", require => Rvm_gemset['bundler'], } exec { 'config_without_devel_test': command => 'bundle config without \'development test\'', user => 'mastodon', cwd => "${mastodon_home}/live", # creates => "${mastodon_home}/.rbenv/libexec/rbenv-realpath.dylib", require => Exec['config_deployment'], } exec { 'bundle_install': command => 'bundle install -j$(getconf _NPROCESSORS_ONLN)', user => 'mastodon', cwd => "${mastodon_home}/live", # creates => "${mastodon_home}/.rbenv/libexec/rbenv-realpath.dylib", require => Exec['config_without_devel_test'], } exec { 'yarn_install': command => 'yarn install --pure-lockfile', user => 'mastodon', cwd => "${mastodon_home}/live", # creates => "${mastodon_home}/.rbenv/libexec/rbenv-realpath.dylib", require => Exec['bundle_install'], } }