# 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 { 'install_bundler': # command => 'gem install bundler --no-document', # user => 'mastodon', # cwd => "${mastodon_home}/.rbenv/", # # creates => '', # require => Vcsrepo['ruby_build'], # } 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)', # path => '/usr/sbin:/usr/bin:/sbin:/bin', # 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', # path => '/usr/sbin:/usr/bin:/sbin:/bin', # user => 'mastodon', # cwd => "${mastodon_home}/live", # # creates => "${mastodon_home}/.rbenv/libexec/rbenv-realpath.dylib", # require => Exec['bundle_install'], # } }