Merge branch 'master' into broadcast-to-worker
commit
3d8b80e1cc
|
@ -0,0 +1,2 @@
|
||||||
|
https://github.com/Scalingo/nodejs-buildpack
|
||||||
|
https://github.com/Scalingo/ruby-buildpack
|
|
@ -0,0 +1,2 @@
|
||||||
|
node_modules/
|
||||||
|
.cache/
|
2
Gemfile
2
Gemfile
|
@ -8,8 +8,6 @@ gem 'sass-rails', '~> 5.0'
|
||||||
gem 'uglifier', '>= 1.3.0'
|
gem 'uglifier', '>= 1.3.0'
|
||||||
gem 'coffee-rails', '~> 4.1.0'
|
gem 'coffee-rails', '~> 4.1.0'
|
||||||
gem 'jquery-rails'
|
gem 'jquery-rails'
|
||||||
gem 'jbuilder', '~> 2.0'
|
|
||||||
gem 'sdoc', '~> 0.4.0', group: :doc
|
|
||||||
gem 'puma'
|
gem 'puma'
|
||||||
|
|
||||||
gem 'hamlit-rails'
|
gem 'hamlit-rails'
|
||||||
|
|
11
Gemfile.lock
11
Gemfile.lock
|
@ -198,9 +198,6 @@ GEM
|
||||||
parser (>= 2.2.3.0)
|
parser (>= 2.2.3.0)
|
||||||
term-ansicolor (>= 1.3.2)
|
term-ansicolor (>= 1.3.2)
|
||||||
terminal-table (>= 1.5.1)
|
terminal-table (>= 1.5.1)
|
||||||
jbuilder (2.6.0)
|
|
||||||
activesupport (>= 3.0.0, < 5.1)
|
|
||||||
multi_json (~> 1.2)
|
|
||||||
jmespath (1.3.1)
|
jmespath (1.3.1)
|
||||||
jquery-rails (4.1.1)
|
jquery-rails (4.1.1)
|
||||||
rails-dom-testing (>= 1, < 3)
|
rails-dom-testing (>= 1, < 3)
|
||||||
|
@ -231,7 +228,6 @@ GEM
|
||||||
mimemagic (0.3.2)
|
mimemagic (0.3.2)
|
||||||
mini_portile2 (2.1.0)
|
mini_portile2 (2.1.0)
|
||||||
minitest (5.10.1)
|
minitest (5.10.1)
|
||||||
multi_json (1.12.1)
|
|
||||||
net-scp (1.2.1)
|
net-scp (1.2.1)
|
||||||
net-ssh (>= 2.6.5)
|
net-ssh (>= 2.6.5)
|
||||||
net-ssh (4.0.1)
|
net-ssh (4.0.1)
|
||||||
|
@ -310,8 +306,6 @@ GEM
|
||||||
thor (>= 0.18.1, < 2.0)
|
thor (>= 0.18.1, < 2.0)
|
||||||
rainbow (2.1.0)
|
rainbow (2.1.0)
|
||||||
rake (12.0.0)
|
rake (12.0.0)
|
||||||
rdoc (4.2.2)
|
|
||||||
json (~> 1.4)
|
|
||||||
react-rails (1.10.0)
|
react-rails (1.10.0)
|
||||||
babel-transpiler (>= 0.7.0)
|
babel-transpiler (>= 0.7.0)
|
||||||
coffee-script-source (~> 1.8)
|
coffee-script-source (~> 1.8)
|
||||||
|
@ -381,9 +375,6 @@ GEM
|
||||||
sprockets (>= 2.8, < 4.0)
|
sprockets (>= 2.8, < 4.0)
|
||||||
sprockets-rails (>= 2.0, < 4.0)
|
sprockets-rails (>= 2.0, < 4.0)
|
||||||
tilt (>= 1.1, < 3)
|
tilt (>= 1.1, < 3)
|
||||||
sdoc (0.4.1)
|
|
||||||
json (~> 1.7, >= 1.7.7)
|
|
||||||
rdoc (~> 4.0)
|
|
||||||
sidekiq (4.2.7)
|
sidekiq (4.2.7)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
connection_pool (~> 2.2, >= 2.2.0)
|
connection_pool (~> 2.2, >= 2.2.0)
|
||||||
|
@ -483,7 +474,6 @@ DEPENDENCIES
|
||||||
http
|
http
|
||||||
httplog
|
httplog
|
||||||
i18n-tasks (~> 0.9.6)
|
i18n-tasks (~> 0.9.6)
|
||||||
jbuilder (~> 2.0)
|
|
||||||
jquery-rails
|
jquery-rails
|
||||||
letter_opener
|
letter_opener
|
||||||
letter_opener_web
|
letter_opener_web
|
||||||
|
@ -514,7 +504,6 @@ DEPENDENCIES
|
||||||
rubocop
|
rubocop
|
||||||
ruby-oembed
|
ruby-oembed
|
||||||
sass-rails (~> 5.0)
|
sass-rails (~> 5.0)
|
||||||
sdoc (~> 0.4.0)
|
|
||||||
sidekiq
|
sidekiq
|
||||||
sidekiq-unique-jobs
|
sidekiq-unique-jobs
|
||||||
simple-navigation
|
simple-navigation
|
||||||
|
|
|
@ -117,6 +117,12 @@ Which will re-create the updated containers, leaving databases and data as is. D
|
||||||
|
|
||||||
Docker is great for quickly trying out software, but it has its drawbacks too. If you prefer to run Mastodon without using Docker, refer to the [production guide](docs/Running-Mastodon/Production-guide.md) for examples, configuration and instructions.
|
Docker is great for quickly trying out software, but it has its drawbacks too. If you prefer to run Mastodon without using Docker, refer to the [production guide](docs/Running-Mastodon/Production-guide.md) for examples, configuration and instructions.
|
||||||
|
|
||||||
|
## Deployment on Scalingo
|
||||||
|
|
||||||
|
[![Deploy on Scalingo](https://cdn.scalingo.com/deploy/button.svg)](https://my.scalingo.com/deploy?source=https://github.com/tootsuite/mastodon#master)
|
||||||
|
|
||||||
|
[You can view a guide for deployment on Scalingo here.](docs/Running-Mastodon/Scalingo-guide.md)
|
||||||
|
|
||||||
## Deployment on Heroku (experimental)
|
## Deployment on Heroku (experimental)
|
||||||
|
|
||||||
[![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy)
|
[![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy)
|
||||||
|
|
|
@ -5,9 +5,9 @@ const fi = {
|
||||||
"status.mention": "Mainitse @{name}",
|
"status.mention": "Mainitse @{name}",
|
||||||
"status.delete": "Poista",
|
"status.delete": "Poista",
|
||||||
"status.reply": "Vastaa",
|
"status.reply": "Vastaa",
|
||||||
"status.reblog": "Boostaa",
|
"status.reblog": "Buustaa",
|
||||||
"status.favourite": "Tykkää",
|
"status.favourite": "Tykkää",
|
||||||
"status.reblogged_by": "{name} boostattu",
|
"status.reblogged_by": "{name} buustasi",
|
||||||
"status.sensitive_warning": "Arkaluontoista sisältöä",
|
"status.sensitive_warning": "Arkaluontoista sisältöä",
|
||||||
"status.sensitive_toggle": "Klikkaa nähdäksesi",
|
"status.sensitive_toggle": "Klikkaa nähdäksesi",
|
||||||
"video_player.toggle_sound": "Äänet päälle/pois",
|
"video_player.toggle_sound": "Äänet päälle/pois",
|
||||||
|
@ -28,7 +28,7 @@ const fi = {
|
||||||
"getting_started.open_source_notice": "Mastodon Mastodon on avoimen lähdekoodin ohjelma. Voit avustaa tai raportoida ongelmia GitHub palvelussa {github}. {apps}.",
|
"getting_started.open_source_notice": "Mastodon Mastodon on avoimen lähdekoodin ohjelma. Voit avustaa tai raportoida ongelmia GitHub palvelussa {github}. {apps}.",
|
||||||
"column.home": "Koti",
|
"column.home": "Koti",
|
||||||
"column.community": "Paikallinen aikajana",
|
"column.community": "Paikallinen aikajana",
|
||||||
"column.public": "Yhdistetty aikajana",
|
"column.public": "Yleinen aikajana",
|
||||||
"column.notifications": "Ilmoitukset",
|
"column.notifications": "Ilmoitukset",
|
||||||
"tabs_bar.compose": "Luo",
|
"tabs_bar.compose": "Luo",
|
||||||
"tabs_bar.home": "Koti",
|
"tabs_bar.home": "Koti",
|
||||||
|
@ -41,7 +41,7 @@ const fi = {
|
||||||
"compose_form.spoiler": "Piiloita teksti varoituksen taakse",
|
"compose_form.spoiler": "Piiloita teksti varoituksen taakse",
|
||||||
"compose_form.private": "Merkitse yksityiseksi",
|
"compose_form.private": "Merkitse yksityiseksi",
|
||||||
"compose_form.privacy_disclaimer": "Sinun yksityinen status toimitetaan mainitsemallesi käyttäjille domaineissa {domains}. Luotatko {domainsCount, plural, one {tähän palvelimeen} other {näihin palvelimiin}}? Postauksen yksityisyys toimii van Mastodon palvelimilla. Jos {domains} {domainsCount, plural, one {ei ole Mastodon palvelin} other {eivät ole Mastodon palvelin}}, viestiin ei tule Yksityinen-merkintää, ja sitä voidaan boostata tai muuten tehdä näkyväksi muille vastaanottajille.",
|
"compose_form.privacy_disclaimer": "Sinun yksityinen status toimitetaan mainitsemallesi käyttäjille domaineissa {domains}. Luotatko {domainsCount, plural, one {tähän palvelimeen} other {näihin palvelimiin}}? Postauksen yksityisyys toimii van Mastodon palvelimilla. Jos {domains} {domainsCount, plural, one {ei ole Mastodon palvelin} other {eivät ole Mastodon palvelin}}, viestiin ei tule Yksityinen-merkintää, ja sitä voidaan boostata tai muuten tehdä näkyväksi muille vastaanottajille.",
|
||||||
"compose_form.unlisted": "Älä näytä julkisilla aikajanoilla",
|
"compose_form.unlisted": "Älä näytä yleisillä aikajanoilla",
|
||||||
"navigation_bar.edit_profile": "Muokkaa profiilia",
|
"navigation_bar.edit_profile": "Muokkaa profiilia",
|
||||||
"navigation_bar.preferences": "Ominaisuudet",
|
"navigation_bar.preferences": "Ominaisuudet",
|
||||||
"navigation_bar.community_timeline": "Paikallinen aikajana",
|
"navigation_bar.community_timeline": "Paikallinen aikajana",
|
||||||
|
@ -55,14 +55,14 @@ const fi = {
|
||||||
"upload_form.undo": "Peru",
|
"upload_form.undo": "Peru",
|
||||||
"notification.follow": "{name} seurasi sinua",
|
"notification.follow": "{name} seurasi sinua",
|
||||||
"notification.favourite": "{name} tykkäsi statuksestasi",
|
"notification.favourite": "{name} tykkäsi statuksestasi",
|
||||||
"notification.reblog": "{name} boostasi statustasi",
|
"notification.reblog": "{name} buustasi statustasi",
|
||||||
"notification.mention": "{name} mainitsi sinut",
|
"notification.mention": "{name} mainitsi sinut",
|
||||||
"notifications.column_settings.alert": "Työpöytä ilmoitukset",
|
"notifications.column_settings.alert": "Työpöytä ilmoitukset",
|
||||||
"notifications.column_settings.show": "Näytä sarakkeessa",
|
"notifications.column_settings.show": "Näytä sarakkeessa",
|
||||||
"notifications.column_settings.follow": "Uusia seuraajia:",
|
"notifications.column_settings.follow": "Uusia seuraajia:",
|
||||||
"notifications.column_settings.favourite": "Tykkäyksiä:",
|
"notifications.column_settings.favourite": "Tykkäyksiä:",
|
||||||
"notifications.column_settings.mention": "Mainintoja:",
|
"notifications.column_settings.mention": "Mainintoja:",
|
||||||
"notifications.column_settings.reblog": "Boosteja:",
|
"notifications.column_settings.reblog": "Buusteja:",
|
||||||
};
|
};
|
||||||
|
|
||||||
export default fi;
|
export default fi;
|
||||||
|
|
|
@ -161,9 +161,9 @@ class Status < ApplicationRecord
|
||||||
return where.not(visibility: [:private, :direct]) if account.nil?
|
return where.not(visibility: [:private, :direct]) if account.nil?
|
||||||
|
|
||||||
if target_account.blocking?(account) # get rid of blocked peeps
|
if target_account.blocking?(account) # get rid of blocked peeps
|
||||||
where('1 = 0')
|
none
|
||||||
elsif account.id == target_account.id # author can see own stuff
|
elsif account.id == target_account.id # author can see own stuff
|
||||||
where('1 = 1')
|
all
|
||||||
elsif account.following?(target_account) # followers can see followers-only stuff, but also things they are mentioned in
|
elsif account.following?(target_account) # followers can see followers-only stuff, but also things they are mentioned in
|
||||||
joins('LEFT OUTER JOIN mentions ON statuses.id = mentions.status_id AND mentions.account_id = ' + account.id.to_s)
|
joins('LEFT OUTER JOIN mentions ON statuses.id = mentions.status_id AND mentions.account_id = ' + account.id.to_s)
|
||||||
.where('statuses.visibility != ? OR mentions.id IS NOT NULL', Status.visibilities[:direct])
|
.where('statuses.visibility != ? OR mentions.id IS NOT NULL', Status.visibilities[:direct])
|
||||||
|
|
|
@ -16,6 +16,7 @@ class FanOutOnWriteService < BaseService
|
||||||
|
|
||||||
return if status.account.silenced? || !status.public_visibility? || status.reblog?
|
return if status.account.silenced? || !status.public_visibility? || status.reblog?
|
||||||
|
|
||||||
|
render_anonymous_payload(status)
|
||||||
deliver_to_hashtags(status)
|
deliver_to_hashtags(status)
|
||||||
|
|
||||||
return if status.reply? && status.in_reply_to_account_id != status.account_id
|
return if status.reply? && status.in_reply_to_account_id != status.account_id
|
||||||
|
@ -48,23 +49,23 @@ class FanOutOnWriteService < BaseService
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def render_anonymous_payload(status)
|
||||||
|
@payload = FeedManager.instance.inline_render(nil, 'api/v1/statuses/show', status)
|
||||||
|
end
|
||||||
|
|
||||||
def deliver_to_hashtags(status)
|
def deliver_to_hashtags(status)
|
||||||
Rails.logger.debug "Delivering status #{status.id} to hashtags"
|
Rails.logger.debug "Delivering status #{status.id} to hashtags"
|
||||||
|
|
||||||
payload = FeedManager.instance.inline_render(nil, 'api/v1/statuses/show', status)
|
|
||||||
|
|
||||||
status.tags.pluck(:name).each do |hashtag|
|
status.tags.pluck(:name).each do |hashtag|
|
||||||
FeedManager.instance.broadcast("hashtag:#{hashtag}", event: 'update', payload: payload)
|
FeedManager.instance.broadcast("hashtag:#{hashtag}", event: 'update', payload: @payload)
|
||||||
FeedManager.instance.broadcast("hashtag:#{hashtag}:local", event: 'update', payload: payload) if status.account.local?
|
FeedManager.instance.broadcast("hashtag:#{hashtag}:local", event: 'update', payload: @payload) if status.account.local?
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def deliver_to_public(status)
|
def deliver_to_public(status)
|
||||||
Rails.logger.debug "Delivering status #{status.id} to public timeline"
|
Rails.logger.debug "Delivering status #{status.id} to public timeline"
|
||||||
|
|
||||||
payload = FeedManager.instance.inline_render(nil, 'api/v1/statuses/show', status)
|
FeedManager.instance.broadcast(:public, event: 'update', payload: @payload)
|
||||||
|
FeedManager.instance.broadcast('public:local', event: 'update', payload: @payload) if status.account.local?
|
||||||
FeedManager.instance.broadcast(:public, event: 'update', payload: payload)
|
|
||||||
FeedManager.instance.broadcast('public:local', event: 'update', payload: payload) if status.account.local?
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -13,5 +13,7 @@ class AfterRemoteFollowRequestWorker
|
||||||
|
|
||||||
follow_request.destroy
|
follow_request.destroy
|
||||||
FollowService.new.call(follow_request.account, updated_account.acct)
|
FollowService.new.call(follow_request.account, updated_account.acct)
|
||||||
|
rescue ActiveRecord::RecordNotFound
|
||||||
|
true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -13,5 +13,7 @@ class AfterRemoteFollowWorker
|
||||||
|
|
||||||
follow.destroy
|
follow.destroy
|
||||||
FollowService.new.call(follow.account, updated_account.acct)
|
FollowService.new.call(follow.account, updated_account.acct)
|
||||||
|
rescue ActiveRecord::RecordNotFound
|
||||||
|
true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
class ApplicationWorker
|
||||||
|
def info(message)
|
||||||
|
Rails.logger.info("#{self.class.name} - #{message}")
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,6 +1,6 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
class DistributionWorker
|
class DistributionWorker < ApplicationWorker
|
||||||
include Sidekiq::Worker
|
include Sidekiq::Worker
|
||||||
|
|
||||||
def perform(status_id)
|
def perform(status_id)
|
||||||
|
@ -9,6 +9,6 @@ class DistributionWorker
|
||||||
FanOutOnWriteService.new.call(status)
|
FanOutOnWriteService.new.call(status)
|
||||||
WarmCacheService.new.call(status)
|
WarmCacheService.new.call(status)
|
||||||
rescue ActiveRecord::RecordNotFound
|
rescue ActiveRecord::RecordNotFound
|
||||||
true
|
info("Couldn't find the status")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -21,12 +21,12 @@ fi:
|
||||||
features_headline: Mikä erottaa Mastodonin muista
|
features_headline: Mikä erottaa Mastodonin muista
|
||||||
get_started: Aloita käyttö
|
get_started: Aloita käyttö
|
||||||
links: Linkit
|
links: Linkit
|
||||||
other_instances: Muut palvelimet
|
other_instances: muuhun palvelimeen
|
||||||
source_code: Lähdekoodi
|
source_code: Lähdekoodi
|
||||||
status_count_after: statukset
|
status_count_after: statusta
|
||||||
status_count_before: Kuka loi
|
status_count_before: Ovat luoneet
|
||||||
terms: Ehdot
|
terms: Ehdot
|
||||||
user_count_after: käyttäjät
|
user_count_after: käyttäjää
|
||||||
user_count_before: Koti käyttäjälle
|
user_count_before: Koti käyttäjälle
|
||||||
accounts:
|
accounts:
|
||||||
follow: Seuraa
|
follow: Seuraa
|
||||||
|
@ -89,7 +89,7 @@ fi:
|
||||||
preface: Voit tuoda tiettyä dataa kaikista ihmisistä joita seuraat tai estät tilillesi tälle palvelimelle tiedostoista, jotka on luotu toisella palvelimella
|
preface: Voit tuoda tiettyä dataa kaikista ihmisistä joita seuraat tai estät tilillesi tälle palvelimelle tiedostoista, jotka on luotu toisella palvelimella
|
||||||
success: Datasi on onnistuneesti ladattu ja käsitellään pian
|
success: Datasi on onnistuneesti ladattu ja käsitellään pian
|
||||||
types:
|
types:
|
||||||
blocking: Esto lista
|
blocking: Estetyt lista
|
||||||
following: Seuratut lista
|
following: Seuratut lista
|
||||||
upload: Lähetä
|
upload: Lähetä
|
||||||
landing_strip_html: <strong>%{name}</strong> on käyttäjä domainilla <strong>%{domain}</strong>. Voit seurata tai vuorovaikuttaa heidän kanssaan jos sinulla on tili yleisessä verkossa. Jos sinulla ei ole tiliä, voit <a href="%{sign_up_path}">rekisteröityä täällä</a>.
|
landing_strip_html: <strong>%{name}</strong> on käyttäjä domainilla <strong>%{domain}</strong>. Voit seurata tai vuorovaikuttaa heidän kanssaan jos sinulla on tili yleisessä verkossa. Jos sinulla ei ole tiliä, voit <a href="%{sign_up_path}">rekisteröityä täällä</a>.
|
||||||
|
@ -132,7 +132,7 @@ fi:
|
||||||
edit_profile: Muokkaa profiilia
|
edit_profile: Muokkaa profiilia
|
||||||
export: Datan vienti
|
export: Datan vienti
|
||||||
import: Datan tuonti
|
import: Datan tuonti
|
||||||
preferences: Mieltymykset
|
preferences: Ominaisuudet
|
||||||
settings: Asetukset
|
settings: Asetukset
|
||||||
two_factor_auth: Kaksivaiheinen tunnistus
|
two_factor_auth: Kaksivaiheinen tunnistus
|
||||||
statuses:
|
statuses:
|
||||||
|
@ -154,7 +154,7 @@ fi:
|
||||||
description_html: Jos otat käyttöön <strong>kaksivaiheisen tunnistuksen</stron>, kirjautumiseen vaaditaan puhelin, joka voi generoida tokeneita kirjautumista varten.
|
description_html: Jos otat käyttöön <strong>kaksivaiheisen tunnistuksen</stron>, kirjautumiseen vaaditaan puhelin, joka voi generoida tokeneita kirjautumista varten.
|
||||||
disable: Poista käytöstä
|
disable: Poista käytöstä
|
||||||
enable: Ota käyttöön
|
enable: Ota käyttöön
|
||||||
instructions_html: "<strong>Skannaa tämä QR-koodi Google Authenticator tai samanlaiseen sovellukseen puhelimellasi</strong>. Tästä hetkestä lähtien, ohjelma generoi tokenit mikä sinun tarvitsee syöttää sisäänkirjautuessa."
|
instructions_html: "<strong>Skannaa tämä QR-koodi Google Authenticator tai samanlaiseen sovellukseen puhelimellasi</strong>. Tästä hetkestä lähtien ohjelma generoi koodin, mikä sinun tarvitsee syöttää sisäänkirjautuessa."
|
||||||
plaintext_secret_html: 'Plain-text secret: <samp>%{secret}</samp>'
|
plaintext_secret_html: 'Plain-text secret: <samp>%{secret}</samp>'
|
||||||
warning: Jos et juuri nyt voi konfiguroida authenticator-applikaatiota juuri nyt, sinun pitäisi klikata "Poista käytöstä" tai et voi kirjautua sisään.
|
warning: Jos et juuri nyt voi konfiguroida authenticator-applikaatiota juuri nyt, sinun pitäisi klikata "Poista käytöstä" tai et voi kirjautua sisään.
|
||||||
users:
|
users:
|
||||||
|
|
|
@ -17,7 +17,7 @@ fi:
|
||||||
confirm_password: Varmista salasana
|
confirm_password: Varmista salasana
|
||||||
current_password: Nykyinen salasana
|
current_password: Nykyinen salasana
|
||||||
data: Data
|
data: Data
|
||||||
display_name: Näyttö nimi
|
display_name: Näykyvä nimi
|
||||||
email: Sähköpostiosoite
|
email: Sähköpostiosoite
|
||||||
header: Header
|
header: Header
|
||||||
locale: Kieli
|
locale: Kieli
|
||||||
|
@ -38,7 +38,7 @@ fi:
|
||||||
follow: Lähetä s-posti kun joku seuraa sinua
|
follow: Lähetä s-posti kun joku seuraa sinua
|
||||||
follow_request: Lähetä s-posti kun joku pyytää seurata sinua
|
follow_request: Lähetä s-posti kun joku pyytää seurata sinua
|
||||||
mention: Lähetä s-posti kun joku mainitsee sinut
|
mention: Lähetä s-posti kun joku mainitsee sinut
|
||||||
reblog: Lähetä s-posti kun joku uudestaanblogaa julkaisusi
|
reblog: Lähetä s-posti kun joku buustaa julkaisusi
|
||||||
'no': 'Ei'
|
'no': 'Ei'
|
||||||
required:
|
required:
|
||||||
mark: "*"
|
mark: "*"
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
class AddIndexOnMentionsStatusId < ActiveRecord::Migration[5.0]
|
||||||
|
def change
|
||||||
|
add_index :mentions, :status_id
|
||||||
|
end
|
||||||
|
end
|
|
@ -10,7 +10,7 @@
|
||||||
#
|
#
|
||||||
# It's strongly recommended that you check this file into your version control system.
|
# It's strongly recommended that you check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema.define(version: 20170403172249) do
|
ActiveRecord::Schema.define(version: 20170405112956) do
|
||||||
|
|
||||||
# These are extensions that must be enabled in order to support this database
|
# These are extensions that must be enabled in order to support this database
|
||||||
enable_extension "plpgsql"
|
enable_extension "plpgsql"
|
||||||
|
@ -127,6 +127,7 @@ ActiveRecord::Schema.define(version: 20170403172249) do
|
||||||
t.datetime "created_at", null: false
|
t.datetime "created_at", null: false
|
||||||
t.datetime "updated_at", null: false
|
t.datetime "updated_at", null: false
|
||||||
t.index ["account_id", "status_id"], name: "index_mentions_on_account_id_and_status_id", unique: true, using: :btree
|
t.index ["account_id", "status_id"], name: "index_mentions_on_account_id_and_status_id", unique: true, using: :btree
|
||||||
|
t.index ["status_id"], name: "index_mentions_on_status_id", using: :btree
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "mutes", force: :cascade do |t|
|
create_table "mutes", force: :cascade do |t|
|
||||||
|
|
|
@ -11,10 +11,23 @@ map $http_upgrade $connection_upgrade {
|
||||||
'' close;
|
'' close;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
listen [::]:80;
|
||||||
|
server_name example.com;
|
||||||
|
return 301 https://$host$request_uri;
|
||||||
|
}
|
||||||
|
|
||||||
server {
|
server {
|
||||||
listen 443 ssl;
|
listen 443 ssl;
|
||||||
server_name example.com;
|
server_name example.com;
|
||||||
|
|
||||||
|
ssl_protocols TLSv1.2;
|
||||||
|
ssl_ciphers EECDH+AESGCM:EECDH+AES;
|
||||||
|
ssl_ecdh_curve secp384r1;
|
||||||
|
ssl_prefer_server_ciphers on;
|
||||||
|
ssl_session_cache shared:SSL:10m;
|
||||||
|
|
||||||
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
|
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
|
||||||
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
|
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
|
||||||
|
|
||||||
|
@ -75,8 +88,9 @@ It is recommended to create a special user for mastodon on the server (you could
|
||||||
|
|
||||||
## General dependencies
|
## General dependencies
|
||||||
|
|
||||||
|
sudo apt-get install imagemagick ffmpeg libpq-dev libxml2-dev libxslt1-dev nodejs file git curl
|
||||||
curl -sL https://deb.nodesource.com/setup_4.x | sudo bash -
|
curl -sL https://deb.nodesource.com/setup_4.x | sudo bash -
|
||||||
sudo apt-get install imagemagick ffmpeg libpq-dev libxml2-dev libxslt1-dev nodejs file
|
apt-get intall nodejs
|
||||||
sudo npm install -g yarn
|
sudo npm install -g yarn
|
||||||
|
|
||||||
## Redis
|
## Redis
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
Scalingo guide
|
||||||
|
==============
|
||||||
|
|
||||||
|
[![Deploy on Scalingo](https://cdn.scalingo.com/deploy/button.svg)](https://my.scalingo.com/deploy?source=https://github.com/tootsuite/mastodon#master)
|
||||||
|
|
||||||
|
1. Click the above button.
|
||||||
|
2. Fill in the options requested.
|
||||||
|
* You can use a .scalingo.io domain, which will be simple to set up, or you can use a custom domain.
|
||||||
|
* You will want Amazon S3 for file storage. The only exception is for development purposes, where you may not care if files are not saved. Follow a guide online for creating a free Amazon S3 bucket and Access Key, then enter the details.
|
||||||
|
* If you want your Mastodon to be able to send emails, configure SMTP settings here (or later). Consider using [Mailgun](https://mailgun.com) or similar, who offer free plans that should suit your interests.
|
||||||
|
3. Deploy! The app should be set up, with a working web interface and database. You can change settings and manage versions from the Heroku dashboard.
|
||||||
|
|
||||||
|
You may need to use the `scalingo` CLI application to run `USERNAME=yourUsername rails mastodon:make_admin` to make yourself an admin.
|
|
@ -5,7 +5,10 @@ There is also a list at [instances.mastodon.xyz](https://instances.mastodon.xyz)
|
||||||
|
|
||||||
| Name | Theme/Notes, if applicable | Open Registrations | IPv6 |
|
| Name | Theme/Notes, if applicable | Open Registrations | IPv6 |
|
||||||
| -------------|-------------|---|---|
|
| -------------|-------------|---|---|
|
||||||
| [mastodon.social](https://mastodon.social) |Flagship, quick updates|Yes|No|
|
| [mastodon.social](https://mastodon.social) |Flagship, quick updates|No|No|
|
||||||
|
| [securitymastod.one](https://securitymastod.one/) |Information security enthusiasts and pros|Yes|Yes|
|
||||||
|
| [mastodon.cx](https://mastodon.cx/) |Alternative Mastodon instance hosted in France|Yes|Yes|
|
||||||
|
| [mastodon.network](https://mastodon.network) |N/A|Yes|Yes|
|
||||||
| [awoo.space](https://awoo.space) |Intentionally moderated, only federates with mastodon.social|Yes|No|
|
| [awoo.space](https://awoo.space) |Intentionally moderated, only federates with mastodon.social|Yes|No|
|
||||||
| [animalliberation.social](https://animalliberation.social) |Animal Rights|Yes|No|
|
| [animalliberation.social](https://animalliberation.social) |Animal Rights|Yes|No|
|
||||||
| [socially.constructed.space](https://socially.constructed.space) |Single user|No|No|
|
| [socially.constructed.space](https://socially.constructed.space) |Single user|No|No|
|
||||||
|
@ -17,12 +20,15 @@ There is also a list at [instances.mastodon.xyz](https://instances.mastodon.xyz)
|
||||||
| [social.diskseven.com](https://social.diskseven.com) |Single user|No|Yes|
|
| [social.diskseven.com](https://social.diskseven.com) |Single user|No|Yes|
|
||||||
| [social.gestaltzerfall.net](https://social.gestaltzerfall.net) |Single user|No|No|
|
| [social.gestaltzerfall.net](https://social.gestaltzerfall.net) |Single user|No|No|
|
||||||
| [mastodon.xyz](https://mastodon.xyz) |N/A|Yes|Yes|
|
| [mastodon.xyz](https://mastodon.xyz) |N/A|Yes|Yes|
|
||||||
|
| [mastodon.partipirate.org](https://mastodon.partipirate.org) |French Pirate Party Instance - Politics and stuff|Yes|No|
|
||||||
| [social.targaryen.house](https://social.targaryen.house) |Federates everywhere, quick updates.|Yes|Yes|
|
| [social.targaryen.house](https://social.targaryen.house) |Federates everywhere, quick updates.|Yes|Yes|
|
||||||
| [masto.themimitoof.fr](https://masto.themimitoof.fr) |N/A|Yes|Yes|
|
| [masto.themimitoof.fr](https://masto.themimitoof.fr) |N/A|Yes|Yes|
|
||||||
|
| [mstdn.io](https://mstdn.io) |N/A|Yes|Yes|
|
||||||
| [social.imirhil.fr](https://social.imirhil.fr) |N/A|No|Yes|
|
| [social.imirhil.fr](https://social.imirhil.fr) |N/A|No|Yes|
|
||||||
| [social.wxcafe.net](https://social.wxcafe.net) |Open registrations, federates everywhere, no moderation yet|Yes|Yes|
|
| [social.wxcafe.net](https://social.wxcafe.net) |Open registrations, queer people, activists, safe as much as possible |Yes|Yes|
|
||||||
| [octodon.social](https://octodon.social) |Open registrations, federates everywhere, cutest instance yet|Yes|Yes|
|
| [octodon.social](https://octodon.social) |Open registrations, federates everywhere, cutest instance yet|Yes|Yes|
|
||||||
| [mastodon.club](https://mastodon.club)|Open Registration, Open Federation, Mostly Canadians|Yes|No|
|
| [mastodon.club](https://mastodon.club)|Open Registration, Open Federation, Mostly Canadians|Yes|No|
|
||||||
|
| [mastodon.irish](https://mastodon.irish)|Open Registration|Yes|No|
|
||||||
| [hostux.social](https://hostux.social) |N/A|Yes|Yes|
|
| [hostux.social](https://hostux.social) |N/A|Yes|Yes|
|
||||||
| [social.alex73630.xyz](https://social.alex73630.xyz) |Francophones|Yes|Yes|
|
| [social.alex73630.xyz](https://social.alex73630.xyz) |Francophones|Yes|Yes|
|
||||||
| [oc.todon.fr](https://oc.todon.fr) |Modérée et principalement francophone, pas de tolérances pour misogynie/LGBTphobies/validisme/etc.|Yes|Yes|
|
| [oc.todon.fr](https://oc.todon.fr) |Modérée et principalement francophone, pas de tolérances pour misogynie/LGBTphobies/validisme/etc.|Yes|Yes|
|
||||||
|
@ -40,5 +46,7 @@ There is also a list at [instances.mastodon.xyz](https://instances.mastodon.xyz)
|
||||||
| [social.nasqueron.org](https://social.nasqueron.org) |Dreamers, open source developers, free culture|Yes|Yes|
|
| [social.nasqueron.org](https://social.nasqueron.org) |Dreamers, open source developers, free culture|Yes|Yes|
|
||||||
| [status.dissidence.ovh](https://status.dissidence.ovh)|N/A|Yes|Yes|
|
| [status.dissidence.ovh](https://status.dissidence.ovh)|N/A|Yes|Yes|
|
||||||
| [mastodon.cc](https://mastodon.cc)|Art|Yes|No|
|
| [mastodon.cc](https://mastodon.cc)|Art|Yes|No|
|
||||||
|
| [mastodon.technology](https://mastodon.technology)|Open registrations, federates everywhere, for tech folks|Yes|No|
|
||||||
|
| [mastodon.systemlab.fr](https://mastodon.systemlab.fr/)|Le mastodon Français, informatique, jeux-vidéos, gaming et hébergement.|Yes|No|
|
||||||
|
|
||||||
Let me know if you start running one so I can add it to the list! (Alternatively, add it yourself as a pull request).
|
Let me know if you start running one so I can add it to the list! (Alternatively, add it yourself as a pull request).
|
||||||
|
|
|
@ -160,13 +160,13 @@ Toot privacy is handled independently of account privacy, and individually for e
|
||||||
|
|
||||||
**Unlisted** toots are toggled with the "Do not display in public timeline" option in the Compose pane. They are visible to anyone following you and appear on your profile page to the public even without a Mastodon login, but do *not* appear to anyone viewing the Public Timeline while logged into Mastodon.
|
**Unlisted** toots are toggled with the "Do not display in public timeline" option in the Compose pane. They are visible to anyone following you and appear on your profile page to the public even without a Mastodon login, but do *not* appear to anyone viewing the Public Timeline while logged into Mastodon.
|
||||||
|
|
||||||
**Private** toots, finally, are toggled with the "Mark as private" switch. Private toots do not appear in the public timeline nor on your profile page to anyone viewing it unless they are on your Followers list. This means the option is of very limited use if your account is not also set to be private (as anyone can follow you without confirmation and thus see your private toots). However the separation of this means that if you *do* set your entire account to private, you can switch this option off on a toot to make unlisted or even public toots from your otherwise private account.
|
**Private** toots, finally, are toggled with the "Mark as private" switch. Private toots do not appear in the public timeline nor on your profile page to anyone viewing it unless they are on your Followers list. This means the option is of very limited use if your account is not also set to be private (as anyone can follow you without confirmation and thus see your private toots). However the separation of this means that if you *do* set your entire account to private, you can switch this option off on a toot to make unlisted or even public toots from your otherwise private account. Private posts are not encrypted. Make sure you trust your instance admin not to just read your private posts on the back-end.
|
||||||
|
|
||||||
Private toots do not federate to other instances, unless you @mention a remote user. In this case, they will federate to their instance *and may appear there PUBLICLY*. A warning will be displayed if you're composing a private toot that will federate to another instance.
|
Private toots do not federate to other instances, unless you @mention a remote user. In this case, they will federate to their instance *and may appear there PUBLICLY*. A warning will be displayed if you're composing a private toot that will federate to another instance.
|
||||||
|
|
||||||
Private toots cannot be boosted. If someone you follow makes a private toot, it will appear in your timeline with a padlock icon in place of the Boost icon. **NOTE** that remote instances may not respect this.
|
Private toots cannot be boosted. If someone you follow makes a private toot, it will appear in your timeline with a padlock icon in place of the Boost icon. **NOTE** that remote instances may not respect this.
|
||||||
|
|
||||||
**Direct** messages are only visible to users you have @mentioned in them. This does *not* federate to protect your privacy (as other instances may ignore the "Direct" status and display the messages as public if they were to receive them), even if you have @mentioned a remote user.
|
**Direct** posts are only visible to users you have @mentioned in them and cannot be boosted. Like with private posts, you should be mindful that the remote instance may not respect this protocol. If you are discussing a sensitive matter you should move the conversation off of Mastodon.
|
||||||
|
|
||||||
To summarise:
|
To summarise:
|
||||||
|
|
||||||
|
@ -175,7 +175,7 @@ Toot Privacy | Visible on Profile | Visible on Public Timeline | Federates to ot
|
||||||
Public | Anyone incl. anonymous viewers | Yes | Yes
|
Public | Anyone incl. anonymous viewers | Yes | Yes
|
||||||
Unlisted | Anyone incl. anonymous viewers | No | Yes
|
Unlisted | Anyone incl. anonymous viewers | No | Yes
|
||||||
Private | Followers only | No | Only remote @mentions
|
Private | Followers only | No | Only remote @mentions
|
||||||
Direct | No | No | No
|
Direct | No | No | Only remote @mentions
|
||||||
|
|
||||||
#### Blocking
|
#### Blocking
|
||||||
|
|
||||||
|
|
|
@ -310,7 +310,7 @@ Returns a [Status](#status).
|
||||||
|
|
||||||
#### Getting status context:
|
#### Getting status context:
|
||||||
|
|
||||||
GET /api/v1/statuses/:id/contexts
|
GET /api/v1/statuses/:id/context
|
||||||
|
|
||||||
Returns a [Context](#context).
|
Returns a [Context](#context).
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,87 @@
|
||||||
|
{
|
||||||
|
"name": "Mastodon",
|
||||||
|
"description": "A GNU Social-compatible microblogging server",
|
||||||
|
"repository": "https://github.com/johnsudaar/mastodon",
|
||||||
|
"logo": "https://github.com/tootsuite/mastodon/raw/master/app/assets/images/logo.png",
|
||||||
|
"env": {
|
||||||
|
"LOCAL_DOMAIN": {
|
||||||
|
"description": "The domain that your Mastodon instance will run on (this can be appname.scalingo.io or a custom domain)",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
"LOCAL_HTTPS": {
|
||||||
|
"description": "Will your domain support HTTPS? (Automatic for *.scalingo.io, requires manual configuration for custom domains)",
|
||||||
|
"value": "true",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
"PAPERCLIP_SECRET": {
|
||||||
|
"description": "The secret key for storing media files",
|
||||||
|
"generator": "secret"
|
||||||
|
},
|
||||||
|
"SECRET_KEY_BASE": {
|
||||||
|
"description": "The secret key base",
|
||||||
|
"generator": "secret"
|
||||||
|
},
|
||||||
|
"SINGLE_USER_MODE": {
|
||||||
|
"description": "Should the instance run in single user mode? (Disable registrations, redirect to front page)",
|
||||||
|
"value": "false",
|
||||||
|
"required": true
|
||||||
|
},
|
||||||
|
"S3_ENABLED": {
|
||||||
|
"description": "Should Mastodon use Amazon S3 for storage? This is highly recommended, as Scalingo does not have persistent file storage (files will be lost).",
|
||||||
|
"value": "true",
|
||||||
|
"required": false
|
||||||
|
},
|
||||||
|
"S3_BUCKET": {
|
||||||
|
"description": "Amazon S3 Bucket",
|
||||||
|
"required": false
|
||||||
|
},
|
||||||
|
"S3_REGION": {
|
||||||
|
"description": "Amazon S3 region that the bucket is located in",
|
||||||
|
"required": false
|
||||||
|
},
|
||||||
|
"AWS_ACCESS_KEY_ID": {
|
||||||
|
"description": "Amazon S3 Access Key",
|
||||||
|
"required": false
|
||||||
|
},
|
||||||
|
"AWS_SECRET_ACCESS_KEY": {
|
||||||
|
"description": "Amazon S3 Secret Key",
|
||||||
|
"required": false
|
||||||
|
},
|
||||||
|
"SMTP_SERVER": {
|
||||||
|
"description": "Hostname for SMTP server, if you want to enable email",
|
||||||
|
"required": false
|
||||||
|
},
|
||||||
|
"SMTP_PORT": {
|
||||||
|
"description": "Port for SMTP server",
|
||||||
|
"required": false
|
||||||
|
},
|
||||||
|
"SMTP_LOGIN": {
|
||||||
|
"description": "Username for SMTP server",
|
||||||
|
"required": false
|
||||||
|
},
|
||||||
|
"SMTP_PASSWORD": {
|
||||||
|
"description": "Password for SMTP server",
|
||||||
|
"required": false
|
||||||
|
},
|
||||||
|
"SMTP_DOMAIN": {
|
||||||
|
"description": "Domain for SMTP server. Will default to instance domain if blank.",
|
||||||
|
"required": false
|
||||||
|
},
|
||||||
|
"SMTP_FROM_ADDRESS": {
|
||||||
|
"description": "Address to send emails from",
|
||||||
|
"required": false
|
||||||
|
},
|
||||||
|
"BUILDPACK_URL": {
|
||||||
|
"description": "Internal scalingo configuration",
|
||||||
|
"required": true,
|
||||||
|
"value": "https://github.com/Scalingo/multi-buildpack.git"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"postdeploy": "bundle exec rails db:migrate && bundle exec rails db:seed"
|
||||||
|
},
|
||||||
|
"addons": [
|
||||||
|
"scalingo-postgresql",
|
||||||
|
"scalingo-redis"
|
||||||
|
]
|
||||||
|
}
|
Reference in New Issue