ifstatus.reply?&&!status.in_reply_to_account_id.nil?# Filter out if it's a reply
should_filter=!Follow.where(account_id:receiver_id,target_account_id:status.in_reply_to_account_id).exists?# and I'm not following the person it's a reply to
should_filter&&=!(receiver_id==status.in_reply_to_account_id)# and it's not a reply to me
should_filter&&=!(status.account_id==status.in_reply_to_account_id)# and it's not a self-reply
returnshould_filter
elsifstatus.reblog?# Filter out a reblog
returnBlock.where(account_id:status.reblog.account_id,target_account_id:receiver_id).exists?# or if the author of the reblogged status is blocking me
should_filter=receiver_id==status.account_id# Filter if I'm mentioning myself
should_filter||=Block.where(account_id:receiver_id,target_account_id:check_for_blocks).any?# or it's from someone I blocked, in reply to someone I blocked, or mentioning someone I blocked
should_filter||=(status.account.silenced?&&!Follow.where(account_id:receiver_id,target_account_id:status.account_id).exists?)# of if the account is silenced and I'm not following them
@ -22,6 +22,7 @@ class Pubsubhubbub::DeliveryWorker
.headers(headers)
.post(subscription.callback_url,body:payload)
returnsubscription.destroy!ifresponse.code>299&&response.code<500&&response.code!=429# HTTP 4xx means error is not temporary, except for 429 (throttling)
raise"Delivery failed for #{subscription.callback_url}: HTTP #{response.code}"unlessresponse.code>199&&response.code<300
about_mastodon:Mastodon ist ein <em>freier, quelloffener</em> soziales Netzwerkserver. Eine <em>dezentralisierte</em> Alternative zu kommerziellen Plattformen, verhindert es die Risiken, die entstehen, wenn eine einzelne Firma deine Kommunikation monopolisiert. Jeder kann Mastodon verwenden und ganz einfach am <em>sozialen Netzwerk</em> teilnehmen.
about_mastodon:Mastodon ist ein <em>freier, quelloffener</em> soziales Netzwerkserver. Als <em>dezentralisierte</em> Alternative zu kommerziellen Plattformen verhindert es die Risiken, die entstehen, wenn eine einzelne Firma deine Kommunikation monopolisiert. Jeder kann Mastodon verwenden und ganz einfach am <em>sozialen Netzwerk</em> teilnehmen.
get_started:Erste Schritte
source_code:Quellcode
terms:AGB
accounts:
follow:Folgen
followers:Folger
following:Folgt
followers:Follower
following:Gefolgt
nothing_here:Hier gibt es nichts!
people_followed_by:Nutzer, denen %{name} folgt
people_who_follow:Nutzer, die %{name} folgen
@ -27,7 +27,7 @@ de:
reset_password:Passwort zurücksetzen
set_new_password:Neues Passwort setzen
authorize_follow:
error:Das entfernte Profil konnte nicht geladen werden
error:Das Profil konnte nicht geladen werden
follow:Folgen
prompt_html:'Du (<strong>%{self}</strong>) möchtest dieser Person folgen:'
title:"%{acct} folgen"
@ -55,25 +55,25 @@ de:
notification_mailer:
favourite:
body:'Dein Beitrag wurde von %{name} favorisiert:'
subject:"%{name} hat deinen Beitrag favorisiert"
subject:"%{name} hat deinen Beitrag favorisiert."
follow:
body:"%{name} folgt dir jetzt!"
subject:"%{name} folgt dir nun"
subject:"%{name} folgt dir jetzt."
follow_request:
body:"%{name} möchte dir folgen:"
subject:"%{name} möchte dir folgen"
subject:"%{name} möchte dir folgen."
mention:
body:"%{name} hat dich erwähnt:"
subject:"%{name} hat dich erwähnt"
subject:"%{name} hat dich erwähnt."
reblog:
body:'Dein Beitrag wurde von %{name} geteilt:'
subject:"%{name} teilte deinen Beitrag"
subject:"%{name} teilte deinen Beitrag."
pagination:
next:Vorwärts
prev:Zurück
remote_follow:
acct:Dein Nutzername@Domain, von dem du dieser Person folgen möchtest
missing_resource:Die erforderliche Weiterleitungs-URL konnte leider in deinem Profil nicht gefunden werden
acct:Dein Nutzername@Domain, von dem aus du dieser Person folgen möchtest.
missing_resource:Die erforderliche Weiterleitungs-URL konnte leider in deinem Profil nicht gefunden werden.
confirmed:"Vielen Dank für Deine Registrierung. Bitte melde dich jetzt an."
send_instructions:"Du erhältst in wenigen Minuten eine E-Mail, mit der Du Deine Registrierung bestätigen kannst."
send_paranoid_instructions:"Falls Deine E-Mail-Adresse in unserer Datenbank existiert erhältst Du in wenigen Minuten eine E-Mail mit der Du Deine Registrierung bestätigen kannst."
confirmed:"Vielen Dank für deine Registrierung. Bitte melde dich jetzt an."
send_instructions:"Du erhältst in wenigen Minuten eine E-Mail, mit der du deine Registrierung bestätigen kannst."
send_paranoid_instructions:"Falls Deine E-Mail-Adresse in unserer Datenbank existiert, erhältst Du in wenigen Minuten eine E-Mail mit der du deine Registrierung bestätigen kannst."
failure:
already_authenticated:"Du bist bereits angemeldet."
inactive:"Dein Account ist nicht aktiv."
invalid:"Ungültige Anmeldedaten."
last_attempt:"Du hast noch einen Versuch bevor dein Account gesperrt wird"
last_attempt:"Du hast noch einen Versuch bevor dein Account gesperrt wird."
locked:"Dein Account ist gesperrt."
not_found_in_database:"E-Mail-Adresse oder Passwort ungültig."
timeout:"Deine Sitzung ist abgelaufen, bitte melde Dich erneut an."
unauthenticated:"Du musst Dich anmelden oder registrieren, bevor Du fortfahren kannst."
unconfirmed:"Du musst Deinen Account bestätigen, bevor Du fortfahren kannst."
timeout:"Deine Sitzung ist abgelaufen, bitte melde dich erneut an."
unauthenticated:"Du musst Dich anmelden oder registrieren, bevor du fortfahren kannst."
unconfirmed:"Du musst deinen Account bestätigen, bevor du fortfahren kannst."
mailer:
confirmation_instructions:
subject:"Mastodon: Anleitung zur Bestätigung Deines Accounts"
subject:"Mastodon: Anleitung zur Bestätigung deines Accounts"
password_change:
subject: 'Mastodon:Passwort wurde geändert'
reset_password_instructions:
subject:"Mastodon: Anleitung um Dein Passwort zurückzusetzen"
subject:"Mastodon: Anleitung um dein Passwort zurückzusetzen"
unlock_instructions:
subject:"Mastodon: Anleitung um Deinen Account freizuschalten"
subject:"Mastodon: Anleitung um deinen Account freizuschalten"
omniauth_callbacks:
failure:"Du konntest nicht Deinem %{kind}-Account angemeldet werden, weil '%{reason}'."
success:"Du hast Dich erfolgreich mit Deinem %{kind}-Account angemeldet."
failure:"Du konntest nicht mit deinem %{kind}-Account angemeldet werden, weil '%{reason}'."
success:"Du hast dich erfolgreich mit Deinem %{kind}-Account angemeldet."
passwords:
no_token:"Du kannst diese Seite nur von dem Link aus einer E-Mail zum Passwort-Zurücksetzen aufrufen. Wenn du einen solchen Link aufgerufen hast stelle bitte sicher, dass du die vollständige Adresse aufrufst."
send_instructions:"Du erhältst in wenigen Minuten eine E-Mail mit der Anleitung, wie Du Dein Passwort zurücksetzen kannst."
send_paranoid_instructions:"Falls Deine E-Mail-Adresse in unserer Datenbank existiert erhältst Du in wenigen Minuten eine E-Mail mit der Anleitung, wie Du Dein Passwort zurücksetzen können."
no_token:"Du kannst diese Seite nur über den Link aus der E-Mail zum Passwort-Zurücksetzen aufrufen. Wenn du einen solchen Link aufgerufen hast, stelle bitte sicher, dass du die vollständige Adresse aufrufst."
send_instructions:"Du erhältst in wenigen Minuten eine E-Mail mit der Anleitung, wie du dein Passwort zurücksetzen kannst."
send_paranoid_instructions:"Falls deine E-Mail-Adresse in unserer Datenbank existiert erhältst du in wenigen Minuten eine E-Mail mit der Anleitung, wie du dein Passwort zurücksetzen kannst."
updated:"Dein Passwort wurde geändert. Du bist jetzt angemeldet."
updated_not_active:"Dein Passwort wurde geändert."
registrations:
destroyed:"Dein Account wurde gelöscht."
signed_up:"Du hast dich erfolgreich registriert."
signed_up_but_inactive:"Du hast dich erfolgreich registriert. Wir konnten Dich noch nicht anmelden, da Dein Account inaktiv ist."
signed_up_but_locked:"Du hast dich erfolgreich registriert. Wir konnten Dich noch nicht anmelden, da Dein Account gesperrt ist."
signed_up_but_unconfirmed:"Du hast Dich erfolgreich registriert. Wir konnten Dich noch nicht anmelden, da Dein Account noch nicht bestätigt ist. Du erhältst in Kürze eine E-Mail mit der Anleitung, wie Du Deinen Account freischalten kannst."
update_needs_confirmation:"Deine Daten wurden aktualisiert, aber Du musst Deine neue E-Mail-Adresse bestätigen. Du erhälst in wenigen Minuten eine E-Mail, mit der Du die Änderung Deiner E-Mail-Adresse abschließen kannst."
signed_up_but_inactive:"Du hast dich erfolgreich registriert. Wir konnten dich noch nicht anmelden, da dein Account inaktiv ist."
signed_up_but_locked:"Du hast dich erfolgreich registriert. Wir konnten dich noch nicht anmelden, da dein Account gesperrt ist."
signed_up_but_unconfirmed:"Du hast Dich erfolgreich registriert. Wir konnten dich noch nicht anmelden, da dein Account noch nicht bestätigt ist. Du erhältst in Kürze eine E-Mail mit der Anleitung, wie Du Deinen Account freischalten kannst."
update_needs_confirmation:"Deine Daten wurden aktualisiert, aber du musst deine neue E-Mail-Adresse bestätigen. Du erhälst in wenigen Minuten eine E-Mail, mit der du die Änderung deiner E-Mail-Adresse abschließen kannst."
updated:"Deine Daten wurden aktualisiert."
sessions:
already_signed_out:"Erfolgreich abgemeldet."
signed_in:"Erfolgreich angemeldet."
signed_out:"Erfolgreich abgemeldet."
unlocks:
send_instructions:"Du erhältst in wenigen Minuten eine E-Mail mit der Anleitung, wie Du Deinen Account entsperren können."
send_paranoid_instructions:"Falls Deine E-Mail-Adresse in unserer Datenbank existiert erhältst Du in wenigen Minuten eine E-Mail mit der Anleitung, wie Du Deinen Account entsperren kannst."
send_instructions:"Du erhältst in wenigen Minuten eine E-Mail mit der Anleitung, wie du deinen Account entsperren können."
send_paranoid_instructions:"Falls deine E-Mail-Adresse in unserer Datenbank existiert erhältst du in wenigen Minuten eine E-Mail mit der Anleitung, wie du deinen Account entsperren kannst."
unlocked:"Dein Account wurde entsperrt. Du bist jetzt angemeldet."
errors:
messages:
already_confirmed:"wurde bereits bestätigt"
confirmation_period_expired:"muss innerhalb %{period} bestätigt werden, bitte fordere einen neuen Link an"
expired:"ist abgelaufen, bitte neu anfordern"
not_found:"nicht gefunden"
already_confirmed:"wurde bereits bestätigt."
confirmation_period_expired:"muss innerhalb %{period} bestätigt werden, bitte fordere einen neuen Link an."
expired:"ist abgelaufen, bitte neu anfordern."
not_found:"wurde nicht gefunden."
not_locked:"ist nicht gesperrt"
not_saved:
one:"Konnte %{resource} nicht speichern: ein Fehler."
access_denied:Le propriétaire de la ressource ou le serveur d'autorisation a refusé la demande.
credential_flow_not_configured:Le flux des identifiants du mot de passe du propriétaire de la ressource a échoué en raison de Doorkeeper.configure.resource_owner_from_credentials n'est pas configuré.
credential_flow_not_configured:Le flux des identifiants du mot de passe du propriétaire de la ressource a échoué car Doorkeeper.configure.resource_owner_from_credentials n'est pas configuré.
invalid_client:L'authentification du client a échoué à cause d'un client inconnu, d'aucune authentification de client incluse, ou d'une méthode d'authentification non prise en charge.
invalid_grant:Le consentement d'autorisation accordé n'est pas valide, a expiré, est annulé, ne concorde pas avec l'URL de redirection utilisée dans la demande d'autorisation, ou a été émis à un autre client.
invalid_redirect_uri:L'URL de redirection n'est pas valide.
invalid_request:La demande manque un paramètre requis, inclut une valeur de paramètre non prise en charge, ou est autrement mal formée.
invalid_resource_owner:Les identifiants fournis du propriétaire de la ressource ne sont pas valides, ou le propriétaire de la ressource ne peut être trouvé
invalid_resource_owner:Les identifiants fournis par le propriétaire de la ressource ne sont pas valides, ou le propriétaire de la ressource ne peut être trouvé
invalid_scope:La portée demandée n'est pas valide, est inconnue, ou est mal formée.
invalid_token:
expired:Le jeton d'accès a expiré
revoked:Le jeton d'accès a été révoqué
unknown:Le jeton d'accès n'est pas valide
resource_owner_authenticator_not_configured:La recherche du propriétaire de la ressource a échoué en raison de Doorkeeper.configure.resource_owner_authenticator n'est pas configuré.
server_error:Le serveur d'autorisation a rencontré une condition inattendue qui l'a empêché de remplir la demande.
resource_owner_authenticator_not_configured:La recherche du propriétaire de la ressource a échoué car Doorkeeper.configure.resource_owner_authenticator n'est pas configuré.
server_error:Le serveur d'autorisation a rencontré une condition inattendue l'empêchant de remplir la demande.
temporarily_unavailable:Le serveur d'autorisation est actuellement incapable de traiter la demande à cause d'une surcharge ou d'un entretien temporaire du serveur.
unauthorized_client:Le client n'est pas autorisé à effectuer cette demande à l'aide de cette méthode.
unsupported_grant_type:Le type de consentement d'autorisation n'est pas pris en charge par le serveur d'autorisation.
@ -8,6 +8,8 @@ Mastodon can theoretically run indefinitely on a free [Heroku](https://heroku.co
1. Click the above button.
2. Fill in the options requested.
* You can use a .herokuapp.com domain, which will be simple to set up, or you can use a custom domain. If you want a custom domain and HTTPS, you will need to upgrade to a paid plan (to use Heroku's SSL features), or set up [CloudFlare](https://cloudflare.com) who offer free "Flexible SSL" (note: CloudFlare have some undefined limits on WebSockets. So far, no one has reported hitting concurrent connection limits).
* You will want Amazon S3 for file storage. The only exception is for development purposes, where you may not care if files are not saaved. Follow a guide online for creating a free Amazon S3 bucket and Access Key, then enter the details.
* 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 `heroku` CLI application to run `USERNAME=yourUsername rails mastodon:make_admin` to make yourself an admin.
@ -112,7 +112,7 @@ Then once `rbenv` is ready, run `rbenv install 2.3.1` to install the Ruby versio
You need the `git-core` package installed on your system. If it is so, from the `mastodon` user:
cd ~
git clone https://github.com/Gargron/mastodon.git live
git clone https://github.com/tootsuite/mastodon.git live
cd live
Then you can proceed to install project dependencies:
@ -132,7 +132,7 @@ Fill in the important data, like host/port of the redis database, host/port/user
rake secret
To get a random string. If you are setting up on one single server (most likely), then REDIS_HOST is localhost and `DB_HOST` is `/var/run/postgresql`, `DB_USER` is `mastodon` and `DB_NAME` is `mastodon_production` while `DB_PASS` is empty because this setup will use the ident authentication method (system user "mastodon" maps to postgres user "mastodon").
To get a random string. If you are setting up on one single server (most likely), then `REDIS_HOST` is localhost and `DB_HOST` is `/var/run/postgresql`, `DB_USER` is `mastodon` and `DB_NAME` is `mastodon_production` while `DB_PASS` is empty because this setup will use the ident authentication method (system user "mastodon" maps to postgres user "mastodon").
## Setup
@ -221,7 +221,7 @@ I recommend creating a couple cronjobs for the following tasks:
You may want to run `which bundle` first and copypaste that full path instead of simply `bundle` in the above commands because cronjobs usually don't have all the paths set. The time and intervals of when to run these jobs are up to you, but once every day should be enough for all.
You can edit the cronjob file for the `mastodon` user by running `sudo crontab -e mastodon` (outside of the mastodon user).
You can edit the cronjob file for the `mastodon` user by running `sudo crontab -e -u mastodon` (outside of the mastodon user).
Mastodon is a social network application based on the GNU Social protocol. It behaves a lot like other social networks, especially Twitter, with one key difference - it is open-source and anyone can start their own server (also called an "instance"), and users of any instance can interact freely with those of other instances (called "federation"). Thus, it is possible for small communities to set up their own servers to use amongst themselves while also allowing interaction with other communities.
Mastodon is a social network application based on the GNU Social protocol. It behaves a lot like other social networks, especially Twitter, with one key difference - it is open-source and anyone can start their own server (also called an "*instance*"), and users of any instance can interact freely with those of other instances (called "*federation*"). Thus, it is possible for small communities to set up their own servers to use amongst themselves while also allowing interaction with other communities.
#### Decentralization and Federation
Mastodon is a system decentralized through a concept called "federation" - rather than depending on a single person or organization to run its infrastructure, anyone can download and run the software and run their own server. Federation means different Mastodon servers can interact with each other seamlessly, similar to e.g. e-mail.
Mastodon is a system decentralized through a concept called "*federation*" - rather than depending on a single person or organization to run its infrastructure, anyone can download and run the software and run their own server. Federation means different Mastodon servers can interact with each other seamlessly, similar to e.g. e-mail.
As such, anyone can download Mastodon and e.g. run it for a small community of people, but any user registered on that instance can follow and send and read posts from other Mastodon instances (as well as servers running other GNU Social-compatible services). This means that not only is users' data not inherently owned by a company with an interest in selling it to advertisers, but also that if any given server shuts down its users can set up a new one or migrate to another instance, rather than the entire service being lost.
Within each Mastodon instance, usernames just appear as `@username`, similar to other services such as Twitter. Users from other instances appear, and can be searched for and followed, as `@user@servername.ext` - so e.g. `@gargron` on the `mastodon.social` instance can be followed from other instances as `@gargron@mastodon.social`).
Posts from users on external instances are "federated" into the local one, i.e. if `user1@mastodon1` follows `user2@gnusocial2`, any posts `user2@gnusocial2` makes appear in both `user1@mastodon`'s Home feed and the public timeline on the `mastodon1` server. Mastodon server administrators have some control over this and can exclude users' posts from appearing on the public timeline; post privacy settings from users on Mastodon instances also affect this, see below in the [Toot Privacy](User-guide.md#toot-privacy) section.
Posts from users on external instances are "*federated*" into the local one, i.e. if `user1@mastodon1` follows `user2@gnusocial2`, any posts `user2@gnusocial2` makes appear in both `user1@mastodon`'s Home feed and the public timeline on the `mastodon1` server. Mastodon server administrators have some control over this and can exclude users' posts from appearing on the public timeline; post privacy settings from users on Mastodon instances also affect this, see below in the [Toot Privacy](User-guide.md#toot-privacy) section.