From e9fc6f58a32b0ab4a2bf4a763f71301efb931850 Mon Sep 17 00:00:00 2001 From: Aleksandr Bogdanov Date: Tue, 30 Oct 2018 16:46:13 +0100 Subject: [PATCH] Initial commit --- .dockerignore | 6 +++ .gitignore | 3 ++ CHANGELOG | 2 + CloudronManifest.json | 30 +++++++++++++ DESCRIPTION.md | 15 +++++++ Dockerfile | 48 +++++++++++++++++++++ docker-compose.yml | 32 ++++++++++++++ logo.png | Bin 0 -> 13999 bytes mastodon.env.template | 41 ++++++++++++++++++ nginx.conf | 96 ++++++++++++++++++++++++++++++++++++++++++ start.sh | 28 ++++++++++++ 11 files changed, 301 insertions(+) create mode 100644 .dockerignore create mode 100644 .gitignore create mode 100644 CHANGELOG create mode 100644 CloudronManifest.json create mode 100644 DESCRIPTION.md create mode 100644 Dockerfile create mode 100644 docker-compose.yml create mode 100644 logo.png create mode 100644 mastodon.env.template create mode 100644 nginx.conf create mode 100755 start.sh diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..f618e9b --- /dev/null +++ b/.dockerignore @@ -0,0 +1,6 @@ +.git +.gitignore +.dockerignore +node_modules +mastodon +.idea diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..481bf12 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules +mastodon +.idea diff --git a/CHANGELOG b/CHANGELOG new file mode 100644 index 0000000..3206be8 --- /dev/null +++ b/CHANGELOG @@ -0,0 +1,2 @@ +[2.5.2] +* Initial Cloudron packaging diff --git a/CloudronManifest.json b/CloudronManifest.json new file mode 100644 index 0000000..ec9f332 --- /dev/null +++ b/CloudronManifest.json @@ -0,0 +1,30 @@ +{ + "id": "org.joinmastodon.cloudronapp", + "title": "Mastodon", + "author": "Matodon Authors", + "description": "file://DESCRIPTION.md", + "changelog": "file://CHANGELOG", + "tagline": "A federated microblogging network that is decentralized between independently operated servers", + "version": "2.5.2", + "healthCheckPath": "/about", + "httpPort": 8000, + "memoryLimit": 536870912, + "addons": { + "localstorage": {}, + "postgresql": {}, + "redis": {}, + "sendmail": {} + }, + "minBoxVersion": "1.8.1", + "manifestVersion": 1, + "website": "https://joinmastodon.org/", + "contactEmail": "syn+cloudron@syn.im", + "icon": "logo.png", + "tags": [ + "social", + "forum" + ], + "mediaLinks": [ + "https://upload.wikimedia.org/wikipedia/commons/0/0b/Mastodon_desktop_web_screenshot.png" + ] +} diff --git a/DESCRIPTION.md b/DESCRIPTION.md new file mode 100644 index 0000000..4043383 --- /dev/null +++ b/DESCRIPTION.md @@ -0,0 +1,15 @@ +Social networking, back in your hands +===== +Follow friends and discover new ones. Publish anything you want: links, pictures, text, video. All on a platform that is community-owned and ad-free. + +Find your perfect community +===== +Mastodon isn’t just a website, it is a federation—think Star Trek. Thousands of independent communities running Mastodon form a coherent network, where while every planet is different, being part of one is being part of the whole. + +Safer social media experience +===== +Mastodon comes with effective anti-abuse tools to help protect yourself. Thanks to the network's spread out and independent nature there are more moderators who you can approach for personal help, and servers with strict codes of conduct. + +Sharing your thoughts has never been more convenient +===== +You have 500 characters. You can adjust the thumbnails of your pictures with focal points. You can use custom emojis, hide things behind spoiler warnings and choose who sees a given post. Messed it up? You can delete & redraft for quick corrections. \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..78e79ca --- /dev/null +++ b/Dockerfile @@ -0,0 +1,48 @@ +FROM cloudron/base:1.0.0 + +RUN mkdir -p /app/code +WORKDIR /app/code + +RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - +RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list + +# the following does apt-get update +RUN curl -sL https://deb.nodesource.com/setup_8.x | bash - + +RUN apt-get install -y \ + imagemagick ffmpeg libpq-dev libxml2-dev libxslt1-dev file git-core \ + g++ libprotobuf-dev protobuf-compiler pkg-config nodejs gcc autoconf \ + bison build-essential libssl-dev libyaml-dev libreadline6-dev \ + zlib1g-dev libncurses5-dev libffi-dev libgdbm5 libgdbm-dev \ + nginx redis-server redis-tools postgresql postgresql-contrib \ + certbot yarn libidn11-dev libicu-dev libjemalloc-dev \ + ruby2.5 + +RUN gem install bundler --no-ri --no-rdoc + +RUN rm -r /etc/nginx/sites-enabled/default /var/lib/nginx /var/log/nginx +RUN mkdir -p /run/nginx && ln -fs /run/nginx /var/lib/nginx && ln -fs /run/nginx/log /var/log/nginx + +RUN git init && \ + git remote add origin https://github.com/tootsuite/mastodon.git && \ + git fetch --depth=1 origin $(git ls-remote --tags | grep refs/tags | grep -v 'rc[0-9]*$' | cut -f2 | sort -V | tail -n 1 | cut -d '/' -f3-) && \ + git checkout FETCH_HEAD + +RUN bundle install -j$(getconf _NPROCESSORS_ONLN) --deployment --without development test && \ + yarn install --pure-lockfile + +ENV GEM_PATH=/app/code/vendor/bundle/ruby/2.5.0/gems/ RAILS_ENV=production NODE_ENV=production + +# secret keys are not built into assets, so precompiling is safe to do here +# (these variables are required by rake though) +RUN SECRET_KEY_BASE=insecure.secret_key_base OTP_SECRET=insecure.otp_secret \ + bundle exec rake assets:precompile + +RUN ln -fs /app/data/.env.production /app/code/.env.production +RUN ln -fs /app/data/bullet.log /app/code/log/bullet.log +RUN ln -fs /app/data/system /app/code/public/system +CMD /app/code/start.sh + +COPY nginx.conf /etc/nginx/sites-enabled/mastodon +COPY mastodon.env.template /app/code +COPY start.sh /app/code diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..4f51400 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,32 @@ +version: '2.4' + +services: + mastodon: + build: . + ports: + - 3000 + - 4000 + - 80:8000 + environment: + - LOCAL_DOMAIN=localhost + - LOCAL_HTTPS=false + - POSTGRESQL_HOST=postgres + - POSTGRESQL_DATABASE=postgres + - POSTGRESQL_USERNAME=postgres + - POSTGRESQL_PASSWORD=postgres + - REDIS_HOST=redis + volumes: + - data:/app/data + tmpfs: + - /run + - /tmp + postgres: + image: postgres + environment: + - POSTGRES_PASSWORD=postgres + + redis: + image: redis + +volumes: + data: \ No newline at end of file diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d0dfdd66b7c8d705ee4940b04f26f98b781a73ba GIT binary patch literal 13999 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"}" +SMTP_AUTH_METHOD=plain +SMTP_LOGIN=${MAIL_SMTP_USERNAME} +SMTP_PASSWORD=${MAIL_SMTP_PASSWORD} +SMTP_OPENSSL_VERIFY_MODE=none + +LDAP_ENABLED=$([ -z "$LDAP_SERVER" ] && echo "false" || echo "true") +LDAP_HOST=${LDAP_SERVER} +LDAP_PORT=${LDAP_PORT} +LDAP_BASE=${LDAP_USERS_BASE_DN} +LDAP_BIND_DN=${LDAP_BIND_DN} +LDAP_PASSWORD=${LDAP_BIND_PASSWORD} +LDAP_UID=mail + +# the following is generated by start.sh +END + +#SECRET_KEY_BASE= +#OTP_SECRET= +#VAPID_PRIVATE_KEY= +#VAPID_PUBLIC_KEY= \ No newline at end of file diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 0000000..7adb57b --- /dev/null +++ b/nginx.conf @@ -0,0 +1,96 @@ +map $http_upgrade $connection_upgrade { + default upgrade; + '' close; +} + +proxy_cache_path /run/nginx/cache levels=1:2 keys_zone=CACHE:10m inactive=7d max_size=1g; + +error_log /dev/stdout info; +access_log /dev/stdout; +client_body_temp_path /run/nginx/body 1 2; + +server { + listen 8000; + listen [::]:8000; + + keepalive_timeout 70; + sendfile on; + client_max_body_size 80m; + + root /app/code/public; + + gzip on; + gzip_disable "msie6"; + gzip_vary on; + gzip_proxied any; + gzip_comp_level 6; + gzip_buffers 16 8k; + gzip_http_version 1.1; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; + + add_header Strict-Transport-Security "max-age=31536000"; + + location / { + try_files $uri @proxy; + } + + location ~ ^/(emoji|packs|system/accounts/avatars|system/media_attachments/files) { + add_header Cache-Control "public, max-age=31536000, immutable"; + add_header Strict-Transport-Security "max-age=31536000"; + try_files $uri @proxy; + } + + location /sw.js { + add_header Cache-Control "public, max-age=0"; + add_header Strict-Transport-Security "max-age=31536000"; + try_files $uri @proxy; + } + + location @proxy { + # forwarding cloudron's nginx proxy-proto headers + proxy_set_header Host $host; + proxy_set_header X-Real-IP $http_x_real_ip; + proxy_set_header X-Forwarded-For $http_x_forwarded_for,$remote_addr; + proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto; + proxy_set_header X-Forwarded-Host $http_x_forwarded_host; + proxy_set_header X-Forwarded-Port $http_x_forwarded_port; + proxy_set_header X-Forwarded-Server $http_x_forwarded_server; + + proxy_set_header Proxy ""; + proxy_pass_header Server; + + proxy_pass http://127.0.0.1:3000; + proxy_buffering on; + proxy_redirect off; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + + proxy_cache CACHE; + proxy_cache_valid 200 7d; + proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; + add_header X-Cached $upstream_cache_status; + add_header Strict-Transport-Security "max-age=31536000"; + + tcp_nodelay on; + } + + location /api/v1/streaming { + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto https; + proxy_set_header Proxy ""; + + proxy_pass http://127.0.0.1:4000; + proxy_buffering off; + proxy_redirect off; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + + tcp_nodelay on; + } + + error_page 500 501 502 503 504 /500.html; +} diff --git a/start.sh b/start.sh new file mode 100755 index 0000000..93ad60c --- /dev/null +++ b/start.sh @@ -0,0 +1,28 @@ +#!/bin/bash -eu +echo "=>Configuring mastodon<=" +bash /app/code/mastodon.env.template > /app/data/.env.production + +if ! [ -f /app/data/.keys.env ]; then + echo "=>First run, generating keys and setting up the DB<=" + export RANDFILE=/app/data/.rnd + echo -e "SECRET_KEY_BASE=$(openssl rand -hex 64)\nOTP_SECRET=$(openssl rand -hex 64)" > /app/data/.keys.env + + source /app/data/.keys.env + HOME=/app/data bundle exec rake mastodon:webpush:generate_vapid_key >> /app/data/.keys.env + SAFETY_ASSURED=1 HOME=/app/data bundle exec rails db:schema:load db:seed + + # the app writes to the following dirs: + mkdir -p /app/data/system && chown cloudron:cloudron /app/data/system +fi + +cat /app/data/.keys.env >> /app/data/.env.production + +echo "=>Starting mastodon<=" + +SUDO='sudo -u cloudron -H -E' +PORT=3000 $SUDO bundle exec puma -C config/puma.rb & +PORT=4000 STREAMING_CLUSTER_NUM=1 $SUDO npm run start & +DB_POOL=25 MALLOC_ARENA_MAX=2 $SUDO bundle exec sidekiq -c 25 & + +mkdir -p /run/nginx/log /run/nginx/body /run/nginx/cache +nginx -g 'daemon off;'