Compare commits

..

1 commit

Author SHA1 Message Date
Daenney 0047b87b8a
Merge 9acf9ddc75 into 3b037d165c 2024-10-29 17:44:05 -07:00
206 changed files with 2013 additions and 21986 deletions

View file

@ -8,7 +8,7 @@ GoToSocial is an [ActivityPub](https://activitypub.rocks/) social network server
With GoToSocial, you can keep in touch with your friends, post, read, and share images and articles. All without being tracked or advertised to!
<p align="middle">
<img src="https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/overrides/public/sloth.webp" width="300"/>
<img src="https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/assets/sloth.webp" width="300"/>
</p>
**GoToSocial is still [BETA SOFTWARE](https://en.wikipedia.org/wiki/Software_release_life_cycle#Beta)**. It is already deployable and useable, and it federates cleanly with many other Fediverse servers (not yet all). However, many things are not yet implemented, and there are plenty of bugs! We left alpha stage around September/October 2024, and we intend to exit beta some time around 2026.
@ -19,7 +19,7 @@ To build from source, check the [CONTRIBUTING.md](https://github.com/superseriou
Here's a screenshot of the instance landing page!
![Screenshot of the landing page for the GoToSocial instance goblin.technology. It shows basic information about the instance; number of users and posts etc.](https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/overrides/public/instancesplash.png)
![Screenshot of the landing page for the GoToSocial instance goblin.technology. It shows basic information about the instance; number of users and posts etc.](https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/assets/instancesplash.png)
<!--overview-end-->
## Table of Contents <!-- omit in toc -->
@ -72,7 +72,7 @@ GoToSocial provides a lightweight, customizable, and safety-focused entryway int
If you've ever used something like Twitter or Tumblr (or even Myspace!) GoToSocial will probably feel familiar to you: You can follow people and have followers, you make posts which people can favourite and reply to and share, and you scroll through posts from people you follow using a timeline. You can write long posts or short posts, or just post images, it's up to you. You can also, of course, block people or otherwise limit interactions that you don't want by posting just to your friends.
![Screenshot of the web view of a profile in GoToSocial, showing header and avatar, bio, and numbers of followers/following.](https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/overrides/public/profile1.png)
![Screenshot of the web view of a profile in GoToSocial, showing header and avatar, bio, and numbers of followers/following.](https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/assets/profile1.png)
**GoToSocial does NOT use recommendation algorithms or collect data about you to suggest content or 'improve your experience'**. The timeline is chronological: whatever you see at the top of your timeline is there because it's *just been posted*, not because it's been selected as interesting (or controversial) based on your personal profile.
@ -84,7 +84,7 @@ GoToSocial doesn't claim to be *better* than any other application, but it offer
Because GoToSocial uses [ActivityPub](https://activitypub.rocks/), you can hang out not just with people on your home server, but with people all over the [Fediverse](https://en.wikipedia.org/wiki/Fediverse), seamlessly.
![the activitypub logo](https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/overrides/public/ap_logo.svg)
![the activitypub logo](https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/assets/ap_logo.svg)
Federation means that your home server is part of a network of servers all over the world that all communicate using the same protocol. Your data is no longer centralized on one company's servers, but resides on your own server and is shared — as you see fit — across a resilient web of servers run by other people.
@ -128,7 +128,7 @@ GoToSocial offers public, unlisted/unlocked, followers-only, and direct posts (s
GoToSocial lets you choose who can reply to your posts, via [interaction policies](https://docs.gotosocial.org/en/latest/user_guide/settings/#default-interaction-policies). You can choose to let anyone reply to your posts, let only your friends reply, and more.
![interaction policies settings](https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/overrides/public/user-settings-interaction-policy-1.png)
![interaction policies settings](https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/assets/user-settings-interaction-policy-1.png)
### Local-only posting
@ -142,7 +142,7 @@ GoToSocial lets you opt-in to exposing your profile as an RSS feed, so that peop
With GoToSocial, you can write posts using the popular, easy-to-use Markdown markup language, which lets you produce rich HTML posts with support for blockquotes, syntax-highlighted code blocks, lists, inline links, and more.
![markdown-formatted post](https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/overrides/public/markdown-post.png)
![markdown-formatted post](https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/assets/markdown-post.png)
### Themes and custom CSS
@ -153,61 +153,61 @@ It's also easy for admins to [add their own custom themes](https://docs.gotosoci
<details>
<summary>Show theme examples</summary>
<figure>
<img src="https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/overrides/public/theme-blurple-dark.png"/>
<img src="https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/assets/theme-blurple-dark.png"/>
<figcaption>Blurple dark</figcaption>
</figure>
<hr/>
<figure>
<img src="https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/overrides/public/theme-blurple-light.png"/>
<img src="https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/assets/theme-blurple-light.png"/>
<figcaption>Blurple light</figcaption>
</figure>
<hr/>
<figure>
<img src="https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/overrides/public/theme-brutalist-light.png"/>
<img src="https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/assets/theme-brutalist-light.png"/>
<figcaption>Brutalist light</figcaption>
</figure>
<hr/>
<figure>
<img src="https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/overrides/public/theme-brutalist-dark.png"/>
<img src="https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/assets/theme-brutalist-dark.png"/>
<figcaption>Brutalist dark</figcaption>
</figure>
<hr/>
<figure>
<img src="https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/overrides/public/theme-ecks-pee.png"/>
<img src="https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/assets/theme-ecks-pee.png"/>
<figcaption>Ecks pee</figcaption>
</figure>
<hr/>
<figure>
<img src="https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/overrides/public/theme-midnight-trip.png"/>
<img src="https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/assets/theme-midnight-trip.png"/>
<figcaption>Midnight trip</figcaption>
</figure>
<figure>
<img src="https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/overrides/public/theme-moonlight-hunt.png"/>
<img src="https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/assets/theme-moonlight-hunt.png"/>
<figcaption>Moonlight hunt</figcaption>
</figure>
<hr/>
<figure>
<img src="https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/overrides/public/theme-rainforest.png"/>
<img src="https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/assets/theme-rainforest.png"/>
<figcaption>Rainforest</figcaption>
</figure>
<hr/>
<figure>
<img src="https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/overrides/public/theme-soft.png"/>
<img src="https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/assets/theme-soft.png"/>
<figcaption>Soft</figcaption>
</figure>
<hr/>
<figure>
<img src="https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/overrides/public/theme-solarized-dark.png"/>
<img src="https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/assets/theme-solarized-dark.png"/>
<figcaption>Solarized dark</figcaption>
</figure>
<hr/>
<figure>
<img src="https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/overrides/public/theme-solarized-light.png"/>
<img src="https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/assets/theme-solarized-light.png"/>
<figcaption>Solarized light</figcaption>
</figure>
<hr/>
<figure>
<img src="https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/overrides/public/theme-sunset.png"/>
<img src="https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/assets/theme-sunset.png"/>
<figcaption>Sunset</figcaption>
</figure>
<hr/>
@ -217,7 +217,7 @@ It's also easy for admins to [add their own custom themes](https://docs.gotosoci
GoToSocial uses only about 250-350MiB of RAM, and requires very little CPU power, so it plays nice with single-board computers, old laptops and tiny $5/month VPSes.
![Grafana graph showing GoToSocial heap in use hovering around 250MB and spiking occasionally to 400MB-500MB.](https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/overrides/public/getting-started-memory-graph.png)
![Grafana graph showing GoToSocial heap in use hovering around 250MB and spiking occasionally to 400MB-500MB.](https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/docs/assets/getting-started-memory-graph.png)
No external dependencies apart from a database (or just use SQLite!).

View file

@ -33,7 +33,7 @@ When your instance encounters a mention or an announce of a status or account it
It is possible to both block and allow the same domain, and the effect of combining these two things depends on which federation mode your instance is currently using.
![A flow chart diagram showing how the two different federation modes treat incoming requests.](../public/diagrams/federation_modes.png)
![A flow chart diagram showing how the two different federation modes treat incoming requests.](../assets/diagrams/federation_modes.png)
### In blocklist mode

View file

@ -20,13 +20,13 @@ Instance moderation settings.
### Reports
![List of reports for testing, showing one open report.](../public/admin-settings-reports.png)
![List of reports for testing, showing one open report.](../assets/admin-settings-reports.png)
The reports section shows a list of reports, originating from your local users, or remote instances (shown anonymously as just the name of the instance, without specific username).
Clicking a report shows if it was resolved (with the reasoning if available), more information, and a list of reported toots if selected by the reporting user. You can also use this view to mark a report as resolved, and fill in a comment. Whatever comment you enter here will be visible to the user that created the report, if that user is from your instance.
![The detailed view of an open report, showing the reported status and the reason for the report.](../public/admin-settings-report-detail.png)
![The detailed view of an open report, showing the reported status and the reason for the report.](../assets/admin-settings-report-detail.png)
Clicking on the username of the reported account opens that account in the 'Accounts' view, allowing you to perform moderation actions on it.
@ -36,7 +36,7 @@ You can use this section to search for an account and perform moderation actions
### Federation
![List of suspended instances, with a field to filter/add new blocks. Below is a link to the bulk import/export interface](../public/admin-settings-federation.png)
![List of suspended instances, with a field to filter/add new blocks. Below is a link to the bulk import/export interface](../assets/admin-settings-federation.png)
In the federation section you can create, delete, and review explicit domain blocks and domain allows.
@ -56,7 +56,7 @@ The domain allows section works much like the domain blocks section, described a
Through the link at the bottom of the Federation section (or going to `/settings/admin/federation/import-export`) you can do bulk import/export of blocklists and allowlists.
![List of domains included in an import, providing ways to select some or all of them, change their domains, and update the use of subdomains.](../public/admin-settings-federation-import-export.png)
![List of domains included in an import, providing ways to select some or all of them, change their domains, and update the use of subdomains.](../assets/admin-settings-federation-import-export.png)
Upon importing a list, either through the input field or from a file, you can review the entries in the list before importing a subset. You'll also be warned for entries that use subdomains, providing an easy way to change them to the main domain.
@ -86,7 +86,7 @@ Custom Emoji will be automatically fetched when included in remote toots, but to
#### Local
![Local custom emoji section, showing an overview of custom emoji sorted by category. There are a lot of garfields.](../public/admin-settings-emoji-local.png)
![Local custom emoji section, showing an overview of custom emoji sorted by category. There are a lot of garfields.](../assets/admin-settings-emoji-local.png)
This section shows an overview of all the custom emoji enabled on your instance, sorted by their category. Clicking an emoji shows it's details, and provides options to change the category or image, or delete it completely. The shortcode cannot be updated here, you would have to upload it with the new shortcode yourself (and optionally delete the old one).
@ -94,7 +94,7 @@ Below the overview you can upload your own custom emoji, after previewing how th
#### Remote
![Remote custom emoji section, showing a list of 3 emoji parsed from the entered toot, garfield, blobfoxbox and blobhajmlem. They can be selected, their shortcode can be tweaked, and they can be assigned to a category, before submitting as a copy or delete operation](../public/admin-settings-emoji-remote.png)
![Remote custom emoji section, showing a list of 3 emoji parsed from the entered toot, garfield, blobfoxbox and blobhajmlem. They can be selected, their shortcode can be tweaked, and they can be assigned to a category, before submitting as a copy or delete operation](../assets/admin-settings-emoji-remote.png)
Through the 'remote' section, you can look up a link to any remote toots (provided the instance isn't suspended). If they use any custom emoji they will be listed, providing an easy way to copy them to the local emoji (for use in your own toots), or disable them ( hiding them from toots).
@ -102,7 +102,7 @@ Through the 'remote' section, you can look up a link to any remote toots (provid
### Instance Settings
![Screenshot of the GoToSocial admin panel, showing the fields to change an instance's settings](../public/admin-settings-instance.png)
![Screenshot of the GoToSocial admin panel, showing the fields to change an instance's settings](../assets/admin-settings-instance.png)
Here you can set various metadata for your instance, like the displayed name/title, thumbnail image, (short) description, and contact info.

View file

@ -17,7 +17,7 @@ You can open new account sign-ups for your instance by changing the variable `ac
A sign-up form for your instance will be available at the `/signup` endpoint. For example, `https://your-instance.example.org/signup`.
![Sign-up form, showing email, password, username, and reason fields.](../public/signup-form.png)
![Sign-up form, showing email, password, username, and reason fields.](../assets/signup-form.png)
Also, your instance homepage and "about" pages will be updated to reflect that registrations are open.
@ -29,11 +29,11 @@ In the meantime, admins and moderators on your instance will receive an email an
Instance admins and moderators can handle a new sign-up by either approving or rejecting it via the "accounts" -> "pending" section in the admin panel.
![Admin settings panel open to "accounts" -> "pending", showing one account in a list.](../public/signup-pending.png)
![Admin settings panel open to "accounts" -> "pending", showing one account in a list.](../assets/signup-pending.png)
If you have no sign-ups, the list pictured above will be empty. If you have a pending account sign-up, however, you can click on it to open that account in the account details screen:
![Details of a new pending account, giving options to approve or reject the sign-up.](../public/signup-account.png)
![Details of a new pending account, giving options to approve or reject the sign-up.](../assets/signup-account.png)
At the bottom, you will find actions that let you approve or reject the sign-up.

View file

@ -39,6 +39,6 @@ If you wanted to see all GoToSocial traces, you could instead run:
Once you select a trace, a second panel will open up visualising the span. You can drill down from there, by clicking into every sub-span to see what it was doing.
![Grafana showing a trace for the /api/v1/instance endpoint](../public/tracing.png)
![Grafana showing a trace for the /api/v1/instance endpoint](../assets/tracing.png)
[traceql]: https://grafana.com/docs/tempo/latest/traceql/

View file

Before

Width:  |  Height:  |  Size: 102 KiB

After

Width:  |  Height:  |  Size: 102 KiB

View file

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 90 KiB

View file

Before

Width:  |  Height:  |  Size: 125 KiB

After

Width:  |  Height:  |  Size: 125 KiB

View file

Before

Width:  |  Height:  |  Size: 95 KiB

After

Width:  |  Height:  |  Size: 95 KiB

View file

Before

Width:  |  Height:  |  Size: 200 KiB

After

Width:  |  Height:  |  Size: 200 KiB

View file

Before

Width:  |  Height:  |  Size: 224 KiB

After

Width:  |  Height:  |  Size: 224 KiB

View file

Before

Width:  |  Height:  |  Size: 109 KiB

After

Width:  |  Height:  |  Size: 109 KiB

View file

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View file

Before

Width:  |  Height:  |  Size: 485 KiB

After

Width:  |  Height:  |  Size: 485 KiB

View file

Before

Width:  |  Height:  |  Size: 492 KiB

After

Width:  |  Height:  |  Size: 492 KiB

View file

Before

Width:  |  Height:  |  Size: 488 KiB

After

Width:  |  Height:  |  Size: 488 KiB

View file

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 23 KiB

View file

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 59 KiB

View file

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 90 KiB

View file

Before

Width:  |  Height:  |  Size: 131 KiB

After

Width:  |  Height:  |  Size: 131 KiB

View file

Before

Width:  |  Height:  |  Size: 87 KiB

After

Width:  |  Height:  |  Size: 87 KiB

View file

Before

Width:  |  Height:  |  Size: 227 KiB

After

Width:  |  Height:  |  Size: 227 KiB

View file

Before

Width:  |  Height:  |  Size: 133 KiB

After

Width:  |  Height:  |  Size: 133 KiB

View file

Before

Width:  |  Height:  |  Size: 633 KiB

After

Width:  |  Height:  |  Size: 633 KiB

View file

Before

Width:  |  Height:  |  Size: 879 KiB

After

Width:  |  Height:  |  Size: 879 KiB

View file

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 76 KiB

View file

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 110 KiB

View file

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 72 KiB

View file

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View file

Before

Width:  |  Height:  |  Size: 650 KiB

After

Width:  |  Height:  |  Size: 650 KiB

View file

Before

Width:  |  Height:  |  Size: 652 KiB

After

Width:  |  Height:  |  Size: 652 KiB

View file

Before

Width:  |  Height:  |  Size: 635 KiB

After

Width:  |  Height:  |  Size: 635 KiB

View file

Before

Width:  |  Height:  |  Size: 639 KiB

After

Width:  |  Height:  |  Size: 639 KiB

View file

Before

Width:  |  Height:  |  Size: 855 KiB

After

Width:  |  Height:  |  Size: 855 KiB

View file

Before

Width:  |  Height:  |  Size: 631 KiB

After

Width:  |  Height:  |  Size: 631 KiB

View file

Before

Width:  |  Height:  |  Size: 682 KiB

After

Width:  |  Height:  |  Size: 682 KiB

View file

Before

Width:  |  Height:  |  Size: 637 KiB

After

Width:  |  Height:  |  Size: 637 KiB

View file

Before

Width:  |  Height:  |  Size: 680 KiB

After

Width:  |  Height:  |  Size: 680 KiB

View file

Before

Width:  |  Height:  |  Size: 658 KiB

After

Width:  |  Height:  |  Size: 658 KiB

View file

Before

Width:  |  Height:  |  Size: 663 KiB

After

Width:  |  Height:  |  Size: 663 KiB

View file

Before

Width:  |  Height:  |  Size: 653 KiB

After

Width:  |  Height:  |  Size: 653 KiB

View file

Before

Width:  |  Height:  |  Size: 266 KiB

After

Width:  |  Height:  |  Size: 266 KiB

View file

Before

Width:  |  Height:  |  Size: 98 KiB

After

Width:  |  Height:  |  Size: 98 KiB

View file

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 62 KiB

View file

Before

Width:  |  Height:  |  Size: 102 KiB

After

Width:  |  Height:  |  Size: 102 KiB

View file

Before

Width:  |  Height:  |  Size: 108 KiB

After

Width:  |  Height:  |  Size: 108 KiB

View file

@ -18,24 +18,6 @@
# Default: 40MiB (41943040 bytes)
media-local-max-size: 40MiB
# Size. Size in bytes of max image size referred to on /api/v_/instance endpoints,
# used by applications like Tusky to automatically scale locally uploaded media.
#
# Leaving this unset will default to media-local-max-size.
#
# Examples: [64, 500, 5MiB, 5MB, 50M]
# Default: unset
media-image-size-hint: 5MiB
# Size. Size in bytes of max video size referred to on /api/v_/instance endpoints,
# used by applications like Tusky to automatically scale locally uploaded media.
#
# Leaving this unset will default to media-local-max-size.
#
# Examples: [64, 4096, 4MiB, 4MB, 40M]
# Default: unset
media-video-size-hint: 40MiB
# Size. Max size in bytes of media to download from other instances.
#
# Lowering this limit may cause your instance not to fetch post media.

View file

@ -914,7 +914,7 @@ Now, `remote_1` boosts/reblogs a post from a third account, `remote_2`, residing
`local_account` does not follow `remote_2`, and neither does anybody else on `our.server`, which means that `our.server` has not seen this post by `remote_2` before.
![A diagram of the conversation thread, showing the post from remote_2, and possible ancestor and descendant posts](../public/diagrams/conversation_thread.png)
![A diagram of the conversation thread, showing the post from remote_2, and possible ancestor and descendant posts](../assets/diagrams/conversation_thread.png)
What GoToSocial will do now, is 'dereference' the post by `remote_2` to check if it is part of a thread and, if so, whether any other parts of the thread can be obtained.

View file

@ -20,7 +20,7 @@ You can find more detail on system requirements below, but in short you should a
For a small instance (1-20 active users), GoToSocial will likely hover consistently between 250MB and 350MB of RAM usage once the internal caches are hydrated:
![Grafana graph showing GoToSocial heap in use hovering around 250MB and spiking occasionally to 400MB-500MB.](../public/getting-started-memory-graph.png)
![Grafana graph showing GoToSocial heap in use hovering around 250MB and spiking occasionally to 400MB-500MB.](../assets/getting-started-memory-graph.png)
In the graph above you can see that RAM usage spikes during periods of load. This happens, for example, when when a status gets boosted by someone with many followers, or when the embedded `ffmpeg` binary is decoding or reencoding media files into thumbnails (especially larger video files).

View file

@ -47,7 +47,7 @@ sudo systemctl stop gotosocial
```
In your GoToSocial config turn off Lets Encrypt by setting `letsencrypt-enabled` to `false`.
If you are running GoToSocial on port 443, change the `port` value back to the default `8080`.
If you we running GoToSocial on port 443, change the `port` value back to the default `8080`.
If the reverse proxy will be running on the same machine, set the `bind-address` to `"localhost"` so that the GoToSocial server is only accessible via loopback. Otherwise it may be possible to bypass your proxy by connecting to GoToSocial directly, which might be undesirable.
@ -73,7 +73,7 @@ example.org {
# The actual proxy configuration to port 8080 (unless you've chosen another port number)
reverse_proxy * http://127.0.0.1:8080 {
# Flush immediately, to prevent buffered response to the client
# Flush immediatly, to prevent buffered response to the client
flush_interval -1
}
}

View file

@ -1,17 +0,0 @@
# .readthedocs.yaml
# Read the Docs configuration file
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
# Required
version: 2
build:
os: ubuntu-22.04
tools:
python: "mambaforge-22.9" # https://docs.readthedocs.io/en/stable/guides/conda.html#making-builds-faster-with-mamba
mkdocs:
configuration: "docs/locales/zh/mkdocs.yml"
conda:
environment: "docs/environment.yml"

View file

@ -1,223 +0,0 @@
# 备份和恢复
由于 GoToSocial 数据库包含了实例以及所有用户的签名密钥,备份是至关重要的。如果这些密钥丢失,您将无法再从此域名进行联合与交流。请记住加密备份,以确保数据在静置时的安全。
除了灾难恢复之外,还有其他一些保持备份的好理由。您可以考虑以下几种可能的场景:
* 您想关闭实例,但可能会在以后重新创建,并且不希望破坏联合功能。
* 出于某种原因,您需要迁移到不同的数据库(从 Postgres 到 SQLite 或反之亦然)。
* 您准备对实例进行一些调整,希望快速备份以防出错导致数据丢失。
## 需要备份的内容
### 数据库
大多数备份工具都内置对常见的数据库的支持,如 PostgreSQL 和 SQLite。请确保首先查看他们的文档因为它们通常会详细说明备份成功完成和恢复所需满足的某些注意事项和条件。
### 媒体文件
本站媒体文件应被备份。您可以使用 [GoToSocial CLI](cli.md#gotosocial-admin-media-list-local) 列出属于您的实例及其用户的所有媒体文件。
外站媒体无需备份。这可以有效地控制备份大小。外站媒体会从原始实例获取,就像因为媒体保留而被修剪掉后再次获取一样。
## 如何备份
您可以通过以下几种方式进行备份:
* 为实例和数据库运行所在的 VM/机器制作镜像
* 使用 CLI 转储 GoToSocial 的状态
* 备份数据库和媒体文件
* 使用备份软件
尽管设置备份软件可能需要更多工作,但这无疑是最佳选择。它确保了一致和加密的备份,并可以抵御文件系统损坏,而磁盘快照和复制原始数据库及媒体文件无法做到这一点。
### 镜像您的磁盘
如果您在 VPS云端的远程机器上运行 GoToSocial制作附加到 VPS 的磁盘镜像可能是保存所有数据库条目和媒体的最简单方法。这将保留整个磁盘。许多 VPS 提供商提供定时自动创建备份的选项,因此即使数据丢失,您也可以随时恢复。
优点:
* 相对容易操作。
* 易于自动化(视具体的 VPS 而定)。
* 保留完整的媒体和数据库条目。
缺点:
* 可能会根据您的 VPS 产生额外费用。
* 可能也会保留您不需要的其他程序运行的数据。
* 与供应商绑定,数据难以迁移。
### 使用 GoToSocial CLI
GoToSocial CLI 工具还提供了从实例备份和恢复数据的命令,这将保留所有必要的最少数据以备份和恢复您的实例,而不破坏与其他实例的联邦。
将**保留**的内容有:
* 所有本站账户条目,包括私钥和公钥。
* 关注/被关注的外站账户,包括公钥。
* 关注/关注请求。
* 实例屏蔽列表。
* 账户屏蔽列表。
* 账户封禁列表。
* 用户名和密码条目,电子邮件地址。
将**丢弃**的:
* 所有贴文。
* 媒体。
* 收藏。
* 书签。
* 置顶。
* 应用程序。
* 令牌。
生成的备份文件将是一个以行分隔的 JSON 对象序列(而不是 JSON 数组!)。例如:
```json
{"type":"account","id":"01F8MH5NBDF2MV7CTC4Q5128HF","createdAt":"2021-08-31T12:00:53.985645Z","username":"1happyturtle","locked":true,"language":"en","uri":"http://localhost:8080/users/1happyturtle","url":"http://localhost:8080/@1happyturtle","inboxURI":"http://localhost:8080/users/1happyturtle/inbox","outboxURI":"http://localhost:8080/users/1happyturtle/outbox","followingUri":"http://localhost:8080/users/1happyturtle/following","followersUri":"http://localhost:8080/users/1happyturtle/followers","featuredCollectionUri":"http://localhost:8080/users/1happyturtle/collections/featured","actorType":"Person","privateKey":"-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEAzLP7oyyR+BU9ejn0CN9K+WpX3L37pxUcCgZAGH5lf3cGPZjz\nausfsFME94OjVyzw3K5M2beDkZ4E+Fak46NLtakLB1yovy9jKtj4Y4txHoMvRJLz\neUPxdfeXtpx2d3FDj++Uq4DEE0BhbePXhTGJWaNdC9MQmWKghJnCS5mrnFkdpEFx\njUz9l0UHl2Z4wppxPdpt7FyevcdfKqzGsAA3BxTM0dg47ZJWjtcvfCiSYpAKFNJY\nfKhKn9T3ezZgrLsF+o0IpD23KxWe1X4d5lgJRU9T4FmLmbvyJKUnfgYXbSEvLUcq\n79WbhgRcWwxWubjmWXgPGwzULVhhpYlwd2Cv3wIDAQABAoIBAGF+MxHjD15VV2NY\nKKb1GjMx98i1Xx6TijgoA+zmfha4LGu35e79Lql+0LXFp0zEpa6lAQsMQQhgd0OD\nmKKmSk+pxAvskJ4FxrhIf/yBFA4RMrj5OCaAOocRtdsOJ8n5UtFBrNAF0tzMY9q/\nkgzoq97aVF1mV9iFxaeBx6zT8ozSdqBq1PK/3w1dVg89S5tfKYc7Q0lQ00SfsTnd\niTDClKyqurebo9Pt6M7gXavgg3tvBlmwwr6XHs34Leng3oiN9mW8DVzaBMPzn+rE\nxF2eqs3v9vVpj8es88OwCh5P+ff8vJYvhu7Fcr/bJ8BItBQwfb8QBDATg/MXU2BI\n2ssW6AECgYEA4wmIyYGeu9+hzDa/J3Vh8GnlVNUCohHcChQdOsWsFXUgpVlUIHrX\neKHn42vD4Rzy52/YzJts4NkZTM9sL+kEXIEcpMG/S9xIIud7U0m/hMSAlmnJK/9j\niEXws3o4jo0E77jnRcBdIjpG4K5Eekm0DSR3SFhtZfEdN2DWPvu7K98CgYEA5tER\n/qJwFMc51AobMU87ZjXON7hI2U1WY/pVF62jSl0IcSsnj2riEKWLrs+GRG+HUg+U\naFSqAHcxaVHA0h0AYR8RopAhDdVKh0kvB8biLo+IEzNjPv2vyn0yRN5YSfXdGzyJ\nUjVU6kWdQOwmzy86nHgFaqEx7eofHIaGZzJK/AECgYEAu2VNQHX63TuzQuoVUa5z\nzoq5vhGsALYZF0CO98ndRkDNV22qIL0ESQ/qZS64GYFZhWouWoQXlGfdmCbFN65v\n6SKwz9UT3rvN1vGWO6Ltr9q6AG0EnYpJT1vbV2kUcaU4Y94NFue2d9/+TMnKv91B\n/m8Q/efvNGuWH/WQIaCKV6UCgYBz89WhYMMDfS4M2mLcu5vwddk53qciGxrqMMjs\nkzsz0Va7W12NS7lzeWaZlAE0gf6t98urOdUJVNeKvBoss4sMP0phqxwf0eWV3ur0\ncjIQB+TpGGikLVdRVuGY/UXHKe9AjoHBva8B3aTpB3lbnbNJBXZbIc1uYq3sa5w7\nXWWUAQKBgH3yW73RRpQNcc9hTUssomUsnQQgHxpfWx5tNxqod36Ytd9EKBh3NqUZ\nvPcH6gdh7mcnNaVNTtQOHLHsbPfBK/pqvb3MAsdlokJcQz8MQJ9SGBBPY6PaGw8z\nq/ambaQykER6dwlXTIlU20uXY0bttOL/iYjKmgo3vA66qfzS6nsg\n-----END RSA PRIVATE KEY-----\n","publicKey":"-----BEGIN RSA PUBLIC KEY-----\nMIIBCgKCAQEAzLP7oyyR+BU9ejn0CN9K+WpX3L37pxUcCgZAGH5lf3cGPZjzausf\nsFME94OjVyzw3K5M2beDkZ4E+Fak46NLtakLB1yovy9jKtj4Y4txHoMvRJLzeUPx\ndfeXtpx2d3FDj++Uq4DEE0BhbePXhTGJWaNdC9MQmWKghJnCS5mrnFkdpEFxjUz9\nl0UHl2Z4wppxPdpt7FyevcdfKqzGsAA3BxTM0dg47ZJWjtcvfCiSYpAKFNJYfKhK\nn9T3ezZgrLsF+o0IpD23KxWe1X4d5lgJRU9T4FmLmbvyJKUnfgYXbSEvLUcq79Wb\nhgRcWwxWubjmWXgPGwzULVhhpYlwd2Cv3wIDAQAB\n-----END RSA PUBLIC KEY-----\n","publicKeyUri":"http://localhost:8080/users/1happyturtle#main-key"}
{"type":"account","id":"01F8MH0BBE4FHXPH513MBVFHB0","createdAt":"2021-09-08T10:00:53.985634Z","username":"weed_lord420","locked":true,"language":"en","uri":"http://localhost:8080/users/weed_lord420","url":"http://localhost:8080/@weed_lord420","inboxURI":"http://localhost:8080/users/weed_lord420/inbox","outboxURI":"http://localhost:8080/users/weed_lord420/outbox","followingUri":"http://localhost:8080/users/weed_lord420/following","followersUri":"http://localhost:8080/users/weed_lord420/followers","featuredCollectionUri":"http://localhost:8080/users/weed_lord420/collections/featured","actorType":"Person","privateKey":"-----BEGIN RSA PRIVATE KEY-----\nMIIEogIBAAKCAQEAzsCcTHzwIgpWKVvut0Q/t1bFwnbj9hO6Ic6k0KXCXbf6qi0b\nMIyLRZr8DS61mD+SPSO2QKEL647xxyW2D8YGtwN6Cc6MpWETsWJkNtS8t7tDL//P\nceYpo5LiqKgn0TXj0Pq8Lvb7rqpH8QJ2EVm14SK+elhKZW/Bi5ZOEwfL8pw6EHI4\nus6VxCNQ099dksu++kbdD7zxqEKnk/4zOttYt0whlVrxzkibTjlKdlSlTYpIstU+\nfNyYVE0xWvrn+yF7jVlEwZYOFGfZbpELadrdOr2k1hvAk7upkrpKmLqYfwqD/xPc\nqwtx0iS6AEnmkSiTcAvju5vLkoLFRU7Of4AZ2wIDAQABAoIBAEAA4GHNS4k+Ke4j\nx4J0XkUjV5UbuPY0pSpSDjOJHOJmUfLcg85Ds9mYYO6zxwOaqmrC42ieclI5rh84\nTWQUqX9+VAk1J9UKeE4xZ1SSBtnZ3rK9PjrERZ+dmQ0dATaCuEO5Wwgu7Trk++Bg\nIqy8WNGZL94v9tfwALp1jTXW9AvmQoNdCFBP62vcmYW4YLjnggxLCFTA8YKfdePa\nTuxxY6uLkeBbxzWpbRU2+bmlxd5OnCkiRSMHIX+6JdtCu2JdWpUTCnWrFi2n1TZz\nZQx9z5rvowK1O785jGMFum5vBWpjIU8sJcXmPjGMU25zzmrhzfmkJsTXER3CXoUo\nSqSPqgECgYEA78OR7bY5KKQQ7Lyz6dru4Fct5P/OXTQoOg5aS7TKb95LVWj+TANn\n5djwIbLmAUV30z0Id9VgiZOL0Hny8+3VV9eU088Z408pAy5WQrL3dB8tZLUJSq5c\n5k6X15/VjWOOZKppDxShzoV3mcohrnwVwkv4fhPFQQOJJBYz6xurWs0CgYEA3MDE\nsDMd9ahzO0dl62ynojkkA8ZTcn2UdyvLpGj9UxT5j9vWF3CfqitXgcpNiVSIbxqQ\nbo/pBch7c/2Xakv5zkdcrJj5/6gyr+m1/tK2o7+CjDaSE4SYwufXx+qkl03Zpyzt\nKdOi7Hz/b2tdjump7ECEDE45mG2ea8oSnPgXl0cCgYBkGGFzu/9g2B24t47ksmHH\nhp3CXIjqoDurARLxSCi7SzJoFc0ULtfRPSAC8YzUOwwrQ++lF4+V3+MexcqHy2Kl\nqXqYcn18SC/3BAE/Fzf3Yoyw3mNiqihefbEmc7PTsxxfKkVx5ksmzNGBgsFM9sCe\nvNigyeAvpCo8xogmPwbqgQKBgE34mIBTzcUzFmBdu5YH7r3RyPK8XkUWLhZZlbgg\njTmHMw6o61mkIgENBf+F4RUckoQLsfAbTIcKZPB3JcAZzcYaVpVwAv1V/3E671lu\nO6xivE2iCL50GzDcis7GBhSbHsF5kNsxMV6uV9qW5ZjQ13/m2b0u9BDuxwHzgdeH\nmW2JAoGAIUOYniuEwdygxWVnYatpr3NPjT3BOKoV5i9zkeJRu1hFpwQM6vQ4Ds5p\nGC5vbMKAv9Cwuw62e2HvqTun3+U2Y5Uived3XCpgM/50BFrFHCfuqXEnu1bEzk5z\n9mIhp8uXPxzC5N7tRQfb3/eU1IUcb6T6ksbr2P81z0j03J55erg=\n-----END RSA PRIVATE KEY-----\n","publicKey":"-----BEGIN RSA PUBLIC KEY-----\nMIIBCgKCAQEAzsCcTHzwIgpWKVvut0Q/t1bFwnbj9hO6Ic6k0KXCXbf6qi0bMIyL\nRZr8DS61mD+SPSO2QKEL647xxyW2D8YGtwN6Cc6MpWETsWJkNtS8t7tDL//PceYp\no5LiqKgn0TXj0Pq8Lvb7rqpH8QJ2EVm14SK+elhKZW/Bi5ZOEwfL8pw6EHI4us6V\nxCNQ099dksu++kbdD7zxqEKnk/4zOttYt0whlVrxzkibTjlKdlSlTYpIstU+fNyY\nVE0xWvrn+yF7jVlEwZYOFGfZbpELadrdOr2k1hvAk7upkrpKmLqYfwqD/xPcqwtx\n0iS6AEnmkSiTcAvju5vLkoLFRU7Of4AZ2wIDAQAB\n-----END RSA PUBLIC KEY-----\n","publicKeyUri":"http://localhost:8080/users/weed_lord420#main-key"}
{"type":"account","id":"01F8MH17FWEB39HZJ76B6VXSKF","createdAt":"2021-09-05T10:00:53.985641Z","username":"admin","locked":true,"language":"en","uri":"http://localhost:8080/users/admin","url":"http://localhost:8080/@admin","inboxURI":"http://localhost:8080/users/admin/inbox","outboxURI":"http://localhost:8080/users/admin/outbox","followingUri":"http://localhost:8080/users/admin/following","followersUri":"http://localhost:8080/users/admin/followers","featuredCollectionUri":"http://localhost:8080/users/admin/collections/featured","actorType":"Person","privateKey":"-----BEGIN RSA PRIVATE KEY-----\nMIIEogIBAAKCAQEAxr2e1pqfLwwUCwHUdx56Mxnq5Kzc2EBwqN6jIPjiqVaG5eVq\nhujDhdqwMq0hnpBSPzLnvjiOtEh7Bwhx0MjuC/GRPTM9oNWPYD4PcjX5ofrubyLR\nBI97qD0SbyzUWzeyBi6R5tpW8LK1MJXNbnYlz5WouEiC4mY77ulri0EN2hCq80wg\nfvtEjEvELcKBqIytKH3rutIzfAyqXD7LSQ8UDoNh9GHyIfq8Zj32gWVk2MiPI3+G\n8kQJDmD8CKEasnrGVdSJBQUg3xDAtOibPXLP+07AIsKYMon35hVNvQNQPS7ru/Bk\nRhhGp2R44zqj6L9mxYbSrhFAaKDedu8oVe1aLQIDAQABAoIBAGK0aIADOU4ffJDe\n7sveiih5Fc1PATwx/QIR2QkWM1SREdx6LYclcX44V8xDanAbE44p1SkHY/CsEtYy\nXnyoXnn2FwFDQrdveY7+I6PApOPLAcKWkyLltC+hbVdj92/6YGNrm7EA/a77wruH\nmwjiivLnTG2CLecNiXSl33DA9YU4Yz+2Tza3IpTdjt8c/dz/BKKaxaWV+i9ew5VR\nioo5v51B+J8PrneCM/p8LGiLV148Njr0JqV6eFy1JuzItYMYdc3Fp+YnMzsuMZEA\n1akMcoln/ucVJyOFnCn6jx47nIoPZLl1KxX3aRDRfvrejm6W4yAkkTmR5voSRqax\njPL3rI0CgYEA9Acu4TO8xJ3uGaUad0N9JTYQVSmtAaE/g+df9LGMSzoj8X95S4xE\nQsGPqNGDm2VWADJjK4P05twZ+LfsfSKQ86wbp4/gbgnXpqB1P5Lty/B7KxiTnNwt\nwb1WGWTCukxfUSL3PRyf8uylkrg72RxKiBx4zKO3WVSLWOZWrFtn0qMCgYEA0H2p\nJs9Nv20ADOOX5tQ7+ruS6/B/Fhyj5fhflSYCAtOW7aME7+zQKJyqSQZ4b2Aub3Tp\nGIaUbRIGzjHyuTultFFWvjU3H5aI/0g1G9WKaBhNkyTIYVmMKtYyhXNvouWing8x\noraWx8TTBP8Cdnnk+QgdR2fpug8cghKupp5wvO8CgYA1JFtRL7MsHjh73TimQExA\njkWARlMmx7bNQtXis8eZmk+5h8kiaqly4DQoz3eZn7fa0x5Fm7b5j3UYdPVLSvvG\nFPTwyKRXUk1kPA1MivK+NuCbwf5jao+MYW8emJLPf1JCmRq+dD1g6aglC3n9Dewt\nOAYWipCjI4Y1FfRKFJ3HgQKBgEAb47+DTyzln3ZXJYZdDHR06SCTuwBZnixAy2NZ\nZJTp6yb3UbVU5E0Yn2QFEVNuB9lN4b8g4tMHEACnazN6G+HugPXL9z9HUqjs0yfT\n6dNIZdIxJUyJ9IfXhYFzlYhJhE+F7IVUD9kttJV8tI0pvja1QAuM8Fm9+84jYIDr\nh08RAoGAMYbjKHbtejcHBwt1kIcSss0cDmlZbBleJo8tdmdg4ndf5GE9N4/EL7tq\nm2zYSfr7OVdnOwRhoO+xF/6d1L7+TR1wz+k2fuMsI71aM5Ocp1nYTutjIkBTcldZ\nZzvjOgZWng5icuRLQQiDSKG5uqazqL/xGXkijb4kp4WW6myWY3c=\n-----END RSA PRIVATE KEY-----\n","publicKey":"-----BEGIN RSA PUBLIC KEY-----\nMIIBCgKCAQEAxr2e1pqfLwwUCwHUdx56Mxnq5Kzc2EBwqN6jIPjiqVaG5eVqhujD\nhdqwMq0hnpBSPzLnvjiOtEh7Bwhx0MjuC/GRPTM9oNWPYD4PcjX5ofrubyLRBI97\nqD0SbyzUWzeyBi6R5tpW8LK1MJXNbnYlz5WouEiC4mY77ulri0EN2hCq80wgfvtE\njEvELcKBqIytKH3rutIzfAyqXD7LSQ8UDoNh9GHyIfq8Zj32gWVk2MiPI3+G8kQJ\nDmD8CKEasnrGVdSJBQUg3xDAtOibPXLP+07AIsKYMon35hVNvQNQPS7ru/BkRhhG\np2R44zqj6L9mxYbSrhFAaKDedu8oVe1aLQIDAQAB\n-----END RSA PUBLIC KEY-----\n","publicKeyUri":"http://localhost:8080/users/admin#main-key"}
{"type":"account","id":"01F8MH1H7YV1Z7D2C8K2730QBF","createdAt":"2021-09-06T10:00:53.985643Z","username":"the_mighty_zork","locked":true,"language":"en","uri":"http://localhost:8080/users/the_mighty_zork","url":"http://localhost:8080/@the_mighty_zork","inboxURI":"http://localhost:8080/users/the_mighty_zork/inbox","outboxURI":"http://localhost:8080/users/the_mighty_zork/outbox","followingUri":"http://localhost:8080/users/the_mighty_zork/following","followersUri":"http://localhost:8080/users/the_mighty_zork/followers","featuredCollectionUri":"http://localhost:8080/users/the_mighty_zork/collections/featured","actorType":"Person","privateKey":"-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEApBmF8U+or+E0mgUMH3LE4uRIWzeV9rhYnvSMm9OpOsxwJiss\n5mEA/NtPHvQlq2UwrqXX89Wvu94K9EzZ4VyWYQGdxaiPpt17vRqUfsHUnXkY0pvC\nC9zt/aNlJtdt2xm+7PTC0YQd4+E1FX3aaoUPJL8MXzNlpJzaUtuwLZe1iBmFfatZ\nFHptEgc4nlf6TNLTzj3Yw1/7zIGVS8Vi7VquHc0Xo8dRiL2RxCGzLWnwL6GlrxY1\ntMhsUg467XeoiwegFCpcIhAhPFREKoTnCEksL/N0rpXl7m6CAy5uqBGs5mMXnXlq\nefr58l0j2dU6zc60LCHH9TJC+roXsKJhy9sx/QIDAQABAoIBAFa+UypbFG1cW2Tr\nNBxPm7ngOEtXl8MicV4dIVKh0TwOo13ZxtNFBbOj7jALmPn/9HrtmbkABPQHDL1U\n/nt9aNSAeTjpwH3RaD5vFX3n0g8n2zJBOZLxxzAjNi4RBLYj5uP1AiKkdvRlsJza\nuSFDkty2zMBqN9mLPHE+RePj5Qa6tjYfIQqQzu/+YnYMlXHoC2yHNKsvz6S5FhVj\nv5zATv2JlJQH3RSmhuPOah73iQnKCLzYYEAHleawKrCg/rZ3ht37Guvabeq7MqQN\nvi9pJdAA+RMxPsboHajskePjOTYJgKQSxEAMRTMfBR40aZxklxQL0EoBd1Y3CHXh\nfMg0xWECgYEA0ORrpJ1A2WNQwKcDDeBBsaJqWF4EraoFzYrugKZrAYEeVyuGD0zq\nARUaWkZTZ1f6wQ10i1WxAuKlBEds7QsLdZzLsA4um4JlBroCZiYfPnmTtb8op1LY\nFqeYTByvAmnfWWTuOI67GX9ruLg8tEGuz38kuQVSxYs51its3tScNPUCgYEAyRst\nwRbqpOqnwoRoS6pxv0Vpc3nUcfaVYwsg/qobJkiwAdlUYeE7alvEY926VW4cvU/X\nhy3L1punAqnyLI7uuqCefXEbNxO0Cebyy4Kv2Ye1uzl0OHsJczSNdfpNqfAIKwtN\nHLCYDGCsluQhz+I/5Pd0dT+JDPPW9hKS2HG7o+kCgYBqugn1VRLo/sEnbS02TbnC\n1ESZWY/yWsgUOEObH2vUnO+vgeFAt/9nBi0sqnm6d0z6jbFZ7zI9UycUhJm2ksoM\nEUxQay6M7ZZIVYkcP6X++YbqePyAYOdey8oYOR+BkC45MkQ0SVh2so+LFTaOsnBq\nO3+7uGiN3ZBzSESbpO0acQKBgQCONrsXZeZO82XpB4tdns3LbgGRWKEkajTgEnml\nvZNvck2NMSwb/5PttbFe0ei4CyMluPV4MamJPQ9Qse+BFR67OWR63uZY/4T8z6X4\nxpUmZnLcUFfgrRlUr+AtgvEy8HxGPDquxC7x6deC6RcEFEIM3/UqCOEZGMJ1x1Ky\n31LLKQKBgGCKwVgQ8+4JyHZFkie3YdHhxJDokgY+Opb0HNnoBY/lZ54UMCCJQPS2\n0XPSu651j/3adr3RQneU04gF6U2/D5JzFEV0kUsqZ4Zy2EEU0LU4ibus0gyomSpK\niWhU4QrC/M4ELxYZinlNu3ThPWNQ/PMNteVWfdgOcV7uUWl0ViFp\n-----END RSA PRIVATE KEY-----\n","publicKey":"-----BEGIN RSA PUBLIC KEY-----\nMIIBCgKCAQEApBmF8U+or+E0mgUMH3LE4uRIWzeV9rhYnvSMm9OpOsxwJiss5mEA\n/NtPHvQlq2UwrqXX89Wvu94K9EzZ4VyWYQGdxaiPpt17vRqUfsHUnXkY0pvCC9zt\n/aNlJtdt2xm+7PTC0YQd4+E1FX3aaoUPJL8MXzNlpJzaUtuwLZe1iBmFfatZFHpt\nEgc4nlf6TNLTzj3Yw1/7zIGVS8Vi7VquHc0Xo8dRiL2RxCGzLWnwL6GlrxY1tMhs\nUg467XeoiwegFCpcIhAhPFREKoTnCEksL/N0rpXl7m6CAy5uqBGs5mMXnXlqefr5\n8l0j2dU6zc60LCHH9TJC+roXsKJhy9sx/QIDAQAB\n-----END RSA PUBLIC KEY-----\n","publicKeyUri":"http://localhost:8080/users/the_mighty_zork#main-key"}
{"type":"block","id":"01FEXXET6XXMF7G2V3ASZP3YQW","createdAt":"2021-09-08T09:00:53.965362Z","uri":"http://localhost:8080/users/1happyturtle/blocks/01FEXXET6XXMF7G2V3ASZP3YQW","accountId":"01F8MH5NBDF2MV7CTC4Q5128HF","targetAccountId":"01F8MH5ZK5VRH73AKHQM6Y9VNX"}
{"type":"account","id":"01F8MH5ZK5VRH73AKHQM6Y9VNX","createdAt":"2021-08-31T12:00:53.985646Z","username":"foss_satan","domain":"fossbros-anonymous.io","locked":true,"language":"en","uri":"http://fossbros-anonymous.io/users/foss_satan","url":"http://fossbros-anonymous.io/@foss_satan","inboxURI":"http://fossbros-anonymous.io/users/foss_satan/inbox","outboxURI":"http://fossbros-anonymous.io/users/foss_satan/outbox","followingUri":"http://fossbros-anonymous.io/users/foss_satan/following","followersUri":"http://fossbros-anonymous.io/users/foss_satan/followers","featuredCollectionUri":"http://fossbros-anonymous.io/users/foss_satan/collections/featured","actorType":"Person","publicKey":"-----BEGIN RSA PUBLIC KEY-----\nMIIBCgKCAQEA2OyVgkaIL9VohXKYTh319j4OouHRX/8QC7piXj71k7q5RDzEyvis\nVZBc5/C1/crCpxt895i0Ai2CiXQx+dISV7s/JBhAGl8s7TQ8jLlMuptrI0+sdkBC\nlu8pU0qQmoeXVnlquOzNmqGufUxIDtLXLZDN17qf/7vWA23q4d0tG5KQhGGGKiVM\n61Ufvr9MmgPBSpyUvYMAulFlz1264L49aGWeVgOz3qUQzqtxjrP0kaIbeyt56miP\nKr5AqkRgSsXci+FAo6suxR5gzo9NgleNkbZWF9MQyKlawukPwZUDSh396vtNQMee\n/4mto7mAXw8iio0IacrYO3F7iyewXnmI/QIDAQAB\n-----END RSA PUBLIC KEY-----\n","publicKeyUri":"http://fossbros-anonymous.io/users/foss_satan/main-key"}
{"type":"follow","id":"01F8PYDCE8XE23GRE5DPZJDZDP","createdAt":"2021-09-08T09:00:54.749465Z","uri":"http://localhost:8080/users/the_mighty_zork/follow/01F8PYDCE8XE23GRE5DPZJDZDP","accountId":"01F8MH1H7YV1Z7D2C8K2730QBF","targetAccountId":"01F8MH5NBDF2MV7CTC4Q5128HF"}
{"type":"follow","id":"01F8PY8RHWRQZV038T4E8T9YK8","createdAt":"2021-09-06T12:00:54.749459Z","uri":"http://localhost:8080/users/the_mighty_zork/follow/01F8PY8RHWRQZV038T4E8T9YK8","accountId":"01F8MH1H7YV1Z7D2C8K2730QBF","targetAccountId":"01F8MH17FWEB39HZJ76B6VXSKF"}
{"type":"domainBlock","id":"01FF22EQM7X8E3RX1XGPN7S87D","createdAt":"2021-09-08T10:00:53.968971Z","domain":"replyguys.com","createdByAccountID":"01F8MH17FWEB39HZJ76B6VXSKF","privateComment":"i blocked this domain because they keep replying with pushy + unwarranted linux advice","publicComment":"reply-guying to tech posts","obfuscate":false}
{"type":"user","id":"01F8MGYG9E893WRHW0TAEXR8GJ","createdAt":"2021-09-08T10:00:53.97247Z","accountID":"01F8MH0BBE4FHXPH513MBVFHB0","encryptedPassword":"$2y$10$ggWz5QWwnx6kzb9g0tnIJurFtE0dhr5Zfeaqs9iFuUIXzafQlJVZS","locale":"en","lastEmailedAt":"0001-01-01T00:00:00Z","confirmationToken":"a5a280bd-34be-44a3-8330-a57eaf61b8dd","confirmationTokenSentAt":"2021-09-08T10:00:53.972472Z","unconfirmedEmail":"weed_lord420@example.org","moderator":false,"admin":false,"disabled":false,"approved":false}
{"type":"user","id":"01F8MGWYWKVKS3VS8DV1AMYPGE","createdAt":"2021-09-05T10:00:53.972475Z","email":"admin@example.org","accountID":"01F8MH17FWEB39HZJ76B6VXSKF","encryptedPassword":"$2y$10$ggWz5QWwnx6kzb9g0tnIJurFtE0dhr5Zfeaqs9iFuUIXzafQlJVZS","currentSignInAt":"2021-09-08T09:50:53.972477Z","lastSignInAt":"2021-09-08T08:00:53.972477Z","chosenLanguages":["en"],"locale":"en","lastEmailedAt":"2021-09-08T09:30:53.972478Z","confirmedAt":"2021-09-05T10:00:53.972478Z","moderator":true,"admin":true,"disabled":false,"approved":true}
{"type":"user","id":"01F8MGVGPHQ2D3P3X0454H54Z5","createdAt":"2021-09-06T22:00:53.97248Z","email":"zork@example.org","accountID":"01F8MH1H7YV1Z7D2C8K2730QBF","encryptedPassword":"$2y$10$ggWz5QWwnx6kzb9g0tnIJurFtE0dhr5Zfeaqs9iFuUIXzafQlJVZS","currentSignInAt":"2021-09-08T09:30:53.972481Z","lastSignInAt":"2021-09-08T08:00:53.972481Z","chosenLanguages":["en"],"locale":"en","lastEmailedAt":"2021-09-08T09:05:53.972482Z","confirmationTokenSentAt":"2021-09-06T22:00:53.972483Z","confirmedAt":"2021-09-07T00:00:53.972482Z","moderator":false,"admin":false,"disabled":false,"approved":true}
{"type":"user","id":"01F8MH1VYJAE00TVVGMM5JNJ8X","createdAt":"2021-09-06T22:00:53.972485Z","email":"tortle.dude@example.org","accountID":"01F8MH5NBDF2MV7CTC4Q5128HF","encryptedPassword":"$2y$10$ggWz5QWwnx6kzb9g0tnIJurFtE0dhr5Zfeaqs9iFuUIXzafQlJVZS","currentSignInAt":"2021-09-08T09:30:53.972485Z","lastSignInAt":"2021-09-08T08:00:53.972486Z","chosenLanguages":["en"],"locale":"en","lastEmailedAt":"2021-09-08T09:05:53.972487Z","confirmationTokenSentAt":"2021-09-06T22:00:53.972487Z","confirmedAt":"2021-09-07T00:00:53.972487Z","moderator":false,"admin":false,"disabled":false,"approved":true}
{"type":"instance","id":"01BZDDRPAB8J645ABY31HHF68Y","createdAt":"2021-09-08T10:00:54.763912Z","domain":"localhost:8080","title":"localhost:8080","uri":"http://localhost:8080","reputation":0}
```
有关如何使用命令导入/导出的信息,参见[此处](cli.md#gotosocial-admin-export)。尽管 `export` 命令不会备份媒体,但可以使用 [`media list-local`](cli.md#gotosocial-admin-media-list-local) 命令来确定应该保留哪些媒体文件。
优势:
* 数据库无关:导出的数据采用了一种通用格式,可以使用 `import` 命令将这些数据插入 Postgres 或 SQLite 数据库中。
* 轻量级:仅保留必要的内容,因此备份文件可以非常小(甚至小到可以通过电子邮件发送)。备份/导入命令只需几秒钟即可运行。
* 易读格式:输出是 JSON 格式。
劣势:
* 贴文/收藏等的丢失:除非你愿意丢失某些内容,否则不要这样进行备份/恢复。
* 需要使用 GoToSocial CLI 工具将数据插回数据库,除非你为此编写自定义工具。
### 备份你的数据库文件和媒体
无论你是使用 PostgreSQL 还是 SQLite 作为 GoToSocial 数据库,都可以直接使用类似 [rclone](https://rclone.org/) 的工具来备份数据库文件,或者遵循 [Postgres 数据备份的最佳实践](https://www.postgresql.org/docs/15/backup.html) 或 [SQLite 数据备份的最佳实践](https://sqlite.org/backup.html)。
使用 GoToSocial CLI 的媒体 [`list-attachments`](cli.md#gotosocial-admin-media-list-attachments) 和 [`list-emojis`](cli.md#gotosocial-admin-media-list-emojis) 命令来获取需要保护的媒体文件列表。
优势:
* 备份相对便携 - 可以将数据从一台机器迁移到另一台。
* 有大量文档和工具可供参考。
* 可以根据需要有多种备份方式。
劣势:
* 初次设置可能有点复杂。
* 需要确定备份的存放位置。
* 从备份中恢复可能比较麻烦。
* 除非同时备份媒体,否则数据库中的媒体附件引用将会中断。
### 备份软件
备份软件专为帮助你创建、管理和恢复备份而设计。它通常知道如何安全地备份数据库,因此你不用成为 PostgreSQL 或 SQLite 备份专家。它也可以从文件系统中进行备份。
尽管与直接备份数据库文件的方法大致具有相同的优点和缺点,这种方法还有一些额外的好处:
* 备份高度便携,可以从零开始恢复数据库。
* 备份按照常规计划进行,并有可配置的保留策略。
* 备份是增量和压缩的,以节省存储和带宽。
* 备份是加密的。
* 内置工具可以列出快照并从中恢复。
!!! tip
[Rsync.net](https://rsync.net/)、[BorgBase](https://www.borgbase.com/) 和 [Hetzner Storage](https://www.hetzner.com/storage/storage-box) 提供了可用于备份的经济实惠的存储。Rsync.net 有一种专门为 Borg 设计的备份产品,比他们的常规存储产品便宜得多。如果你只想使用 Borg 管理的备份,请在[此处注册](https://www.rsync.net/products/borg.html)。
#### Borgmatic
[Borgmatic](https://torsion.org/borgmatic/) 是一个帮助使用 [Borg](https://www.borgbackup.org/) 进行备份的工具。它通过使用 YAML 的声明性配置文件驱动。BorgBase、Rsync.net 和 Hetzner 都支持 Borg。
!!! warning
初始化 Borg 仓库时确保使用强加密密钥进行设置并将密钥安全地存放在某处。否则将无法在将来解密备份。ArchWiki 上关于 Borgmatic 的条目解释了如何安全地将你的加密密钥传递给 Borgmatic而不在配置文件中以明文形式存储它。
如何使用 Borgmatic 备份数据库有其[单独的文档页面](https://torsion.org/borgmatic/docs/how-to/backup-your-databases/),你应当在备份前查看一下。对于使用 SQLite 的 GoToSocialBorgmatic 的简单 `config.yaml` 如下:
```yaml
location:
repositories:
- path: ssh://<在你的提供商控制面板中查找ssh地址>
label: <可以是任意内容但通常是提供商名称例如 borgbase>
patterns_from:
- /etc/borgmatic/gotosocial_patterns
storage:
compression: auto,zstd
archive_name_format: '{hostname}-{now:%Y-%m-%d-%H%M%S}'
retries: 5
retry_wait: 30
retention:
keep_daily: 7
keep_weekly: 6
keep_monthly: 12
hooks:
before_backup:
- /usr/bin/systemctl stop gotosocial
after_backup:
- /usr/bin/systemctl start gotosocial
sqlite_databases:
- name: gotosocial
path: /path/to/sqlite.db
```
对于 PostgreSQL你应该使用 `postgresql_databases`
`patterns_from` 中提到的文件可以通过转换 GoToSocial CLI 媒体命令 [`list-attachments`](cli.md#gotosocial-admin-media-list-attachments) 和 [`list-emojis`](cli.md#gotosocial-admin-media-list-emojis) 的输出来创建。要生成正确的模式,您可以使用 [`media-to-borg-patterns.py`](https://github.com/superseriousbusiness/gotosocial/tree/main/example/borgmatic/media-to-borg-patterns.py) 脚本。有关 Borg 模式如何工作的详情,参见 [他们的文档](https://man.archlinux.org/man/borg-patterns.1)。
您需要将该文件放在您的 GoToSocial 实例上,并确保该文件是可执行的。它需要 Python 3安装 Borg 和 Borgmatic 后您应该已经具备。它仅依赖于 Python 标准库。
!!! note
为了确保可靠运行,您应确保 GoToSocial 配置中的 [storage-local-base-path](../configuration/storage.md) 使用的是绝对路径。否则您将需要自己调整路径。
```sh
$ gotosocial admin media list-attachments --local-only | \
/path/to/media-to-borg-patterns.py \
<storage-local-base-path>
```
这将在控制台上输出一个类似于以下内容的模式集:
```
R <storage-local-base-path>
+ pp:<storage-local-base-path>/<account ID>
- <storage-local-base-path>/*
```
!!! tip
你可以通过向 `media-to-borg-patterns.py` 传递 `--help` 来查看帮助。通过将文件位置作为脚本的最后一个参数,也可以将输出直接写入文件。
给定这组模式Borg 将从 `<storage-local-base-path>` 开始寻找文件。任何匹配路径前缀 `pp:` 的都会被包括进去。其他的则会匹配最后一个模式,从存档中排除。
在单用户实例中,你可以运行此命令一次,并直接在 Borgmatic 配置中内联模式 [使用 `patterns` 键](https://torsion.org/borgmatic/docs/reference/configuration/)。在多用户实例中,你应该在用户注册后运行此命令。或者,每次备份前都可以运行它。
如果你将 Borgmatic 作为 systemd 服务运行,可以为 `borgmatic.service` [创建一个 drop-in](https://wiki.archlinux.org/title/systemd#Drop-in_files),在备份开始前运行模式生成:
```ini
[Service]
ExecStartPre=/path/to/gotosocial admin media list-attachments --local-only | /path/to/media-to-borg-patterns.py <storage-local-base-path> /etc/borgmatic/gotosocial_patterns
```
建议查看的文档:
* Borgmatic [配置参考](https://torsion.org/borgmatic/docs/reference/configuration/)
* ArchWiki 关于 [Borgmatic 的条目](https://wiki.archlinux.org/title/Borgmatic)
* ArchWiki 关于 [Borg 的条目](https://wiki.archlinux.org/title/Borg_backup)
* BorgBase [文档](https://docs.borgbase.com/)
* Hetzner 社区指南关于 [设置 Borgmatic](https://community.hetzner.com/tutorials/install-and-configure-borgmatic)

View file

@ -1,465 +0,0 @@
# GtS CLI 工具
GoToSocial 编译为二进制可执行文件。
使用此二进制文件的标准方法是通过运行 `gotosocial server start` 命令启动服务器。
不过,此二进制文件也可以作为管理工具和调试工具使用。
以下是 `gotosocial --help` 的完整输出,不包括全局配置选项的大列表。
```text
GoToSocial - 一个联邦制社交媒体服务器
帮助文档参见https://docs.gotosocial.org。
代码仓库https://github.com/superseriousbusiness/gotosocial
用法:
gotosocial [command]
可用命令:
admin gotosocial 管理相关任务
debug gotosocial 调试相关任务
help 获取任何命令的帮助
server gotosocial 服务器相关任务
```
`可用命令` 下,可以看到标准的 `server` 命令。但是也有处理管理和调试的命令,这些将在本文档中进行解释。
!!! Info "将全局配置传递给 CLI"
对于所有这些命令,你仍然需要正确设置全局选项,以便 CLI 工具知道如何连接到你的数据库,以及使用哪个数据库、哪个主机和账户域等。
你可以使用环境变量设置这些选项,通过 CLI 标志传递它们(例如,`gotosocial [commands] --host example.org`),或者只需将 CLI 工具指向你的配置文件(例如,`gotosocial --config-path ./config.yaml [commands]`)。
!!! Info
运行 CLI 命令时,你将会看到如下输出:
```text
time=XXXX level=info msg=connected to SQLITE database
time=XXXX level=info msg=there are no new migrations to run func=doMigration
time=XXXX level=info msg=closing db connection
```
这是正常的,表示命令已按预期运行。
!!! Warning "运行管理命令后重启 GtS"
由于 GoToSocial 的内部缓存机制,你可能需要在运行某些命令后重启 GoToSocial以使命令的效果“生效”。我们仍在寻找一种无需重启的方法。在此期间需要在运行命令后重启的命令将在下文中突出显示。
## gotosocial admin
包含 `account`、`export`、`import` 和 `media` 子命令。
### gotosocial admin account create
此命令可用于在你的实例上创建新账户。
`gotosocial admin account create --help`:
```text
创建一个新的本站账户
用法:
gotosocial admin account create [flags]
标志:
--email string 该账户的电子邮件地址
-h, --help 获取创建命令的帮助
--password string 为该账户设置的密码
--username string 要创建/删除等的用户名
```
示例:
```bash
gotosocial admin account create \
--username some_username \
--email someuser@example.org \
--password 'somelongandcomplicatedpassword' \
--config-path config.yaml
```
### gotosocial admin account confirm
此命令可用于确认你的实例上的用户+账户,允许他们登录并使用账户。
!!! Info
如果账户是使用 `admin account create` 创建的,则不必在账户上运行 `confirm`,它将已被确认。
`gotosocial admin account confirm --help`:
```text
手动确认现有本站账户,从而跳过电子邮件确认
用法:
gotosocial admin account confirm [flags]
标志:
-h, --help 获取确认命令的帮助
--username string 要创建/删除等的用户名
```
示例:
```bash
gotosocial admin account confirm --username some_username --config-path config.yaml
```
### gotosocial admin account promote
此命令可用于将用户提升为管理员。
!!! Warning "需要重启服务器"
为使更改生效,此命令需要在运行命令后重启 GoToSocial。
`gotosocial admin account promote --help`:
```text
将本站账户提升为管理员
用法:
gotosocial admin account promote [flags]
标志:
-h, --help 获取提升命令的帮助
--username string 要创建/删除等的用户名
```
示例:
```bash
gotosocial admin account promote --username some_username --config-path config.yaml
```
### gotosocial admin account demote
此命令可用于将用户从管理员降级为普通用户。
!!! Warning "需要重启服务器"
为使更改生效,此命令需要在运行命令后重启 GoToSocial。
`gotosocial admin account demote --help`:
```text
将本站账户从管理员降级为普通用户
用法:
gotosocial admin account demote [flags]
标志:
-h, --help 获取降级命令的帮助
--username string 要创建/删除等的用户名
```
示例:
```bash
gotosocial admin account demote --username some_username --config-path config.yaml
```
### gotosocial admin account disable
此命令可用于在你的实例上禁用一个账户:禁止其登录或执行任何操作,但不删除数据。
!!! Warning "需要重启服务器"
为使更改生效,此命令需要在运行命令后重启 GoToSocial。
`gotosocial admin account disable --help`:
```text
将本站账户的 `disabled` 设置为 true以防止其登录或发布等但不删除任何内容
用法:
gotosocial admin account disable [flags]
标志:
-h, --help 获取禁用命令的帮助
--username string 要创建/删除等的用户名
```
示例:
```bash
gotosocial admin account disable --username some_username --config-path config.yaml
```
### gotosocial admin account enable
此命令可用于重新启用你实例上的账户,撤销之前的 `disable` 命令。
!!! Warning "需要重启服务器"
为使更改生效,此命令需要在运行命令后重启 GoToSocial。
`gotosocial admin account enable --help`:
```text
通过将本站账户的 `disabled` 设置为 false撤销之前的禁用命令
用法:
gotosocial admin account enable [flags]
标志:
-h, --help 获取启用命令的帮助
--username string 要创建/删除等的用户名
```
示例:
```bash
gotosocial admin account enable --username some_username --config-path config.yaml
```
### gotosocial admin account password
此命令可用于为指定的本站账户设置新密码。
!!! Warning "需要重启服务器"
为使更改生效,此命令需要在运行命令后重启 GoToSocial。
`gotosocial admin account password --help`:
```text
为指定的本站账户设置新密码
用法:
gotosocial admin account password [flags]
标志:
-h, --help 获取密码命令的帮助
--password string 为该账户设置的密码
--username string 要创建/删除等的用户名
```
示例:
```bash
gotosocial admin account password --username some_username --password some_really_good_password --config-path config.yaml
```
### gotosocial admin export
此命令可用于将你的 GoToSocial 实例中的数据导出到文件,以便备份/存储。
文件格式将是一系列以换行符分隔的 JSON 对象。
`gotosocial admin export --help`:
```text
将数据从数据库导出到指定路径的文件
用法:
gotosocial admin export [flags]
标志:
-h, --help 获取导出命令的帮助
--path string 导入/导出文件的路径
```
Example:
```bash
gotosocial admin export --path example.json --config-path config.yaml
```
`example.json`:
```json
{"type":"account","id":"01F8MH5NBDF2MV7CTC4Q5128HF","createdAt":"2021-08-31T12:00:53.985645Z","username":"1happyturtle","locked":true,"language":"en","uri":"http://localhost:8080/users/1happyturtle","url":"http://localhost:8080/@1happyturtle","inboxURI":"http://localhost:8080/users/1happyturtle/inbox","outboxURI":"http://localhost:8080/users/1happyturtle/outbox","followingUri":"http://localhost:8080/users/1happyturtle/following","followersUri":"http://localhost:8080/users/1happyturtle/followers","featuredCollectionUri":"http://localhost:8080/users/1happyturtle/collections/featured","actorType":"Person","privateKey":"-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEAzLP7oyyR+BU9ejn0CN9K+WpX3L37pxUcCgZAGH5lf3cGPZjz\nausfsFME94OjVyzw3K5M2beDkZ4E+Fak46NLtakLB1yovy9jKtj4Y4txHoMvRJLz\neUPxdfeXtpx2d3FDj++Uq4DEE0BhbePXhTGJWaNdC9MQmWKghJnCS5mrnFkdpEFx\njUz9l0UHl2Z4wppxPdpt7FyevcdfKqzGsAA3BxTM0dg47ZJWjtcvfCiSYpAKFNJY\nfKhKn9T3ezZgrLsF+o0IpD23KxWe1X4d5lgJRU9T4FmLmbvyJKUnfgYXbSEvLUcq\n79WbhgRcWwxWubjmWXgPGwzULVhhpYlwd2Cv3wIDAQABAoIBAGF+MxHjD15VV2NY\nKKb1GjMx98i1Xx6TijgoA+zmfha4LGu35e79Lql+0LXFp0zEpa6lAQsMQQhgd0OD\nmKKmSk+pxAvskJ4FxrhIf/yBFA4RMrj5OCaAOocRtdsOJ8n5UtFBrNAF0tzMY9q/\nkgzoq97aVF1mV9iFxaeBx6zT8ozSdqBq1PK/3w1dVg89S5tfKYc7Q0lQ00SfsTnd\niTDClKyqurebo9Pt6M7gXavgg3tvBlmwwr6XHs34Leng3oiN9mW8DVzaBMPzn+rE\nxF2eqs3v9vVpj8es88OwCh5P+ff8vJYvhu7Fcr/bJ8BItBQwfb8QBDATg/MXU2BI\n2ssW6AECgYEA4wmIyYGeu9+hzDa/J3Vh8GnlVNUCohHcChQdOsWsFXUgpVlUIHrX\neKHn42vD4Rzy52/YzJts4NkZTM9sL+kEXIEcpMG/S9xIIud7U0m/hMSAlmnJK/9j\niEXws3o4jo0E77jnRcBdIjpG4K5Eekm0DSR3SFhtZfEdN2DWPvu7K98CgYEA5tER\n/qJwFMc51AobMU87ZjXON7hI2U1WY/pVF62jSl0IcSsnj2riEKWLrs+GRG+HUg+U\naFSqAHcxaVHA0h0AYR8RopAhDdVKh0kvB8biLo+IEzNjPv2vyn0yRN5YSfXdGzyJ\nUjVU6kWdQOwmzy86nHgFaqEx7eofHIaGZzJK/AECgYEAu2VNQHX63TuzQuoVUa5z\nzoq5vhGsALYZF0CO98ndRkDNV22qIL0ESQ/qZS64GYFZhWouWoQXlGfdmCbFN65v\n6SKwz9UT3rvN1vGWO6Ltr9q6AG0EnYpJT1vbV2kUcaU4Y94NFue2d9/+TMnKv91B\n/m8Q/efvNGuWH/WQIaCKV6UCgYBz89WhYMMDfS4M2mLcu5vwddk53qciGxrqMMjs\nkzsz0Va7W12NS7lzeWaZlAE0gf6t98urOdUJVNeKvBoss4sMP0phqxwf0eWV3ur0\ncjIQB+TpGGikLVdRVuGY/UXHKe9AjoHBva8B3aTpB3lbnbNJBXZbIc1uYq3sa5w7\nXWWUAQKBgH3yW73RRpQNcc9hTUssomUsnQQgHxpfWx5tNxqod36Ytd9EKBh3NqUZ\nvPcH6gdh7mcnNaVNTtQOHLHsbPfBK/pqvb3MAsdlokJcQz8MQJ9SGBBPY6PaGw8z\nq/ambaQykER6dwlXTIlU20uXY0bttOL/iYjKmgo3vA66qfzS6nsg\n-----END RSA PRIVATE KEY-----\n","publicKey":"-----BEGIN RSA PUBLIC KEY-----\nMIIBCgKCAQEAzLP7oyyR+BU9ejn0CN9K+WpX3L37pxUcCgZAGH5lf3cGPZjzausf\nsFME94OjVyzw3K5M2beDkZ4E+Fak46NLtakLB1yovy9jKtj4Y4txHoMvRJLzeUPx\ndfeXtpx2d3FDj++Uq4DEE0BhbePXhTGJWaNdC9MQmWKghJnCS5mrnFkdpEFxjUz9\nl0UHl2Z4wppxPdpt7FyevcdfKqzGsAA3BxTM0dg47ZJWjtcvfCiSYpAKFNJYfKhK\nn9T3ezZgrLsF+o0IpD23KxWe1X4d5lgJRU9T4FmLmbvyJKUnfgYXbSEvLUcq79Wb\nhgRcWwxWubjmWXgPGwzULVhhpYlwd2Cv3wIDAQAB\n-----END RSA PUBLIC KEY-----\n","publicKeyUri":"http://localhost:8080/users/1happyturtle#main-key"}
{"type":"account","id":"01F8MH0BBE4FHXPH513MBVFHB0","createdAt":"2021-09-08T10:00:53.985634Z","username":"weed_lord420","locked":true,"language":"en","uri":"http://localhost:8080/users/weed_lord420","url":"http://localhost:8080/@weed_lord420","inboxURI":"http://localhost:8080/users/weed_lord420/inbox","outboxURI":"http://localhost:8080/users/weed_lord420/outbox","followingUri":"http://localhost:8080/users/weed_lord420/following","followersUri":"http://localhost:8080/users/weed_lord420/followers","featuredCollectionUri":"http://localhost:8080/users/weed_lord420/collections/featured","actorType":"Person","privateKey":"-----BEGIN RSA PRIVATE KEY-----\nMIIEogIBAAKCAQEAzsCcTHzwIgpWKVvut0Q/t1bFwnbj9hO6Ic6k0KXCXbf6qi0b\nMIyLRZr8DS61mD+SPSO2QKEL647xxyW2D8YGtwN6Cc6MpWETsWJkNtS8t7tDL//P\nceYpo5LiqKgn0TXj0Pq8Lvb7rqpH8QJ2EVm14SK+elhKZW/Bi5ZOEwfL8pw6EHI4\nus6VxCNQ099dksu++kbdD7zxqEKnk/4zOttYt0whlVrxzkibTjlKdlSlTYpIstU+\nfNyYVE0xWvrn+yF7jVlEwZYOFGfZbpELadrdOr2k1hvAk7upkrpKmLqYfwqD/xPc\nqwtx0iS6AEnmkSiTcAvju5vLkoLFRU7Of4AZ2wIDAQABAoIBAEAA4GHNS4k+Ke4j\nx4J0XkUjV5UbuPY0pSpSDjOJHOJmUfLcg85Ds9mYYO6zxwOaqmrC42ieclI5rh84\nTWQUqX9+VAk1J9UKeE4xZ1SSBtnZ3rK9PjrERZ+dmQ0dATaCuEO5Wwgu7Trk++Bg\nIqy8WNGZL94v9tfwALp1jTXW9AvmQoNdCFBP62vcmYW4YLjnggxLCFTA8YKfdePa\nTuxxY6uLkeBbxzWpbRU2+bmlxd5OnCkiRSMHIX+6JdtCu2JdWpUTCnWrFi2n1TZz\nZQx9z5rvowK1O785jGMFum5vBWpjIU8sJcXmPjGMU25zzmrhzfmkJsTXER3CXoUo\nSqSPqgECgYEA78OR7bY5KKQQ7Lyz6dru4Fct5P/OXTQoOg5aS7TKb95LVWj+TANn\n5djwIbLmAUV30z0Id9VgiZOL0Hny8+3VV9eU088Z408pAy5WQrL3dB8tZLUJSq5c\n5k6X15/VjWOOZKppDxShzoV3mcohrnwVwkv4fhPFQQOJJBYz6xurWs0CgYEA3MDE\nsDMd9ahzO0dl62ynojkkA8ZTcn2UdyvLpGj9UxT5j9vWF3CfqitXgcpNiVSIbxqQ\nbo/pBch7c/2Xakv5zkdcrJj5/6gyr+m1/tK2o7+CjDaSE4SYwufXx+qkl03Zpyzt\nKdOi7Hz/b2tdjump7ECEDE45mG2ea8oSnPgXl0cCgYBkGGFzu/9g2B24t47ksmHH\nhp3CXIjqoDurARLxSCi7SzJoFc0ULtfRPSAC8YzUOwwrQ++lF4+V3+MexcqHy2Kl\nqXqYcn18SC/3BAE/Fzf3Yoyw3mNiqihefbEmc7PTsxxfKkVx5ksmzNGBgsFM9sCe\nvNigyeAvpCo8xogmPwbqgQKBgE34mIBTzcUzFmBdu5YH7r3RyPK8XkUWLhZZlbgg\njTmHMw6o61mkIgENBf+F4RUckoQLsfAbTIcKZPB3JcAZzcYaVpVwAv1V/3E671lu\nO6xivE2iCL50GzDcis7GBhSbHsF5kNsxMV6uV9qW5ZjQ13/m2b0u9BDuxwHzgdeH\nmW2JAoGAIUOYniuEwdygxWVnYatpr3NPjT3BOKoV5i9zkeJRu1hFpwQM6vQ4Ds5p\nGC5vbMKAv9Cwuw62e2HvqTun3+U2Y5Uived3XCpgM/50BFrFHCfuqXEnu1bEzk5z\n9mIhp8uXPxzC5N7tRQfb3/eU1IUcb6T6ksbr2P81z0j03J55erg=\n-----END RSA PRIVATE KEY-----\n","publicKey":"-----BEGIN RSA PUBLIC KEY-----\nMIIBCgKCAQEAzsCcTHzwIgpWKVvut0Q/t1bFwnbj9hO6Ic6k0KXCXbf6qi0bMIyL\nRZr8DS61mD+SPSO2QKEL647xxyW2D8YGtwN6Cc6MpWETsWJkNtS8t7tDL//PceYp\no5LiqKgn0TXj0Pq8Lvb7rqpH8QJ2EVm14SK+elhKZW/Bi5ZOEwfL8pw6EHI4us6V\nxCNQ099dksu++kbdD7zxqEKnk/4zOttYt0whlVrxzkibTjlKdlSlTYpIstU+fNyY\nVE0xWvrn+yF7jVlEwZYOFGfZbpELadrdOr2k1hvAk7upkrpKmLqYfwqD/xPcqwtx\n0iS6AEnmkSiTcAvju5vLkoLFRU7Of4AZ2wIDAQAB\n-----END RSA PUBLIC KEY-----\n","publicKeyUri":"http://localhost:8080/users/weed_lord420#main-key"}
{"type":"account","id":"01F8MH17FWEB39HZJ76B6VXSKF","createdAt":"2021-09-05T10:00:53.985641Z","username":"admin","locked":true,"language":"en","uri":"http://localhost:8080/users/admin","url":"http://localhost:8080/@admin","inboxURI":"http://localhost:8080/users/admin/inbox","outboxURI":"http://localhost:8080/users/admin/outbox","followingUri":"http://localhost:8080/users/admin/following","followersUri":"http://localhost:8080/users/admin/followers","featuredCollectionUri":"http://localhost:8080/users/admin/collections/featured","actorType":"Person","privateKey":"-----BEGIN RSA PRIVATE KEY-----\nMIIEogIBAAKCAQEAxr2e1pqfLwwUCwHUdx56Mxnq5Kzc2EBwqN6jIPjiqVaG5eVq\nhujDhdqwMq0hnpBSPzLnvjiOtEh7Bwhx0MjuC/GRPTM9oNWPYD4PcjX5ofrubyLR\nBI97qD0SbyzUWzeyBi6R5tpW8LK1MJXNbnYlz5WouEiC4mY77ulri0EN2hCq80wg\nfvtEjEvELcKBqIytKH3rutIzfAyqXD7LSQ8UDoNh9GHyIfq8Zj32gWVk2MiPI3+G\n8kQJDmD8CKEasnrGVdSJBQUg3xDAtOibPXLP+07AIsKYMon35hVNvQNQPS7ru/Bk\nRhhGp2R44zqj6L9mxYbSrhFAaKDedu8oVe1aLQIDAQABAoIBAGK0aIADOU4ffJDe\n7sveiih5Fc1PATwx/QIR2QkWM1SREdx6LYclcX44V8xDanAbE44p1SkHY/CsEtYy\nXnyoXnn2FwFDQrdveY7+I6PApOPLAcKWkyLltC+hbVdj92/6YGNrm7EA/a77wruH\nmwjiivLnTG2CLecNiXSl33DA9YU4Yz+2Tza3IpTdjt8c/dz/BKKaxaWV+i9ew5VR\nioo5v51B+J8PrneCM/p8LGiLV148Njr0JqV6eFy1JuzItYMYdc3Fp+YnMzsuMZEA\n1akMcoln/ucVJyOFnCn6jx47nIoPZLl1KxX3aRDRfvrejm6W4yAkkTmR5voSRqax\njPL3rI0CgYEA9Acu4TO8xJ3uGaUad0N9JTYQVSmtAaE/g+df9LGMSzoj8X95S4xE\nQsGPqNGDm2VWADJjK4P05twZ+LfsfSKQ86wbp4/gbgnXpqB1P5Lty/B7KxiTnNwt\nwb1WGWTCukxfUSL3PRyf8uylkrg72RxKiBx4zKO3WVSLWOZWrFtn0qMCgYEA0H2p\nJs9Nv20ADOOX5tQ7+ruS6/B/Fhyj5fhflSYCAtOW7aME7+zQKJyqSQZ4b2Aub3Tp\nGIaUbRIGzjHyuTultFFWvjU3H5aI/0g1G9WKaBhNkyTIYVmMKtYyhXNvouWing8x\noraWx8TTBP8Cdnnk+QgdR2fpug8cghKupp5wvO8CgYA1JFtRL7MsHjh73TimQExA\njkWARlMmx7bNQtXis8eZmk+5h8kiaqly4DQoz3eZn7fa0x5Fm7b5j3UYdPVLSvvG\nFPTwyKRXUk1kPA1MivK+NuCbwf5jao+MYW8emJLPf1JCmRq+dD1g6aglC3n9Dewt\nOAYWipCjI4Y1FfRKFJ3HgQKBgEAb47+DTyzln3ZXJYZdDHR06SCTuwBZnixAy2NZ\nZJTp6yb3UbVU5E0Yn2QFEVNuB9lN4b8g4tMHEACnazN6G+HugPXL9z9HUqjs0yfT\n6dNIZdIxJUyJ9IfXhYFzlYhJhE+F7IVUD9kttJV8tI0pvja1QAuM8Fm9+84jYIDr\nh08RAoGAMYbjKHbtejcHBwt1kIcSss0cDmlZbBleJo8tdmdg4ndf5GE9N4/EL7tq\nm2zYSfr7OVdnOwRhoO+xF/6d1L7+TR1wz+k2fuMsI71aM5Ocp1nYTutjIkBTcldZ\nZzvjOgZWng5icuRLQQiDSKG5uqazqL/xGXkijb4kp4WW6myWY3c=\n-----END RSA PRIVATE KEY-----\n","publicKey":"-----BEGIN RSA PUBLIC KEY-----\nMIIBCgKCAQEAxr2e1pqfLwwUCwHUdx56Mxnq5Kzc2EBwqN6jIPjiqVaG5eVqhujD\nhdqwMq0hnpBSPzLnvjiOtEh7Bwhx0MjuC/GRPTM9oNWPYD4PcjX5ofrubyLRBI97\nqD0SbyzUWzeyBi6R5tpW8LK1MJXNbnYlz5WouEiC4mY77ulri0EN2hCq80wgfvtE\njEvELcKBqIytKH3rutIzfAyqXD7LSQ8UDoNh9GHyIfq8Zj32gWVk2MiPI3+G8kQJ\nDmD8CKEasnrGVdSJBQUg3xDAtOibPXLP+07AIsKYMon35hVNvQNQPS7ru/BkRhhG\np2R44zqj6L9mxYbSrhFAaKDedu8oVe1aLQIDAQAB\n-----END RSA PUBLIC KEY-----\n","publicKeyUri":"http://localhost:8080/users/admin#main-key"}
{"type":"account","id":"01F8MH1H7YV1Z7D2C8K2730QBF","createdAt":"2021-09-06T10:00:53.985643Z","username":"the_mighty_zork","locked":true,"language":"en","uri":"http://localhost:8080/users/the_mighty_zork","url":"http://localhost:8080/@the_mighty_zork","inboxURI":"http://localhost:8080/users/the_mighty_zork/inbox","outboxURI":"http://localhost:8080/users/the_mighty_zork/outbox","followingUri":"http://localhost:8080/users/the_mighty_zork/following","followersUri":"http://localhost:8080/users/the_mighty_zork/followers","featuredCollectionUri":"http://localhost:8080/users/the_mighty_zork/collections/featured","actorType":"Person","privateKey":"-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEApBmF8U+or+E0mgUMH3LE4uRIWzeV9rhYnvSMm9OpOsxwJiss\n5mEA/NtPHvQlq2UwrqXX89Wvu94K9EzZ4VyWYQGdxaiPpt17vRqUfsHUnXkY0pvC\nC9zt/aNlJtdt2xm+7PTC0YQd4+E1FX3aaoUPJL8MXzNlpJzaUtuwLZe1iBmFfatZ\nFHptEgc4nlf6TNLTzj3Yw1/7zIGVS8Vi7VquHc0Xo8dRiL2RxCGzLWnwL6GlrxY1\ntMhsUg467XeoiwegFCpcIhAhPFREKoTnCEksL/N0rpXl7m6CAy5uqBGs5mMXnXlq\nefr58l0j2dU6zc60LCHH9TJC+roXsKJhy9sx/QIDAQABAoIBAFa+UypbFG1cW2Tr\nNBxPm7ngOEtXl8MicV4dIVKh0TwOo13ZxtNFBbOj7jALmPn/9HrtmbkABPQHDL1U\n/nt9aNSAeTjpwH3RaD5vFX3n0g8n2zJBOZLxxzAjNi4RBLYj5uP1AiKkdvRlsJza\nuSFDkty2zMBqN9mLPHE+RePj5Qa6tjYfIQqQzu/+YnYMlXHoC2yHNKsvz6S5FhVj\nv5zATv2JlJQH3RSmhuPOah73iQnKCLzYYEAHleawKrCg/rZ3ht37Guvabeq7MqQN\nvi9pJdAA+RMxPsboHajskePjOTYJgKQSxEAMRTMfBR40aZxklxQL0EoBd1Y3CHXh\nfMg0xWECgYEA0ORrpJ1A2WNQwKcDDeBBsaJqWF4EraoFzYrugKZrAYEeVyuGD0zq\nARUaWkZTZ1f6wQ10i1WxAuKlBEds7QsLdZzLsA4um4JlBroCZiYfPnmTtb8op1LY\nFqeYTByvAmnfWWTuOI67GX9ruLg8tEGuz38kuQVSxYs51its3tScNPUCgYEAyRst\nwRbqpOqnwoRoS6pxv0Vpc3nUcfaVYwsg/qobJkiwAdlUYeE7alvEY926VW4cvU/X\nhy3L1punAqnyLI7uuqCefXEbNxO0Cebyy4Kv2Ye1uzl0OHsJczSNdfpNqfAIKwtN\nHLCYDGCsluQhz+I/5Pd0dT+JDPPW9hKS2HG7o+kCgYBqugn1VRLo/sEnbS02TbnC\n1ESZWY/yWsgUOEObH2vUnO+vgeFAt/9nBi0sqnm6d0z6jbFZ7zI9UycUhJm2ksoM\nEUxQay6M7ZZIVYkcP6X++YbqePyAYOdey8oYOR+BkC45MkQ0SVh2so+LFTaOsnBq\nO3+7uGiN3ZBzSESbpO0acQKBgQCONrsXZeZO82XpB4tdns3LbgGRWKEkajTgEnml\nvZNvck2NMSwb/5PttbFe0ei4CyMluPV4MamJPQ9Qse+BFR67OWR63uZY/4T8z6X4\nxpUmZnLcUFfgrRlUr+AtgvEy8HxGPDquxC7x6deC6RcEFEIM3/UqCOEZGMJ1x1Ky\n31LLKQKBgGCKwVgQ8+4JyHZFkie3YdHhxJDokgY+Opb0HNnoBY/lZ54UMCCJQPS2\n0XPSu651j/3adr3RQneU04gF6U2/D5JzFEV0kUsqZ4Zy2EEU0LU4ibus0gyomSpK\niWhU4QrC/M4ELxYZinlNu3ThPWNQ/PMNteVWfdgOcV7uUWl0ViFp\n-----END RSA PRIVATE KEY-----\n","publicKey":"-----BEGIN RSA PUBLIC KEY-----\nMIIBCgKCAQEApBmF8U+or+E0mgUMH3LE4uRIWzeV9rhYnvSMm9OpOsxwJiss5mEA\n/NtPHvQlq2UwrqXX89Wvu94K9EzZ4VyWYQGdxaiPpt17vRqUfsHUnXkY0pvCC9zt\n/aNlJtdt2xm+7PTC0YQd4+E1FX3aaoUPJL8MXzNlpJzaUtuwLZe1iBmFfatZFHpt\nEgc4nlf6TNLTzj3Yw1/7zIGVS8Vi7VquHc0Xo8dRiL2RxCGzLWnwL6GlrxY1tMhs\nUg467XeoiwegFCpcIhAhPFREKoTnCEksL/N0rpXl7m6CAy5uqBGs5mMXnXlqefr5\n8l0j2dU6zc60LCHH9TJC+roXsKJhy9sx/QIDAQAB\n-----END RSA PUBLIC KEY-----\n","publicKeyUri":"http://localhost:8080/users/the_mighty_zork#main-key"}
{"type":"block","id":"01FEXXET6XXMF7G2V3ASZP3YQW","createdAt":"2021-09-08T09:00:53.965362Z","uri":"http://localhost:8080/users/1happyturtle/blocks/01FEXXET6XXMF7G2V3ASZP3YQW","accountId":"01F8MH5NBDF2MV7CTC4Q5128HF","targetAccountId":"01F8MH5ZK5VRH73AKHQM6Y9VNX"}
{"type":"account","id":"01F8MH5ZK5VRH73AKHQM6Y9VNX","createdAt":"2021-08-31T12:00:53.985646Z","username":"foss_satan","domain":"fossbros-anonymous.io","locked":true,"language":"en","uri":"http://fossbros-anonymous.io/users/foss_satan","url":"http://fossbros-anonymous.io/@foss_satan","inboxURI":"http://fossbros-anonymous.io/users/foss_satan/inbox","outboxURI":"http://fossbros-anonymous.io/users/foss_satan/outbox","followingUri":"http://fossbros-anonymous.io/users/foss_satan/following","followersUri":"http://fossbros-anonymous.io/users/foss_satan/followers","featuredCollectionUri":"http://fossbros-anonymous.io/users/foss_satan/collections/featured","actorType":"Person","publicKey":"-----BEGIN RSA PUBLIC KEY-----\nMIIBCgKCAQEA2OyVgkaIL9VohXKYTh319j4OouHRX/8QC7piXj71k7q5RDzEyvis\nVZBc5/C1/crCpxt895i0Ai2CiXQx+dISV7s/JBhAGl8s7TQ8jLlMuptrI0+sdkBC\nlu8pU0qQmoeXVnlquOzNmqGufUxIDtLXLZDN17qf/7vWA23q4d0tG5KQhGGGKiVM\n61Ufvr9MmgPBSpyUvYMAulFlz1264L49aGWeVgOz3qUQzqtxjrP0kaIbeyt56miP\nKr5AqkRgSsXci+FAo6suxR5gzo9NgleNkbZWF9MQyKlawukPwZUDSh396vtNQMee\n/4mto7mAXw8iio0IacrYO3F7iyewXnmI/QIDAQAB\n-----END RSA PUBLIC KEY-----\n","publicKeyUri":"http://fossbros-anonymous.io/users/foss_satan/main-key"}
{"type":"follow","id":"01F8PYDCE8XE23GRE5DPZJDZDP","createdAt":"2021-09-08T09:00:54.749465Z","uri":"http://localhost:8080/users/the_mighty_zork/follow/01F8PYDCE8XE23GRE5DPZJDZDP","accountId":"01F8MH1H7YV1Z7D2C8K2730QBF","targetAccountId":"01F8MH5NBDF2MV7CTC4Q5128HF"}
{"type":"follow","id":"01F8PY8RHWRQZV038T4E8T9YK8","createdAt":"2021-09-06T12:00:54.749459Z","uri":"http://localhost:8080/users/the_mighty_zork/follow/01F8PY8RHWRQZV038T4E8T9YK8","accountId":"01F8MH1H7YV1Z7D2C8K2730QBF","targetAccountId":"01F8MH17FWEB39HZJ76B6VXSKF"}
{"type":"domainBlock","id":"01FF22EQM7X8E3RX1XGPN7S87D","createdAt":"2021-09-08T10:00:53.968971Z","domain":"replyguys.com","createdByAccountID":"01F8MH17FWEB39HZJ76B6VXSKF","privateComment":"i blocked this domain because they keep replying with pushy + unwarranted linux advice","publicComment":"reply-guying to tech posts","obfuscate":false}
{"type":"user","id":"01F8MGYG9E893WRHW0TAEXR8GJ","createdAt":"2021-09-08T10:00:53.97247Z","accountID":"01F8MH0BBE4FHXPH513MBVFHB0","encryptedPassword":"$2y$10$ggWz5QWwnx6kzb9g0tnIJurFtE0dhr5Zfeaqs9iFuUIXzafQlJVZS","locale":"en","lastEmailedAt":"0001-01-01T00:00:00Z","confirmationToken":"a5a280bd-34be-44a3-8330-a57eaf61b8dd","confirmationTokenSentAt":"2021-09-08T10:00:53.972472Z","unconfirmedEmail":"weed_lord420@example.org","moderator":false,"admin":false,"disabled":false,"approved":false}
{"type":"user","id":"01F8MGWYWKVKS3VS8DV1AMYPGE","createdAt":"2021-09-05T10:00:53.972475Z","email":"admin@example.org","accountID":"01F8MH17FWEB39HZJ76B6VXSKF","encryptedPassword":"$2y$10$ggWz5QWwnx6kzb9g0tnIJurFtE0dhr5Zfeaqs9iFuUIXzafQlJVZS","currentSignInAt":"2021-09-08T09:50:53.972477Z","lastSignInAt":"2021-09-08T08:00:53.972477Z","chosenLanguages":["en"],"locale":"en","lastEmailedAt":"2021-09-08T09:30:53.972478Z","confirmedAt":"2021-09-05T10:00:53.972478Z","moderator":true,"admin":true,"disabled":false,"approved":true}
{"type":"user","id":"01F8MGVGPHQ2D3P3X0454H54Z5","createdAt":"2021-09-06T22:00:53.97248Z","email":"zork@example.org","accountID":"01F8MH1H7YV1Z7D2C8K2730QBF","encryptedPassword":"$2y$10$ggWz5QWwnx6kzb9g0tnIJurFtE0dhr5Zfeaqs9iFuUIXzafQlJVZS","currentSignInAt":"2021-09-08T09:30:53.972481Z","lastSignInAt":"2021-09-08T08:00:53.972481Z","chosenLanguages":["en"],"locale":"en","lastEmailedAt":"2021-09-08T09:05:53.972482Z","confirmationTokenSentAt":"2021-09-06T22:00:53.972483Z","confirmedAt":"2021-09-07T00:00:53.972482Z","moderator":false,"admin":false,"disabled":false,"approved":true}
{"type":"user","id":"01F8MH1VYJAE00TVVGMM5JNJ8X","createdAt":"2021-09-06T22:00:53.972485Z","email":"tortle.dude@example.org","accountID":"01F8MH5NBDF2MV7CTC4Q5128HF","encryptedPassword":"$2y$10$ggWz5QWwnx6kzb9g0tnIJurFtE0dhr5Zfeaqs9iFuUIXzafQlJVZS","currentSignInAt":"2021-09-08T09:30:53.972485Z","lastSignInAt":"2021-09-08T08:00:53.972486Z","chosenLanguages":["en"],"locale":"en","lastEmailedAt":"2021-09-08T09:05:53.972487Z","confirmationTokenSentAt":"2021-09-06T22:00:53.972487Z","confirmedAt":"2021-09-07T00:00:53.972487Z","moderator":false,"admin":false,"disabled":false,"approved":true}
{"type":"instance","id":"01BZDDRPAB8J645ABY31HHF68Y","createdAt":"2021-09-08T10:00:54.763912Z","domain":"localhost:8080","title":"localhost:8080","uri":"http://localhost:8080","reputation":0}
```
### gotosocial admin import
此命令可用于将文件中的数据导入到你的 GoToSocial 数据库中。
如果数据库中尚未存在 GoToSocial 表,它们将被创建。
如果在导入过程中出现任何冲突(例如尝试导入特定帐户时已经存在),则进程将中止。
文件格式应为一系列以换行符分隔的 JSON 对象(参见上文)。
`gotosocial admin import --help`:
```text
从文件中导入数据到数据库
用法:
gotosocial admin import [选项]
选项:
-h, --help 导入命令的帮助信息
--path string 要导入/导出文件的路径
```
示例:
```bash
gotosocial admin import --path example.json --config-path config.yaml
```
### gotosocial admin media list-attachments
可用于列出实例上的本站、外站或所有媒体附件的存储路径(包括头像和头图)。
`local-only``remote-only` 可用作过滤器;它们不能同时被设置。
如果既未设置 `local-only` 也未设置 `remote-only`,则将列出实例上的所有媒体附件。
你可能希望在运行此命令时将 `GTS_LOG_LEVEL` 设置为 `warn``error`,否则会记录大量你可能不需要的信息日志。
`gotosocial admin media list-attachments --help`:
```text
列出本站、外站或所有附件
用法:
gotosocial admin media list-attachments [选项]
选项:
-h, --help list-attachments 命令的帮助信息
--local-only 仅列出本站附件/表情;如果指定,则 remote-only 不能为 true
--remote-only 仅列出外站附件/表情;如果指定,则 local-only 不能为 true
```
示例输出:
```text
/gotosocial/062G5WYKY35KKD12EMSM3F8PJ8/attachment/original/01PFPMWK2FF0D9WMHEJHR07C3R.jpg
/gotosocial/01F8MH1H7YV1Z7D2C8K2730QBF/attachment/original/01PFPMWK2FF0D9WMHEJHR07C3Q.jpg
/gotosocial/01F8MH5ZK5VRH73AKHQM6Y9VNX/attachment/original/01FVW7RXPQ8YJHTEXYPE7Q8ZY0.jpg
/gotosocial/01F8MH1H7YV1Z7D2C8K2730QBF/attachment/original/01F8MH8RMYQ6MSNY3JM2XT1CQ5.jpg
/gotosocial/01F8MH1H7YV1Z7D2C8K2730QBF/attachment/original/01F8MH7TDVANYKWVE8VVKFPJTJ.gif
/gotosocial/01F8MH17FWEB39HZJ76B6VXSKF/attachment/original/01F8MH6NEM8D7527KZAECTCR76.jpg
/gotosocial/01F8MH1H7YV1Z7D2C8K2730QBF/attachment/original/01F8MH58A357CV5K7R7TJMSH6S.jpg
/gotosocial/01F8MH1H7YV1Z7D2C8K2730QBF/attachment/original/01CDR64G398ADCHXK08WWTHEZ5.gif
```
### gotosocial admin media list-emojis
用于列出您实例上的本站、外站或所有表情符号的存储路径。
`local-only``remote-only` 可用作过滤器;它们不能同时设置。
如果未设置 `local-only``remote-only`,将列出您实例上的所有表情符号。
您可能需要在运行时将 `GTS_LOG_LEVEL` 设置为 `warn``error`,否则将记录许多您可能不需要的信息消息。
`gotosocial admin media list-emojis --help`:
```text
列出本站、外站或所有表情符号
用法:
gotosocial admin media list-emojis [标志]
标志:
-h, --help 获取 list-emojis 帮助信息
--local-only 仅列出本站附件/表情符号;如果指定,则 remote-only 不能为真
--remote-only 仅列出外站附件/表情符号;如果指定,则 local-only 不能为真
```
示例输出:
```text
/gotosocial/01AY6P665V14JJR0AFVRT7311Y/emoji/original/01GD5KP5CQEE1R3X43Y1EHS2CW.png
/gotosocial/01AY6P665V14JJR0AFVRT7311Y/emoji/original/01F8MH9H8E4VG3KDYJR9EGPXCQ.png
```
### gotosocial admin media prune orphaned
此命令可用于删除您 GoToSocial 中的孤立媒体。
孤立媒体定义为存储中使用 GoToSocial 格式的键存在,但没有相应数据库条目的媒体。这对于删除可能在以前安装中遗留的文件,或错误放置在存储中的文件非常有用。
!!! warning "需要停止服务器"
此命令仅在 GoToSocial 未运行时起作用,因为它需要获取存储的独占锁。
在运行此命令之前,请先停止 GoToSocial
```text
删除存储中的孤立媒体
用法:
gotosocial admin media prune orphaned [标志]
标志:
--dry-run 执行试运行,仅记录可删除项目的数量(默认值为 true
-h, --help 获取 orphaned 帮助信息
```
默认情况下,此命令执行试运行,将记录可以删除的项目数量。要真正执行删除,请在命令中添加 `--dry-run=false`
示例(试运行):
```bash
gotosocial admin media prune orphaned
```
示例(实际执行):
```bash
gotosocial admin media prune orphaned --dry-run=false
```
### gotosocial admin media prune remote
此命令可用于删除您 GoToSocial 中未使用/过时的外站媒体。
过时媒体是指外站实例中早于 `media-remote-cache-days` 的头像/头图/状态附件。
如果需要,这些项目将会在之后按需重新获取。
未使用媒体是指当前账号或状态未使用的头像/头图/状态附件。
!!! warning "需要停止服务器"
此命令仅在 GoToSocial 未运行时起作用,因为它需要获取存储的独占锁。
在运行此命令之前,请先停止 GoToSocial
```text
从存储中删除未使用/过时的外站媒体,时间早于指定天数
用法:
gotosocial admin media prune remote [标志]
标志:
--dry-run 执行试运行,仅记录可删除项目的数量(默认值为 true
-h, --help 获取 remote 帮助信息
```
默认情况下,此命令执行试运行,将记录可以删除的项目数量。要真正执行删除,请在命令中添加 `--dry-run=false`
示例(试运行):
```bash
gotosocial admin media prune remote
```
示例(实际执行):
```bash
gotosocial admin media prune remote --dry-run=false
```

View file

@ -1,55 +0,0 @@
# 数据库维护
无论你选择使用 SQLite 还是 Postgres 来运行 GoToSocial可能都需要偶尔执行一些维护工作以保持数据库的良好运作。
!!! tip
尽管此处提供的维护建议旨在不破坏现有数据,你还是应该在手动执行维护操作之前备份数据库。这样,如果输入错误或意外运行了不当命令,可以恢复备份并重试。
!!! danger
**强烈不建议**手动创建、删除或更新 GoToSocial 数据库中的条目,这里不会提供相关命令。即使你认为自己知道在做什么,运行 `DELETE` 等语句可能会引入非常难以排查的问题。以下维护建议旨在帮助你的实例平稳运行;如果你手动进入数据库并对条目、表和索引进行修改,它们不会拯救你的数据。
## SQLite
要进行手动 SQLite 维护,你首先应该在存储 GoToSocial sqlite.db 文件的机器上安装 SQLite 命令行工具 `sqlite3`。有关 `sqlite3` 的详细信息,请参见[此处](https://sqlite.org/cli.html)。
### 分析/优化
按照 [SQLite 最佳实践](https://sqlite.org/lang_analyze.html#recommended_usage_pattern)GoToSocial 在关闭数据库连接时运行 `optimize` SQLite pragma`analysis_limit=1000`,以保持索引信息的更新。
在每次数据库迁移后(例如,启动新版本的 GoToSocial 时GoToSocial 将运行 `ANALYZE`,以确保查询计划器正确考虑迁移新增或删除的索引。
`ANALYZE` 命令可能需要大约 10 分钟,具体时间取决于硬件和数据库文件的大小。
由于上述自动化步骤,正常情况下你不需要针对 SQLite 数据库文件手动运行 `ANALYZE` 命令。
然而,如果你中断了之前的 `ANALYZE` 命令,并发现查询运行缓慢,可能是因为 SQLite 内部表中存储的索引元数据已被删除或不当修改。
如果是这种情况,可以尝试手动运行完整的 `ANALYZE` 命令,步骤如下:
1. 停止 GoToSocial。
2. 在 `sqlite3` shell 中连接到你的 GoToSocial 数据库文件,运行 `PRAGMA analysis_limit=0; ANALYZE;`(这可能需要几分钟)。
3. 启动 GoToSocial。
[查看更多信息](https://sqlite.org/lang_analyze.html#approximate_analyze_for_large_databases).
### 清理Vacuum
GoToSocial 当前未启用 SQLite 的自动清理auto-vacuum。要将数据库文件重新打包到最佳大小你可能需要定期例如每几个月在 SQLite 数据库上运行 `VACUUM` 命令。
可以在[此处](https://sqlite.org/lang_vacuum.html)查看有关 `VACUUM` 命令的详细信息。
基本步骤如下:
1. 停止 GoToSocial。
2. 在 `sqlite3` shell 中连接到你的 GoToSocial 数据库文件,运行 `VACUUM;`(这可能需要几分钟)。
3. 启动 GoToSocial。
### 副本
为数据库设置副本等保护措施是常见做法。SQLite 可以使用外部软件进行副本创建。基本步骤描述在 [配置 SQLite 副本](../advanced/replicating-sqlite.md) 页面。
## Postgres
待完成Postgres 的维护建议。

View file

@ -1,73 +0,0 @@
# 域名屏蔽
GoToSocial 支持屏蔽/封禁那些你不想与你的实例联合的域名。在我们的文档中,“屏蔽”和“封禁”这两个术语在涉及域名时可以互换使用,因为它们的意思相同:屏蔽你的实例与目标域名上的实例相互通信,有效地切断两个实例之间的联合。
你可以使用[实例管理面板](./settings.md#联合)查看、创建和移除域名屏蔽和域名允许。
本文档重点说明域名屏蔽实际*作用*是什么,以及创建新域名屏蔽时会产生哪些副作用。
## 域名屏蔽如何工作
域名屏蔽通过两种方式工作:
首先,它指示你的实例拒绝来自目标域名的任何请求:
- 从被屏蔽域名到你的实例的所有传入请求将以 HTTP 状态码 `403 Forbidden` 响应。
- 这使目标域名上的帐户无法与你实例上的帐户或该帐户创建的任何贴文进行互动,因为你的实例会简单地拒绝处理请求。
- 这也延伸到 GET 请求:你的实例将不再对被屏蔽实例的请求提供 ActivityPub 响应,例如获取帐户简介或置顶贴文等。
- 你的实例上的帐户的贴文转发也不应对被屏蔽的实例可见,因为那些实例将无法获取已转发贴文的内容。
其次,域名屏蔽指示你的实例不再向目标实例发出任何请求。这意味着:
- 你的实例不会向被屏蔽域名上的实例发送任何消息。
- 也不会从该实例获取贴文、帐户、媒体或表情符号。
## 安全顾虑
### 屏蔽规避
域名屏蔽并不完全严密。GoToSocial *可以* 确保自身既不响应来自被屏蔽域名的请求,也不向这些实例发出请求。不幸的是,它*无法*保证你的实例上的帐户不会以任何方式对被屏蔽实例的用户可见。请考虑以下情况,这些都代表了一种[屏蔽规避](https://en.wikipedia.org/wiki/Block_(Internet)#Evasion)
- 你屏蔽了 `blocked.instance.org`。`blocked.instance.org` 上的用户在 `not-blocked.domain` 上创建了一个帐户,以便他们可以使用新帐户与你的帖子互动或向你发送消息。他们可能会直接跳脸,告诉你他们是谁,或者使用假身份。
- 你屏蔽了 `blocked.instance.org`。`not-blocked.domain` 上的用户截屏了你的贴文并将其发送给 `blocked.instance.org` 上的某人。
- 你屏蔽了 `blocked.instance.org`。`blocked.instance.org` 上的用户通过浏览器访问你的个人资料,以查看你的公开贴文。
- 你屏蔽了 `blocked.instance.org`。你的个人资料启用了 RSS。`blocked.instance.org` 上的用户订阅了你的 RSS feed 以阅读你的公开贴文。
在上述情况下,`blocked.instance.org` 依然被屏蔽,但该实例的用户可能仍有其他方式查看你的贴文并可能联系到你。
考虑到这一点,你应始终将域名屏蔽视为隐私保护的*一个层次*。也就是说,域名屏蔽应该与其他层次一起部署,以实现你所满意的隐私水平。这应包括不公开发布敏感信息、不在照片中意外暴露个人信息等。
### 屏蔽公告机器人
不幸的是,联邦宇宙中有一些恶意用户,他们将域名屏蔽视为敌人而试图打破。为达到此目的,他们通常会针对那些使用域名屏蔽来保护用户的实例。
因此,联邦宇宙中有机器人抓取实例域名屏蔽,并向机器人的关注者宣布任何发现的屏蔽,从而使屏蔽实例的管理员可能面临骚扰。这些机器人使用 `api/v1/instance/peers?filter=suspended` 端点来收集域名屏蔽信息。
默认情况下GoToSocial 不会公开此端点,因此你的实例将不会被这种方式抓取。然而,如果你在 config.yaml 文件中将 `instance-expose-suspended` 设置为 `true`,你可能会发现此端点偶尔会被抓取,并且你的屏蔽可能会被恶意机器人宣布。
## 创建域名屏蔽的副作用
当你创建新的域名屏蔽(或重新提交现有的域名屏蔽)时,你的实例将处理该屏蔽的副作用。这些副作用是:
1. 将数据库中存储自目标域的所有帐户标记为已封禁,并删除被标记帐户的大多数信息(简介、显示名称、字段等)。
2. 清除本地帐户与封禁帐户之间的所有互关或单方面关系(关注、被关注、关注请求、收藏等)。
3. 删除封禁帐户的所有贴文。
4. 删除封禁帐户及其贴文的所有媒体,包括媒体附件、头像、头图和表情符号。
!!! danger
目前,上述大多数副作用是**不可逆**的。如果你在屏蔽后取消屏蔽一个域名,该域名上的所有帐户将不再被标记为已封禁,并且你将能够再次与他们互动,但所有关系仍将被清除,所有贴文和媒体将被删除。
在屏蔽一个域名之前请仔细考虑。
## 屏蔽一个域名及其所有子域
当你添加一个新的域名屏蔽时GoToSocial 也将屏蔽该域名的所有子域。如果你不信任域名所有者,你可以选择屏蔽某些特定子域,或者更一般地屏蔽整个域名。
一些例子:
1. 你屏蔽 `example.org`。这将屏蔽以下域名(非详尽列表):`example.org``subdomain.example.org``another-subdomain.example.org``sub.sub.sub.domain.example.org`。
2. 你屏蔽 `baddies.example.org`。这将屏蔽以下域名(非详尽列表):`baddies.example.org``really-bad.baddies.example.org`。然而,以下域名不会被屏蔽(非详尽列表):`example.org``subdomain.example.org``not-baddies.example.org`。
一个更实际的例子:
某个家伙拥有域名 `fossbros-anonymous.io`。他们不仅在 `mastodon.fossbros-anonymous.io` 运行 Mastodon 实例,还在 `gts.fossbros-anonymous.io` 运行 GoToSocial 实例,以及在 `akko.fossbros-anonymous.io` 运行 Akkoma 实例。你希望一次性屏蔽他们的所有这些实例(以及他们可能在未来创建的任何实例,例如 `pl.fossbros-anonymous.io` 等)。你可以通过简单地为 `fossbros-anonymous.io` 创建域名屏蔽来实现。子域上的任何实例将无法与你的实例通信。搞定!

View file

@ -1,62 +0,0 @@
# 联合模式
GoToSocial 当前提供“黑名单”和“白名单”联合模式,可以通过在 `config.yaml` 中设置 `instance-federation-mode`,或者使用环境变量 `GTS_INSTANCE_FEDERATION_MODE` 来配置。这些模式如下所述。
## 黑名单联合模式(默认)
`instance-federation-mode` 设置为 `blocklist` 时,你的实例将与其他实例自由联合,没有限制,但你在设置面板中明确创建的屏蔽的实例除外。
当你的实例收到来自不在黑名单内的实例的新请求时,如果请求有效,并且请求者被允许查看所请求的资源(考虑贴文的可见性和任何用户级屏蔽),实例将处理该请求。
当你的实例遇到它以前未见过的贴文或账户的提及或公告时,如果该资源的域未通过域屏蔽条目被屏蔽,它将会去获取该资源。
!!! info
黑名单联合模式是 GoToSocial 的默认联合模式。它也是大多数其他 ActivityPub 服务器实现的默认联合模式。
## 白名单联合模式
!!! warning
白名单联合模式仍然被认为是“实验性”的,我们正在研究其在实际中的表现。它应该如其名称所示,但可能会在其他地方导致错误或出现边缘情况,我们还不确定!
`instance-federation-mode` 设置为 `allowlist` 时,你的实例将仅与通过设置面板明确设为允许的实例联合,并限制任何未被允许的实例的访问。
当你的实例收到来自白名单之外实例的新请求时,它将拒绝处理该请求。如果请求来自白名单中的域名,你的实例将处理该请求(考虑贴文的可见性和任何用户级别的屏蔽)。
当你的实例遇到它以前未见过的贴文或账户的提及或公告时,它只会在资源所属域名被明确允许时才去获取资源。
!!! tip
白名单联合模式在你希望仅与选择的“可信”实例联合的情况下非常有用。然而,这会影响发现过程。在黑名单联合模式下,你会通过转发和回复自然地遇到未知实例的贴文和账户,但在白名单联合模式下,这样的偶然发现不会发生。
因此,建议你要么先从黑名单联合模式开始,然后在确定喜欢哪些其他实例后切换到白名单联合模式,要么从白名单联合模式开始,并在首次启动实例后准备好并导入白名单,以便“启动”它。
## 结合屏蔽与允许
可以同时屏蔽和允许同一个域,结合这两者的效果取决于你的实例当前使用的联合模式。
![一个流程图,显示两种不同联合模式如何处理传入的请求。](../public/diagrams/federation_modes.png)
### 在黑名单模式下
如图所示,在黑名单模式下(图的左侧),显式添加允许条目可以用来覆盖域名屏蔽。
这在你从其他人处导入黑名单,但导入的黑名单中包含了一些你实际上不想屏蔽的实例时很有用。为了避免屏蔽这些实例,你可以先为这些实例显式创建允许条目。然后,当你导入黑名单时,显式允许的域将不会被屏蔽,并且创建屏蔽所导致的副作用(删除贴文、媒体、关系等)将不会被处理。
如果你以后移除对于同时存在屏蔽的域的显式允许,该实例将被屏蔽,并且将处理屏蔽创建的相关影响。
相反,如果你为被屏蔽的域添加显式允许,将处理解除屏蔽的相关影响。
### 在白名单模式下
如图所示,在白名单模式下(图的右侧),显式域名屏蔽条目会优先于显式域名允许条目。在运行白名单模式时,必须满足以下两个条件才能允许一个实例通过:
1. 实例没有存在对应的显式域名屏蔽。
2. 实例存在对应的显式域名允许。
如果上述任何条件不满足,请求将被拒绝。
!!! danger
结合屏蔽和允许是一项棘手的工作!
在导入允许和黑名单时,你应该始终手动审核列表,以确保不会无意中屏蔽你不想屏蔽的实例,因为这可能会有**非常烦人的副作用**,例如移除关注/被关注、贴文等。
有疑问时,请始终首先添加显式允许作为保险策略!

View file

@ -1,57 +0,0 @@
# 媒体缓存
GoToSocial 使用配置的[存储后端](https://docs.gotosocial.org/zh-cn/latest/configuration/storage/)来存储由本站用户上传到实例的媒体(图像、视频等),并缓存从外站实例联合过来的贴文和个人资料中附带的媒体。
由本站用户上传的媒体将会永久保存在存储中(除非其所属的贴文或账户被删除),以便能够随时响应来自外站的请求。
另一方面,外站媒体仅会被临时缓存。经过一段时间(见下文)后,它将从存储中移除,以帮助缓解存储空间的使用。通过这种方式被移除缓存的外站媒体,如果再次需要,将自动从外站重新获取。
!!! info "为什么要缓存?"
你可能会认为应该完全不缓存外站媒体,因为它始终可以在原始服务器上获取。为什么不完全放弃缓存,而依赖外站根据需求提供服务呢?
虽然这是节省存储空间的一种简单方法,但它可能会引发其他问题,并且通常被认为是不够礼貌的做法。
例如假设某个小实例的用户发布了一条带有图片的有趣贴文。该贴文被一个拥有1000名跨5个不同实例每个实例200人关注者的账号转发。这1000人便会同时在时间线上看到这个图片。
如果没有外站媒体缓存可能会导致多达1000个请求同时冲击小实例因为每个接收者的浏览器必须单独请求从小实例获取该图片。这会导致小实例的流量激增。在极端情况下可能导致实例无响应或崩溃本质上是对其进行分布式拒绝服务攻击DDOS
然而通过启用外站媒体缓存将一条贴文转发给1000名来自5个不同实例的用户仅会向小实例发出5个请求每个实例1个请求。然后每个实例会从缓存的外站图片版本为其本站用户提供200个请求有效地分散了负载保护了较小的实例。
## 清理
外站媒体缓存的清理是一个计划的后台进程管理员无需手动干预。根据服务器速度、配置的存储速度和待处理的媒体数量清理时间大约在5到30分钟之间。
GoToSocial 提供了三个变量,让你(管理员)可以调节何时以及如何进行这些操作:`media-remote-cache-days`、`media-cleanup-from` 和 `media-cleanup-every`
默认情况下,这些变量设置如下:
| 变量名称 | 默认值 | 含义 |
|-----------------------------|--------------|----------|
| `media-remote-cache-days` | `7` | 7天 |
| `media-cleanup-from` | `"00:00"` | 午夜 |
| `media-cleanup-every` | `"24h"` | 每日 |
换句话说,默认设置意味着每晚午夜,超过一周的外站媒体将被清除并从存储中移除。
你可以通过调节这些变量实现不同的效果。例如如果你希望在凌晨4:30而不是午夜进行清理你可以将 `media-cleanup-from` 改为 `"04:30"`
如果你只想每隔几天而不是每晚进行清理,可以将 `media-cleanup-every` 设置为更高的值,如 `"48h"``"72h"`
如果你想采用更积极的清理策略以尽量减少存储使用,可以设置以下值:
| 变量名称 | 设置值 | 含义 |
|-----------------------------|--------------|-----------------|
| `media-remote-cache-days` | `1` | 1天 |
| `media-cleanup-from` | `"00:00"` | 午夜 |
| `media-cleanup-every` | `"8h"` | 每8小时 |
上述设置意味着从午夜开始每8小时GoToSocial 将清除任何缓存超过1天24小时的媒体。清理任务将在 00:00、08:00 和 16:00即午夜、上午8点和下午4点运行。使用此配置你可能将外站媒体在存储中保留的最长时间约为32小时。
!!! tip
`media-remote-cache-days` 设置为0或更小意味着外站媒体将永不被清除。然而本站孤立媒体的清理任务和其他一致性检查仍将按其他变量定义的计划运行。
!!! tip
如果你愿意,你也可以通过管理面板手动执行一次性清理操作([查看文档](./settings.md#媒体))。
!!! warning
`media-cleanup-every` 设置为非常小的值,如 `"30m"` 或更小,可能会导致你的实例不断遍历附件,导致数据使用率高而效益甚微。我们不建议将该值设置为小于约 `"8h"`,即便如此,可能也显得过度。

View file

@ -1,31 +0,0 @@
# HTTP 请求头过滤模式
GoToSocial 当前提供“屏蔽”、“允许”和禁用的 HTTP 请求头过滤模式,可以通过在 config.yaml 中设置 `advanced-header-filter-mode`,或使用环境变量 `GTS_ADVANCED_HEADER_FILTER_MODE` 来配置。这些模式的具体说明如下。
!!! warning
HTTP 请求头过滤是一个进阶设置。如果你不熟悉 HTTP 请求头的使用和复杂性,修改这些设置可能会导致联合功能中断,甚至无法访问你自己的实例。
HTTP 请求头过滤仍被视为“实验性”功能。它应该能如预期工作,但可能会导致其他地方出现错误或边缘情况,这点我们尚不确定!
## 禁用请求头过滤模式(默认)
`advanced-header-filter-mode` 设置为 `""`(即空字符串)时,将禁用所有请求头过滤。
## 屏蔽过滤模式
`advanced-header-filter-mode` 设置为 `"block"` 时,你的实例将正常接受 HTTP 请求(需进行 API 令牌检查、HTTP 签名检查等),但会拒绝符合你通过设置面板明确创建的屏蔽头过滤规则的请求。
在屏蔽模式中,可以使用允许头过滤规则来覆盖现有的屏蔽过滤规则,以提供更细致的控制。
在屏蔽模式下,请求将被接受,前提是该请求被明确允许或未被明确屏蔽。
## 允许过滤模式
`advanced-header-filter-mode` 设置为 `"allow"` 时,你的实例只会接受那些与通过设置面板明确创建的允许头过滤规则相匹配的 HTTP 请求。所有其他请求将被拒绝。
在允许模式中,可以使用屏蔽头过滤规则来覆盖现有的允许过滤规则,以提供更细致的控制。
在允许模式下,请求只有在被明确允许且未被明确屏蔽的情况下才会被接受。
!!! danger
允许过滤模式是一个极为严格的模式,几乎肯定会阻止许多(合法的)客户端访问你的实例,包括你自己。只有在完全明确你的目标时才应启用此模式。

View file

@ -1,13 +0,0 @@
# Robots.txt
GoToSocial 在主域名上提供一个 `robots.txt` 文件。该文件包含试图屏蔽已知 AI 爬虫的一些规则,以及其他一些索引器。它还包括一些规则,以确保诸如 API 端点之类的内容不会被搜索引擎索引,因为这些内容没有被索引的必要。
## AI 爬虫
AI 爬虫来自一个[社区维护的仓库][airobots]。目前是手动保持同步的。如果你知道有任何遗漏的爬虫,请给他们提交一个 PR
已知有许多 AI 爬虫即便明确匹配其 User-Agent也会忽略 `robots.txt` 中的条目。这意味着 `robots.txt` 文件并不是确保 AI 爬虫不抓取你的内容的万无一失的方法。
如果你想完全屏蔽这些爬虫,需要在反向代理中根据 User-Agent 头进行屏蔽,直到 GoToSocial 能够根据 User-Agent 头过滤请求。
[airobots]: https://github.com/ai-robots-txt/ai.robots.txt/

View file

@ -1,169 +0,0 @@
# 管理设置面板
GoToSocial 管理设置面板使用 [管理 API](https://docs.gotosocial.org/zh-cn/latest/api/swagger/#operations-tag-admin) 来管理你的实例。它与 [用户设置面板](../user_guide/settings.md) 结合使用,并采用与普通客户端相同的 OAuth 机制范围admin
## 设置管理员账户权限和登录
要使用管理设置面板,你的账户必须被提升为管理员:
```bash
./gotosocial --config-path ./config.yaml admin account promote --username 你的用户名
```
为了使提权生效,可能需要在运行命令后重启你的实例。
之后,你可以访问 `https://[your-instance-name.org]/settings`,在登录字段中输入你的域名,然后像使用其他客户端一样登录。现在,你应该可以看到管理设置。
## 管理
实例管理设置。
### 举报
![一个展示未解决举报的举报列表。](../public/admin-settings-reports.png)
举报部分显示来自本站用户或外站(匿名显示,仅显示实例名称,不显示具体用户名)的举报列表。
点击举报可以查看其是否已解决(若有理由则显示),更多信息,以及由举报用户选定的被举报贴文列表。你也可以在此视图中将举报标记为已解决,并填写评论。如果该用户来自你的实例,你在此处输入的任何评论都会对创建举报的用户可见。
![待处理的举报的详细视图,显示被举报的贴文和举报理由。](../public/admin-settings-report-detail.png)
点击被举报账户的用户名会在“账户”视图中打开该账户,从而允许你对其执行管理操作。
### 账户
你可以使用此部分搜索账户并对其执行管理操作。
### 联合
![已封禁实例列表,有一个字段用于过滤/添加新的屏蔽。下面是批量导入/导出界面的链接](../public/admin-settings-federation.png)
在联合部分,你可以创建、删除和审核明确的域名屏蔽和域名允许。
关于联合设置的更多详细信息,特别是域名允许和域名屏蔽如何结合使用,请参阅 [联合模式部分](./federation_modes.md) 和 [域名屏蔽部分](./domain_blocks.md)。
#### 域名屏蔽
你可以在搜索字段中输入一个要封禁的域名,这将过滤列表以显示你是否已有该域名的屏蔽条目。
点击“封禁”会显示一个表单,允许你添加公开和/或私人评论,并提交以添加屏蔽。添加封禁后,该实例上的所有已知账户将被封禁,并阻止与该被屏蔽实例上的任何用户的新互动。
#### 域名允许
域名允许部分的工作方式与域名屏蔽部分类似,只是用于明确的域名允许而不是域名屏蔽。
#### 批量导入/导出
通过联合部分底部的链接(或访问 `/settings/admin/federation/import-export`),你可以批量导入/导出屏蔽列表和允许列表。
![导入中包含的域列表,提供选择某些或全部域的方法,更改其域,以及更新子域使用方法。](../public/admin-settings-federation-import-export.png)
通过输入字段或文件导入列表后,你可以在导入子集之前查看列表中的条目。你还会在使用子域的条目中收到警告,此处还提供一种轻松将其更改为主域的方法。
## 管理
实例管理设置。
### 操作
运行一次性管理操作。
#### 电子邮件
你可以使用此部分向指定的电子邮件地址发送测试邮件,并附加可选的测试信息。
#### 媒体
你可以使用此部分运行清理外站媒体缓存的操作可以指定天数。超过指定天数的媒体将从存储中删除s3 或本地)。以这种方式删除的媒体将未来需要时重新尝试获取。此操作在功能上与自动运行的媒体清理相同。
#### 密钥
你可以使用此部分使来自特定外站实例的公钥过期/失效。下次你的实例收到使用过期密钥的签名请求时,它将尝试重新获取和存储公钥。
### 自定义表情
包含在外站贴文中的自定义表情将自动获取,但要在你的帖子中使用它们,必须在你的实例上启用。
#### 本站
![本站自定义表情部分,显示按类别排序的自定义表情概览。有很多加菲猫表情。](../public/admin-settings-emoji-local.png)
此部分显示你的实例上启用的所有自定义表情的概览,按类别排序。点击某个表情可显示其详细信息,并提供更改类别或图像的选项,或完全删除它。这里无法更新短代码,你需要自己上传带有新短代码的表情(可以选择删除旧的表情)。
在概览下方,你可以在预览表情在贴文中的效果后上传自己的自定义表情。支持 PNG 和动画GIF 格式。
#### 外站
![外站自定义表情部分,显示从输入的贴文中解析的 3 个表情的列表: blobcat、blobfoxbox 和 blobhajmlem。可以选择它们微调短代码并在提交复制或删除操作前为其分配类别](../public/admin-settings-emoji-remote.png)
通过“外站”部分,你可以查找任何外站贴文的链接(前提是该实例未被封禁)。如果使用了任何自定义表情,它们将被列出,这样就提供了一种轻松复制到本站表情的方法(供你自己在贴文中使用),或者也可以禁止它们(从贴文中隐藏)。
**注意:**由于 testrig 服务器未进行联合此功能在开发过程中无法使用500内部服务器错误
### 实例设置
![GoToSocial 管理面板的截图,显示了更改实例设置的字段](../public/admin-settings-instance.png)
在这里,你可以为你的实例设置各种元数据,如显示名称/标题、缩略图、(简短)描述和联系信息。
#### 实例外观
这些设置主要影响你的实例在网络和他人眼中的显示方式。
你的 **实例标题** 将显示在你实例每个网页的顶部,并在 OpenGraph 元标签中出现,所以选择一个能代表你实例氛围的名称。
**实例头像** 类似于你实例的吉祥物。它将出现在每个网页顶上的实例标题旁边并作为浏览器标签、OpenGraph 链接等的预览图像。
如果你设置了实例头像,我们强烈建议同时设置 **头像描述**。这将为你设置为头像的图片提供替代文字,帮助屏幕阅读器用户理解图片中描绘的内容。替代文本应保持简短明了。
#### 实例描述
你可以使用这些字段设置实例的简短和完整描述,并为当前和潜在用户提供实例使用条款。
**简短描述** 将显示在实例主页的顶部附近,以及响应 `/api/v1/instance` 查询时显示。
可以提供一些精辟的内容,以便访问你的实例的访客对你的实例有一个第一印象。例如:
> 这是一个 ACG 爱好者的实例!
>
> 不管磕什么都可以来注册。
或者:
> 这是一个单用户实例,只属于我!
>
> 这是我的主页:@your_username
**完整描述** 将显示在你的实例的 /about 页面上,并在响应 `/api/v1/instance` 查询时显示。
你可以用它来提供如下信息:
- 你的实例的历史、理念、态度和氛围
- 你实例上的居民倾向于发布的内容类型
- 如何在你的实例上获得账户(如果可能的话)
- 一个拥有账户的用户列表,希望更容易被找到
**使用条款** 框也会出现在你的实例的 /about 页面上,并在响应 `/api/v1/instance` 查询时显示。
用它来填写如下内容:
- 法律术语版权、GDPR 或相关链接)
- 联合政策
- 数据政策
- 账户删除/封禁政策
以上所有字段都接受 **markdown** 输入,因此你可以编写合适的列表、代码块、水平线、引用块或任何你喜欢的内容。
你也可以使用标准 `@user[@domain]` 格式提及账户。
查看 [markdown 速查表](https://markdownguide.offshoot.io/cheat-sheet/) 以了解可以做些什么。
### 实例联系信息
在此部分中,你可以向访问你实例的用户提供一种方便的方法,以联系你的实例管理员。
设置好的联系人账户和/或电子邮件地址的链接将出现在实例的每个网页底部、/about 页面的“联系”部分,以及响应 `/api/v1/instance` 查询时显示。
选择的 **联系人用户** 必须是实例上的活跃(未封禁)的管理员和/或站务。
如果你是在单用户实例上并将管理员权限授予你的主账户,你只需在此处填写自己的用户名即可;无需为此专门创建管理账户。

View file

@ -1,59 +0,0 @@
# 新账户注册
如果你希望你的实例不仅限于你自己,还可以让其他人注册账户,你可以开放你的实例供新账户注册。
注意,作为实例管理员,无论你是否愿意,你都需对在你的实例上发布的内容负责。如果你的实例用户在联合网上骚扰或烦扰他人,可能会导致你的实例名誉受损,并被其他人屏蔽。妥善管理一个社区需要付出努力。因此,你应仔细考虑是否愿意且有能力进行管理,及是否只接受朋友和你非常信任的人注册账户。
!!! warning
为使注册流程正常运作,你的实例应[配置电子邮件发件服务](../configuration/smtp.md)。
如下所述,在注册流程中,会向你(作为管理员/站务)和申请人发送几封邮件,包括要求对方确认邮箱地址的邮件。
如果他们无法收到此邮件(因为你的实例未配置电子邮件发件服务),你将需要通过[使用 CLI 工具](../admin/cli.md#gotosocial-admin-account-confirm)手动确认账户。
## 开放注册
你可以通过在[配置文件](../configuration/accounts.md)中将变量 `accounts-registration-open` 修改为 `true`,并重启你的 GoToSocial 实例来开放新账户注册。
你的实例将会在 `/signup` 端点提供注册表单。例如,`https://your-instance.example.org/signup`。
![注册表单,显示电子邮件、密码、用户名和理由字段。](../public/signup-form.png)
此外,你的实例主页和“关于”页面将更新,以反映注册现已开放。
当有人提交新注册申请时,他们会在提供的电子邮件地址收到一封邮件,其中包含一个链接,用于确认该地址确实属于他们。
同时,你实例上的管理员和站务会收到一封邮件和一条通知,告知有新的注册申请提交。
## 处理注册
实例管理员和版主可以通过管理面板中的“账户” -> “待处理”部分来审批或拒绝新注册。
![管理员设置面板打开到“账户” -> “待处理”,显示列表中有一个账户。](../public/signup-pending.png)
如果没有注册申请,以上列表将为空。如果有待处理的注册申请,你可以点击打开账户详情页:
![新待处理账户详情,提供批准或拒绝注册的选项。](../public/signup-account.png)
在底部,你会看到批准或拒绝注册的操作选项。
如果你**批准**注册,账户将被标记为“已批准”,并会向申请人发送一封邮件,通知其注册已获批准,并提醒他们确认电子邮件地址(如果尚未确认)。如果已经确认,他们就可以登录并开始使用他们的账户。
如果你**拒绝**注册,可以选择通知申请人注册被拒,你可以通过勾选“发送邮件”复选框来实现。这将向申请人发送一封简短邮件,告知其被拒。如果需要,还可以添加自定义消息,该消息将添加在邮件底部。你还可以添加仅供其他管理员查看的私人备注。
!!! warning
你可能希望等申请人确认他们的电子邮件地址后再批准注册,以防申请时输入错误或提供不是他们的电子邮件地址。如果他们不能确认电子邮件地址,将无法登录和使用账户。
## 注册限制
为了避免注册积压过多使管理员和版主不堪重负GoToSocial 将待处理注册积压限制为 20 个账户。一旦积压中有 20 个账户等待管理员或版主处理,新注册将不能通过表单提交。
如果过去 24 小时内已批准 10 个或以上新账户注册,新的注册也将不能通过表单提交,以避免实例规模快速扩张超出管理能力。
在这两种情况下,申请人将看到一条错误信息,解释无法提交表单的原因,并邀请他们稍后再试。
为了防止垃圾账户GoToSocial 的账户注册**始终**需要管理员手动批准,并且申请人**始终**需确认其电子邮件地址后才能登录和发布贴文。
## 通过邀请注册
尚未实现: 在未来的更新中,管理员和版主将能够创建和发送邀请,即使公共注册关闭时也允许创建账户,并可预先批准通过邀请创建的账户,和/或允许其绕过上述注册限制。

View file

@ -1,23 +0,0 @@
# 骚扰信息过滤
为了让管理员在应对来自开放注册实例的骚扰信息时稍微轻松一些GoToSocial 提供了一个实验性的骚扰信息过滤选项。
如果你或你的用户受到骚扰信息的轰炸,可以尝试在 `config.yaml` 中将选项 `instance-federation-spam-filter` 设置为 true。你可以在[实例配置页面](../configuration/instance.md)了解有关使用的启发算法的更多信息。
被认为是骚扰信息的消息将不会存储在你的本站实例上,也不会生成通知。
!!! warning
骚扰信息过滤器必然是不完美的工具,因为它们可能会误判一些合法的信息为垃圾,或者确实未能抓住一些*确实*是垃圾的信息。
启用 `instance-federation-spam-filter` 应被视为当联合网络遭遇骚扰信息攻击时的一种“加固”选项。在正常情况下,你可能希望将其关闭,以避免意外过滤掉合法信息。
!!! tip
如果你想检查骚扰信息过滤器捕获了哪些内容(如果有的话),可以在日志中搜索 `looked like spam`
如果你[将 GoToSocial 作为 systemd 服务运行](../getting_started/installation/metal.md#optional-enable-the-systemd-service),可以使用以下命令:
```bash
journalctl -u gotosocial --no-pager | grep 'looked like spam'
```
如果没有输出,说明过滤器中没有捕获到骚扰信息。否则,你将看到一行或多行日志,其中包含已被过滤并丢弃的贴文链接。

View file

@ -1,13 +0,0 @@
# 主题
你在本站的用户可以从 `web/assets/themes` 目录中的任何 CSS 文件中选择一个主题来装饰他们的个人资料。
GoToSocial 自带了一些主题文件,但你可以通过以下方式添加更多:
1. 在 `web/assets/themes` 中创建一个文件,例如 `new-theme.css`
2. (可选)在你的主题文件顶部加入以下注释来给你的主题命名和描述:
```css
/*
theme-title: 新主题
theme-description: 这是一个示例主题。
*/

View file

@ -1,27 +0,0 @@
# 无 Wazero / WASM 版构建
!!! danger "不受支持"
我们不提供对使用本节描述的 `nowasm` 标签构建的 GoToSocial 部署的任何支持。这样的构建在任何情况下都应被视为实验性构建,任何运行时出现的问题与我们无关!请不要在存储库中提交寻求 `nowasm` 构建的调试帮助的相关问题。
在[支持的平台](../../getting_started/releases.md#支持的平台)上GoToSocial 使用 WebAssembly 运行时 [Wazero](https://wazero.io/) 对 `ffmpeg`、`ffprobe` 和 `sqlite3` WebAssembly 二进制文件进行沙盒化,使这些应用程序可以被打包并在 GoToSocial 二进制文件中运行,无需管理员安装和管理任何外部依赖。
这使得管理员更容易维护他们的 GoToSocial 实例,因为他们的 GtS 二进制文件完全与系统安装的 `ffmpeg`、`ffprobe` 和 `sqlite` 的更改隔离开来。以这种方式运行 `ffmpeg` 也更安全一些,因为 GoToSocial 将 `ffmpeg` 二进制文件封装在一个非常受限的文件系统中,该系统不允许 `ffmpeg` 二进制文件访问除正在解码和重新编码的文件以外的任何文件。换句话说在受支持的平台上GoToSocial 提供了 `ffmpeg` 等的大多数功能,而不存在一些麻烦。
然而,并不是所有的平台都能在速度更快的“编译器”模式下运行 Wazero因此必须使用非常慢且资源占用大的“解释器”模式。有关符合性的详细信息请参考 Wazero 的[此表](https://github.com/tetratelabs/wazero?tab=readme-ov-file#conformance)。
“解释器”模式的运行性能非常差,以至于在不是 64 位 Linux 或 64 位 FreeBSD 的平台上运行 GoToSocial 实例是不切实际的,因为所有的内存和 CPU 都被媒体处理消耗殆尽。
但是!为了让用户能够运行**实验性、不受支持的 GoToSocial 部署**,我们开放了 `nowasm` 构建标签,该标签可用于编译完全不使用 Wazero 或 WASM 的 GoToSocial 构建。
使用 `nowasm` 构建的 GoToSocial 二进制文件将使用 [modernc 版本的 SQLite](https://pkg.go.dev/modernc.org/sqlite) 而不是 WASM 版本,并将在系统上使用 `ffmpeg``ffprobe` 二进制文件进行媒体处理。
要使用 `nowasm` 标签构建 GoToSocial可以像这样将标签传入我们的便利 `build.sh` 脚本:
```bash
GO_BUILDTAGS=nowasm ./scripts/build.sh
```
要运行以此方式构建的 GoToSocial 版本,你必须确保在主机上安装了 `ffmpeg``ffprobe`。这通常只需运行类似 `doas -u root pkg_add ffmpeg`OpenBSD`sudo apt install ffmpeg`Debian 等)的命令即可。
!!! danger "确实不受支持"
再次强调,如果在你的操作系统/架构组合上运行 `nowasm` 构建的 GoToSocial 有效,那很好,但我们不会为这样的构建提供支持,也无法帮助调试为何某些功能不起作用。

View file

@ -1,84 +0,0 @@
# 缓存 API 响应
可以缓存某些 API 响应,以减少 GoToSocial 处理所有请求的负担。我们不建议缓存 `/api` 下请求的响应。
在使用[分域](../host-account-domain.md)部署方式时,你需要确保在主机域上配置缓存。账号域应仅发出重定向到主机域的指令,客户端会自动记住这些指令。
## 端点
### Webfinger 和 hostmeta
`/.well-known/webfinger``/.well-known/host-meta` 的请求可以安全地缓存。注意确保任何缓存策略都考虑到 webfinger 请求的查询参数,因为对该端点的请求形式为 `?resource=acct:@username@domain.tld`
### 公钥
许多实现将定期请求用户的公钥,以验证收到消息的签名。这将在消息联合的过程中发生。这些密钥是长期存在的,因此可以用长时间缓存。
## 配置代码片段
=== "nginx"
请先在 nginx 中配置一个缓存区。该缓存区必须在 `http` 节内创建,而非 `server``location` 内。
```nginx
http {
...
proxy_cache_path /var/cache/nginx keys_zone=gotosocial_ap_public_responses:10m inactive=1w;
}
```
这配置了一个 10MB 的缓存,其条目将在一周内未被访问时保留。
该区域命名为 `gotosocial_ap_public_responses`你可以自行更改名称。10MB 可以容纳大量缓存键;在小实例上可以使用更小的值。
其次,我们需要更新 GoToSocial 的 nginx 配置,以便真正使用我们想要缓存的端点的缓存。
```nginx
server {
server_name social.example.org;
location ~ /.well-known/(webfinger|host-meta)$ {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache gotosocial_ap_public_responses;
proxy_cache_background_update on;
proxy_cache_key $scheme://$host$uri$is_args$query_string;
proxy_cache_valid 200 10m;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504 http_429;
proxy_cache_lock on;
add_header X-Cache-Status $upstream_cache_status;
proxy_pass http://localhost:8080;
}
location ~ ^\/users\/(?:[a-z0-9_\.]+)\/main-key$ {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_cache gotosocial_ap_public_responses;
proxy_cache_background_update on;
proxy_cache_key $scheme://$host$uri;
proxy_cache_valid 200 604800s;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504 http_429;
proxy_cache_lock on;
add_header X-Cache-Status $upstream_cache_status;
proxy_pass http://localhost:8080;
}
}
```
`proxy_pass``proxy_set_header` 大致相同,但 `proxy_cache*` 条目需要一些说明:
- `proxy_cache gotosocial_ap_public_responses` 告诉 nginx 使用我们之前创建的 `gotosocial_ap_public_responses` 缓存区。如果你用的是其他名称,需要更改此值。
- `proxy_cache_background_update on` 表示 nginx 会尝试在后台刷新即将过期的缓存资源,以确保磁盘上有最新副本。
- `proxy_cache_key` 的配置确保缓存时考虑到查询字符串。所以请求 `.well-known/webfinger?acct=user1@example.org``.well-known/webfinger?acct=user2@example.org` 被视为不同请求。
- `proxy_cache_valid 200 10m;` 意味着我们只缓存来自 GTS 的 200 响应,时间为 10 分钟。你可以添加类似 `proxy_cache_valid 404 1m;` 的其他行,来缓存 404 响应 1 分钟。
- `proxy_cache_use_stale` 告诉 nginx 允许在某些情况下使用过期的缓存条目(超过 10 分钟)。
- `proxy_cache_lock on` 表示如果资源未缓存且有多个并发请求,则查询将排队,以便只有一个请求通过,其他请求则从缓存中获取答案。
- `add_header X-Cache-Status $upstream_cache_status``X-Cache-Status` 头添加到响应中,以便你可以检查是否正在缓存。你可以删除此项。
上述配置将在代理到 GoToSocial 时出错、连接到 GoToSocial 时超时、GoToSocial 返回 `5xx` 状态码或 GoToSocial 返回 429请求过多时提供过期响应。`updating` 值表示允许在 nginx 刷新缓存时提供过期的条目。因为我们在 `proxy_cache_path` 指令中配置了 `inactive=1w`,所以如果满足 `proxy_cache_use_stale` 中的条件nginx 可以提供最长一周的缓存响应。

View file

@ -1,132 +0,0 @@
# 缓存资源与媒体
当你配置 GoToSocial 实例使用本地存储媒体时,可以使用你的[反向代理](../../getting_started/reverse_proxy/index.md)直接提供这些文件并进行缓存。这样可以避免频繁请求 GoToSocial同时反向代理通常能比 GoToSocial 更快地提供资源。
你还可以使用反向代理来缓存 GoToSocial Web UI 的资源,比如其使用的 CSS 和图片。
当使用[分域](../host-account-domain.md)部署方式时,你需要确保在主机域上配置资源和媒体的缓存。
!!! warning "媒体修剪"
如果你配置了媒体修剪,必须确保当磁盘上找不到媒体时,仍然将请求发送到 GoToSocial。这将保证从外站实例重新获取该媒体之后的请求将再次由你的反向代理处理。
## 端点
有两个端点提供可服务和缓存的资源:
* `/assets` 包含字体、CSS、图像等 Web UI 的资源
* `/fileserver` 在使用本地存储后端时,服务于贴文的附件
`/assets` 的文件系统位置由 [`web-asset-base-dir`](../../configuration/web.md) 配置选项定义。`/fileserver` 下的文件从 [`storage-local-base-path`](../../configuration/storage.md) 获取。
## 配置
=== "apache2"
`Cache-Control` 头手动设置,合并配置和 `expires` 指令的值,以避免因为两个头行而导致错误。默认情况下 `Header set``onsuccess`,因此它也不会添加到错误响应中。
假设你的 GtS 安装在 `/opt/GtS` 根目录下,并有一个 `storage` 子目录,且 Web 服务器已被授予访问权限,可以在 vhost 中添加以下部分:
```apacheconf
<Directory /opt/GtS/web/assets>
Options None
AllowOverride None
Require all granted
ExpiresActive on
ExpiresDefault A300
Header set Cache-Control "public, max-age=300"
</Directory>
RewriteRule "^/assets/(.*)$" "/opt/GtS/web/assets/$1" [L]
<Directory /opt/GtS/storage>
Options None
AllowOverride None
Require all granted
ExpiresActive on
ExpiresDefault A604800
Header set Cache-Control "private, immutable, max-age=604800"
</Directory>
RewriteCond "/opt/GtS/storage/$1" -f
RewriteRule "^/fileserver/(.*)$" "/opt/GtS/storage/$1" [L]
```
这里的技巧是在基于 Apache 2 的反向代理设置中…
```apacheconf
RewriteEngine On
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule ^/?(.*) "ws://localhost:8980/$1" [P,L]
ProxyIOBufferSize 65536
ProxyTimeout 120
ProxyPreserveHost On
<Location "/">
ProxyPass http://127.0.0.1:8980/
ProxyPassReverse http://127.0.0.1:8980/
</Location>
```
… 默认情况下所有的请求都是通过代理的,`RewriteRule` 通过指定文件系统路径来绕过代理以重定向到特定 URL 前缀,而 `RewriteCond` 确保只有在文件确实存在时才禁用 `/fileserver/` 代理。
你还需要运行以下命令(假设使用类似 Debian 的设置)来启用使用的模块:
```
$ sudo a2enmod expires
$ sudo a2enmod headers
$ sudo a2enmod rewrite
```
然后(在测试配置后)重启 Apache。
=== "nginx"
以下是你需要在现有的 nginx 配置中添加的三个位置块的示例:
```nginx
server {
server_name social.example.org;
location /assets/ {
alias web-asset-base-dir/;
autoindex off;
expires 5m;
add_header Cache-Control "public";
}
location @fileserver {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /fileserver/ {
alias storage-local-base-path/;
autoindex off;
expires 1w;
add_header Cache-Control "private, immutable";
try_files $uri @fileserver;
}
}
```
`/fileserver` 位置有点特殊。当我们无法从磁盘获取媒体时,我们希望将请求代理到 GoToSocial以便它尝试获取。`try_files` 指令本身不能使用 `proxy_pass`,所以我们创建了命名的 `@fileserver` 位置,在 `try_files` 中最后传递给它。
!!! bug "尾部斜杠"
`location` 指令和 `alias` 中的尾部斜杠很重要,不要移除它们。
`expires` 指令添加了必要的头信息,以告知客户端可以缓存资源的时间:
* 对于资源,因为可能在每次发布时更改,所以在此示例中使用了 5 分钟
* 对于附件,因为一旦创建后永远不会更改,所以当前使用一周
有关其他选项,请参阅 [nginx 的 `expires` 指令](https://nginx.org/en/docs/http/ngx_http_headers_module.html#expires)文档。
Nginx 不会为 4xx 或 5xx 响应代码添加缓存头,因此抓取资源失败时不会被客户端缓存。`autoindex off` 指令告诉 nginx 不提供目录列表。这应该是默认设置,但明确设置不会有害。添加的 `add_header` 行为 `Cache-Control` 头设置了额外的选项:
* `public` 用于指示任何人都可以缓存此资源
* `immutable` 用于指示该资源在其新鲜期内(在 `expires` 之前)绝不会更改,允许客户端在此期间忽略条件请求以重新验证资源。

View file

@ -1,11 +0,0 @@
# 缓存
本节涵盖了多种缓存技术,这些技术可以提高 GoToSocial 在高流量情况下的稳定性,并减轻 GoToSocial 实例的一部分工作负担。
!!! note
这些指南仅在你运行[反向代理](../../getting_started/reverse_proxy/index.md)时才有意义。
## 指南
* [缓存 API 响应](api.md)
* [缓存资源与媒体](assets-media.md)

View file

@ -1,108 +0,0 @@
# 配置 TLS 证书
如[部署注意事项](../getting_started/index.md)中所述,联合需要使用 TLS因为大多数实例拒绝通过未加密的传输进行联合。
GoToSocial 内置了通过 Lets Encrypt 进行 TLS 证书的配置和更新支持。本指南介绍如何独立于 GoToSocial 配置证书。如果你想完全控制证书的配置方式,或者因为你正在使用执行 TLS 终止的[反向代理](../getting_started/reverse_proxy/index.md),这将很有用。
获取 TLS 证书的方式有几种:
* 从供应商购买,通常有效期为 2 年
* 从云提供商获取,具体有效期取决于其产品限制
* 从像 Lets Encrypt 这样的[ACME](https://en.wikipedia.org/wiki/Automatic_Certificate_Management_Environment)兼容提供商处获取,通常有效期为 3 个月
在本指南中,我们只讨论第三种,有关 ACME 兼容提供商的选项。
## 一般方法
通过 Lets Encrypt 配置证书的方法是:
* 在你的服务器上安装 ACME 客户端
* 配置 ACME 客户端来配置你的证书
* 配置一个软件使用这些证书
* 启用定时器/cron 定期续订证书
* 通知必要的应用程序重新加载或重启以获取新证书
证书是通过[使用质询](https://letsencrypt.org/sv/docs/challenge-types/)来配置的,这是一种验证你为自己控制的域请求证书的方法。你通常会使用以下之一:
* HTTP 质询
* DNS 质询
HTTP 质询要求在所请求证书的域上的 80 端口下提供某些文件,路径为 `/.well-known/acme/`。这是默认质询类型。
DNS 质询完全在服务器外进行,但需要你更新 DNS TXT 记录。此方法只有在你的 DNS 注册商提供 API使你的 ACME 客户端完成此质询时才可行。
## 客户端
官方的 Lets Encrypt 客户端是 [certbot](https://certbot.eff.org/),通常在你选择的[Linux发行版](https://repology.org/project/certbot/versions)中打包。某些反向代理如 Caddy 和 Traefik 内置了使用 ACME 协议配置证书的支持。
你可以考虑使用的其他一些客户端包括:
* [acme-client](https://man.openbsd.org/acme-client.1),适用于 OpenBSD使用平台的特权分离功能
* [lacme](https://git.guilhem.org/lacme/about/),以进程隔离和最低特权为构建目标,类似于 acme-client 但适用于 Linux
* [Lego](https://github.com/go-acme/lego),用 Go 编写的 ACME 客户端和库
* [mod_md](https://httpd.apache.org/docs/2.4/mod/mod_md.html),适用于 Apache 2.4.30+
### DNS 质询
对于 DNS 质询,你的注册商的 API 需要被你的 ACME 客户端支持。尽管 certbot 对一些流行提供商有一些插件,但你可能想查看 [dns-multi](https://github.com/alexzorin/certbot-dns-multi) 插件。它在幕后使用 [Lego](https://github.com/go-acme/lego),支持更广泛的供应商。
## 配置
有三个重要的配置选项:
* [`letsencrypt-enabled`](../configuration/tls.md) 控制 GoToSocial 是否尝试配置自己的证书
* [`tls-certificate-chain`](../configuration/tls.md) 文件系统路径GoToSocial 可以在此找到 TLS 证书链和公钥
* [`tls-certificate-key`](../configuration/tls.md) 文件系统路径GoToSocial 可以在此找到关联的 TLS 私钥
### 不使用反向代理
当直接将 GoToSocial 暴露到互联网,但仍想使用自己的证书时,可以设置以下选项:
```yaml
letsencrypt-enabled: false
tls-certificate-chain: "/path/to/combined-certificate-chain-public.key"
tls-certificate-key: "/path/to/private.key"
```
这将禁用通过 Lets Encrypt 内置的证书配置,并指示 GoToSocial 在磁盘上找到证书。
!!! tip
在续订证书后应重启 GoToSocial。它在这种情况下不会自动监测证书的更换。
### 使用反向代理
当在执行 TLS 终止的[反向代理](../getting_started/reverse_proxy/index.md)后运行 GoToSocial 时,你需要如下设置:
```yaml
letsencrypt-enabled: false
tls-certificate-chain: ""
tls-certificate-key: ""
```
确保 `tls-certificate-*` 选项未设置或设置为空字符串。否则GoToSocial 将尝试自行处理 TLS。
!!! danger "协议配置选项"
**不要**将 [`protocol`](../configuration/general.md) 配置选项更改为 `http`。此选项仅应在开发环境中设置为 `http`。即使在 TLS 终止的反向代理后运行,也需要设置为 `https`
你还需要更改 GoToSocial 绑定的[`port`](../configuration/general.md),以便它不再尝试使用 443 端口。
要在反向代理中配置 TLS请参考其文档
* [nginx](https://docs.nginx.com/nginx/admin-guide/security-controls/terminating-ssl-http/)
* [apache](https://httpd.apache.org/docs/2.4/ssl/ssl_howto.html)
* [Traefik](https://doc.traefik.io/traefik/https/tls/)
* [Caddy](https://caddyserver.com/docs/caddyfile/directives/tls)
!!! tip
在你的反向代理中配置 TLS 时,请确保你配置了一组较现代的兼容版本和加密套件。可以使用 [Mozilla SSL Configuration Generator](https://ssl-config.mozilla.org/) 的“中级”配置。
检查你的反向代理文档,以了解在证书更改后是否需要重新加载或重启它。并非所有的反向代理都会自动检测到这一点。
## 指南
网上有许多优质资源解释如何设置这些内容。
* [ArchWiki 条目](https://wiki.archlinux.org/title/certbot)关于 certbot
* [Gentoo wiki 条目](https://wiki.gentoo.org/wiki/Let%27s_Encrypt)关于 Lets Encrypt
* [Linode 指南](https://www.linode.com/docs/guides/enabling-https-using-certbot-with-nginx-on-fedora/)关于 Fedora、RHEL/CentOS、Debian 和 Ubuntu 上的 certbot
* Digital Ocean 指南关于在 Ubuntu 22.04 上用 [nginx](https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-22-04) 或 [apache](https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-ubuntu-22-04)使用 Lets Encrypt

View file

@ -1,48 +0,0 @@
# 健康检查
GoToSocial 提供了两个健康检查 HTTP 端点:`/readyz` 和 `/livez`
这些端点可以用来检查 GoToSocial 是否可访问,并能够进行简单的数据库查询。
`/livez` 会始终返回 200 OK 响应且无内容,支持 GET 和 HEAD 请求。这用于检查 GoToSocial 服务是否存活。
如果 GoToSocial 能够对配置的数据库后台执行一个非常简单的 SELECT 查询,`/readyz` 会在 GET 和 HEAD 请求下返回 200 OK 响应且无内容。如果执行 SELECT 时发生错误,错误会被记录,并返回 500 Internal Server Error但无内容。
你可以使用上述端点在容器运行时/编排系统中实现健康检查。
例如,在 Docker 设置中,你可以在 docker-compose.yaml 中添加以下内容:
```yaml
healthcheck:
test: wget --no-verbose --tries=1 --spider http://localhost:8080/readyz || exit 1
interval: 120s
retries: 5
start_period: 30s
timeout: 10s
```
上述健康检查将在 30 秒后开始,每两分钟检查一次服务是否可用,通过对 `/readyz` 进行 HEAD 请求。如果检查连续失败五次,服务将被标记为不健康。你可以在使用的编排系统中利用此功能强制重启容器。
!!! warning
在慢速硬件上进行数据库迁移时,迁移可能会超过上述健康检查所允许的 10 分钟。
在这样的系统上,你可能需要增加健康检查的间隔或重试次数,以确保不会在迁移中途停止 GoToSocial这会很糟糕
!!! tip
尽管健康检查端点不透露任何敏感信息,并且只运行非常简单的查询,你可能希望避免将它们暴露给外部世界。你可以在 nginx 中通过在 `server` 段中添加以下代码片段来实现:
```nginx
location /livez {
return 404;
}
location /readyz {
return 404;
}
```
这样会导致 nginx 在请求传递给 GoToSocial 之前拦截这些请求,并直接返回 404 Not Found。
参考资料:
- [Dockerfile 参考](https://docs.docker.com/reference/dockerfile/#healthcheck)
- [Compose 文件参考](https://docs.docker.com/compose/compose-file/compose-file-v3/#healthcheck)

View file

@ -1,116 +0,0 @@
# 分域部署
本指南解释了如何使用 `@me@example.org` 这样的用户名,但将 GoToSocial 实例本身运行在例如 `social.example.org` 这样的子域名的方法。这种部署布局的配置**必须**在第一次启动 GoToSocial 前完成。
!!! danger
一旦与他人联合后就无法更改域名布局。服务器会因此产生混淆,而你需要说服每个与你联合的实例管理员修改其数据库来解决问题。同时,你还需要在本地重新生成数据库,创建一个新的实例账户和加密密钥对。
## 背景
ActivityPub 实现通过一个称为 [webfinger](https://www.rfc-editor.org/rfc/rfc7033) 的协议来发现如何将你的账户域映射到你的主机域。这种映射通常会被服务器缓存,因此在事后无法更改。
它的工作原理是请求 `https://<账户域>/.well-known/webfinger?resource=acct:@me@example.org`。此时,服务器可以返回重定向到实际的 webfinger 端点 `https://<主机域>/.well-known/webfinger?resource=acct:@me@example.org` 或直接响应。返回的 JSON 文档告知应查询的用户端点:
```json
{
"subject": "acct:me@example.org",
"aliases": [
"https://social.example.org/users/me",
"https://social.example.org/@me"
],
"links": [
{
"rel": "http://webfinger.net/rel/profile-page",
"type": "text/html",
"href": "https://social.example.org/@me"
},
{
"rel": "self",
"type": "application/activity+json",
"href": "https://social.example.org/users/me"
}
]
}
```
ActivityPub 客户端和服务器将使用 `links` 数组中 `rel``self``type``application/activity+json` 的条目来查询更多信息,比如在哪里找到 `inbox` 以进行联合消息的传递。
## 配置
你需要关注两个配置设置:
* `host`API 运行的域名,以及客户端和服务器与实例通信时使用的域
* `account-domain`,用户账户所属的域名
为了实现引言中描述的设置,你需要相应地设置这两个配置选项:
```yaml
host: social.example.org
account-domain: example.org
```
!!! info
`host` 必须始终是运行 GoToSocial 实例的 DNS 名称。它不影响 GoToSocial 实例绑定的 IP 地址。该地址由 `bind-address` 控制。
## 反向代理
使用[反向代理](../getting_started/reverse_proxy/index.md)时,需要确保能够处理这两个域的流量。你需要将一些端点从账户域重定向到主机域。
重定向通常用于客户端侧检测域变化。需要从账户域重定向到主机域的端点是:
* `/.well-known/webfinger`
* `/.well-known/host-meta`
* `/.well-known/nodeinfo`
!!! tip
不要将 API 端点 `/api/...` 的请求从账户域代理或重定向到主机域。这会混淆某些客户端用来检测分域部署的启发式方法,导致登录流程中断及其他异常行为。
### nginx
为了配置重定向,你需要在账户域上进行配置。假设账户域为 `example.org`,主机域为 `social.example.org`,以下配置代码展示了如何做到这一点:
```nginx
server {
server_name example.org; # account-domain
location /.well-known/webfinger {
rewrite ^.*$ https://social.example.org/.well-known/webfinger permanent; # host
}
location /.well-known/host-meta {
rewrite ^.*$ https://social.example.org/.well-known/host-meta permanent; # host
}
location /.well-known/nodeinfo {
rewrite ^.*$ https://social.example.org/.well-known/nodeinfo permanent; # host
}
}
```
### Traefik
如果 `example.org` 运行在 [Traefik](https://doc.traefik.io/traefik/) 上,可以使用类似以下的标签设置重定向。
```yaml
myservice:
image: foo
# 其他配置
labels:
- 'traefik.http.routers.myservice.rule=Host(`example.org`)' # account-domain
- 'traefik.http.middlewares.myservice-gts.redirectregex.permanent=true'
- 'traefik.http.middlewares.myservice-gts.redirectregex.regex=^https://(.*)/.well-known/(webfinger|nodeinfo|host-meta)(\?.*)?' # host
- 'traefik.http.middlewares.myservice-gts.redirectregex.replacement=https://social.${1}/.well-known/${2}${3}' # host
- 'traefik.http.routers.myservice.middlewares=myservice-gts@docker'
```
### Caddy 2
确保在你的 `Caddyfile` 中在账户域上配置重定向。以下示例假设账户域为 `example.com`,主机域为 `social.example.com`
```
example.com { # account-domain
redir /.well-known/host-meta* https://social.example.com{uri} permanent # host
redir /.well-known/webfinger* https://social.example.com{uri} permanent # host
redir /.well-known/nodeinfo* https://social.example.com{uri} permanent # host
}
```

View file

@ -1,19 +0,0 @@
# 进阶
在本节中,我们将讨论多个进阶主题,主要涉及 GoToSocial 的构建、部署、操作和调优。
我们将这些主题视为进阶主题,因为不正确地应用它们可能导致客户端和联合问题。如果你不了解所做的更改,应用其中的任何配置更改也可能使调试你的 GoToSocial 实例问题变得更困难。
## 指南
* [分域部署API 与账户域名)](host-account-domain.md)
* [使用 HTTP 代理进行客户端/外部请求](outgoing-proxy.md)
* [配置 TLS 证书](certificates.md)
* [缓存 API 响应](caching/api.md)
* [缓存资源及媒体](caching/assets-media.md)
* [进程沙箱](security/sandboxing.md)
* [配置防火墙](security/firewall.md)
* [追踪](tracing.md)
* [指标](metrics.md)
* [配置 SQLite 副本](replicating-sqlite.md)
* [网络存储上的 SQLite](sqlite-networked-storage.md)

View file

@ -1,57 +0,0 @@
# 指标
GoToSocial 提供了基于 [OpenTelemetry][otel] 的指标。这些指标使用 [Prometheus 暴露格式][prom],通过 `/metrics` 路径展示。配置设置在 [可观察性配置参考][obs] 中有详细说明。
当前收集的指标包括:
* Go 性能和运行时指标
* Gin (HTTP) 指标
* Bun (数据库) 指标
可以通过以下配置启用指标:
```yaml
metrics-enabled: true
```
虽然指标不包含任何隐私敏感信息,但你可能不希望随便让任何人查看和抓取你的实例的运营指标。
## 启用基本身份验证
你可以为指标端点启用基本身份验证。在 GoToSocial 上,你需要以下配置:
```yaml
metrics-auth-enabled: true
metrics-auth-username: some_username
metrics-auth-password: some_password
```
你可以使用 Prometheus 实例通过以下 `scrape_configs` 配置抓取该端点:
```yaml
- job_name: gotosocial
metrics_path: /metrics
scheme: https
basic_auth:
username: some_username
password: some_password
static_configs:
- targets:
- example.org
```
## 屏蔽外部抓取
当使用反向代理运行时,可以利用它来屏蔽对指标的外部访问。如果你的 Prometheus 抓取器在与 GoToSocial 实例相同的机器上运行,并可以内部访问它,可以使用这种方法。
例如使用 nginx通过返回 404 来屏蔽 `/metrics` 端点:
```nginx
location /metrics {
return 404;
}
```
[otel]: https://opentelemetry.io/
[prom]: https://prometheus.io/docs/instrumenting/exposition_formats/
[obs]: ../configuration/observability.md

View file

@ -1,21 +0,0 @@
# 出站 HTTP 代理
GoToSocial 支持配置 HTTP 代理使用的标准环境变量,用于出站请求:
* `HTTP_PROXY`
* `HTTPS_PROXY`
* `NO_PROXY`
这些环境变量的小写版本也同样被识别。在处理 https 请求时,`HTTPS_PROXY` 的优先级高于 `HTTP_PROXY`
环境变量的值可以是完整的 URL 或 `host[:port]`,在这种情况下默认使用 "http" 协议。支持的协议包括 "http"、"https" 和 "socks5"。
## systemd
使用 systemd 运行时,可以在 `Service` 部分使用 `Environment` 选项添加必要的环境变量。
如何操作可以参考 [`systemd.exec` 手册](https://www.freedesktop.org/software/systemd/man/systemd.exec.html#Environment)。
## 容器运行时
可以在 compose 文件的 `environment` 键下设置环境变量。你也可以在命令行中使用 `-e KEY=VALUE``--env KEY=VALUE` 传递给 Docker 或 Podman 的 `run` 命令。

View file

@ -1,102 +0,0 @@
# 配置 SQLite 副本
除了常规的[备份方法](../admin/backup_and_restore.md)之外,你可能还想设置副本功能,以便在发生灾难时恢复到另一个路径或外部主机。
为了使其正常工作SQLite 需要将日志模式配置为 `WAL` 模式,且同步模式设置为 `NORMAL`。这是 GoToSocial 的默认配置。
你可以在配置文件中检查你的设置。日志模式在 `db-sqlite-journal-mode` 中设置,同步模式在 `db-sqlite-synchronous` 中设置。
## Linux 下的 Litestream
使用 [Litestream](https://litestream.io) 是设置 SQLite 副本的一种相对轻量且快速的方法。它可以很容易地配置,并支持不同的后端,比如基于文件的副本、兼容 S3 的存储和许多其他设置。
你可以通过在 Linux 上使用 deb 文件安装预构建的软件包,或在其他发行版上从源代码构建。
在 Linux 上使用 .deb 包:
转到 [releases page](https://github.com/benbjohnson/litestream/releases/latest),下载最新版本(确保为下面的 wget 命令选择合适的平台)。
```bash
wget https://github.com/benbjohnson/litestream/releases/download/v0.3.13/litestream-v0.3.13-linux-amd64.deb
sudo dpkg -i litestream-*.deb
```
## 配置 Litestream
通过编辑配置文件进行配置。文件位于 /etc/litestream.yml。
### 配置基于文件的副本
```yaml
dbs:
- path: /gotosocial/sqlite.db
- path: /backup/sqlite.db
```
### 配置基于 S3 的副本
设置一个用于副本的桶,并确保将其设置为私有。
确保用你仪表板中的正确值替换示例中的 `access-key-id``secret-access-key`
```yaml
access-key-id: AKIAJSIE27KKMHXI3BJQ
secret-access-key: 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
dbs:
- path: /gotosocial/sqlite.db
- url: s3://my.bucket.com/db
```
使用兼容 S3 的存储提供商时,你需要设置一个端点。
例如,对 minio 可以使用以下配置。
```yaml
access-key-id: miniouser
secret-access-key: miniopassword
dbs:
- path: /gotosocial/sqlite.db
- type: s3
bucket: mybucket
path: sqlite.db
endpoint: minio:9000
```
## 启用副本
你可以通过启用 Litestream 服务在 Linux 上启用副本。
```bash
sudo systemctl enable litestream
sudo systemctl start litestream
```
使用 `sudo journalctl -u litestream -f` 检查其是否正常运行。
如果你需要更改配置文件,请重启 Litestream
```bash
sudo systemctl restart litestream
```
### 从配置的后端恢复
你可以使用以下简单命令从存储的后端拉取恢复文件。
```bash
sudo litestream restore
```
如果你配置了多个文件备份或有多个副本,请指定你要执行的操作。
对于基于文件的副本:
```bash
sudo litestream restore -o /gotosocial/sqlite.db /backup/sqlite.db
```
对于基于 S3 的副本:
```bash
sudo litestream restore -o /gotosocial/sqlite.db s3://bucketname/db
```

View file

@ -1,174 +0,0 @@
# 防火墙
你应该在你的实例上部署防火墙,以关闭任何开放端口,并提供一个机制来封禁可能行为不端的客户端。许多防火墙前端还会自动安装一些规则来屏蔽明显的恶意数据包。
部署工具来监控日志文件中的某些趋势,并自动封禁表现出某种行为的客户端是很有帮助的。这可以用于监控你的 SSH 和 Web 服务器访问日志,以应对如 SSH 暴力破解攻击。
## 端口
对于 GoToSocial你需要确保端口 `443` 保持开放。没有它,任何人都无法访问你的实例。联合将失败,客户端应用程序将无法正常工作。
如果你使用 ACME 或 GoToSocial 的内置 Lets Encrypt 支持[配置 TLS 证书](../certificates.md),你还需要开放端口 `80`
为了通过 SSH 访问你的实例,你还需要保持 SSH 守护进程绑定的端口开放。默认情况下SSH 端口是 `22`
## ICMP
[ICMP](https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol) 是在机器之间交换数据,以检测某些网络条件或排除故障的协议。许多防火墙倾向于完全屏蔽 ICMP但这并不理想。应该允许一些 ICMP 类型,你可以使用防火墙为它们配置速率限制。
### IPv4
为了确保功能可靠,你的防火墙必须允许:
* ICMP 类型 3"目标不可达",并有助于路径 MTU 发现
* ICMP 类型 4"源抑制"
如果你希望能够 ping 或被 ping还应允许
* ICMP 类型 0"回显应答"
* ICMP 类型 8"回显请求"
为了 traceroute 能够工作,还可以允许:
* ICMP 类型 11"时间超限"
### IPv6
IPv6 协议栈的所有部分非常依赖 ICMP屏蔽它会导致难以调试的问题。[RFC 4890](https://www.rfc-editor.org/rfc/rfc4890) 专门为此而写,值得查看。
简单来说,你必须始终允许:
* ICMP 类型 1"目标不可达"
* ICMP 类型 2"数据包过大"
* ICMP 类型 3代码 0"时间超限"
* ICMP 类型 4代码 1, 2"参数问题"
对于 ping你应该允许
* ICMP 类型 128"回显请求"
* ICMP 类型 129"回显应答"
## 防火墙配置
在 Linux 上,通常使用 [iptables](https://en.wikipedia.org/wiki/Iptables) 或更现代、更快的 [nftables](https://en.wikipedia.org/wiki/Nftables) 作为后端进行防火墙配置。大多数发行版正在转向使用 nftables许多防火墙前端可以配置为使用 nftables。你需要参考发行版的文档但通常会有一个 `iptables``nftables` 服务,可以通过预定义的位置加载防火墙规则。
手动使用原始的 iptables 或 nftables 规则提供了最大的控制精度,但如果不熟悉这些系统,这样做可能会有挑战。为了帮助解决这个问题,存在许多配置前端可以使用。
在 Debian 和 Ubuntu 以及 openSUSE 系列的发行版中,通常使用 UFW。它是一个简单的防火墙前端许多针对这些发行版的教程都会使用它。
对于 Red Hat/CentOS 系列的发行版,通常使用 firewalld。它是一个更高级的防火墙配置工具也有桌面 GUI 和 [Cockpit 集成](https://cockpit-project.org/)。
尽管发行版有各自偏好,你可以在任何 Linux 发行版中使用 UFW、firewalld 或其他完全不同的工具。
* [Ubuntu Wiki](https://wiki.ubuntu.com/UncomplicatedFirewall?action=show&redirect=UbuntuFirewall) 关于 UFW 的介绍
* [ArchWiki](https://wiki.archlinux.org/title/Uncomplicated_Firewall) 关于 UFW 的介绍
* DigitalOcean 指南 [在 Ubuntu 22.04 上使用 UFW 建立防火墙](https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-with-ufw-on-ubuntu-22-04)
* [firewalld](https://firewalld.org/) 项目主页及文档
* [ArchWiki](https://wiki.archlinux.org/title/firewalld) 关于 firewalld 的介绍
* [使用和配置 firewalld](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html/configuring_firewalls_and_packet_filters/using-and-configuring-firewalld_firewall-packet-filters) 的 Red Hat 文档
* Linode 指南 [如何使用 firewalld](https://www.linode.com/docs/guides/introduction-to-firewalld-on-centos/)
## 暴力攻击防护
[fail2ban](https://www.fail2ban.org) 和 [SSHGuard](https://www.sshguard.net/) 可以配置以监控日志文件中暴力破解登录和其他恶意行为的尝试。它们可以配置为自动插入防火墙规则,以屏蔽恶意 IP 地址,屏蔽可以是暂时的,也可以是永久的。
SSHGuard 最初只为 SSH 设计但现在支持多种服务。Fail2ban 往往支持任何可生成一致日志行的服务,而 SSHGuard 的签名方法可以捕获更复杂或隐蔽的攻击,因为它随着时间的推移计算攻击分数。
SSHGuard 和 fail2ban 都带有后端,可以直接针对 iptables 和 nftables或与你选择的前端如 UFW 或 firewalld 在 Linux 上工作,在 \*BSD 系统上可以使用 pf。确保查看其文档以正确配置。
* [ArchWiki](https://wiki.archlinux.org/title/Fail2ban) 关于 fail2ban 的介绍
* DigitalOcean 指南如何在 Ubuntu 上使用 [fail2ban 保护 SSH](https://www.digitalocean.com/community/tutorial_collections/how-to-protect-ssh-with-fail2ban)
* Linode 指南如何使用 [fail2ban 保护服务器](https://www.linode.com/docs/guides/using-fail2ban-to-secure-your-server-a-tutorial/)
* [ArchWiki](https://wiki.archlinux.org/title/sshguard) 关于 sshguard 的介绍
* [FreeBSD 手册](https://man.freebsd.org/cgi/man.cgi?query=sshguard&sektion=8&manpath=FreeBSD+13.2-RELEASE+and+Ports) sshguard 的介绍
* [SSHGuard 设置](https://manpages.ubuntu.com/manpages/lunar/en/man7/sshguard-setup.7.html) 的 Ubuntu 手册
对于 fail2ban可以使用以下正则表达式该正则表达式在身份验证失败时触发 fail2ban而不是其他“未经授权”的错误例如 API
```regex
statusCode=401 path=/auth/sign_in clientIP=<HOST> .* msg=\"Unauthorized:
```
## IP 屏蔽
GoToSocial 实现了速率限制,以保护你的实例不被单个主体占用所有处理能力。然而,如果你知道这不是合法流量,或者来自你不想与之联邦的实例,你可以屏蔽流量来源的 IP以节省 GoToSocial 的处理能力。
### Linux
屏蔽 IP 是通过 iptables 或 nftables 实现的。如果你使用 UFW 或 firewalld 等防火墙前端,请使用其功能来屏蔽 IP。
在 iptables 中,人们倾向于在 `filter` 表的 `INPUT` 链中为 IP 添加一个 `DROP` 规则。在 nftables 中,通常在一个具有 `ip``ip6` 地址族的链的表中完成。在这些情况下,内核已经对传入流量进行了大量不必要的处理,然后再通过 IP 匹配进行屏蔽。
使用 iptables 时,可以更有效地使用 `mangle` 表和 `PREROUTING` 链。你可以查看这篇博客文章,[了解它在 iptables 中的工作原理][iptblock]。对于 nftables你可能会想要使用 [`netdev` family][nftnetdev] 进行屏蔽。
[iptblock]: https://javapipe.com/blog/iptables-ddos-protection/
[nftnetdev]: https://wiki.nftables.org/wiki-nftables/index.php/Nftables_families#netdev
#### iptables
使用 `iptables` 屏蔽 IP 的示例:
```
iptables -t mangle -A PREROUTING -s 1.0.0.0/8 -j DROP
ip6tables -t mangle -A PREROUTING -s fc00::/7 -j DROP
```
当使用 iptables 时,添加许多规则会显著降低速度,包括在添加/删除规则时重新加载防火墙。由于你可能希望屏蔽许多 IP 地址,请使用 [ipset 模块][ipset] 并为集合添加单个屏蔽规则。
[ipset]: https://ipset.netfilter.org/ipset.man.html
首先创建你的集合并添加一些 IP
```
ipset create baddiesv4 hash:ip family inet
ipset create baddiesv6 hash:ip family inet6
ipset add baddiesv4 1.0.0.0/8
ipset add baddiesv6 fc00::/7
```
然后,更新你的 iptables 规则以针对该集合:
```
iptables -t mangle -A PREROUTING -m set --match-set baddiesv4 src -j DROP
ip6tables -t mangle -A PREROUTING -m set --match-set baddiesv6 src -j DROP
```
#### nftables
对于 nftables你可以使用如下配置
```
table netdev filter {
chain ingress {
set baddiesv4 {
type ipv4_addr
flags interval
elements = { \
1.0.0.0/8, \
2.2.2.2/32 \
}
}
set baddiesv6 {
type ipv6_addr
flags interval
elements = { \
2620:4f:8000::/48, \
fc00::/7 \
}
}
type filter hook ingress device <interface name> priority -500;
ip saddr @baddiesv4 drop
ip6 saddr @baddiesv6 drop
}
}
```
### BSDs
使用 pf 时,你可以创建一个通常命名为 `<badhosts>` 的持久化表,将需要屏蔽的 IP 地址添加到该表中。表格还可以从其他文件读取,因此可以将 IP 列表保存在主 `pf.conf` 之外。
有关如何执行此操作的示例,可以在 [pf 手册][manpf] 中找到。
[manpf]: https://man.openbsd.org/pf.conf#TABLES

View file

@ -1,11 +0,0 @@
# 安全加固措施
这些指南涵盖如何提高你的 GoToSocial 部署的安全状况。它们不涉及调整 GoToSocial 的设置,而是指出一些你可以做的额外措施,以更好地保护你的实例。
!!! note
这些指南中的任何内容旨在增强你的 GoToSocial 部署的安全性;它们不能替代良好的安全实践,比如保持你的系统定期得到修补和更新。
## 指南
* [对 GoToSocial 可执行文件进行沙盒处理](sandboxing.md)
* [配置防火墙](firewall.md)

View file

@ -1,63 +0,0 @@
# 对 GoToSocial 可执行文件进行沙盒处理
通过对 GoToSocial 二进制文件进行沙盒化,可以控制 GoToSocial 能访问系统的哪些部分,并限制其读写权限。这有助于确保即使在 GoToSocial 出现安全问题时,攻击者也很难提升权限,进而在系统上立足。
不同发行版有其偏好的沙盒机制:
* **AppArmor** 适用于 Debian 或 Ubuntu 系列及 OpenSuSE包括在 Docker 中的运行时
* **SELinux** 适用于 Red Hat/Fedora/CentOS 系列或 Gentoo
## AppArmor
我们提供了一个 GoToSocial 的 AppArmor 示例策略,你可以按以下步骤获取并安装:
```sh
$ curl -LO 'https://github.com/superseriousbusiness/gotosocial/raw/main/example/apparmor/gotosocial'
$ sudo install -o root -g root gotosocial /etc/apparmor.d/gotosocial
$ sudo apparmor_parser -Kr /etc/apparmor.d/gotosocial
```
安装策略后,你需要配置系统以使用该策略来限制 GoToSocial 的权限。
你可以这样禁用该策略:
```sh
$ sudo apparmor_parser -R /etc/apparmor.d/gotosocial
$ sudo rm -vi /etc/apparmor.d/gotosocial
```
别忘了回滚你所做的任何加载 AppArmor 策略的配置更改。
### systemd
在 systemd 服务中添加以下内容,或创建一条覆盖规则:
```ini
[Service]
...
AppArmorProfile=gotosocial
```
重载 systemd 并重新启动 GoToSocial
```sh
$ systemctl daemon-reload
$ systemctl restart gotosocial
```
### 容器
使用我们的示例 Compose 文件时,可以通过以下方式告知其加载 AppArmor 策略:
```yaml
services:
gotosocial:
...
security_opt:
- apparmor=gotosocial
```
在使用 `docker run``podman run` 启动容器时,需要使用 `--security-opt="apparmor=gotosocial"` 命令行标志。
## SELinux
SELinux 策略由社区在 GitHub 上的 [`lzap/gotosocial-selinux`](https://github.com/lzap/gotosocial-selinux) 仓库维护。请务必阅读其文档,在使用前查看策略,并使用其问题跟踪器获取有关 SELinux 策略的支持请求。

View file

@ -1,35 +0,0 @@
# 网络存储上的 SQLite
SQLite 的运行模式假定数据库和使用它的进程或应用程序位于同一主机上。在运行 WAL 模式GoToSocial 的默认模式)时,它依赖于进程之间的共享内存来确保数据库完整性。
!!! quote
所有使用数据库的进程必须在同一台主机计算机上WAL 不能在网络文件系统上工作。这是因为 WAL 需要所有进程共享少量内存,而在不同主机上的进程显然不能相互共享内存。
— SQLite.org [写前日志](https://www.sqlite.org/wal.html)
这也意味着访问数据库的任何其他进程需要在相同的命名空间或容器上下文中运行。
理论上,可以通过 Samba、NFS、iSCSI 或其他形式的网络访问文件系统运行 SQLite。但无论是否使用写前日志模式SQLite 维护者都不推荐或不支持这样做。这样做会使你的数据库面临损坏的风险。长期以来,网络存储在其锁定原语中存在同步问题,实现的保证也比本地存储更弱。
你的云供应商的外部卷,如 Hetzner 云存储卷、AWS EBS、GCP 持久磁盘等,也可能导致问题,并增加不确定的延迟。这往往会严重降低 SQLite 的性能。
如果你打算通过网络访问数据库,最好使用具有客户端-服务器架构的数据库。GoToSocial 支持这种用例的 Postgres。
如果想要在耐久的长期存储上保留 SQLite 数据库的副本,请参阅 [SQLite 流式副本](replicating-sqlite.md)。请记住,无论是还是副本使用网络文件系统都不能替代[备份](../admin/backup_and_restore.md)。
## 设置
!!! danger "数据库损坏"
我们不支持在网络文件系统上使用 SQLite 运行 GoToSocial如果你因此损坏了数据库我们将无法帮助你。
如果你确实想冒这个风险,你需要调整 SQLite 的 [synchronous][sqlite-sync] 模式和 [journal][sqlite-journal] 模式以适应文件系统的限制。
[sqlite-sync]: https://www.sqlite.org/pragma.html#pragma_synchronous
[sqlite-journal]: https://www.sqlite.org/pragma.html#pragma_journal_mode
你需要更新以下设置:
* `db-sqlite-journal-mode`
* `db-sqlite-synchronous`
我们不提供任何建议,因为这将根据你使用的解决方案而有所不同。请参阅 [此问题](https://github.com/superseriousbusiness/gotosocial/issues/3360#issuecomment-2380332027)以了解你可能设置的值。

View file

@ -1,44 +0,0 @@
# 追踪
GoToSocial 内置了基于 [OpenTelemetry][otel] 的追踪功能。虽然并没有贯穿每个函数,但我们的 HTTP 处理程序和数据库库会创建跨度。在 [可观测性配置参考][obs] 中解释了如何配置追踪。
为了接收这些追踪,你需要一些工具来摄取并可视化它们。有很多选项,包括自托管和商业选项。
我们提供了一个示例,说明如何使用 [Grafana Tempo][tempo] 来抓取数据跨度,并使用 [Grafana][grafana] 来检索它们。请注意,我们提供的配置不适合生产环境。可以安全地用于本地开发,并可为设置你自己的追踪基础设施提供一个良好的起点。
你需要获取 [`example/tracing`][ext] 中的文件。获取这些文件后,你可以运行 `docker-compose up -d` 来启动 Tempo 和 Grafana。在两个服务运行后可以将以下内容添加到 GoToSocial 配置中,并重新启动你的实例:
```yaml
tracing-enabled: true
tracing-transport: "grpc"
tracing-endpoint: "localhost:4317"
tracing-insecure-transport: true
```
[otel]: https://opentelemetry.io/
[obs]: ../configuration/observability.md
[tempo]: https://grafana.com/oss/tempo/
[grafana]: https://grafana.com/oss/grafana/
[ext]: https://github.com/superseriousbusiness/gotosocial/tree/main/example/tracing
## 查询和可视化追踪
在对你的实例执行几个查询后,你可以在 Grafana 中找到它们。你可以使用 Explore 选项卡并选择 Tempo 作为数据源。由于我们的 Grafana 示例配置启用了 [TraceQL][traceql]Explore 选项卡将默认选择 TraceQL 查询类型。你可以改为选择“搜索”并在“GoToSocial”服务名称下找到所有 GoToSocial 发出的追踪。
使用 TraceQL 时,一个简单的查询来查找与 `/api/v1/instance` 请求相关的所有追踪可以这样写:
```
{.http.route = "/api/v1/instance"}
```
如果你想查看所有 GoToSocial 追踪,可以运行:
```
{.service.name = "GoToSocial"}
```
选择一个追踪后,将打开第二个面板,显示对应数据跨度的可视化视图。你可以从那里深入浏览,通过点击每个子跨度查看其执行的操作。
![Grafana 显示 /api/v1/instance 端点的追踪](../public/tracing.png)
[traceql]: https://grafana.com/docs/tempo/latest/traceql/

View file

@ -1,149 +0,0 @@
# 使用 API 进行身份验证
使用客户端 API 需要进行身份验证。本页记录了如何获取身份验证令牌的通用流程,并提供了使用 `curl` 在命令行界面进行操作的示例。
## 创建新应用
我们需要注册一个新应用,以便请求 OAuth 令牌。这可以通过向 `/api/v1/apps` 端点发送 `POST` 请求来完成。注意将下面命令中的 `your_app_name` 替换为你想使用的应用名称:
```bash
curl \
-X POST \
-H 'Content-Type:application/json' \
-d '{
"client_name": "your_app_name",
"redirect_uris": "urn:ietf:wg:oauth:2.0:oob",
"scopes": "read"
}' \
'https://example.org/api/v1/apps'
```
字符串 `urn:ietf:wg:oauth:2.0:oob` 表示一种称为带外身份验证的技术,这是一种用于多因素身份验证的技术,旨在减少恶意行为者干扰身份验证过程的途径。在此情况下,它允许我们查看并手动复制生成的令牌以便继续使用。
注意,`scopes` 可以是以下任意空格分隔的组合:
- `read`
- `write`
- `admin`
!!! warning
GoToSocial 目前不支持范围授权令牌,因此在此过程中获得的任何令牌都可以代表你执行所有操作,包括如果你的账户具有管理员权限时的管理员操作。然而,始终以最低权限授予你的应用是一个好习惯。例如,如果你的应用不会发布贴文,请使用 scope=read。
本着这种精神,上述示例使用了`read`,这意味着当未来支持范围令牌时,应用将仅限于执行`read`操作。
你可以在[此处](https://github.com/superseriousbusiness/gotosocial/issues/2232)阅读更多关于计划中 OAuth 安全功能的信息。
成功调用会返回一个带有 `client_id``client_secret` 的响应,我们将在后续流程中需要使用这些信息。它看起来像这样:
```json
{
"id": "01J1CYJ4QRNFZD6WHQMZV7248G",
"name": "your_app_name",
"redirect_uri": "urn:ietf:wg:oauth:2.0:oob",
"client_id": "YOUR_CLIENT_ID",
"client_secret": "YOUR_CLIENT_SECRET"
}
```
!!! tip
确保将 `client_id``client_secret` 的值保存到某个位置,以便在需要时参考。
## 授权你的应用代表你操作
我们已经在 GoToSocial 注册了一个新应用,但它尚未与你的账户连接。现在,我们需要告知 GoToSocial 这个新应用将代表你操作。为此,我们需要通过浏览器进行实例认证,以启动登录和权限授予过程。
创建一个带查询字符串的 URL如下所示`YOUR_CLIENT_ID` 替换为你在上一步收到的 `client_id`,然后将 URL 粘贴到浏览器中:
```text
https://example.org/oauth/authorize?client_id=YOUR_CLIENT_ID&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code&scope=read
```
!!! tip
如果你在注册应用时使用了不同的范围,在上面的 URL 中将 `scope=read` 替换为你注册时使用的加号分隔的范围列表。例如,如果你注册你的应用时使用了 `scopes``read write`,那么你应该将上面的 `scope=read` 改为 `scope=read+write`
将 URL 粘贴到浏览器后,你会被引导到实例的登录表单,提示你输入邮箱地址和密码以将应用连接到你的账户。
提交凭据后,你会到达一个页面,上面写着类似这样的内容:
```
嗨嗨,`your_username`!
应用 `your_app_name` 申请以你的名义执行操作,申请的权限范围是 *`read`*.
如果选择允许,应用将跳转到: urn:ietf:wg:oauth:2.0:oob 继续操作
```
点击 `允许`,你将到达这样一个页面:
```text
Here's your out-of-band token with scope "read", use it wisely:
YOUR_AUTHORIZATION_TOKEN
```
复制带外授权令牌到某个地方,因为你将在下一步中需要它。
## 获取访问令牌
下一步是用刚刚收到的带外授权令牌交换一个可重用的访问令牌,该令牌可以在以后所有的 API 请求中发送。
你可以通过另一个 `POST` 请求来完成这项操作,如下所示:
```bash
curl \
-X POST \
-H 'Content-Type: application/json' \
-d '{
"redirect_uri": "urn:ietf:wg:oauth:2.0:oob",
"client_id": "YOUR_CLIENT_ID",
"client_secret": "YOUR_CLIENT_SECRET",
"grant_type": "authorization_code",
"code": "YOUR_AUTHORIZATION_TOKEN"
}' \
'https://example.org/oauth/token'
```
确保替换:
- `YOUR_CLIENT_ID` 为第一步中收到的客户端 ID。
- `YOUR_CLIENT_SECRET` 为第一步中收到的客户端密钥。
- `YOUR_AUTHORIZATION_TOKEN` 为在第二步中收到的带外授权令牌。
你会收到一个包含访问令牌的响应,看起来像这样:
```json
{
"access_token": "YOUR_ACCESS_TOKEN",
"created_at": 1719577950,
"scope": "read",
"token_type": "Bearer"
}
```
将你的访问令牌复制并安全保存。
## 验证
为了确保一切正常,尝试查询 `/api/v1/verify_credentials` 端点,在请求头中添加你的访问令牌作为 `Authorization: Bearer YOUR_ACCESS_TOKEN`
请参考以下示例:
```bash
curl \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
'https://example.org/api/v1/accounts/verify_credentials'
```
如果一切顺利,你应该会得到用户资料的 JSON 响应。
## 最后说明
现在你拥有了访问令牌,可以在每次 API 请求中重复使用该令牌进行授权。你不需要每次都执行整个令牌交换过程!
例如,你可以使用相同的访问令牌向 API 发送另一个 `GET` 请求以获取通知,如下所示:
```bash
curl \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
'https://example.org/api/v1/notifications'
```

View file

@ -1,41 +0,0 @@
# 请求速率限制
为减轻对你的实例的滥用和抓取,系统使用了基于 IP 的 HTTP 速率限制。
不同的端点组有单独的速率限制规则。换句话说,一个部分的 API 被速率限制了,并不意味着其他部分也会被限制。以下列表中的每个项目都有单独的速率限制规则:
- `/users/*``/emoji/*` - ActivityPub (s2s) 端点。
- `/auth/*``/oauth/*` - 登录和 OAUTH 令牌请求。
- `/fileserver/*` - 媒体附件、表情符号等。
- `/nodeinfo/*` - NodeInfo 端点。
- `/.well-known/*` - webfinger 和 nodeinfo 请求。
默认情况下,每个速率限制规则允许在 5 分钟内最多进行 300 次请求:每个客户端 IP 地址每秒 1 次请求。
每个响应将包含速率限制的当前状态,具体表现为以下头信息:
- `X-Ratelimit-Limit`: 每个时间段允许的最大请求数。
- `X-Ratelimit-Remaining`: 在剩余时间内仍然可以进行的请求数量。
- `X-Ratelimit-Reset`: 表示速率限制何时重置的 ISO8601 时间戳。
如果超过速率限制,将返回 [HTTP 429 Too Many Requests](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429) 错误给请求者。
## 速率限制常见问题
### 我总是超出速率限制!为什么?
如果你发现自己的速率限制在正常使用时经常被超出(对于你自己和其他请求者也是如此),这可能是因为 GoToSocial 无法通过 IP 地址区分客户端。你可以通过查看实例的日志来调查这个问题。如果(几乎)所有记录的 IP 地址似乎都是相同的 IP 地址(类似于 `172.x.x.x`),那么速率限制将导致问题。
这种情况通常发生在你的服务器运行在 NAT端口转发或者在没有正确配置的 HTTP 代理之后,导致你的实例将所有传入 IP 地址视为相同的地址:即你的反向代理或网关的 IP 地址。这意味着所有传入请求*共享同一个速率限制*,而不是按 IP 正确分开。
如果你正在使用 HTTP 代理,那么很可能你的 `trusted-proxies` 未正确配置。如果是这种情况,尝试将反向代理的 IP 地址添加到 `trusted-proxies` 列表中,并重启你的实例。
如果没有使用 HTTP 代理,那么很可能是由 NAT 引起的。在这种情况下,你应该完全禁用速率限制。
### 我可以配置速率限制吗?可以关闭吗?
可以!在配置中设置 `advanced-rate-limit-requests: 0`
### 我可以将一个或多个 IP 地址排除在速率限制之外,而保持其他的限制吗?
可以!在配置中设置 `advanced-rate-limit-exceptions`

View file

@ -1,21 +0,0 @@
# 路由和方法
GoToSocial 使用 [go-swagger](https://github.com/go-swagger/go-swagger) 从代码注释生成一个 V2 [OpenAPI 规范](https://swagger.io/specification/v2/)文档。
生成的 API 文档如下所示。请注意,本文档仅供参考。你将无法使用以下小部件内置的授权功能实际连接到实例或进行 API 调用。相反,你应该使用像 curl、Postman 等工具。
大多数 GoToSocial API 端点需要用户级别的 OAuth 令牌。有关如何使用 OAuth 令牌进行 API 认证的指南,请参阅[认证文档](./authentication.md)。
!!! tip
如果你想更多地使用该规范,还可以直接查看 [swagger.yaml](./swagger.yaml),然后将其粘贴到 [Swagger Editor](https://editor.swagger.io/) 等工具中。这样你可以尝试自动生成不同语言的 GoToSocial API 客户端(不支持,但可以尝试),或者将文档转换为 JSON 或 OpenAPI v3 规范等。更多信息请参见[这里](https://swagger.io/tools/open-source/getting-started/)。
!!! info "注意事项:上传文件"
当使用涉及提交表单上传文件的 API 端点时(例如,媒体附件端点或表情符号上传端点等),请注意,在表单字段中 `filename` 是必需的,这是由于 GoToSocial 用于解析表单的依赖关系以及 Go 的某些特性导致的。
有关更多背景信息,请参见以下问题:
- [#1958](https://github.com/superseriousbusiness/gotosocial/issues/1958)
- [#1944](https://github.com/superseriousbusiness/gotosocial/issues/1944)
- [#2641](https://github.com/superseriousbusiness/gotosocial/issues/2641)
<swagger-ui src="swagger.yaml"/>

File diff suppressed because it is too large Load diff

View file

@ -1,35 +0,0 @@
# 请求限流
GoToSocial 使用请求限流来限制与你的实例 API 的开放连接数。这是为了防止在一个账户含有成千上万粉丝的情况下,贴文被转发或回复时,避免你的实例意外被 DDOS 攻击(即所谓的[死亡之拥](https://en.wikipedia.org/wiki/Slashdot_effect))。
限流意味着只有有限数量的 HTTP 请求可同时处理,以便为每个请求提供快速响应,迅速完成。其原理是,快速处理较少的请求比同时尝试处理所有传入请求并每个用时多秒要好。
限流应用于不同的路由组,类似于[速率限制](./ratelimiting.md)的组织方式,因此,如果 API 的某个部分正处于限流状态,并不意味着所有部分都如此。
限流限制基于 GoToSocial 可用的 CPU 数量和配置值 `advanced-throttling-multiplier` 来计算。其计算方式如下:
- 处理中的队列限制 = CPU 数量 * CPU 乘数。
- 待处理队列限制 = 处理中的队列限制 * CPU 乘数。
对于默认乘数8得出以下值
```text
1 个 CPU = 08 处理中064 待处理
2 个 CPU = 16 处理中128 待处理
4 个 CPU = 32 处理中256 待处理
8 个 CPU = 64 处理中512 待处理
```
新请求如果超过处理中的限制将被放入待处理队列,并在有空位时进行处理(即当前处理中的请求完成时)。无法处理且无法放入待处理队列的请求将收到 HTTP 代码 [503 - 服务不可用](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/503),并设置 `Retry-After` 头为 `30`(秒),以表示调用者稍后重试。
请求不会无限期地保留在待处理队列中:如果待处理中的请求无法在 30 秒内处理,它们也将收到 503 代码和 30 秒的重试等待。
## 限流常见问题
### 我可以调节请求限流吗?
可以。只需根据你的 CPU 性能更改 `advanced-throttling-multiplier` 的值CPU 性能强可调高,性能相对较弱可调低。
### 我可以禁用请求限流吗?
可以。只需将 `advanced-throttling-multiplier` 设置为 `0` 或更小。这样将完全禁用 HTTP 请求限流,并尝试同时处理所有传入请求。如果你想使用外部服务或反向代理进行请求限流,并且不希望 GoToSocial 干扰你的设置,这是很有用的。

View file

@ -1,44 +0,0 @@
# 账户
## 设置
```yaml
###########################
##### 账户配置 #####
###########################
# 服务器上账户创建与维护的配置,以及新账户的默认设置。
# 布尔值。允许人们通过 /signup 表单提交新的注册请求。
#
# 选项: [true, false]
# 默认: false
accounts-registration-open: false
# 布尔值。注册请求是否需要提交请求理由(例如,解释他们为何想加入此实例)?
# 选项: [true, false]
# 默认: true
accounts-reason-required: true
# 布尔值。允许此实例上的账户为其个人资料页面和贴文设置自定义 CSS。
# 启用此设置将允许账户通过 /user 设置页面上传自定义 CSS
# 然后这些 CSS 将在账户的个人资料和贴文的网页视图中呈现。
#
# 对于允许公开注册的实例,**强烈建议**将此设置保持为 'false'
# 因为设置为 true 允许恶意账户使其个人资料页面具有误导性、不可用
# 或对访问者甚至危险。换句话说,只有在你信任实例上的用户不会产生有害 CSS 时,
# 才应启用此设置。
#
# 无论此值设置为何,任何上传的 CSS 都不会联合到其他实例,仅在*本*实例上的个人资料和贴文中显示。
#
# 选项: [true, false]
# 默认: false
accounts-allow-custom-css: false
# 整数值。如果 accounts-allow-custom-css 为 true则为此实例上账户上传的
# CSS 允许的字符长度。如果 accounts-allow-custom-css 为 false则无效。
#
# 示例: [500, 5000, 9999]
# 默认: 10000
accounts-custom-css-length: 10000
```

View file

@ -1,152 +0,0 @@
# 进阶设置
提供进阶设置选项是为了让管理员能够根据自己的喜好调整实例。
这些设置已设置为合理的默认值,所以大多数服务器管理员不需要更改或考虑它们。
**如果你不知道自己在做什么,修改这些设置可能会导致实例出错**。
## 设置
```yaml
#############################
##### 进阶设置 #####
#############################
# 与HTTP超时、安全性、Cookie等相关的进阶设置。
#
# 只有在你了解自己在做什么的情况下才调整这些设置!
#
# 大多数用户不需要(也不应该)修改这些设置,因为它们被设为合理的默认值,改变可能导致问题。
#
# 不过,这些设置提供给服务器管理员用于性能或安全原因的调整。
# 字符串。GoToSocial设置的Cookie的SameSite属性值。
# 默认设置为 'lax' 以确保OIDC流程不会中断这通常是可以的。
# 如果你希望加强实例对抗CSRF攻击并且不介意某些登录相关操作可能中断可以将其设置为 'strict'。
#
# 关于此设置的概述,请参见:
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie/SameSite
#
# 选项: ["lax", "strict"]
# 默认: "lax"
advanced-cookies-samesite: "lax"
# 整数。允许单个IP地址在5分钟内对每个路由分组的请求数量。
# 如果超出此数量将返回429 HTTP错误代码。
#
# 如果你发现需要调整此限制,是因为它经常被超出,你应首先验证 `trusted-proxies` 配置是否正确。
# 在许多情况下,超出速率限制是因为你的实例将所有传入请求视为来自*相同的IP地址*你可以通过查看实例日志中的客户端IP来验证
# 如果是这种情况,尝试在调整此速率限制设置*之前*将该IP地址添加到你的`trusted-proxies`中!
#
# 如果将此设置为0或更少则完全禁用速率限制。
#
# 示例: [1000, 500, 0]
# 默认: 300
advanced-rate-limit-requests: 300
# 字符串数组。要从速率限制中排除的CIDR范围。
# CIDR范围内的任何IP的请求将不受速率限制并且这些请求不会设置速率限制头。
#
# 对于IPv6我们只考虑到/64的子网。如果你想开放更大的前缀你需要列出多个前缀。
#
# 在以下示例情况下(可能还有很多其他情况),这可能很有用:
#
# 1. 你已设置使用API的自动化服务但它频繁被限速你信任它没有滥用实例。资源
#
# 2. 你和多人共用同一路由器/NAT登录同一实例所以你们都有相同的IP地址并且不断相互限速。
#
# 3. 你主要使用自己的家庭网络访问实例,并希望豁免家庭网络的速率限制。
#
# 调整此设置时需要小心,因为如果设置范围过宽,可能会使速率限制变得无用。如果不确定,建议宁少勿多,并根据需要调整。
#
# 示例: ["192.168.0.0/16", "2001:DB8:FACE:CAFE::/64"]
# 默认: []
advanced-rate-limit-exceptions: []
# 整数。每个CPU、每个路由分组允许的开放请求数量以应用HTTP请求限制。
# 超出计算限制的请求将被保留在一个等待队列中最长30秒然后处理或超时。
# 不在等待队列中的请求将返回状态503并设置“Retry-After”头为30秒。
#
# 开放请求限制为可用CPU * 乘数;等待队列限制为限制 * 乘数。
#
# 乘数为8的示例值
#
# 1 cpu = 08 开放, 064 等待
# 2 cpu = 16 开放, 128 等待
# 4 cpu = 32 开放, 256 等待
#
# 乘数为4的示例值
#
# 1 cpu = 04 开放, 016 等待
# 2 cpu = 08 开放, 032 等待
# 4 cpu = 16 开放, 064 等待
#
# 乘数为8是合理的默认值但对于运行在性能非常高的硬件上的实例你可能希望增加它对于使用非常慢的CPU的实例你可能希望减少它。
#
# 如果将此设置为0或更少将完全禁用HTTP请求限制。
#
# 示例: [8, 4, 9, 0]
# 默认: 8
advanced-throttling-multiplier: 8
# 持续时间。用于响应限速请求的“retry-after”头值的时间段。
# 最小分辨率为1秒。
#
# 示例: [30s, 10s, 5s, 1m]
# 默认: "30s"
advanced-throttling-retry-after: "30s"
# 整数。用于通过ActivityPub发送消息的固定协程数量的CPU倍数。
# 消息将被批量处理并推送到单一队列,倍数 * CPU数的协程将提取对垒中的消息并尝试发送。
# 这可以用于限制对外站收件箱的并发发布防止当有很多关注者的账户发布贴文时实例CPU使用率激增。
#
# 如果将此设置为0或更少无论CPU数量如何都只会使用1个发送者。这可能在你有非常严格的网络或CPU限制时有用。
#
# 乘数为2的示例值默认
#
# 1 cpu = 2 个并发发送者
# 2 cpu = 4 个并发发送者
# 4 cpu = 8 个并发发送者
#
# 乘数为4的示例值
#
# 1 cpu = 4 个并发发送者
# 2 cpu = 8 个并发发送者
# 4 cpu = 16 个并发发送者
#
# 乘数<1的示例值
#
# 1 cpu = 1 个并发发送者
# 2 cpu = 1 个并发发送者
# 4 cpu = 1 个并发发送者
advanced-sender-multiplier: 2
# 字符串数组。为实例设置Content-Security-Policy头时要添加到'img-src'和'media-src'中的额外URI。
#
# 这可以用于在浏览器中查看实例页面和个人资料时允许加载来自额外来源如S3桶等的资源。
#
# 由于非代理的S3存储将在实例启动时被探测以生成正确的Content-Security-Policy你可能永远都不需要修改此设置但把它包括在内是因为“可配置项通常越多越好”。
#
# 参见: https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
#
# 示例: ["s3.example.org", "some-bucket-name.s3.example.org"]
# 默认: []
advanced-csp-extra-uris: []
# 字符串。用于此实例的HTTP请求头过滤模式。
#
# "block" -- 只有明确被请求头过滤规则阻止的请求会被拒绝(除非它们被明确允许)。
#
# "allow" -- 只有明确被请求头过滤规则允许的请求会被接受(除非它们被明确阻止)。
# 此模式被视为实验性功能,并且几乎肯定会破坏对你实例的访问,除非非常小心。
#
# "" -- 请求头过滤禁用。
#
# 有关阻止和允许模式的更多详细信息,请查看文档:
# https://docs.gotosocial.org/zh-cn/latest/admin/request_filtering_modes
#
# 选项: ["block", "allow", ""]
# 默认: ""
advanced-header-filter-mode: ""
```

View file

@ -1,192 +0,0 @@
# 数据库
GoToSocial 将贴文、账号等存储在数据库中。可以选择使用 [SQLite](https://sqlite.org/index.html) 或 [Postgres](https://www.postgresql.org/)。
默认情况下GoToSocial 使用 Postgres但可以轻松更改。
## SQLite
顾名思义SQLite 是 GoToSocial 可用的最轻量级的数据库类型。它以简单的文件格式存储条目,通常与 GoToSocial 二进制文件位于同一目录。SQLite 非常适合小规模实例和单板计算机,使用专用数据库对它们来说过于复杂。
要配置 GoToSocial 使用 SQLite`db-type` 更改为 `sqlite`。此时 `address` 设置将是一个文件名而不是地址,所以你需要将其更改为 `sqlite.db` 或类似名称。
注意,`:memory:` 设置将使用 *内存数据库*,当你的 GoToSocial 实例停止运行时,内存将被清除。这仅用于测试,绝不适用于运行正式实例,因此*不要这样做*。
## Postgres
Postgres 是较重的数据库格式,适用于需要扩展性能的大型实例,或者需要在 GoToSocial 实例之外的专用计算机上运行数据库的情况(或运行数据库集群等复杂应用)。
你可以使用 Unix 套接字连接或 TCP 连接到 Postgres这取决于你设置的 `db-address` 值。
GoToSocial 还支持使用 SSL/TLS 通过 TCP 连接到 Postgres。如果你在不同的计算机上运行 Postgres并通过 IP 地址或主机名连接它(而不是仅在本地运行),那么 SSL/TLS **至关重要**,以防止数据泄露!
使用 Postgres 时GoToSocial 期望你已经在数据库中创建了 `db-user` 并拥有 `db-database` 的所有权。
例如,如果你设置了:
```text
db:
[...]
user: "gotosocial"
password: "some_really_good_password"
database: "gotosocial"
```
那么你应该已经在 Postgres 中创建了数据库 `gotosocial`,并将其所有权授予 `gotosocial` 用户。
执行这些操作的 psql 命令如下:
```psql
create database gotosocial with locale 'C.UTF-8' template template0;
create user gotosocial with password 'some_really_good_password';
grant all privileges on database gotosocial to gotosocial;
```
GoToSocial 使用 ULIDs全局唯一且按字典顺序可排序的标识符这在非英文排序环境中不起作用。因此创建数据库时使用 `C.UTF-8` 地区设置很重要。在已经使用非 C 地区初始化的系统上,必须使用 `template0` 原始数据库模板才能进行。
如果你希望使用特定选项连接到 Postgres可以使用 `db-postgres-connection-string` 定义连接字符串。如果 `db-postgres-connection-string` 已定义,则所有其他与数据库相关的配置字段将被忽略。例如,可以使用 `db-postgres-connection-string` 连接到 `mySchema`,用户名为 `myUser`,密码为 `myPass`,在 `localhost` 上,数据库名称为 `db`
```yaml
db-postgres-connection-string: 'postgres://myUser:myPass@localhost/db?search_path=mySchema'
```
## 设置
```yaml
############################
##### 数据库配置 ######
############################
# GoToSocial 数据库连接的相关配置
# 字符串。数据库类型。
# 选项: ["postgres","sqlite"]
# 默认: "postgres"
db-type: "postgres"
# 字符串。数据库地址或参数。
#
# 对于 Postgres这应该是数据库可以访问的地址或套接字。
#
# 对于 Sqlite这应该是你的 sqlite 数据库文件的路径。比如,/opt/gotosocial/sqlite.db。
# 如果在指定路径不存在该文件,会自动创建。
# 如果只提供了文件名(没有目录),那么数据库将创建在 GoToSocial 二进制文件的同一目录中。
# 如果 `address` 设置为 :memory:,将使用内存数据库(没有文件)。
# 警告: :memory: 应该仅用于测试目的,不应在其他情况下使用。
#
# 示例: ["localhost","my.db.host","127.0.0.1","192.111.39.110",":memory:", "sqlite.db"]
# 默认: ""
db-address: ""
# 整数。数据库连接的端口。
# 示例: [5432, 1234, 6969]
# 默认: 5432
db-port: 5432
# 字符串。数据库连接的用户名。
# 示例: ["mydbuser","postgres","gotosocial"]
# 默认: ""
db-user: ""
# 字符串。数据库连接使用的密码
# 示例: ["password123","verysafepassword","postgres"]
# 默认: ""
db-password: ""
# 字符串。要在提供的数据库类型中使用的数据库名称。
# 示例: ["mydb","postgres","gotosocial"]
# 默认: "gotosocial"
db-database: "gotosocial"
# 字符串。禁用、启用或要求数据库的 SSL/TLS 连接。
# 如果为 "disable",则不会尝试 TLS 连接。
# 如果为 "enable",则会尝试 TLS但不会检查数据库证书适用于自签名证书
# 如果为 "require",则需要 TLS 进行连接,并且必须提供有效证书。
# 选项: ["disable", "enable", "require"]
# 默认: "disable"
db-tls-mode: "disable"
# 字符串。用于数据库证书验证的主机的 CA 证书路径。
# 如果留空,仅使用主机证书。
# 如果填写,则会加载证书并添加到主机证书中。
# 示例: ["/path/to/some/cert.crt"]
# 默认: ""
db-tls-ca-cert: ""
# 整数。乘以 CPU 数量以设置允许总数的打开数据库连接(使用和空闲)。
# 你可以使用此设置来调整你的数据库连接行为,但大多数管理员不需要更改它。
#
# 乘数 8 的示例值:
#
# 1 cpu = 08 打开的连接
# 2 cpu = 16 打开的连接
# 4 cpu = 32 打开的连接
#
# 乘数 4 的示例值:
#
# 1 cpu = 04 打开的连接
# 2 cpu = 08 打开的连接
# 4 cpu = 16 打开的连接
#
# 乘数 8 是一个合理的默认值,但你可能希望为在非常高性能硬件上运行的实例增加此值,或为使用非常慢的 CPU 的实例减少此值。
#
# 请注意!!:此设置目前仅适用于 Postgres。SQLite 将始终使用 1 个连接,无论此处设置为何。这种行为将在实现更好的 SQLITE_BUSY 处理时更改。
# 更多详情请参见 https://github.com/superseriousbusiness/gotosocial/issues/1407。
#
# 示例: [16, 8, 10, 2]
# 默认: 8
db-max-open-conns-multiplier: 8
# 字符串。SQLite 日志模式。
# 仅适用于 SQLite -- 否则不使用。
# 如果设置为空字符串,则使用 sqlite 默认值。
# 参见: https://www.sqlite.org/pragma.html#pragma_journal_mode
# 示例: ["DELETE", "TRUNCATE", "PERSIST", "MEMORY", "WAL", "OFF"]
# 默认: "WAL"
db-sqlite-journal-mode: "WAL"
# 字符串。SQLite 同步模式。
# 仅适用于 SQLite -- 否则不使用。
# 如果设置为空字符串,则使用 sqlite 默认值。
# 参见: https://www.sqlite.org/pragma.html#pragma_synchronous
# 示例: ["OFF", "NORMAL", "FULL", "EXTRA"]
# 默认: "NORMAL"
db-sqlite-synchronous: "NORMAL"
# 字节大小。SQlite 缓存大小。
# 仅适用于 SQLite -- 否则不使用。
# 如果设置为空字符串或零,则使用 sqlite 默认值2MiB
# 参见: https://www.sqlite.org/pragma.html#pragma_cache_size
#
# 缓存并非越大越好。它们需要针对工作负载进行调整。默认设置对于大多数实例应该已足够,不应该更改。
# 如果你确实更改它,请确保在 GoToSocial 帮助频道求助时提到这一点。
#
# 示例: ["0", "2MiB", "8MiB", "64MiB"]
# 默认: "8MiB"
db-sqlite-cache-size: "8MiB"
# 持续时间。SQlite 忙等待时间。
# 仅适用于 SQLite -- 否则不使用。
# 如果设置为空字符串或零,则使用 sqlite 默认值。
# 参见: https://www.sqlite.org/pragma.html#pragma_busy_timeout
# 示例: ["0s", "1s", "30s", "1m", "5m"]
# 默认: "30m"
db-sqlite-busy-timeout: "30m"
# 字符串。完整的数据库连接字符串
#
# 此连接字符串仅适用于 Postgres。当定义此字段时所有其他与数据库相关的配置字段将被忽略。
# 此字段允许你微调与 Postgres 的连接。
#
# 示例: ["postgres://user:pass@localhost/db?search_path=gotosocial", "postgres://user:pass@localhost:9999/db"]
# 默认: ""
db-postgres-connection-string: ""
cache:
# cache.memory-target 设置一个目标限制,
# 应用程序将尝试将其缓存保持在此限制内。
# 这是基于内存对象的估计大小,因此绝对不精确。
# 示例: ["100MiB", "200MiB", "500MiB", "1GiB"]
# 默认: "100MiB"
memory-target: "100MiB"
```

View file

@ -1,121 +0,0 @@
# 基础配置
GoToSocial 的基础配置,包括域名、端口、绑定地址和传输协议等基本内容。
这里*真正*需要设置的只有 `host`,也就是你实例可以访问的域名,可能还需要设置 `port`
## 设置
```yaml
###########################
##### 通用配置 ######
###########################
# 字符串。应用程序使用的日志级别,必须是小写。
# 选项: ["trace","debug","info","warn","error","fatal"]
# 默认: "info"
log-level: "info"
# 布尔值。当日志级别设置为 debug 或 trace 时记录数据库查询。
# 这一设置会产生详细的日志,因此最好在你尝试定位问题时才启用。
# 选项: [true, false]
# 默认: false
log-db-queries: false
# 布尔值。在日志行中包含客户端 IP。
# 选项: [true, false]
# 默认: true
log-client-ip: true
# 字符串。日志行中时间戳的格式。
# 如果设置为空字符串,则时间戳将完全从日志中省略。
#
# 该格式必须符合 Go 的 time.Layout 规定,
# 详见 https://pkg.go.dev/time#pkg-constants。
#
# 示例: ["2006-01-02T15:04:05.000Z07:00", ""]
# 默认: "02/01/2006 15:04:05.000"
log-timestamp-format: "02/01/2006 15:04:05.000"
# 字符串。内部使用的应用程序名称。
# 示例: ["My Application","gotosocial"]
# 默认: "gotosocial"
application-name: "gotosocial"
# 字符串。在首页显示的用户。如果没有设置用户,将显示默认的首页。
# 示例: "admin"
# 默认: ""
landing-page-user: ""
# 字符串。可以访问到本实例的主机名。默认值为用于本地测试的 localhost
# 但在实际运行时你*绝对*应该更改此设置,否则你的服务器将无法正常工作。
# 在你的实例已经运行过一次后,请不要更改此项,否则会导致问题!
# 示例: ["gts.example.org","some.server.com"]
# 默认: "localhost"
host: "localhost"
# 字符串。在交换账户信息时使用的域名。当你希望服务器位于
# "gts.example.org",但希望账户域名为 "example.org" 时,这会更好看,
# 或更加简短易记。
#
# 为使此设置正常工作,你需要将 "example.org/.well-known/webfinger" 的请求
# 重定向到 "gts.example.org/.well-known/webfinger",以便 GtS 正常处理它们。
#
# 你还应该以同样的方式重定向 "example.org/.well-known/nodeinfo" 的请求。
#
# 你还应该以同样的方式重定向 "example.org/.well-known/host-meta" 的请求。
# 这个端点被许多客户端用于在主机名和账户域名不同时发现 API 端点。
#
# 空字符串(即,未设置)表示将使用 'host' 的相同值。
#
# 在你的服务器已经运行过一次后请不要更改此项,否则会导致问题!
#
# 在更改此设置前,请阅读安装指南的相应部分:
# https://docs.gotosocial.org/zh-cn/latest/advanced/host-account-domain/
#
# 示例: ["example.org","server.com"]
# 默认: ""
account-domain: ""
# 字符串。服务器从外界可访问的协议。
#
# 仅在本地测试时,才需将其更改为 HTTP在 99.99% 的情况下你不应该更改此项!
#
# 这应该是你的服务器实际可以访问的 URI 的协议部分。
# 因此,即使你在处理 SSL 证书的反向代理之后运行 GoToSocial
# 而不是使用内置的 letsencrypt它仍然应该是 https而不是 http。
#
# 再次强调,仅在本地测试时才需将其更改为 HTTP如果你将其设置为 `http`,启动实例,
# 然后再更改为 `https`,你的实例上已有的用户的 URI 生成过程将被破坏。在 100% 知道自己在做什么时才更改此设置。
#
# 选项: ["http","https"]
# 默认: "https"
protocol: "https"
# 字符串。GoToSocial 服务器绑定的地址。
# 可以是 IPv4 地址或 IPv6 地址(用方括号括起来),或者是主机名。
# 默认值为绑定到所有接口,使服务器可以被其他机器访问。在大多数场景中无需更改此项。
# 如果你在与代理同一台机器上使用反向代理设置 GoToSocial
# 建议将其设置为 "localhost" 或等效值,以防止代理被绕过。
# 示例: ["0.0.0.0", "172.128.0.16", "localhost", "[::]", "[2001:db8::fed1]"]
# 默认: "0.0.0.0"
bind-address: "0.0.0.0"
# 整数。GoToSocial 网页服务器和 API 的监听端口。如果你在反向代理和/或 Docker 容器中运行,
# 请将其设置为任意值(或保留默认值),并确保正确转发。
# 如果你启用了内建 letsencrypt 并在本机直接运行 GoToSocial
# 可能希望将其设置为 443标准 https 端口),除非你有其他服务正在使用该端口。
# 此项*不得*与下面指定的 letsencrypt 端口相同,除非禁用 letsencrypt。
# 示例: [443, 6666, 8080]
# 默认: 8080
port: 8080
# 字符串数组。用于通过反向代理确定真实客户端 IP 的受信任代理的 CIDR 或 IP 地址。
# 如果你的实例在 Docker 容器中运行,且位于 Traefik 或 Nginx 后,请添加你的 Docker 网络的子网,
# 或 Docker 网络的网关,和/或反向代理的地址(如果不是运行在本机上)。
# 示例: ["127.0.0.1/32", "172.20.0.1"]
# 默认: ["127.0.0.1/32", "::1"] (本地主机 ipv4 + ipv6)
trusted-proxies:
- "127.0.0.1/32"
- "::1"
```

View file

@ -1,67 +0,0 @@
# HTTP 客户端
## 设置
```yaml
################################
##### HTTP 客户端设置 #####
################################
# GoToSocial 用于向外站资源发送请求的 HTTP 客户端连接设置
# (如贴文获取、媒体获取、向对方收件箱发信等)。
http-client:
# 持续时间。对外 HTTP 请求的超时时长。
# 如果超时,连接到外站服务器的请求将被中断。
# 设置为 0s 表示没有超时:不建议这样做!
# 示例: ["5s", "10s", "0s"]
# 默认: "10s"
timeout: "10s"
########################################
#### 保留的例外 IP 范围 ######
########################################
#
# 在提供的 IPv4/v6 CIDR 范围内显式允许或屏蔽出站连接。
#
# 默认情况下作为基本的安全预防措施GoToSocial 屏蔽大多数“特殊用途”
# IP 范围内的出站连接。然而,具有更复杂设置(代理、特殊 NAT 环境等)的管理员
# 可能希望显式覆盖一个或多个被屏蔽的范围。
#
# 以下每个允许/屏蔽配置选项接受一个 IPv4 和/或 IPv6 CIDR 字符串数组。
# 例如,要覆盖本地站的 IPv4 和 IPv6 建立连接的硬编码屏蔽,请设置:
#
# allow-ips: ["127.0.0.1/32", "::1/128"].
#
# 你也可以使用 YAML 多行数组来定义这些,但要注意缩进。
#
# 建立连接时GoToSocial 将首先检查目标是否在显式允许的 IP 范围内,
# 然后检查显式屏蔽的 IP 范围,再检查默认(硬编码)屏蔽的 IP 范围,
# 首次命中允许匹配项时返回 OK首次命中屏蔽匹配项时返回不 OK
# 或如果没有命中,则默认返回 OK。
#
# 和所有安全设置一样,最好从最严格的配置开始,根据用例放宽,
# 而不是从最宽松的配置开始,然后再试图亡羊补牢。记住这一点:
# - 除非你有充分的理由,否则不要修改这些设置,只在你知道自己在做什么的情况下修改。
# - 添加显式允许的例外 IP 段时,尽可能使用最小 CIDR。
#
# 有关保留/特殊范围,请参阅:
# - https://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml
# - https://www.iana.org/assignments/iana-ipv6-special-registry/iana-ipv6-special-registry.xhtml
#
# allow-ips 和 block-ips 默认都是空数组。
allow-ips: []
block-ips: []
# 布尔值。禁用对外站服务器 TLS 证书的验证。
# 设置为 'true' 时,当外站服务器提供无效或自签名证书时,
# GoToSocial 不会报错。
#
# 该设置仅用于测试!如果你在生产环境中启用,
# 就会让你的服务器容易受到中间人攻击!不要更改此设置,
# 除非你非常清楚自己在做什么以及为什么这么做。
#
# 默认: false
tls-insecure-skip-verify: false
```

View file

@ -1,138 +0,0 @@
# 配置概述
GoToSocial 力求尽可能让所有属性可配置,以适应多种不同的使用场景。
我们尽量提供合理的默认值,但在运行 GoToSocial 实例时,你需要进行*一些*配置管理。
## 配置方法
配置 GoToSocial 实例有三种不同的方法,这些方法可以根据你的设置进行组合。
### 配置文件
配置 GoToSocial 最简单的方法是将配置文件传递给 `gotosocial server start` 命令,例如:
```bash
gotosocial --config-path ./config.yaml server start
```
该命令需要一个 [YAML](https://en.wikipedia.org/wiki/YAML) 或 [JSON](https://en.wikipedia.org/wiki/JSON) 格式的文件。
可以在[这里](https://github.com/superseriousbusiness/gotosocial/blob/main/example/config.yaml)找到示例配置文件,其中包含每个配置字段的解释、默认值和示例值。此示例文件也包含在每个发行版的下载资源中。
建议创建你自己的配置文件,只更改你需要改变的设置。这可以确保在每次发布时,你不必合并默认值的更改或者增删未从默认值更改的配置设置。
#### 在容器中挂载
你可能需要在容器中挂载一个 `config.yaml`,因为某些设置不容易通过环境变量或命令行标志管理。
为此,请在主机上创建一个 `config.yaml`,将其挂载到容器中,然后告诉 GoToSocial 读取该配置文件。可以通过将容器的运行命令设置为 `--config-path /path/inside/container/to/config.yaml` 或使用 `GTS_CONFIG_PATH` 环境变量来实现这一点。
对于 docker compose可以这样修改配置
```yaml
services:
gotosocial:
command: ["--config-path", "/gotosocial/config.yaml"]
volumes:
- type: bind
source: /path/on/the/host/to/config.yaml
target: /gotosocial/config.yaml
read_only: true
```
或者,通过环境变量来修改配置:
```yaml
services:
gotosocial:
environment:
GTS_CONFIG_PATH: /gotosocial/config.yaml
volumes:
- type: bind
source: /path/on/the/host/to/config.yaml
target: /gotosocial/config.yaml
read_only: true
```
对于 Docker 或 Podman 命令行,需要传递一个 [符合规范的挂载参数](https://docs.podman.io/en/latest/markdown/podman-run.1.html#mount-type-type-type-specific-option)。
在使用 `docker run``podman run` 时,传递 `--config-path /gotosocial/config.yaml` 作为命令,例如:
```sh
podman run \
--mount type=bind,source=/path/on/the/host/to/config.yaml,destination=/gotosocial/config.yaml,readonly \
docker.io/superseriousbusiness/gotosocial:latest \
--config-path /gotosocial/config.yaml
```
使用 `GTS_CONFIG_PATH` 环境变量:
```sh
podman run \
--mount type=bind,source=/path/on/the/host/to/config.yaml,destination=/gotosocial/config.yaml,readonly \
--env 'GTS_CONFIG_PATH=/gotosocial/config.yaml' \
docker.io/superseriousbusiness/gotosocial:latest
```
### 环境变量
你也可以通过设置[环境变量](https://en.wikipedia.org/wiki/Environment_variable)来配置 GoToSocial。这些环境变量遵循的格式为
1. 在配置标志前加上 `GTS_`
2. 全部使用大写。
3. 将短横线(`-`)替换为下划线(`_`)。
例如,如果不想在 config.yaml 中设置 `media-image-max-size``2097152`,你可以改为设置环境变量:
```text
GTS_MEDIA_IMAGE_MAX_SIZE=2097152
```
如果对于环境变量名称有疑问,只需查看你正在使用的子命令的 `--help`
### 命令行标志
最后,你可以使用命令行标志来设置配置值,这些标志是在运行 `gotosocial` 命令时直接传递的。例如,不在 config.yaml 或环境变量中设置 `media-image-max-size`,你可以直接通过命令行传递值:
```bash
gotosocial server start --media-image-max-size 2097152
```
如果不确定哪些标志可用,请检查 `gotosocial --help`
## 优先级
上述配置方法按列出的顺序相互覆盖。
```text
命令行标志 > 环境变量 > 配置文件
```
也就是说,如果你在配置文件中将 `media-image-max-size` 设置为 `2097152`,但*也*设置了环境变量 `GTS_MEDIA_MAX_IMAGE_SIZE=9999999`,则最终值将为 `9999999`,因为环境变量比 config.yaml 中设置的值具有*更高的优先级*。
命令行标志具有最高优先级,因此如果你设置了 `--media-image-max-size 13121312`,无论你在其他地方设置了什么,最终值都将为 `13121312`
这意味着在你只想尝试改变一件事,但不想编辑配置文件的情况下,可以临时使用环境变量或命令行标志来设置那个东西。
## 默认值
*大多数*配置参数都提供了合理的默认值,除了必须自定义值的情况。
请查看[示例配置文件](https://github.com/superseriousbusiness/gotosocial/blob/main/example/config.yaml)以获取默认值,或运行 `gotosocial --help`
## `GTS_WAZERO_COMPILATION_CACHE`
启动时GoToSocial 会将嵌入的 WebAssembly `ffmpeg``ffprobe` 二进制文件编译为 [Wazero](https://wazero.io/) 兼容模块,这些模块用于媒体处理,无需任何外部依赖。
为了加快 GoToSocial 的启动时间,你可以在首次启动时缓存已编译的模块,这样 GoToSocial 就不必在每次启动时从头开始编译它们。
你可以通过将环境变量 `GTS_WAZERO_COMPILATION_CACHE` 设置为一个目录来指示 GoToSocial 存储 Wazero 工件,该目录将由 GtS 用于存储两个大小约为 ~50MiB 的小型工件(总计约 ~100MiB
要了解此方法的示例,请参见 [docker-compose.yaml](https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/example/docker-compose/docker-compose.yaml) 和 [gotosocial.service](https://raw.githubusercontent.com/superseriousbusiness/gotosocial/main/example/gotosocial.service) 示例文件。
如果你希望在 systemd 或 Docker 之外为 GtS 提供此值,可以在启动 GtS 服务器时通过以下方式进行:
```bash
GTS_WAZERO_COMPILATION_CACHE=~/gotosocial/.cache ./gotosocial --config-path ./config.yaml server start
```

View file

@ -1,115 +0,0 @@
# 站点
## 设置
```yaml
###########################
##### 站点配置 #####
###########################
# 与实例间联合、隐藏/显示页面等相关的配置。
# 字符串数组。BCP47 语言标签,用于指示本站用户的首选语言。
#
# 如果你提供了这些标签,请按照从最优先到最次优先的顺序提供。
# 但请注意,从此数组中省略某种语言并不意味着该语言不能在本站使用,
# 而只是表示不会将其作为为本站的首选语言展示。
#
# 这里可以不提供任何条目;这样的话,你的站点将没有特定的首选语言。
#
# 常用标签参考此处https://en.wikipedia.org/wiki/IETF_language_tag#List_of_common_primary_language_subtags
# 所有当前标签参考此处https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry
#
# 示例: ["zh", "zh-Hans", "zh-Hans-CN", "zh-Hant", "zh-Hant-TW", "en"]
# 默认值: []
instance-languages: []
# 字符串。用于本站的联合模式。
#
# "blocklist" -- 默认开放联合。只有被明确屏蔽的站点会被拒绝(除非它们被另外明确设定的允许规则放行)。
#
# "allowlist" -- 默认关闭联合。只有被明确允许的站点才能与本站互动。
#
# 关于屏蔽列表和允许列表模式的更多详细信息,请查阅文档:
# https://docs.gotosocial.org/zh-cn/latest/admin/federation_modes
#
# 选项: ["blocklist", "allowlist"]
# 默认值: "blocklist"
instance-federation-mode: "blocklist"
# 布尔值。启用针对通过联合 API 进入本站的消息的启发式垃圾过滤。无论你在此处设置什么,
# 都仍将执行基本的相关性检查,但如果你被其他站点的垃圾信息骚扰,并希望更严格地过滤掉垃圾信息,
# 可以尝试启用此设置。
#
# 这是一个实验性设置,可能会过滤掉合法信息,或未能过滤掉垃圾信息。建议仅在
# Fediverse 出现垃圾信息潮时启用此设置,以保持站点的可用性。
#
# 判断消息是否为垃圾信息的决策基于以下启发规则,依次进行,接收者 = 收到消息的账户,发送者 = 发送消息的外站账户。
#
# 首先执行基本相关性检查
#
# 1. 接收者关注了发送者。返回 OK。
# 2. 贴文未提及接收者。返回 NotRelevant。
#
# 如果 instance-federation-spam-filter = false则现在返回 OK。
# 否则进一步检查:
#
# 3. 接收者已锁定账号并被发送者关注。返回 OK。
# 4. 提及五人或以上。返回 Spam。
# 5. 接收者关注(请求关注)一个被提及账户。返回 OK。
# 6. 贴文有媒体附件。返回 Spam。
# 7. 贴文包含非提及、非话题标签的链接。返回 Spam。
#
# 被识别为垃圾的信息将从本站删除,不会插入数据库或主页时间线或通知中。
#
# 选项: [true, false]
# 默认值: false
instance-federation-spam-filter: false
# 布尔值。允许未经认证的用户查询 /api/v1/instance/peers?filter=open 以查看与本站联合的站点列表。
# 即使设置为 'false',认证用户(本站成员)仍然可以查询该端点。
# 选项: [true, false]
# 默认值: false
instance-expose-peers: false
# 布尔值。允许未经认证的用户查询 /api/v1/instance/peers?filter=suspended 以查看被本站屏蔽/封禁的站点列表。
# 即使设置为 'false',认证用户(本站成员)仍然可以查询该端点。
#
# 警告:将此变量设置为 'true' 可能导致你的站点被屏蔽列表爬虫攻击。
# 参考: https://docs.gotosocial.org/zh-cn/latest/admin/domain_blocks/#block-announce-bots
#
# 选项: [true, false]
# 默认值: false
instance-expose-suspended: false
# 布尔值。允许未经认证的用户查看 /about/suspended
# 显示本站屏蔽/封禁站点的 HTML 渲染列表。
# 选项: [true, false]
# 默认值: false
instance-expose-suspended-web: false
# 布尔值。允许未经认证的用户查询 /api/v1/timelines/public 以查看本站的公共贴文列表。
# 即使设置为 'false',认证用户(本站成员)仍然可以查询该端点。
# 选项: [true, false]
# 默认值: false
instance-expose-public-timeline: false
# 布尔值。此标志是否将 GoToSocial 的 ActivityPub 消息发送到收件人的共享收件箱(如果可用),
# 而不是将每条消息分别发送给应接收消息的每个主体。
#
# 当发送给共享收件箱的多个收件人时,共享收件箱传递能显著减少网络负载(例如,大型 Mastodon 实例)。
#
# 参考: https://www.w3.org/TR/activitypub/#shared-inbox-delivery
#
# 选项: [true, false]
# 默认值: true
instance-deliver-to-shared-inboxes: true
# 布尔值。此标志将在 /api/v1/instance 中包含的版本字段中注入一个 Mastodon 版本。
# 这个版本通常被 Mastodon 客户端用于 API 功能检测。通过注入一个与 Mastodon 兼容的版本,
# 可以促使那些客户端在 GoToSocial 上正常运行。
#
# 选项: [true, false]
# 默认值: false
instance-inject-mastodon-version: false
```

View file

@ -1,87 +0,0 @@
# 媒体
## 设置
```yaml
########################
##### 媒体配置 ######
########################
# 关于媒体上传(媒体,图片描述,表情符号)的配置。
# 大小。通过 API 上传的媒体最大大小(字节)。
#
# 增大此限制可能导致其他服务器无法获取贴文中的媒体。
#
# 示例: [2097152, 10485760, 40MB, 40MiB]
# 默认: 40MiB (41943040 字节)
media-local-max-size: 40MiB
# 大小。从其他实例下载媒体的最大大小(字节)。
#
# 降低此限制可能导致你的实例无法获取贴文中的媒体。
#
# 示例: [2097152, 10485760, 40MB, 40MiB]
# 默认: 40MiB (41943040 字节)
media-remote-max-size: 40MiB
# 整数。图像或视频描述所需的最小字符数。
# 示例: [500, 1000, 1500]
# 默认: 0 (无要求)
media-description-min-chars: 0
# 整数。图像或视频描述允许的最大字符数。
# 示例: [1000, 1500, 3000]
# 默认: 1500
media-description-max-chars: 1500
# 大小。通过管理员 API 上传到本站的表情最大大小(字节)。
#
# 默认值与 Mastodon 表情大小限制相同50kb这有助于实现良好的互操作性。提高此限制可能会影响表情在其他实例间的联合需谨慎。
#
# 示例: [51200, 102400, 50KB, 50KiB]
# 默认: 50KiB (51200 字节)
media-emoji-local-max-size: 50KiB
# 大小。从其他实例下载表情的最大大小(字节)。
#
# 默认值为 100kb是 media-emoji-local-max-size 默认值的两倍。这在较高表情大小限制的实例间保持良好的互操作性,并且不会占用太多存储空间。
#
# 示例: [51200, 102400, 100KB, 100KiB]
# 默认: 100KiB (102400 字节)
media-emoji-remote-max-size: 100KiB
# 整数。添加到媒体处理池中的 ffmpeg+ffprobe 实例数量。
#
# 增加此数量会加快并发媒体处理速度,但每增加一个实例将消耗约 250MB 的(峰值)内存。
#
# 如果你有多余的 RAM并且/或者你为超过 50 人提供服务(他们发布/查看大量媒体),你可以增加这个数值,但单用户实例或在受限(低内存)环境中运行 GoToSocial 时应保持为 1。
#
# 如果将此数值设为 0 或更少,则会根据 GOMAXPROCS x 1 进行缩放,通常会在主机的每个 CPU 核上生成一个 ffmpeg 实例和一个 ffprobe 实例。
#
# 示例: [1, 2, -1, 8]
# 默认: 1
media-ffmpeg-pool-size: 1
# 以下媒体清理设置允许管理员自定义什么时候运行媒体清理 + 修剪作业及执行相关作业的频率,默认设置为相对合理(每晚午夜)。有关这些设置的具体操作及一些自定义示例,请参见文档:
# https://docs.gotosocial.org/zh-cn/latest/admin/media_caching#cleanup
# 整数。从外站实例缓存媒体的天数,到期之后它们将从缓存中移除。当外站媒体从缓存中移除时,它会从存储中删除,但媒体的数据库条目将保留,以便用户请求时可以重新获取。
#
# 如果设置为 0外站实例的媒体将无限期缓存。
#
# 示例: [30, 60, 7, 0]
# 默认: 7
media-remote-cache-days: 7
# 字符串。24 小时格式的时间,格式为 hh:mm。
# 示例: ["14:30", "00:00", "04:00"]
# 默认: "00:00" (午夜)。
media-cleanup-from: "00:00"
# 时长。媒体清理运行之间的间隔。
# 每 24 小时多次清理不推荐并且可能是不必要的。将此值设置得过低(如每 10 分钟一次)可能会导致队列滞后并可能产生其他问题。
# 示例: ["24h", "72h", "12h"]
# 默认: "24h"(每天一次)。
media-cleanup-every: "24h"
```

View file

@ -1,53 +0,0 @@
# 可观测性
这些设置允许你调整和配置某些与可观测性相关的行为。
## 指标
在启用指标之前,[请阅读指南](../advanced/metrics.md),并确保你已为设置采取适当的安全措施。
## 设置
```yaml
##################################
##### 可观测性设置 #####
##################################
# 字符串。用于提取请求或跟踪ID的请求头名称。通常由负载均衡器或代理设置。
# 默认值: "X-Request-Id"
request-id-header: "X-Request-Id"
# 布尔值。启用基于OpenTelemetry的跟踪支持。
# 默认值: false
tracing-enabled: false
# 字符串。设置跟踪系统的传输协议。可以是 "grpc" 表示OTLP gRPC或 "http" 表示OTLP HTTP。
# 选项: ["grpc", "http"]
# 默认值: "grpc"
tracing-transport: "grpc"
# 字符串。跟踪收集器的端点。使用gRPC或HTTP传输时应提供不含协议方案的地址/端口组合。
# 示例: ["localhost:4317"]
# 默认值: ""
tracing-endpoint: ""
# 布尔值。禁用gRPC和HTTP传输协议的TLS。
# 默认值: false
tracing-insecure-transport: false
# 布尔值。启用基于OpenTelemetry的指标支持。
# 默认值: false
metrics-enabled: false
# 布尔值。为Prometheus指标端点启用HTTP基本认证。
# 默认值: false
metrics-auth-enabled: false
# 字符串。Prometheus指标端点的用户名。
# 默认值: ""
metrics-auth-username: ""
# 字符串。Prometheus指标端点的密码。
# 默认值: ""
metrics-auth-password: ""
```

View file

@ -1,156 +0,0 @@
# OpenID Connect (OIDC)
GoToSocial 支持 [OpenID Connect](https://openid.net/connect/),这是一种基于 [OAuth 2.0](https://oauth.net/2/) 构建的身份验证协议OAuth 2.0 是授权协议的行业标准协议之一。
这意味着你可以将 GoToSocial 连接到外部 OIDC 提供商,如 [Gitlab](https://docs.gitlab.com/ee/integration/openid_connect_provider.html)、[Google](https://cloud.google.com/identity-platform/docs/web/oidc)、[Keycloak](https://www.keycloak.org/) 或 [Dex](https://dexidp.io/),并允许用户使用其凭据登录 GoToSocial。
在以下情况下,这非常方便:
- 你在一个平台上运行多个服务Matrix、Peertube、GoToSocial并希望用户可以使用相同的登录页面登录所有服务。
- 你希望将用户、账户、密码等的管理委托给外部服务,以简化管理。
- 你已经在外部系统中有很多用户,不想在 GoToSocial 中手动重新创建他们。
!!! tip
如果用户尚不存在,且你的 IdP 没有返回非空的 `email` 作为 claims 的一部分,登录将会失败。这个 email 需要在此实例中是唯一的。尽管我们使用 `sub` claim 将外部身份与 GtS 用户关联,但创建用户时需要一个与之关联的 email。
## 设置
GoToSocial 为 OIDC 提供以下配置设置,以下显示的是其默认值。
```yaml
#######################
##### OIDC CONFIG #####
#######################
# 配置与外部 OIDC 提供商(如 Dex、Google、Auth0 等)的身份验证。
# 布尔值。启用与外部 OIDC 提供商的身份验证。如果设置为 true则其他 OIDC 选项也必须设置。
# 如果设置为 false则使用标准的内部 OAuth 流程,用户使用用户名/密码登录 GtS。
# 选项: [true, false]
# 默认值: false
oidc-enabled: false
# 字符串。oidc idp身份提供商的名称。这将在用户登录时显示。
# 示例: ["Google", "Dex", "Auth0"]
# 默认值: ""
oidc-idp-name: ""
# 布尔值。跳过对从 OIDC 提供商返回的令牌的正常验证流程,即不检查过期或签名。
# 这应仅用于调试或测试,绝对不要在生产环境中使用,因为这极其不安全!
# 选项: [true, false]
# 默认值: false
oidc-skip-verification: false
# 字符串。OIDC 提供商 URI。这是 GtS 将用户重定向到的登录地址。
# 通常这看起来像是一个标准的网页 URL。
# 示例: ["https://auth.example.org", "https://example.org/auth"]
# 默认值: ""
oidc-issuer: ""
# 字符串。在 OIDC 提供商处注册的此客户端的 ID。
# 示例: ["some-client-id", "fda3772a-ad35-41c9-9a59-f1943ad18f54"]
# 默认值: ""
oidc-client-id: ""
# 字符串。在 OIDC 提供商处注册的此客户端的密钥。
# 示例: ["super-secret-business", "79379cf5-8057-426d-bb83-af504d98a7b0"]
# 默认值: ""
oidc-client-secret: ""
# 字符串数组。向 OIDC 提供商请求的范围。返回的值将用于填充在 GtS 中创建的用户。
# 'openid' 和 'email' 是必需的。
# 'profile' 用于提取新创建用户的用户名。
# 'groups' 是可选的,可以用于根据 oidc-admin-groups 确定用户是否为管理员。
# 示例: 见 eg., https://auth0.com/docs/scopes/openid-connect-scopes
# 默认值: ["openid", "email", "profile", "groups"]
oidc-scopes:
- "openid"
- "email"
- "profile"
- "groups"
# 布尔值。将通过 OIDC 进行身份验证的用户与现有用户基于其电子邮件地址进行关联。
# 这主要用于迁移目的,即从使用不稳定 `email` claim 进行唯一用户标识的旧版 GtS 迁移。对于大多数用例,应设置为 false。
# 选项: [true, false]
# 默认值: false
oidc-link-existing: false
# 字符串数组。如果返回的 ID 令牌包含与 oidc-allowed-groups 中的某个组匹配的 'groups' claim则该用户将在 GtS 实例上被授予访问权限。
# 如果数组为空,则授予所有组权限。
# 默认值: []
oidc-allowed-groups: []
# 字符串数组。如果返回的 ID 令牌包含与 oidc-admin-groups 中的某个组匹配的 'groups' claim则该用户将在 GtS 实例上被授予管理员权限。
# 默认值: []
oidc-admin-groups: []
```
## 行为
在 GoToSocial 上启用 OIDC 后,默认登录页面会自动重定向到 OIDC 提供商的登录页面。
这意味着 OIDC 本质上 *替代* 了正常的 GtS 邮箱/密码登录流程。
由于 ActivityPub 标准的工作方式,你 _不能_ 在设置用户名后更改它。这与 OIDC 规范冲突,该规范不保证 `preferred_username` 字段是稳定的。
为了解决这个问题,我们要求用户在首次登录尝试时提供用户名。此字段预先填入 `preferred_username` claim 的值。
在认证后GtS 存储由 OIDC 提供商提供的 `sub` claim。在后续的身份验证尝试中这个 claim 被用作唯一的用户查找方式。
这使你可以在提供商级别更改用户名而不丢失对 GtS 账户的访问。
### 群组成员身份
大多数 OIDC 提供商允许在返回的 claims 中包含群组和群组成员身份的概念。GoToSocial 可以使用群组成员身份来确定从 OIDC 流中返回的用户是否应创建为管理员账户。
如果返回的 OIDC 群组信息中包含配置在 `oidc-admin-groups` 中的群组成员身份,则该用户将被创建/登录为管理员。
## 从旧版本迁移
如果你从使用不稳定 `email` claim 进行唯一用户标识的旧版 GtS 迁移过来,可以将 `oidc-link-existing` 配置设置为 `true`。如果无法为提供商返回的 ID 找到用户,则会根据 `email` claim 进行查找。如果成功,稳定 ID 将被添加到匹配的用户数据库中。
你应仅在有限时间内使用此功能,以避免恶意账户盗取。
## 提供商示例
### Dex
[Dex](https://dexidp.io/) 是一个可以自行托管的开源 OIDC 提供商。安装 Dex 的过程不在本文档范围内,你可以在 [这里](https://dexidp.io/docs/) 查看 Dex 文档。
Dex 的优势在于它也用 Go 编写,像 GoToSocial 一样,这意味着它体积小、运行快,在低功耗系统上也能很好地运行。
要配置 Dex 和 GoToSocial 一起工作,在 Dex 配置的 `staticClients` 部分创建以下客户端:
```yaml
staticClients:
- id: 'gotosocial_client'
redirectURIs:
- 'https://gotosocial.example.org/auth/callback'
name: 'GoToSocial'
secret: 'some-client-secret'
```
确保将 `gotosocial_client` 替换为你想要的客户端 ID并将 `secret` 替换为一个合理长且安全的密钥(例如 UUID。你还应该将 `gotosocial.example.org` 替换为 GtS 实例的 `host`,但保留 `/auth/callback` 不变。
然后,编辑 GoToSocial config.yaml 中的 `oidc` 部分如下:
```yaml
oidc:
enabled: true
idpName: "Dex"
skipVerification: false
issuer: "https://auth.example.org"
clientID: "gotosocial_client"
clientSecret: "some-client-secret"
scopes:
- "openid"
- "email"
- "profile"
- "groups"
```
确保将 `issuer` 变量替换为你的 Dex 提供商设置。这应该是你的 Dex 实例的可访问到的确切 URI。
现在,重启 GoToSocial 和 Dex以便新设置生效。
当你下次登录 GtS 时,你应该会被重定向到 Dex 的登录页面。登录成功后,你将返回到 GoToSocial。

View file

@ -1,78 +0,0 @@
# 邮件配置 (smtp)
GoToSocial 支持通过[简单邮件传输协议](https://wikipedia.org/wiki/Simple_Mail_Transfer_Protocol)(即 **smtp**)向用户发送邮件。
配置 GoToSocial 发送邮件不是必需的,但它在发送确认邮件、通知以及处理密码重置请求等方面非常有用。
要使 GoToSocial 可以发送邮件,你需要一项支持 smtp 的邮件服务,可以在 GoToSocial 所运行的同一台机器上运行SMTP服务器也可以使用像 [Mailgun](https://mailgun.com) 这样的外部服务。如果你的邮件提供商支持 smtp请咨询他们—大多数都支持也可能使用免费的个人电子邮件地址发送邮件但如果发送大量邮件可能会遇到问题。
要验证你的配置,你可以使用设置面板中的“管理 -> 操作 -> 邮件”部分来发送测试邮件。
## 设置
以下是 smtp 的配置选项:
```yaml
#######################
##### SMTP 配置 #####
#######################
# 配置通过 smtp 服务器发送邮件。详情请见 https://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol
# 字符串。你想使用的 smtp 服务器的主机名。
# 如果未设置,将不使用 smtp 发送邮件,你可以忽略其他设置。
# 示例: ["mail.example.org", "localhost"]
# 默认值: ""
smtp-host: ""
# 整数。用于连接 smtp 服务器的端口。
# 在大多数情况下,你应使用端口 587。
# 示例: []
# 默认值: 0
smtp-port: 0
# 字符串。与 smtp 服务器进行身份验证时使用的用户名。
# 你的 smtp 服务应已提供给你。
# 这通常是(但不总是)一个电子邮件地址。
# 示例: ["maillord@example.org"]
# 默认值: ""
smtp-username: ""
# 字符串。与 smtp 服务器进行身份验证时使用的密码。
# 你的 smtp 服务应已提供给你。
# 示例: ["1234", "password"]
# 默认值: ""
smtp-password: ""
# 字符串。发送邮件的‘发件人’地址。
# 示例: ["mail@example.org"]
# 默认值: ""
smtp-from: ""
# 布尔值。如果为 true当一封邮件有多个收件人时每个收件人都将包含在收件人字段中以便每个收件人可以看到其他谁收到了邮件并且如果他们愿意可以“回复所有人”。
#
# 如果为 false邮件将发送给未公开的收件人并且每个收件人将看不到其他收件人。
#
# 如果你希望通过“回复所有人”来讨论新的举报,可能需要将此设置更改为 'true'。
# 默认值: false
smtp-disclose-recipients: false
```
请注意,如果你没有设置 `Host`,则 smtp 发送邮件将被禁用其他设置将被忽略。GoToSocial 仍会记录(跟踪级别)如果启用 smtp 本可以发送的邮件。
## 什么时候发送电子邮件?
目前,电子邮件在以下场景中发送:
- 向新用户通过注册页面或 API 创建新账户时,向其提交的电子邮件地址发送确认请求。
- 当新账户通过上述渠道创建账户时,向实例管理员发送通知。
- 当收到新的举报时,向所有活跃的实例管理员+站务发送通知。默认情况下,收件地址将位于密送列表中,但你可以通过设置 `smtp-disclose-recipients` 更改此行为。
- 当举报被管理员关闭时,向举报创建者(若为本站用户)发送邮件。
## HTML 与纯文本
默认情况下,邮件以纯文本形式发送。目前,没有选项可以发送 html 格式的邮件,但如果有足够的需求,这可能会在以后添加。
## 自定义
如果你愿意,可以自定义用于生成邮件的模板。请按照 `web/templates` 中的示例进行操作。

View file

@ -1,38 +0,0 @@
# 贴文
## 设置
```yaml
###########################
##### 贴文配置 #####
###########################
# 有关创建贴文的配置和允许的限制。
# 整数值。新贴文允许的最大字符数,
# 包括内容警告(如果设置)。
#
# 请注意,大幅高于默认值可能会影响联合。
#
# 示例: [140, 500, 5000]
# 默认: 5000
statuses-max-chars: 5000
# 整数值。创建新投票时允许的最大选项数量。
# 请注意,大幅高于默认值可能会影响联合。
# 示例: [4, 6, 10]
# 默认: 6
statuses-poll-max-options: 6
# 整数值。创建新投票时每个选项允许的最大字符数。
# 请注意,大幅高于默认值可能会影响联合。
# 示例: [50, 100, 150]
# 默认: 50
statuses-poll-option-max-chars: 50
# 整数值。新贴文可以附加的最大媒体文件数量。
# 请注意,大幅高于默认值可能会影响联合。
# 示例: [4, 6, 10]
# 默认: 6
statuses-media-max-files: 6
```

Some files were not shown because too many files have changed in this diff Show more