From 1017a3be6b88232c3631011f877b8be287f4e11f Mon Sep 17 00:00:00 2001 From: kgnfth <73314940+kgnfth@users.noreply.github.com> Date: Fri, 1 Jan 2021 21:50:40 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Added=20Mastodon=20(#338)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * :sparkles: Added Mastodon * Added instructions --- public/v4/apps/mastodon.yml | 223 +++++++++++++++++++++++++++++++++++ public/v4/logos/mastodon.png | Bin 0 -> 17341 bytes 2 files changed, 223 insertions(+) create mode 100644 public/v4/apps/mastodon.yml create mode 100644 public/v4/logos/mastodon.png diff --git a/public/v4/apps/mastodon.yml b/public/v4/apps/mastodon.yml new file mode 100644 index 0000000..4d409ac --- /dev/null +++ b/public/v4/apps/mastodon.yml @@ -0,0 +1,223 @@ +captainVersion: 4 +services: + # Mastodon + $$cap_appname: + environment: + LOCAL_DOMAIN: $$cap_appname.$$cap_root_domain + ALTERNATE_DOMAINS: $$cap_alt_domain + REDIS_HOST: srv-captain--$$cap_appname-redis + REDIS_PORT: 6379 + REDIS_PASSWORD: $$cap_redis_password + DB_HOST: srv-captain--$$cap_appname-postgres + DB_USER: mastodon + DB_NAME: mastodon_production + DB_PASS: $$cap_postgres_password + DB_PORT: 5432 + ES_ENABLED: 'false' + OTP_SECRET: $$cap_opt_secret_base + SECRET_KEY_BASE: $$cap_secret_key_base + VAPID_PRIVATE_KEY: $$cap_gen_random_hex(16) + VAPID_PUBLIC_KEY: $$cap_gen_random_hex(16) + SINGLE_USER_MODE: $$cap_su_mode + SMTP_SERVER: $$cap_smtp_server + SMTP_PORT: $$cap_smtp_port + SMTP_LOGIN: $$cap_smtp_user + SMTP_PASSWORD: $$cap_smtp_pass + SMTP_FROM_ADDRESS: $$cap_smtp_from + SMTP_TLS: $$cap_smtp_tls + S3_ENABLED: 'false' + RAILS_ENV: production + volumes: + - $$cap_appname-system:/mastodon/public/system + caproverExtra: + containerHttpPort: '3000' + dockerfileLines: + - FROM tootsuite/mastodon:$$cap_mastodon_version + - CMD rm -f /mastodon/tmp/pids/server.pid; bundle exec rails db:setup; bundle exec rails s -b 0.0.0.0 -p 3000 + # Streaming + $$cap_appname-streaming: + environment: + LOCAL_DOMAIN: $$cap_appname.$$cap_root_domain + ALTERNATE_DOMAINS: $$cap_alt_domain + REDIS_HOST: srv-captain--$$cap_appname-redis + REDIS_PORT: 6379 + REDIS_PASSWORD: $$cap_redis_password + DB_HOST: srv-captain--$$cap_appname-postgres + DB_USER: mastodon + DB_NAME: mastodon_production + DB_PASS: $$cap_postgres_password + DB_PORT: 5432 + ES_ENABLED: 'false' + OTP_SECRET: $$cap_opt_secret_base + SECRET_KEY_BASE: $$cap_secret_key_base + VAPID_PRIVATE_KEY: $$cap_gen_random_hex(16) + VAPID_PUBLIC_KEY: $$cap_gen_random_hex(16) + SINGLE_USER_MODE: $$cap_su_mode + SMTP_SERVER: $$cap_smtp_server + SMTP_PORT: $$cap_smtp_port + SMTP_LOGIN: $$cap_smtp_user + SMTP_PASSWORD: $$cap_smtp_pass + SMTP_FROM_ADDRESS: $$cap_smtp_from + SMTP_TLS: $$cap_smtp_tls + S3_ENABLED: 'false' + RAILS_ENV: production + caproverExtra: + containerHttpPort: '4000' + dockerfileLines: + - FROM tootsuite/mastodon:$$cap_mastodon_version + - CMD node ./streaming + # Sidekiq + $$cap_appname-sidekiq: + environment: + LOCAL_DOMAIN: $$cap_appname.$$cap_root_domain + ALTERNATE_DOMAINS: $$cap_alt_domain + REDIS_HOST: srv-captain--$$cap_appname-redis + REDIS_PORT: 6379 + REDIS_PASSWORD: $$cap_redis_password + DB_HOST: srv-captain--$$cap_appname-postgres + DB_USER: mastodon + DB_NAME: mastodon_production + DB_PASS: $$cap_postgres_password + DB_PORT: 5432 + ES_ENABLED: 'false' + OTP_SECRET: $$cap_opt_secret_base + SECRET_KEY_BASE: $$cap_secret_key_base + VAPID_PRIVATE_KEY: $$cap_gen_random_hex(16) + VAPID_PUBLIC_KEY: $$cap_gen_random_hex(16) + SINGLE_USER_MODE: $$cap_su_mode + SMTP_SERVER: $$cap_smtp_server + SMTP_PORT: $$cap_smtp_port + SMTP_LOGIN: $$cap_smtp_user + SMTP_PASSWORD: $$cap_smtp_pass + SMTP_FROM_ADDRESS: $$cap_smtp_from + SMTP_TLS: $$cap_smtp_tls + S3_ENABLED: 'false' + RAILS_ENV: production + caproverExtra: + dockerfileLines: + - FROM tootsuite/mastodon:$$cap_mastodon_version + - CMD bundle exec sidekiq + notExposeAsWebApp: 'true' + # PostgreSQL + $$cap_appname-postgres: + image: postgres:12 + volumes: + - $$cap_appname-postgres-data:/var/lib/postgresql/data + environment: + POSTGRES_USER: mastodon + POSTGRES_PASSWORD: $$cap_postgres_password + POSTGRES_DB: mastodon_production + caproverExtra: + notExposeAsWebApp: 'true' + # Redis + $$cap_appname-redis: + volumes: + - $$cap_appname-redis-data:/data + environment: + REDIS_PASSWORD: $$cap_redis_password + caproverExtra: + dockerfileLines: + - FROM redis:alpine + - CMD exec redis-server --requirepass "$$cap_redis_password" + notExposeAsWebApp: 'true' +caproverOneClickApp: + variables: + - id: $$cap_mastodon_version + label: Mastodon Version Tag + description: You can use latest tag or check version builds on https://hub.docker.com/r/tootsuite/mastodon/tags + defaultValue: v3.3.0 + + - id: $$cap_secret_key_base + defaultValue: $$cap_gen_random_hex(64) + label: Secret Key Base + description: The randomized string which is used to verify the integrity of signed cookies. Please use a string with more than 26 characters + validRegex: /^[^\@]{26,}$/ + + - id: $$cap_opt_secret_base + defaultValue: $$cap_gen_random_hex(64) + label: One-time password secret + description: Two-Factor Authentication (2FA) Key + validRegex: /^[^\@]{26,}$/ + + - id: $$cap_postgres_password + defaultValue: $$cap_gen_random_hex(12) + label: Postgres Password + description: Password must be at least 12 characters. Please use a random string. + validRegex: /^[^\@]{12,}$/ + + - id: $$cap_redis_password + defaultValue: $$cap_gen_random_hex(12) + label: Redis Password + description: Password must be at least 12 characters. Please use a random string. + validRegex: /^[^\@]{12,}$/ + + - id: $$cap_alt_domain + label: Alternate domains (optional) + description: If you have multiple domains pointed at your Mastodon server, this setting will allow Mastodon to recognize itself when users are addressed using those other domains. Separate the domains by commas, e.g. foo.com,bar.com + + - id: $$cap_su_mode + label: Single user mode + defaultValue: 'false' + description: If set to true, the frontpage of your Mastodon server will always redirect to the first profile in the database and registrations will be disabled. + + - id: $$cap_smtp_server + label: SMTP hostname + validRegex: /^([^\s^\/])+$/ + + - id: $$cap_smtp_user + label: SMTP username + validRegex: /^([^\s^\/])+$/ + + - id: $$cap_smtp_from + label: SMTP from + validRegex: /^([^\s^\/])+$/ + + - id: $$cap_smtp_pass + label: SMTP password + validRegex: /^([^\s^\/])+$/ + + - id: $$cap_smtp_port + label: SMTP port + validRegex: /^([^\s^\/])+$/ + + - id: $$cap_smtp_tls + label: SMTP TLS + validRegex: /^([^\s^\/])+$/ + instructions: + start: >- + Before you proceed keep a note of the following. + + ----------------------------------------------------- + + + After you deploy mastodon and created your fist user in the browser, you will need to use the command line to give your newly created account admin privileges. + + + Step 1: From your terminal run the following command. + + docker exec -it $(docker ps --filter name='srv-captain--mastodon.1' -q) /bin/bash + + + Step 2: Now that you are inside your mastodon container: run the following command assuming your username is alice: + + "RAILS_ENV=production bin/tootctl accounts modify alice --role admin" + + + Step 3: Now we have to give our persistent directory the correct user rights + + From your terminal run the following assuming your app name is mastodon + + chown -R 991:991 /var/lib/docker/volumes/captain--mastodon-system + end: >- + Aaaand you're done! 😄 + + Your service is available at http://$$cap_appname.$$cap_root_domain + + + You can add more environment variables to use with aws s3 for example + + Checkout https://docs.joinmastodon.org/admin/config/ for more env vars + displayName: Mastodon + isOfficial: true + description: Social networking, back in your hands. + documentation: 'Read more at: https://docs.joinmastodon.org/' diff --git a/public/v4/logos/mastodon.png b/public/v4/logos/mastodon.png new file mode 100644 index 0000000000000000000000000000000000000000..6c2dd3ecfcb246721fa84a8d165128d674f902ab GIT binary patch literal 17341 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 YeVRU9-zE$E>kW{cv=X#h(m3e<06Rc~_W%F@ literal 0 HcmV?d00001