image: ekidd/rust-musl-builder:1.50.0
environment:
LEMMY_DATABASE_URL: postgres://lemmy:password@database:5432/lemmy
+ LEMMY_CONFIG_LOCATION: ../../config/config.hjson
RUST_BACKTRACE: 1
RUST_TEST_THREADS: 1
commands:
image: rust:1.50-slim-buster
environment:
LEMMY_DATABASE_URL: postgres://lemmy:password@database:5432/lemmy
+ LEMMY_CONFIG_LOCATION: ../../config/config.hjson
RUST_BACKTRACE: 1
RUST_TEST_THREADS: 1
commands:
+# Lemmy v0.10.2 Release (2021-04-05)
+
+- Forcing a crash if config.hjson fails to load. Should show errors easier.
+
+# Lemmy v0.10.0 Release (2021-04-05)
+
+## Changes
+
+Since our last release in February, we've had [~150](https://github.com/LemmyNet/lemmy/compare/0.9.9...main) commits to Lemmy. The biggest changes, as we'll outline below, are a split of Lemmy's user tables into federated and local tables, necessitating a `v3` of Lemmy's API, federated moderation, i18n support in join.lemmy.ml, and lots of back-end cleanup.
+
+### Lemmy Server
+
+#### General
+
+- Rewrote config implementation, finally allowing us to use newer Rust versions.
+- Removed categories.
+- Various refactors.
+
+#### API
+
+- A full list of the API changes can be seen on this diff of [lemmy-js-client: 0.9.9 -> 0.10.0](https://github.com/LemmyNet/lemmy-js-client/compare/0.9.9...0.10.0-rc.13) .
+- Login invalidation on password change, thanks to @Mart-Bogdan
+
+#### Federation
+
+- It is now possible to add users from other instances as community mods.
+- Federating Matrix ID.
+- Many changes for better compatibility with ActivityPub standard.
+
+#### Database
+
+- Split the `user_` into `person` and `local_user` tables.
+- Strictly typed commonly used ID columns, to prevent DB errors using `i32` as ids.
+- Strictly typed URL fields, thanks to ajyoon.
+- Created default DB forms, now used in all the unit tests.
+
+### Lemmy UI
+
+- Now using utf-8 emojis.
+- Support for all the above changes to Lemmy.
+- Typescript-safe i18n strings, thanks to @shilangyu.
+- Added expandable post text (click on open book icon).
+- Prettier cross-posting, which does smart quoting.
+- Bugfixes for restoring scroll position on post page, custom site favicons, and autocomplete for login fields.
+
+### Lemmy Docs
+
+- Gazconroy built an [Async API spec for Lemmy](https://join.lemmy.ml/api/index.html), that now serves as our main API docs.
+
+### join.lemmy.ml
+
+- Rewrote in inferno isomorphic, added i18n support via [weblate](https://weblate.yerbamate.ml/projects/lemmy/joinlemmy/).
+- Added a section on the support page thanking contributors.
+- Changed some page urls / titles
+
+## Upgrade notes
+
+**Important**: there are multiple breaking changes:
+
+- Configuration via environment variables is not supported anymore, you must have all your config in the [lemmy.hjson](https://github.com/LemmyNet/lemmy/blob/main/ansible/templates/config.hjson) file ( except for `LEMMY_CONFIG_LOCATION` ).
+- The config format for `allowed_instances` and `blocked_instances` has changed, and you need to adjust your config file manually:
+ - before: `allowed_instances: ds9.lemmy.ml,enterprise.lemmy.ml`
+ - now: `allowed_instances: ["ds9.lemmy.ml", "enterprise.lemmy.ml"]` , and only one of the `allowed_instances` or `blocked_instances` blocks can be set.
+- The API has been upgraded from `v2` to `v3`, so all clients need to be updated: [lemmy-js-client: 0.9.9 -> 0.10.0](https://github.com/LemmyNet/lemmy-js-client/compare/0.9.9...0.10.0-rc.13) .
+
+If you'd like to make a DB backup before upgrading, follow [this guide](https://join.lemmy.ml/docs/en/administration/backup_and_restore.html).
+
+To upgrade your instance to `v0.10.0`, simply follow the instructions in the documentation:
+
+- [Upgrade with manual Docker installation](https://join.lemmy.ml/docs/en/administration/install_docker.html#updating)
+- [Upgrade with Ansible installation](https://join.lemmy.ml/docs/en/administration/install_ansible.html)
+
+
+## Compilation time
+
+|| v0.9.0 (Rust 1.47) | v0.10.0 (Rust 1.47) | v0.10.0 (Rust 1.51) |
+|-| -------- | -------- | -------- |
+|Clean | 140s | 146s | 119s |
+| Incremental | 28s | 22s | 19s |
+
+Despite ongoing efforts to speed up compilation, it has actually gotten slower when comparing with the same Rust version. Only thanks to improvements in newer Rust versions has our build process gotten faster. This could be simply because we added more code, while Lemmy v0.9.0 had 22.4k lines of Rust, v0.10.0 has 23.8k (an increase of 6%).
+
+v0.9.0 build graph:
+![](https://lemmy.ml/pictrs/image/GVBqFnrLqG.jpg)
+
+v0.10.0 build graph:
+![](https://lemmy.ml/pictrs/image/NllzjVEyNK.jpg)
+
+We extracted the crates `lemmy_api_crud` and `lemmy_apub_receive` from `lemmy_api` and `lemmy_apub`, respectively, and renamed `lemmy_structs` to `lemmy_api_common`. In the second graph you can see how parts of the api and apub crates are now built nicely in parallel, speeding up builds on multi-core systems.
+
+On the other hand, some crates have gotten much slower to compile, in particular `lemmy_db_queries` (6.5s slower), `lemmy_apub` (6.5s slower if we include `lemmy_apub_receive`). And `lemmy_db_views` is quite slow, just as before.
+
# Lemmy v0.9.9 Release (2021-02-19)
## Changes
# settings related to the postgresql database
database: {
+ database: lemmy
+ user: lemmy
+ host: postgres
+ port: 5432
+ pool_size: 5
# password to connect to postgres
password: "{{ postgres_password }}"
- # host where postgres is running
- host: "postgres"
}
# the domain name of your instance (eg "lemmy.ml")
hostname: "{{ domain }}"
+ # the port where lemmy should listen for incoming requests
+ port: 8536
# json web token for authorization between server and client
jwt_secret: "{{ jwt_password }}"
+ # whether tls is required for activitypub. only disable this for debugging, never for producion.
+ tls_enabled: true
# email sending configuration
email: {
# hostname of the smtp server
{
- hostname: "localhost:8536"
+# # optional: parameters for automatic configuration of new instance (only used at first start)
+# setup: {
+# # username for the admin user
+# admin_username: ""
+# # password for the admin user
+# admin_password: ""
+# # optional: email for the admin user (can be omitted and set later through the website)
+# admin_email: ""
+# # name of the site (can be changed later)
+# site_name: ""
+# }
+ # settings related to the postgresql database
+ database: {
+ # username to connect to postgres
+ user: "lemmy"
+ # password to connect to postgres
+ password: "password"
+ # host where postgres is running
+ host: "localhost"
+ # port where postgres can be accessed
+ port: 5432
+ # name of the postgres database for lemmy
+ database: "lemmy"
+ # maximum number of active sql connections
+ pool_size: 5
+ }
+ # the domain name of your instance (eg "lemmy.ml")
+ hostname: lemmy-alpha
+ # address where lemmy should listen for incoming requests
+ bind: "0.0.0.0"
+ # port where lemmy should listen for incoming requests
+ port: 8536
+ # whether tls is required for activitypub. only disable this for debugging, never for producion.
+ tls_enabled: true
+ # json web token for authorization between server and client
+ jwt_secret: "changeme"
+ # address where pictrs is available
+ pictrs_url: "http://pictrs:8080"
+ # address where iframely is available
+ iframely_url: "http://iframely"
+ # rate limits for various user actions, by user ip
+ rate_limit: {
+ # maximum number of messages created in interval
+ message: 180
+ # interval length for message limit
+ message_per_second: 60
+ # maximum number of posts created in interval
+ post: 6
+ # interval length for post limit
+ post_per_second: 600
+ # maximum number of registrations in interval
+ register: 3
+ # interval length for registration limit
+ register_per_second: 3600
+ # maximum number of image uploads in interval
+ image: 6
+ # interval length for image uploads
+ image_per_second: 3600
+ }
+ # settings related to activitypub federation
+ federation: {
+ # whether to enable activitypub federation.
+ enabled: false
+ # Allows and blocks are described here:
+ # https://join.lemmy.ml/docs/en/federation/administration.html#instance-allowlist-and-blocklist
+ #
+ # comma separated list of instances with which federation is allowed
+ # Only one of these blocks should be uncommented
+ # allowed_instances: ["instance1.tld","instance2.tld"]
+ # comma separated list of instances which are blocked from federating
+ # blocked_instances: []
+ }
+ captcha: {
+ enabled: true
+ difficulty: medium # Can be easy, medium, or hard
+ }
+# # email sending configuration
+# email: {
+# # hostname and port of the smtp server
+# smtp_server: ""
+# # login name for smtp server
+# smtp_login: ""
+# # password to login to the smtp server
+# smtp_password: ""
+# # address to send emails from, eg "noreply@your-instance.com"
+# smtp_from_address: ""
+# # whether or not smtp connections should use tls
+# use_tls: true
+# }
}
+++ /dev/null
-{
-# # optional: parameters for automatic configuration of new instance (only used at first start)
-# setup: {
-# # username for the admin user
-# admin_username: ""
-# # password for the admin user
-# admin_password: ""
-# # optional: email for the admin user (can be omitted and set later through the website)
-# admin_email: ""
-# # name of the site (can be changed later)
-# site_name: ""
-# }
- # settings related to the postgresql database
- database: {
- # username to connect to postgres
- user: "lemmy"
- # password to connect to postgres
- password: "password"
- # host where postgres is running
- host: "localhost"
- # port where postgres can be accessed
- port: 5432
- # name of the postgres database for lemmy
- database: "lemmy"
- # maximum number of active sql connections
- pool_size: 5
- }
- # the domain name of your instance (eg "lemmy.ml")
- hostname: null
- # address where lemmy should listen for incoming requests
- bind: "0.0.0.0"
- # port where lemmy should listen for incoming requests
- port: 8536
- # whether tls is required for activitypub. only disable this for debugging, never for producion.
- tls_enabled: true
- # json web token for authorization between server and client
- jwt_secret: "changeme"
- # address where pictrs is available
- pictrs_url: "http://pictrs:8080"
- # address where iframely is available
- iframely_url: "http://iframely"
- # rate limits for various user actions, by user ip
- rate_limit: {
- # maximum number of messages created in interval
- message: 180
- # interval length for message limit
- message_per_second: 60
- # maximum number of posts created in interval
- post: 6
- # interval length for post limit
- post_per_second: 600
- # maximum number of registrations in interval
- register: 3
- # interval length for registration limit
- register_per_second: 3600
- # maximum number of image uploads in interval
- image: 6
- # interval length for image uploads
- image_per_second: 3600
- }
- # settings related to activitypub federation
- federation: {
- # whether to enable activitypub federation.
- enabled: false
- # Allows and blocks are described here:
- # https://join.lemmy.ml/docs/en/federation/administration.html#instance-allowlist-and-blocklist
- #
- # comma separated list of instances with which federation is allowed
- # Only one of these blocks should be uncommented
- # allowed_instances: ["instance1.tld","instance2.tld"]
- # comma separated list of instances which are blocked from federating
- # blocked_instances: []
- }
- captcha: {
- enabled: true
- difficulty: medium # Can be easy, medium, or hard
- }
-# # email sending configuration
-# email: {
-# # hostname and port of the smtp server
-# smtp_server: ""
-# # login name for smtp server
-# smtp_login: ""
-# # password to login to the smtp server
-# smtp_password: ""
-# # address to send emails from, eg "noreply@your-instance.com"
-# smtp_from_address: ""
-# # whether or not smtp connections should use tls
-# use_tls: true
-# }
-}
email,
password_encrypted,
show_nsfw: data.show_nsfw,
+ show_scores: data.show_scores,
theme: data.theme.to_owned(),
default_sort_type,
default_listing_type,
#[derive(Deserialize)]
pub struct SaveUserSettings {
pub show_nsfw: Option<bool>,
+ pub show_scores: Option<bool>,
+ pub show_avatars: Option<bool>,
pub theme: Option<String>,
pub default_sort_type: Option<i16>,
pub default_listing_type: Option<i16>,
pub new_password: Option<String>,
pub new_password_verify: Option<String>,
pub old_password: Option<String>,
- pub show_avatars: Option<bool>,
pub send_notifications_to_email: Option<bool>,
pub auth: String,
}
default_listing_type: Some(ListingType::Subscribed as i16),
lang: Some("browser".into()),
show_avatars: Some(true),
+ show_scores: Some(true),
send_notifications_to_email: Some(false),
};
show_avatars,
send_notifications_to_email,
validator_time,
+ show_scores,
);
impl ToSafeSettings for LocalUser {
show_avatars,
send_notifications_to_email,
validator_time,
+ show_scores,
)
}
}
show_avatars -> Bool,
send_notifications_to_email -> Bool,
validator_time -> Timestamp,
+ show_scores -> Bool,
}
}
pub show_avatars: bool,
pub send_notifications_to_email: bool,
pub validator_time: chrono::NaiveDateTime,
+ pub show_scores: bool,
}
// TODO redo these, check table defaults
pub lang: Option<String>,
pub show_avatars: Option<bool>,
pub send_notifications_to_email: Option<bool>,
+ pub show_scores: Option<bool>,
}
/// A local user view that removes password encrypted
pub show_avatars: bool,
pub send_notifications_to_email: bool,
pub validator_time: chrono::NaiveDateTime,
+ pub show_scores: bool,
}
};
use anyhow::{anyhow, Context};
use deser_hjson::from_str;
-use log::warn;
use merge::Merge;
use std::{env, fs, io::Error, net::IpAddr, sync::RwLock};
static CONFIG_FILE: &str = "config/config.hjson";
lazy_static! {
- static ref SETTINGS: RwLock<Settings> = RwLock::new(match Settings::init() {
- Ok(c) => c,
- Err(e) => {
- warn!(
- "Couldn't load settings file, using default settings.\n{}",
- e
- );
- Settings::default()
- }
- });
+ static ref SETTINGS: RwLock<Settings> =
+ RwLock::new(Settings::init().expect("Failed to load settings file"));
}
impl Settings {
-pub const VERSION: &str = "0.10.0-rc.13";
+pub const VERSION: &str = "0.10.2";
- iframely
lemmy-ui:
- image: dessalines/lemmy-ui:0.10.0-rc.13
+ image: dessalines/lemmy-ui:0.10.2
ports:
- "1235:1234"
restart: always
- ./volumes/pictrs_alpha:/mnt
lemmy-alpha-ui:
- image: dessalines/lemmy-ui:0.10.0-rc.13
+ image: dessalines/lemmy-ui:0.10.2
environment:
- LEMMY_INTERNAL_HOST=lemmy-alpha:8541
- LEMMY_EXTERNAL_HOST=localhost:8541
- ./volumes/postgres_alpha:/var/lib/postgresql/data
lemmy-beta-ui:
- image: dessalines/lemmy-ui:0.10.0-rc.13
+ image: dessalines/lemmy-ui:0.10.2
environment:
- LEMMY_INTERNAL_HOST=lemmy-beta:8551
- LEMMY_EXTERNAL_HOST=localhost:8551
- ./volumes/postgres_beta:/var/lib/postgresql/data
lemmy-gamma-ui:
- image: dessalines/lemmy-ui:0.10.0-rc.13
+ image: dessalines/lemmy-ui:0.10.2
environment:
- LEMMY_INTERNAL_HOST=lemmy-gamma:8561
- LEMMY_EXTERNAL_HOST=localhost:8561
# An instance with only an allowlist for beta
lemmy-delta-ui:
- image: dessalines/lemmy-ui:0.10.0-rc.13
+ image: dessalines/lemmy-ui:0.10.2
environment:
- LEMMY_INTERNAL_HOST=lemmy-delta:8571
- LEMMY_EXTERNAL_HOST=localhost:8571
# An instance who has a blocklist, with lemmy-alpha blocked
lemmy-epsilon-ui:
- image: dessalines/lemmy-ui:0.10.0-rc.13
+ image: dessalines/lemmy-ui:0.10.2
environment:
- LEMMY_INTERNAL_HOST=lemmy-epsilon:8581
- LEMMY_EXTERNAL_HOST=localhost:8581
popd
# Changing various references to the Lemmy version
+sed -i "s/dessalines\/lemmy:.*/dessalines\/lemmy:$new_tag/" ../dev/docker-compose.yml
sed -i "s/dessalines\/lemmy-ui:.*/dessalines\/lemmy-ui:$new_tag/" ../dev/docker-compose.yml
+sed -i "s/dessalines\/lemmy:.*/dessalines\/lemmy:$new_tag/" ../federation/docker-compose.yml
sed -i "s/dessalines\/lemmy-ui:.*/dessalines\/lemmy-ui:$new_tag/" ../federation/docker-compose.yml
git add ../dev/docker-compose.yml
git add ../federation/docker-compose.yml
# IE, when the third semver is a number, not '2-rc'
if [ ! -z "${third_semver##*[!0-9]*}" ]; then
sed -i "s/dessalines\/lemmy:.*/dessalines\/lemmy:$new_tag/" ../prod/docker-compose.yml
+ sed -i "s/dessalines\/lemmy-ui:.*/dessalines\/lemmy-ui:$new_tag/" ../prod/docker-compose.yml
git add ../prod/docker-compose.yml
# Setting the version for Ansible
restart: always
lemmy:
- image: dessalines/lemmy:0.9.9
+ image: dessalines/lemmy:0.10.2
ports:
- "127.0.0.1:8536:8536"
restart: always
- iframely
lemmy-ui:
- image: dessalines/lemmy-ui:0.9.9
+ image: dessalines/lemmy-ui:0.10.2
ports:
- "127.0.0.1:1235:1234"
restart: always
--- /dev/null
+alter table local_user drop column show_scores;
--- /dev/null
+alter table local_user add column show_scores boolean default true not null;
psql -U lemmy -d postgres -c "CREATE DATABASE lemmy;"
export LEMMY_DATABASE_URL=postgres://lemmy:password@localhost:5432/lemmy
+# tests are executed in working directory crates/api (or similar),
+# so to load the config we need to traverse to the repo root
+export LEMMY_CONFIG_LOCATION=../../config/config.hjson
RUST_BACKTRACE=1 \
cargo test --workspace --no-fail-fast