mirror of
https://github.com/superseriousbusiness/gotosocial.git
synced 2025-11-18 10:47:29 -06:00
Compare commits
No commits in common. "5b956369934e448db285eb5f3e890f280cfa87de" and "57cb4fe7482962aa8e5a05874a343474d5a453e7" have entirely different histories.
5b95636993
...
57cb4fe748
4 changed files with 1 additions and 132 deletions
|
|
@ -1,43 +0,0 @@
|
||||||
# Managing GtS on slow hardware
|
|
||||||
|
|
||||||
While GoToSocial runs great on lower-end hardware, some operations are not practical on it, especially
|
|
||||||
instances with the database on slow storage (think anything that is not an SSD). This document
|
|
||||||
offers some suggestions on how to work around common issues when running GtS on slow hardware.
|
|
||||||
|
|
||||||
## Running database migrations on a different machine
|
|
||||||
|
|
||||||
Sometimes a database migration will need to do operations that are taxing on the database's storage.
|
|
||||||
These operations can take days if the database resides on a hard disk or SD card. If your
|
|
||||||
database is on slow storage, it can save a lot of time to follow the following procedure:
|
|
||||||
|
|
||||||
!!! danger
|
|
||||||
|
|
||||||
It might seem tempting to keep GtS running while you run the migrations on another machine, but
|
|
||||||
doing this will lead to all the posts that are received during the migration post disappearing
|
|
||||||
once the migrated database is re-imported.
|
|
||||||
|
|
||||||
1. Shut down GtS
|
|
||||||
2. Take a [backup](backup_and_restore.md#what-to-backup-database) of the database
|
|
||||||
3. Import the database on faster hardware
|
|
||||||
4. Run the GtS migration on the faster hardware
|
|
||||||
5. Take a backup of the resultant database
|
|
||||||
6. Import the resultant backup and overwrite the old database
|
|
||||||
7. Start GtS with the new version
|
|
||||||
|
|
||||||
### Running GtS migrations separately
|
|
||||||
|
|
||||||
After you import the database on the faster hardware, you can run the migration without starting
|
|
||||||
GtS by downloading the *target* GtS version from the [releases](https://codeberg.org/superseriousbusiness/gotosocial/releases) page.
|
|
||||||
For instance, if you are running `v0.19.2` and you want to upgrade to `v0.20.0-rc1`, download the
|
|
||||||
latter version. Once you have the binary, set it to executable by running `chmod u+x /path/to/gotosocial`. Afterwards, copy the configuration of the original server, and alter
|
|
||||||
it with the location of the new database. We copy the configuration in case variables like
|
|
||||||
the hostname is used in the migration, we want to keep that consistent.
|
|
||||||
Once everything is in place, you can run the migration like this:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
$ /path/to/gotosocial --config-path /path/to/config migrations run
|
|
||||||
```
|
|
||||||
|
|
||||||
This will run all the migrations, just like GtS would if it was started normally. Once this is done
|
|
||||||
you can copy the result to the original instance and start the new GtS version there as well, which
|
|
||||||
will see that everything is migrated and that there's nothing to do except run as expected.
|
|
||||||
|
|
@ -608,9 +608,6 @@ func (d *Dereferencer) enrichStatus(
|
||||||
return nil, nil, gtserror.Newf("error populating emojis for status %s: %w", uri, err)
|
return nil, nil, gtserror.Newf("error populating emojis for status %s: %w", uri, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if interaction policy has changed between status and latestStatus.
|
|
||||||
interactionPolicyChanged := status.InteractionPolicy.DifferentFrom(latestStatus.InteractionPolicy)
|
|
||||||
|
|
||||||
if isNew {
|
if isNew {
|
||||||
// Simplest case, insert this new remote status into the database.
|
// Simplest case, insert this new remote status into the database.
|
||||||
if err := d.state.DB.PutStatus(ctx, latestStatus); err != nil {
|
if err := d.state.DB.PutStatus(ctx, latestStatus); err != nil {
|
||||||
|
|
@ -628,7 +625,6 @@ func (d *Dereferencer) enrichStatus(
|
||||||
tagsChanged,
|
tagsChanged,
|
||||||
mediaChanged,
|
mediaChanged,
|
||||||
emojiChanged,
|
emojiChanged,
|
||||||
interactionPolicyChanged,
|
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, gtserror.Newf("error handling edit for status %s: %w", uri, err)
|
return nil, nil, gtserror.Newf("error handling edit for status %s: %w", uri, err)
|
||||||
|
|
@ -1061,7 +1057,6 @@ func (d *Dereferencer) handleStatusEdit(
|
||||||
tagsChanged bool,
|
tagsChanged bool,
|
||||||
mediaChanged bool,
|
mediaChanged bool,
|
||||||
emojiChanged bool,
|
emojiChanged bool,
|
||||||
interactionPolicyChanged bool,
|
|
||||||
) (
|
) (
|
||||||
cols []string,
|
cols []string,
|
||||||
err error,
|
err error,
|
||||||
|
|
@ -1146,15 +1141,6 @@ func (d *Dereferencer) handleStatusEdit(
|
||||||
// been previously populated properly.
|
// been previously populated properly.
|
||||||
}
|
}
|
||||||
|
|
||||||
if interactionPolicyChanged {
|
|
||||||
// Interaction policy changed.
|
|
||||||
cols = append(cols, "interaction_policy")
|
|
||||||
|
|
||||||
// Int pol changed doesn't necessarily
|
|
||||||
// indicate an edit, it may just not have
|
|
||||||
// been previously populated properly.
|
|
||||||
}
|
|
||||||
|
|
||||||
if edited {
|
if edited {
|
||||||
// Get previous-most-recent modified time,
|
// Get previous-most-recent modified time,
|
||||||
// which will be this edit's creation time.
|
// which will be this edit's creation time.
|
||||||
|
|
|
||||||
|
|
@ -17,8 +17,6 @@
|
||||||
|
|
||||||
package gtsmodel
|
package gtsmodel
|
||||||
|
|
||||||
import "slices"
|
|
||||||
|
|
||||||
// A policy URI is GoToSocial's internal representation of
|
// A policy URI is GoToSocial's internal representation of
|
||||||
// one ActivityPub URI for an Actor or a Collection of Actors,
|
// one ActivityPub URI for an Actor or a Collection of Actors,
|
||||||
// specific to the domain of enforcing interaction policies.
|
// specific to the domain of enforcing interaction policies.
|
||||||
|
|
@ -234,39 +232,6 @@ type PolicyRules struct {
|
||||||
ManualApproval PolicyValues `json:"WithApproval,omitempty"`
|
ManualApproval PolicyValues `json:"WithApproval,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// DifferentFrom returns true if pr1 and pr2
|
|
||||||
// are not equal in terms of nilness or content.
|
|
||||||
func (pr1 *PolicyRules) DifferentFrom(pr2 *PolicyRules) bool {
|
|
||||||
// If one PolicyRules is nil and
|
|
||||||
// the other isn't, they're different.
|
|
||||||
if pr1 == nil && pr2 != nil ||
|
|
||||||
pr1 != nil && pr2 == nil {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if AutomaticApproval
|
|
||||||
// differs between the two.
|
|
||||||
if slices.Compare(
|
|
||||||
pr1.AutomaticApproval,
|
|
||||||
pr2.AutomaticApproval,
|
|
||||||
) != 0 {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if ManualApproval
|
|
||||||
// differs between the two.
|
|
||||||
if slices.Compare(
|
|
||||||
pr1.ManualApproval,
|
|
||||||
pr2.ManualApproval,
|
|
||||||
) != 0 {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// They're the
|
|
||||||
// same picture.
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns the default interaction policy
|
// Returns the default interaction policy
|
||||||
// for the given visibility level.
|
// for the given visibility level.
|
||||||
func DefaultInteractionPolicyFor(v Visibility) *InteractionPolicy {
|
func DefaultInteractionPolicyFor(v Visibility) *InteractionPolicy {
|
||||||
|
|
@ -457,41 +422,3 @@ func DefaultInteractionPolicyDirect() *InteractionPolicy {
|
||||||
*c = *defaultPolicyDirect
|
*c = *defaultPolicyDirect
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
// DifferentFrom returns true if p1 and p2 are different.
|
|
||||||
func (ip1 *InteractionPolicy) DifferentFrom(ip2 *InteractionPolicy) bool {
|
|
||||||
// If one policy is null and the
|
|
||||||
// other isn't, they're different.
|
|
||||||
if ip1 == nil && ip2 != nil ||
|
|
||||||
ip1 != nil && ip2 == nil {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// If they're both nil we don't
|
|
||||||
// need to check anything else.
|
|
||||||
if ip1 == nil && ip2 == nil {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// If CanLike differs from one policy
|
|
||||||
// to the next, they're different.
|
|
||||||
if ip1.CanLike.DifferentFrom(ip2.CanLike) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// If CanReply differs from one policy
|
|
||||||
// to the next, they're different.
|
|
||||||
if ip1.CanReply.DifferentFrom(ip2.CanReply) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// If CanAnnounce differs from one policy
|
|
||||||
// to the next, they're different.
|
|
||||||
if ip1.CanAnnounce.DifferentFrom(ip2.CanAnnounce) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Looks the
|
|
||||||
// same chief.
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,7 @@ plugins:
|
||||||
extra:
|
extra:
|
||||||
alternate:
|
alternate:
|
||||||
- name: English
|
- name: English
|
||||||
link: /en/
|
link: /en/
|
||||||
lang: en
|
lang: en
|
||||||
- name: 中文
|
- name: 中文
|
||||||
link: /zh-cn/
|
link: /zh-cn/
|
||||||
|
|
@ -149,7 +149,6 @@ nav:
|
||||||
- "admin/spam.md"
|
- "admin/spam.md"
|
||||||
- "admin/database_maintenance.md"
|
- "admin/database_maintenance.md"
|
||||||
- "admin/themes.md"
|
- "admin/themes.md"
|
||||||
- "admin/slow_hardware.md"
|
|
||||||
- "Federation":
|
- "Federation":
|
||||||
- "federation/index.md"
|
- "federation/index.md"
|
||||||
- "federation/http_signatures.md"
|
- "federation/http_signatures.md"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue