Tentang Proyek Ini

Halaman DepanPos
layar utamalayar percakapan

Lemmy serupa seperti situs seperti Reddit, Lobste.rs, Raddle, atau Hacker News: Anda berlangganan ke forum yang Anda tertarik kepada mereka, pos tautan dan diskusi, kemudian pilih, dan komentar di sana. Di belakang layar, itu sangat berbeda; semua orang bisa dengan mudah menjalankan sebuah peladen dan semua peladen tersebut terfederasi (seperti surel) dan terhubung ke semesta yang sama, yaitu Fediverse.

Kata “fediverse” (federated universe) merujuk kepada jaringan dari semua peladen Lemmy dan proyek lainnya, yang dimana pengguna bisa berbicara satu sama lain dengan seamlessly.

Seperti surel, entah Anda mendaftar di Gmail atau Outlook, Anda tahu Anda akan bisa mengirim surel ke semua yang Anda butuhkan, asalkan Anda tahu alamat mereka. Di Lemmy, Anda bisa berlangganan ke komunitas di peladen mana pun lainnya dan bisa mengikuti diskusi dengan pengguna terdaftar dimana pun.

Tujuan utama proyek ini adalah untuk membuat alternatif dari Reddit dan pengumpul tautan lainnya yang mudah dihos sendiri dan desentralisasi, tanpa satu pun perusahaan yang menjalankan pertunjukan.

Tidak ada pemegang modal dan tidak ada iklan tertarget: hanya orang yang membagikan hal yang mereka ingin bagikan dengan yang lainnya.

Setiap peladen Lemmy bisa menentukan kebijakan moderasinya sendiri-sendiri; mengangkat admin tingkat situs, moderator komunitas untuk waspada terhadap troll, dan memupuk lingkungan yang sehat di mana semua bisa dengan nyaman berkontribusi.

Catatan: Federasi masih dalam pengembangan aktif

Kenapa dinamai Lemmy?

Dibangun menggunakan

Fitur

  • Sumber terbuka, Lisensi AGPL.
  • Bisa disetel sendiri, mudah untuk dipasang.
  • Tampilan yang bersih dan ramah ponsel.
    • Yang dibutuhkan untuk mendaftar adalah nama pengguna dan kata sandi!
    • Dukungan avatar pengguna.
    • Utas komentar dengan pembaruan langsung.
    • Skor pilihan penuh (+/-) seperti Reddit yang lama.
    • Banyak tema, termasuk terang, gelap, dan solarized.
    • Emoji dengan dukungan ketik otomatis. Mulai mengetik :
    • Tandai pengguna menggunakan @, tandai komunitas menggunakan !.
    • Pengunggahan gambar terintegrasi baik di pos atau komentar.
    • Sebuah pos bisa terdiri dari sebuah judul dan kombinasi dari teks subjek, URL, atau tidak ada teks sama sekali.
    • Notifikasi di balasan komentar dan ketika Anda ditandai.
      • Notifikasi bisa dikirim lewat surel.
    • i18n/dukungan penginternasionalan
    • Umpan RSS/Atom untuk Semua, Berlangganan, Kotak Masuk, Pengguna, dan Komunitas.
  • Dukungan pos-lintas.
    • Sebuah pencarian pos serupa ketika membuat pos baru. Bagus untuk komunitas tanya/jawab.
  • Kemampuan moderasi.
    • Log Moderasi Publik.
    • Bisa melengketkan pos ke bagian atas komunitas.
    • Baik admin situs dan moderator komunitas dapat menunjuk moderator lain.
    • Bisa mengunci, menghapus, dan memulihkan pos dan komentar.
    • Bisa melarang dan batal melarang pengguna dari komunitas dan situs.
    • Bisa memindah situs dan komunitas ke yang lain.
  • Bisa menghapus seluruhnya data Anda, menggantikan seluruh pos dan komentar.
  • Dukungan pos/komunitas NSFW
  • Performa tinggi.
    • Peladen ditulis dengan Rust.
    • Antarmuka ~80kB gzipped.
    • Antarmuka bekerja tanpa JavaScript (hanya-baca)
    • Mendukung arm64/Raspberry Pi.

Algoritma Pengurutan Tren/Hangat/Terbaik

Tujuan

  • Saat hari pertama, pos dan komentar baru harus berada di atas, sehingga mereka bisa dipilih atas/bawah.
  • Setelah sekitar satu hari, faktor waktu akan hilang.
  • Gunakan skala log, karena suara cenderung menggelinding, dan 10 suara pertama sama pentingnya dengan seratus berikutnya.

Implementasi

Reddit

Tidak memperhitungkan masa hidup utas, memberikan komentar awal keuntungan besar terhadap yang setelahnya, berefek lebih buruk di komunitas kecil. Jajak komentar baru berada di bawah utas, secara efektif membunuh diskusi dan membuat setiap utas balapan untuk komentar lebih dulu. Ini menurunkan kualitas pembicaraan dan menghargai komentar yang repetitif dan spam.

Hacker News

Meskipun jauh lebih unggul daripada implementasi Reddit karena pembusukan skornya dari waktu ke waktu, algoritma peringkat Hacker News tidak menggunakan skala logaritmik untuk skor.

Lemmy

Menyeimbangkan efek bola salju suara dari waktu ke waktu dengan skala logaritmik. Meniadakan keuntungan yang melekat dari komentar awal sambil tetap memastikan bahwa suara tetap penting dalam jangka panjang, tidak menghapus komentar populer yang lama.

Rank = ScaleFactor * log(Max(1, 3 + Score)) / (Time + 2)^Gravity

Score = Upvotes - Downvotes
Time = time since submission (in hours)
Gravity = Decay gravity, 1.8 is default
  • Lemmy menggunakan algoritma Rank yang sama di atas, dengan dua cara: Active dan Hot
    • Active menggunakan suara pos, dan waktu komentar terakhir (dibatasi hingga dua hari).
    • Hot menggunakan suara pos, dan waktu pos diterbitkan.
  • Menggunakan Max(1, score) untuk memastikan semua komentar terpengaruh pembusukan waktu.
  • Tambahkan 3 ke skor, sehingga semua yang memiliki kurang dari 3 pilih bawah akan tampak baru. Atau tidak, semua komentar baru akan tetap nol, dekat di bawah.
  • Tanda dan abs skor diperlukan untuk menangani log skor negatif.
  • Faktor skala 10 ribu menggenapkan peringkat dalam bentuk bilangan bulat.

Plot peringkat lebih dari 24 jam, dengan skor 1, 5, 10, 100, 1000, dengan faktor skala 10 ribu.

Penghitungan Pengguna Aktif

Lemmy juga menampilkan jumlah pengguna aktif untuk situs Anda, dan komunitasnya. Ini dihitung dalam hari, pekan, bulan, dan setengah tahun terakhir, dan ditembolokkan dalam pemulaian Lemmy, dan setiap jam.

Pengguna aktif merupakan seseorang yang mempos atau berkomentar di peladen atau komunitas dalam jangka waktu terakhir yang ditentukan. Untuk penghitungan situs, hanya pengguna lokal yang dihitung. Untuk penghitungan komunitas, pengguna terfederasi juga dihitung.

Panduan Mulai Cepat Lemmy

Jadi Anda ingin bergabung dengan Lemmy dan mulai mengepos. Bagus! Begini cara untuk meluncur masuk.

Di mana saya mendaftar?

Hal pertama yang Anda harus lakukan adalah memilih peladen Anda. Ini merupakan langkah tambahan dibandingkan dengan situs seperti Reddit, tapi tidak sesulit yang dikira.

Seperti surel, identitas Anda dihos oleh peladen yang dimana Anda mendaftar. Jadi sebagai contoh, saya gabung ke lemmy.ml, jadi untuk menyebutkan saya, Anda bisa mengetikkan @retiolus@lemmy.ml di pos Anda.

Jika apa yang ingin Anda bicarakan sesuai dengan kategori yang jelas (mungkin itu permainan video atau seni atau kehidupan aneh atau pengkodean atau fiksi, dll.) maka mungkin ada baiknya membuat peladen pertama Anda di mana yang terutama akan menampung konten semacam itu – akan lebih mudah untuk membuat koneksi dan menemukan orang-orang yang berpikiran sama. Pikirkan peladen Anda sebagai lingkungan atau tempat, di mana obrolan umum tersebut dapat memiliki fokus khusus.

Anda memiliki kemampuan untuk melihat semua pos lokal publik yang dibuat oleh orang di peladen Anda di bilah "Lokal".

Jika Anda tidak di sini untuk menempel ke satu topik, Anda mungkin ingin memilih peladen yang melayani percakapan umum. Apa pun itu, ada daftar peladen yang berguna di join-lemmy.org.

Jangan panik! Anda bisa berbicara kepada orang di peladen lainnya, tidak peduli apa yang Anda pilih. Ingat, ini seperti surel dan, contohnya, Anda masih bisa mengirim surel kepada ibu Anda di akun Yahoo kuno dari Gmail Anda.

Ketahui peladen Anda

Luangkan waktu sejenak sebelum mendaftar untuk memeriksa peraturan dari peladen pilihan Anda dan pastikan mereka sesuai dengan bagaimana Anda ingin mengepos.

Peladen biasanya mendefinisikan peraturan mereka dengan cara yang simpel di bilah sisi kanan dari situs. Dari atas ke bawah, Anda akan biasanya menemukan daftar "Komunitas Sedang Tren" diikuti oleh "Berlangganan ke komunitas," deskripsi singkat peladen, peraturan, beberapa statistik, dan nama pengguna dari admin.

Admin merupakan orang yang sangat ramah yang bisanya menjalankan peladen dari dompet mereka sendiri, jadi merupakan hal yang bagus untuk mengenal mereka. Banyak dari mereka yang menerima donasi untuk menutupi biaya operasional dan jika Anda bisa berkontribusi maka hal itu selalu dihargai.

Sepertinya saya menemukan rumah baru saya!

Pergi ke halaman Masuk (https://your.server/login) dari peladen Anda dan pilih nama pengguna dan kata sandi di formulir pendaftaran. Anda tidak perlu sebuah surel untuk mendaftar, tapi itu merupakan satu-satunya cara untuk mengatur ulang kata sandi Anda jika Anda kehilangannya.

Hal selanjutnya untuk dilakukan adalah mengunggah gambar profil Anda, berikan halaman pengaturan (https://your.server/settings) sebuah utak-atik (dan kembali melakukannya ketika Anda sudah di Lemmy selama beberapa pekan atau hanya untuk utak-atik yang mungkin membantu pengalaman Anda) dan bersiaplah untuk mengenalkan diri Anda.

Beberapa pengaturan yang menarik untuk diperiksa adalah: jenis filter umpan baku antara berlangganan, lokal, atau semua dan jenis pengurutan baku Anda

Meskipun Anda bisa hanya santai membaca Lemmy, keseruan yang asli dimulai ketika Anda meluncur dan mulai berpartisipasi dengan mengepos, mengeluarkan pilihan, dan berkomentar

Untuk membagikan sebuah pos, klik tombol "Buat Pos" di sisi atas dari layar. Anda akan dibawa ke sebuah formulir di mana Anda bisa memasukkan URL dari tautan atau mengunggah gambar Anda dan memasukkan judul dan badan pos. Anda juga akan diharuskan untuk memasukkan sebuah komunitas di mana Anda ingin pos Anda muncul. Sebelum melakukan itu, merupakan ide yang bagus untuk menuju ke halaman komunitas tersebut dan membaca panduan mengepos yang ada di sebelah kanan layar. Ini akan memastikan bahwa Anda patuh terhadap etos tertentu dari sebuah komunitas. Contohnya, di komunitas !privacy@lemmy.ml, Anda tidak boleh untuk mempromosikan perangkat lunak tidak bebas.

Ketika semua bagian sudah diisi, klik "Buat" dan pos Anda akan muncul.

Ketika menulis sebuah pos atau komentar baru, mulai mengetik...

  • @a_user_name untuk mendapatkan daftar nama pengguna.
  • !a_community untuk mendapatkan daftar komunitas.
  • :emoji untuk mendapatkan daftar emoji.

Pengenalan cepat tampilan web

interface.png

Tampilan standar Lemmy memiliki satu umpan. Anda bisa mengubah konten dari umpan tersebut menggunakan filter:

Berlangganan termasuk pos dari peladen Anda dan peladen lainnya, yang terpenting adalah komunitas yang Anda ikuti.

Lokal adalah umpan dari semua pos di komunitas di peladen Anda. Di banyak peladen, terutama yang kecil-kecil dan terfokus ke topik tertentu, di sinilah sihir terjadi. Anda bisa membalas ke orang dari sana dan di sana merupakan tempat yang bagus untuk bertemu dengan orang yang berbagi minat yang sama denganmu.

Semua atau lini masa terfederasi adalah untuk melihat semua pos publik yang peladen Anda ketahui dari seluruh jaringan (termasuk yang lokal). Alasan yang paling umum ketika sesuatu tampil di lini masa terfederasi adalah ada seseorang dari peladen Anda mengikuti komunitas yang ada di peladen lainnya.

JenisDeskripsi
PosHanya tampilkan publikasi (pos)
KomentarHanya tampilkan komentar
------
AktifUrut yang tren berdasarkan skor dan waktu komentar yang paling baru.
HangatUrut yang tren berdasarkan skor dan waktu pembuatan pos.
BaruYang terbaru.
Paling Banyak KomentarPos dengan komentar paling banyak.
Komentar TerbaruPos dengan komentar yang paling baru, alias urut gaya-forum.
TeratasSkor terbesar di jangka waktu tertentu.

Untuk detail lebih lanjut, periksa detail Ranking Pos dan Komentar.

Menggunakan Markdown

Pos Lemmy ditulis menggunakan Markdown, tentu saja ada pintasan untuk Anda gunakan ketika menulis, di bawah ini merupakan tabel untuk membantu Anda jika Anda ingin tahu lebih lanjut.

KetikAtau… untuk mendapatkan
*Miring*_Miring_Miring
**Tebal**__Tebal__Tebal
# Tajuk 1Tajuk 1
=========

Tajuk 1

## Tajuk 2Tajuk 2
---------
Tajuk 2
[Tautan](http://a.com)[Tautan][1]

[1]: http://b.org
Tautan
![Gambar](http://url/a.png)![Gambar][1]

[1]: http://url/b.jpg
Markdown
> Kutipan
Kutipan
* Daftar
* Daftar
* Daftar
- Daftar
- Daftar
- Daftar
* Daftar
* Daftar
* Daftar
1. Satu
2. Dua
3. Tiga
1) Satu
2) Dua
3) Tiga
1. Satu
2. Dua
3. Tiga
Garis Horizontal
---
Garis Horizontal
***
Garis Horizontal

`Kode di pos` dengan petik terbalikKode di pos dengan petik terbalik
```
# blok kode
print '3 petik terbalik or'
print 'indentasi 4 spasi'
```
····# blok kode
····print '3 petik terbalik or'
····print 'indentasi 4 spasi'
# blok kode
print '3 petik terbalik or'
print 'indentasi 4 spasi'
::: spoiler sembunyi atau sesuatu porno
sesuatu untuk disembunyikan
:::
sembunyi atau sesuatu porno

sesuatu untuk disembunyikan

Teks ~bawah~ garisTeks bawah garis
Teks ^atas^ garisTeks atas garis

Tutorial CommonMark

Informasi Administrasi

Informasi untuk admin peladen Lemmy dan mereka yang ingin menjalankan sebuah peladen.

Pasang

Metode Resmi/Didukung

Lemmy memiliki dua metode pemasangan utama:

Kami merekomendasikan menggunakan Ansible, karena menyederhanakan instalasi dan juga membuat pembaruan lebih mudah.

Metode pemasangan lainnya

⚠️ Hati-hati! Risiko Anda sendiri

Dalam beberapa kasus, mungkin perlu menggunakan metode pemasangan yang berbeda. Tetapi kami tidak merekomendasikan ini, dan tidak dapat memberikan dukungan untuk mereka.

Pemasangan Menggunakan Docker

Pastikan Anda sudah punya docker dan docker-compose(>=1.24.0) terpasang. Di Ubuntu, tinggal jalankan apt install docker-compose docker.io. Kemudian,

# buat sebuah folder untuk berkas lemmy. lokasinya tidak penting, bisa ditaruh dimana saja
mkdir /lemmy
cd /lemmy

# unduh berkas konfigurasi baku
wget https://raw.githubusercontent.com/LemmyNet/lemmy/main/docker/prod/docker-compose.yml
wget https://raw.githubusercontent.com/LemmyNet/lemmy/main/docker/lemmy.hjson

# atur izin yang benar untuk folder pictrs
mkdir -p volumes/pictrs
sudo chown -R 991:991 volumes/pictrs

Buka docker-compose.yml Anda dan pastikan LEMMY_EXTERNAL_HOST untuk lemmy-ui diatur ke hos yang benar Anda.

- LEMMY_INTERNAL_HOST=lemmy:8536
- LEMMY_EXTERNAL_HOST=your-domain.com
- LEMMY_HTTPS=false

Jika Anda ingin kata sandi basis data yang berbeda, Anda harus menggantinya juga di docker-compose.yml sebelum pemulaian pertama Anda.

Setelah ini, coba lihat ke berkas konfigurasi bernama lemmy.hjson dan coba sesuaikan, khususnya nama hos dan mungkin kata sandi basis data. Kemudian jalankan:

docker-compose up -d

Anda bisa mengakses lemmy-ui di http://localhost:1235

Untuk membuat Lemmy tersedia di luar peladen, Anda perlu mengatur proksi balik, seperti Nginx. Contoh konfigurasi nginx, dapat disiapkan dengan:

wget https://raw.githubusercontent.com/LemmyNet/lemmy-ansible/main/templates/nginx.conf
# ganti dengan {{ vars }}
# lemmy_port baku adalah 8536
# lemmy_ui_port baku adalah 1235
sudo mv nginx.conf /etc/nginx/sites-enabled/lemmy.conf

Anda juga harus menyiapkan TLS, seperti Let's Encrypt. Setelah ini, Anda harus memulai ulang Nginx untuk memuat ulang konfigurasi.

Memperbarui

Untuk memperbarui ke versi terbaru, Anda bisa secara manual mengganti versi di docker-compose.yml. Atau, ambil versi terbaru dari repositori git kami:

wget https://raw.githubusercontent.com/LemmyNet/lemmy/main/docker/prod/docker-compose.yml
docker-compose up -d

Pemasangan Menggunakan Ansible

Ikuti instruksi di repositori Lemmy-Ansible.

Dari Awal

⚠️ Peringatan: metode pemasangan ini tidak direkomendasikan oleh pengembang Lemmy. Jika Anda ada masalah, Anda harus menyelesaikannya sendiri atau tanya pembuat terkait. Jika Anda melihat ada galat di peladen yang dipasang menggunakan metode ini, harap sebutkan di laporan galat.

Instruksi ini ditulis untuk Ubuntu 20.04.

Pemasangan

Bagian-Belakang Lemmy

Karena dibuat dari sumber, jadi mungkin akan memakan waktu yang lama, terutama pada perangkat yang lambat. Contohnya, Lemmy v0.12.2 membutuhkan 17 menit untuk dibangun pada VPS inti ganda. Jika Anda lebih suka binari sudah siap, gunakan Docker.

Susun dan pasang Lemmy, siapkan basis data:

apt install pkg-config libssl-dev libpq-dev cargo postgresql
# pasang rilis terbaru, anda juga bisa menspesifikkannya dengan --version
# argumen --locked menggunakan versi dependensi yang sama dengan yang dispesifikkan di
# `cargo.lock` saat waktu perilisan. menjalankannya tanpa bendera akan menggunakan versi
# rilis minor dari dependensi tersebut, yang tidak selalu terjamin akan tersusun.
cargo install lemmy_server --target-dir /usr/bin/ --locked
# ganti db-passwd dengan kata sandi yang dibuat acak
sudo -iu postgres psql -c "CREATE USER lemmy WITH PASSWORD 'db-passwd';"
sudo -iu postgres psql -c "CREATE DATABASE lemmy WITH OWNER lemmy;"
adduser lemmy --system --disabled-login --no-create-home --group

Konfigurasi minimal Lemmy, taruh ini di /etc/lemmy/lemmy.hjson (lihat di sini untuk pilihan konfigurasi lebih banyak). Jalankan chown lemmy:lemmy /etc/lemmy/ -R untuk mengatur pemilik yang benar.

{
  database: {
    # taruh db-passwd anda dari atas
    password: "db-passwd"
  }
  # ganti dengan domain anda
  hostname: example.com
  bind: "127.0.0.1"
  # taruh kata acak di sini (diperlukan untuk enkripsi token masuk)
  jwt_secret: "changeme"
}

Berkas unit systemd, sehingga Lemmy bisa secara otomatis dimulai dan diberhentikan, log dikelola lewat journalctl dll. Taruh berkas ini ke /etc/systemd/system/lemmy.service, kemudian jalankan systemctl enable lemmy dan systemctl start lemmy.

[Unit]
Description=Lemmy - A link aggregator for the fediverse
After=network.target

[Service]
User=lemmy
ExecStart=/usr/bin/lemmy_server
Environment=LEMMY_CONFIG_LOCATION=/etc/lemmy/lemmy.hjson
Restart=on-failure

# penguatan
ProtectSystem=yes
PrivateTmp=true
MemoryDenyWriteExecute=true
NoNewPrivileges=true

[Install]
WantedBy=multi-user.target

Jika Anda melakukan semuanya dengan benar, log Lemmy dari journalctl -u lemmy akan menampilkan "Starting http server at 127.0.0.1:8536". Anda juga bisa menjalankan curl localhost:8536/api/v3/site yang seharusnya mengembalikan respons yang berhasil , seperti {"site_view":null,"admins":[],"banned":[],"online":0,"version":"unknown version","my_user":null,"federated_instances":null}.

Pasang lemmy-ui (antarmuka web)

Pasang dependensi (nodejs dan yarn di repositori Ubuntu 20.04 terlalu tua)

# https://classic.yarnpkg.com/en/docs/install/#debian-stable
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
# https://github.com/nodesource/distributions/blob/master/README.md#installation-instructions
curl -fsSL https://deb.nodesource.com/setup_12.x | sudo -E bash -
sudo apt install nodejs yarn

Klon repositori git, checkout versi yang Anda inginkan (dalam contoh ini adalah 0.12.2) dan susun itu.

mkdir /var/lib/lemmy-ui
cd /var/lib/lemmy-ui
chown lemmy:lemmy .
# jangan susun sebagai admin
sudo -u lemmy bash
git clone https://github.com/LemmyNet/lemmy-ui.git --recursive .
git checkout 0.12.2 # ganti dengan versi yang ingin anda pasang
yarn install --pure-lockfile
yarn build:prod
exit

Tambahkan berkas unit systemd yang lain, kali ini untuk lemmy-ui. Anda perlu mengganti example.com dengan domain Anda. Taruh berkas di /etc/systemd/system/lemmy-ui.service, kemudian jalankan systemctl enable lemmy-ui dan systemctl start lemmy-ui.

[Unit]
Description=Lemmy UI - Web frontend for Lemmy
After=lemmy.service
Before=nginx.service

[Service]
User=lemmy
WorkingDirectory=/var/lib/lemmy-ui
ExecStart=/usr/bin/node dist/js/server.js
Environment=LEMMY_INTERNAL_HOST=localhost:8536
Environment=LEMMY_EXTERNAL_HOST=example.com
Environment=LEMMY_HTTPS=true
Restart=on-failure

# Hardening
ProtectSystem=full
PrivateTmp=true
NoNewPrivileges=true

[Install]
WantedBy=multi-user.target

Jika semuanya benar, perintah curl -I localhost:1234 seharusnya menampilkan 200 OK di bagian atas.

Mengonfigurasi proksi-balik dan TLS

Pasang dependensi

apt install nginx certbot python3-certbot-nginx

Minta sertifikat TLS Let's Encrypt (ikuti saja instruksinya)

certbot certonly --nginx

Sertifikat Let's Encrypt akan diperbarui secara otomatis, jadi tambahkan baris di bawah ini ke crontab Anda, dengan menjalankan sudo crontab -e. Ganti example.com dengan domain Anda.

@daily certbot certonly --nginx --cert-name example.com -d example.com --deploy-hook 'nginx -s reload'

Akhirnya, tambahkan konfigurasi nginx. Setelah mengunduh, Anda perlu mengubah beberapa variabel di berkas.

curl https://raw.githubusercontent.com/LemmyNet/lemmy-ansible/main/templates/nginx.conf \
    --output /etc/nginx/sites-enabled/lemmy.conf
# taruh domain anda alih-alih example.com
sed -i -e 's/{{domain}}/example.com/g' /etc/nginx/sites-enabled/lemmy.conf
sed -i -e 's/{{lemmy_port}}/8536/g' /etc/nginx/sites-enabled/lemmy.conf
sed -i -e 's/{{lemmy_ui_port}}/1234/g' /etc/nginx/sites-enabled/lemmy.conf
nginx -s reload

Sekarang buka domain Lemmy Anda di peramban, dan itu seharusnya menampilkan sebuah layar konfigurasi. Gunakan untuk membuat pengguna admin pertama dan komunitas baku.

Pict-rs (untuk hos gambar, opsional)

Pict-rs memerlukan Rust versi yang lebih baru dari yang tersedia di repositori Ubuntu 20.04. Jadi Anda perlu memasang Rustup yang akan memasang toolchain untuk Anda.

apt install ffmpeg exiftool libgexiv2-dev --no-install-recommends
adduser pictrs --system --disabled-login --no-create-home --group
mkdir /var/lib/pictrs-source
cd /var/lib/pictrs
git clone https://git.asonix.dog/asonix/pict-rs.git .
# periksa docker-compose.yml untuk versi pict-rs yang digunakan oleh lemmy
# https://github.com/LemmyNet/lemmy-ansible/blob/main/templates/docker-compose.yml#L40 
git checkout v0.2.6-r2
# atau tinggal tambahkan folder bin ke $PATH anda
$HOME/.cargo/bin/cargo build --release
cp target/release/pict-rs /usr/bin/
# buat folder untuk menyimpan data gambar
mkdir /var/lib/pictrs
chown pictrs:pictrs /var/lib/pictrs

Pict-rs memerlukan perintah magick yang ada di ImageMagick versi 7, tapi Ubuntu 20.04 hanya ada ImageMagick 6. Jadi Anda harus memasangnya secara manual, seperti lewat situs web resmi.

wget https://download.imagemagick.org/ImageMagick/download/binaries/magick
# bandingkan hash dengan "message digest" di halaman resmi yang ditautkan di atas
sha256sum magick
mv magick /usr/bin/
chmod 755 /usr/bin/magick

Seperti sebelumnya, letakkan konfigurasi di bawah ini ke /etc/systemd/system/pictrs.service, kemudian jalankan systemctl enable pictrs dan systemctl start pictrs.

[Unit]
Description=pict-rs - A simple image host
After=network.target

[Service]
User=pictrs
ExecStart=/usr/bin/pict-rs
Environment=PICTRS_PATH=/var/lib/pictrs
Environment=PICTRS_ADDR=127.0.0.1:8080
Restart=on-failure

[Install]
WantedBy=multi-user.target

Jika berjalan dengan benar, curl 127.0.0.1:8080 seharusnya tidak menampilkan apa-apa (terutama tidak ada galat).

Sekarang tambahkan baris pictrs_url: "http://127.0.0.1:8080" ke /etc/lemmy/lemmy.hjson sehingga Lemmy mengetahui bagaimana menjangkau Pict-rs. Kemudian mulai ulang Lemmy dengan systemctl restart lemmy dan pengunggahan gambar seharusnya bisa bekerja.

Meningkatkan/Memperbarui

Lemmy

# pasang rilis terbaru, anda juga bisa menspesifikkannya dengan --version
cargo install lemmy_server --target-dir /usr/bin/
systemctl restart lemmy

Lemmy UI

cd /var/lib/lemmy-ui
sudo -u lemmy
git checkout main
git pull --tags
git checkout 0.12.2 # ganti dengan versi yang ingin anda pasang
git submodule update
yarn install --pure-lockfile
yarn build:prod
exit
systemctl restart lemmy-ui

Pict-rs

rustup update
cd /var/lib/pictrs-source
git checkout main
git pull --tags
# periksa docker-compose.yml untuk versi pict-rs yang digunakan oleh lemmy
# https://github.com/LemmyNet/lemmy-ansible/blob/main/templates/docker-compose.yml#L40 
git checkout v0.2.6-r2
# atau tinggal tambahkan folder bin ke $PATH anda
$HOME/.cargo/bin/cargo build --release
cp target/release/pict-rs /usr/bin/
systemctl restart pictrs

Pemasangan di AWS

⚠️ Peringatan: metode pemasangan ini tidak direkomendasikan oleh pengembang Lemmy. Jika Anda ada masalah, Anda harus menyelesaikannya sendiri atau tanya pembuat terkait. Jika Anda melihat ada galat di peladen yang dipasang menggunakan metode ini, harap sebutkan di laporan galat.

CDK Lemmy AWS

Ini mengadung definisi infrastruktur yang diperlukan untuk memasang Lemmy ke AWS menggunakan Kit Pengembangan Awan mereka.

Termasuk:

  • Kluster fargate ECS
    • Lemmy-UI
    • Lemmy
    • Pictrs
  • CDN CloudFront
  • Penyimpanan EFS untuk pengunggahan gambar
  • Basis Data Postgres Aurora Tanpa Peladen
  • Hos VPC Bastion
  • Penyeimbang beban untuk Lemmy
  • Rekaman DNS untuk situs Anda

Mulai cepat

Klon Lemmy-CDK.

Klon Lemmy dan Lemmy-UI ke direktori di atas ini.

cp example.env.local .env.local
# sunting .env.local

Anda harus menyunting .env.local dengan pengaturan situs Anda.

npm install -g aws-cdk
npm install
cdk bootstrap
cdk deploy

Harga

Ini bukan cara termurah untuk menjalankan Lemmy. Basis Data Aurora Tanpa Peladen bisa membebani Anda ~$90/bulan jika tidak pergi tidur.

Perintah CDK yang Berguna

  • npm run build susun typescript ke js
  • npm run watch lacak perubahan dan susun
  • npm run test laksanakan uji unit jest
  • cdk deploy jalankan tumpukan (stack) ini ke akun/wilayah AWS baku Anda
  • cdk diff bandingkan tumpukan yang jalan dengan kondisi saat ini
  • cdk synth memancarkan templat CloudFormation yang disintesis

Langkah Pertama Administrasi

Setelah Anda berhasil memasang Lemmy entah secara manual dengan Docker atau secara otomatis dengan Ansible, berikut adalah beberapa rekomendasi untuk administrator baru peladen Lemmy.

Pengaturan Admin

Hal pertama yang dilakukan adalah pergi ke panel admin Anda, yang mana bisa ditemukan dengan mengklik gir di kanan atas di sebelah ikon pencarian. Di sini Anda bisa menentukan deskripsi situs Anda, sehingga orang-orang tahu jika situs Anda tentang topik tertentu atau semua topik diterima. Anda juga bisa menambahkan ikon dan spanduk yang mendefinisikan peladen Anda, contohnya logo organisasi Anda.

Luangkan waktu untuk menjelajah seluruh halaman untuk menemukan opsi berbeda untuk menyesuaikan peladen Lemmy Anda, di halaman yang sama Anda bisa menyunting berkas konfigurasi Anda, di mana Anda bisa mencari informasi tentang basis data Anda, surel yang digunakan oleh peladen, opsi federasi, atau siapa administrator utama.

Merupakan ide bagus untuk menunjuk administrator lain selain diri Anda sendiri, di mana jika harus melakukan suatu tindakan saat Anda terlelap. Lihatlah ke petunjuk moderasi untuk informasi lebih lanjut tentang hal ini.

Periksa bahwa semua sudah bekerja dengan benar

Surel

Cara termudah untuk memeriksa bahwa surel sudah bekerja adalah meminta pembaruan kata sandi. Anda perlu untuk mengatur surel di pengaturan Anda jika Anda belum melakukannya.

Setelah itu, tinggal keluar, pergi ke halaman Masuk, masukkan surel Anda di kotak Surel atau Nama Pengguna dan klik lupa kata sandi. Jika semuanya diatur dengan benar, Anda akan menerima sebuah surel untuk memperbarui kata sandi Anda. Anda bisa mengabaikan surel tersebut.

Federasi

Federasi dimatikan secara baku dan perlu dinyalakan antara lewat panel admin daring atau langsung lewat berkas config.json.

Untuk mencoba bahwa federasi peladen Anda bekerja dengan benar, jalankan curl -H 'Accept: application/activity+json' https://your-instance.com/u/your-username, itu seharusnya mengembalikan data json, bukan berkas .html. Jika itu tidak jelas untuk Anda, itu seharusnya sama dengan hasil dari curl -H 'Accept: application/activity+json' https://lemmy.ml/u/nutomic.

Penyertaan pada daftar peladen di join-lemmy.org

Untuk dimasukkan pada daftar peladen Lemmy di join-lemmy.org, Anda harus memenuhi persyaratan berikut:

  • Terfederasi dengan paling tidak satu peladen dari daftar
  • Mempunyai deskripsi dan ikon situs
  • Bersabar dan menunggu situs untuk diperbarui, tidak ada jadwal pasti untuk itu

Sementara menunggu, Anda selalu bisa mempromosikan peladen Anda di jejaring sosial lain seperti Mastodon menggunakan tagar #Lemmy.

Selalu terkini

Anda bisa berlangganan ke umpan RSS GitHub untuk diinformasikan tentang rilis terbaru:

Ada juga Matrix untuk administrator peladen yang Anda bisa gabung. Anda akan bertemu orang-orang yang bersahabat yang akan membantu (atau paling tidak mencoba) jika Anda bertemu suatu masalah.

Konfigurasi

Konfigurasi didasarkan pada berkas config.hjson, yang di mana ditempatkan secara baku di config/config.hjson. Untuk mengubah lokasi baku, Anda bisa mengatur variabel lingkungan LEMMY_CONFIG_LOCATION.

Variabel lingkungan tambahan LEMMY_DATABASE_URL juga tersedia, yang bisa digunakan dengan string koneksi PostgreSQL seperti postgres://lemmy:password@lemmy_db:5432/lemmy, meneruskan semua detail koneksi sekaligus.

Jika kontainer Docker tidak digunakan, buat basis data yang disebutkan di atas secara manual dengan menjalankan perintah berikut:

cd server
./db-init.sh

Federasi tidak diatur secara baku. Anda bisa menambahkan blok federasi ini ke lemmy.hjson Anda dan minta peladen lain untuk menambahkan Anda ke daftar yang diperbolehkan mereka.

Semua konfigurasi dengan nilai baku

{
  # 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
  }
  # 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, in seconds
    message_per_second: 60
    # Maximum number of posts created in interval
    post: 6
    # Interval length for post limit, in seconds
    post_per_second: 600
    # Maximum number of registrations in interval
    register: 3
    # Interval length for registration limit, in seconds
    register_per_second: 3600
    # Maximum number of image uploads in interval
    image: 6
    # Interval length for image uploads, in seconds
    image_per_second: 3600
    # Maximum number of comments created in interval
    comment: 6
    # Interval length for comment limit, in seconds
    comment_per_second: 600
    search: 6
    # Interval length for search limit, in seconds
    search_per_second: 600
  }
  # Settings related to activitypub federation
  federation: {
    # Whether to enable activitypub federation.
    enabled: false
    # Allows and blocks are described here:
    # https://join-lemmy.org/docs/en/administration/federation_getting_started.html
    # 
    # list of instances with which federation is allowed
    allowed_instances: [
      instance1.tld
      instance2.tld
      /* ... */
    ]
    # Instances which we never federate anything with (but previously federated objects are unaffected)
    blocked_instances: [
      string
      /* ... */
    ]
    # If true, only federate with instances on the allowlist and block everything else. If false
    # use allowlist only for remote communities, and posts/comments in local communities
    # (meaning remote communities will show content from arbitrary instances).
    strict_allowlist: true
    # Number of workers for sending outgoing activities. Search logs for Activity queue stats to
    # see information. If running number is consistently close to the worker_count, you should
    # increase it.
    worker_count: 64
  }
  captcha: {
    # Whether captcha is required for signup
    enabled: false
    # Can be easy, medium, or hard
    difficulty: "medium"
  }
  # Email sending configuration. All options except login/password are mandatory
  email: {
    # Hostname and port of the smtp server
    smtp_server: "localhost:25"
    # Login name for smtp server
    smtp_login: "string"
    # Password to login to the smtp server
    smtp_password: "string"
    # Address to send emails from, eg noreply@your-instance.com
    smtp_from_address: "noreply@example.com"
    # Whether or not smtp connections should use tls. Can be none, tls, or starttls
    tls_type: "none"
  }
  # Parameters for automatic configuration of new instance (only used at first start)
  setup: {
    # Username for the admin user
    admin_username: "admin"
    # Password for the admin user. It must be at least 10 characters.
    admin_password: "my_passwd_longer_than_ten_characters"
    # Name of the site (can be changed later)
    site_name: "My Lemmy Instance"
    # Email for the admin user (optional, can be omitted and set later through the website)
    admin_email: "string"
    sidebar: "string"
    description: "string"
    icon: "string"
    banner: "string"
    enable_downvotes: true
    open_registration: true
    enable_nsfw: true
    community_creation_admin_only: true
    require_email_verification: true
    require_application: true
    application_question: "string"
    private_instance: true
    default_theme: "string"
    default_post_listing_type: "string"
  }
  # the domain name of your instance (mandatory)
  hostname: "unset"
  # Address where lemmy should listen for incoming requests
  bind: "0.0.0.0"
  # Port where lemmy should listen for incoming requests
  port: 8536
  # Whether the site is available over TLS. Needs to be true for federation to work.
  tls_enabled: true
  # Address where pictrs is available (for image hosting)
  pictrs_url: "http://localhost:8080"
  slur_filter: "(\bThis\b)|(\bis\b)|(\bsample\b)"
  # Maximum length of local community and user names
  actor_name_max_length: 20
  # Maximum number of HTTP requests allowed to handle a single incoming activity (or a single object fetch through the search).
  http_fetch_retry_limit: 25
}

Federasi

Lemmy memiliki tiga jenis federasi:

  • Daftar yang diperbolehkan: Secara jelas mendaftar peladen untuk terhubung.
  • Daftar yang diblokir: Secara jelas mendaftar peladen untuk tidak terhubung. Federasi masih bisa untuk semua peladen lainnya.
  • Terbuka: Terfederasi dengan semua peladen yang mungkin.

Federasi tidak diatur secara baku. Anda bisa menambahkan blok federasi ini ke lemmy.hjson Anda dan minta peladen lain untuk menambahkan Anda ke daftar yang diperbolehkan mereka.

Lemmy menggunakan protokol ActivityPub (standar W3C) untuk mengaktifkan federasi antar peladen berbeda. Ini sangat sama dengan bagaimana surel bekerja. Contohnya, jika Anda menggunakan gmail.com, maka Anda bisa tidak hanya mengirim surel ke pengguna gmail.com lain, tapi juga ke pengguna yahoo.com, yandex.ru, dll. Surel menggunakan protokol SMTP untuk mencapai hal tersebut, jadi Anda bisa menganggap ActivityPub adalah "SMTP untuk media sosial". Jumlah tindakan berbeda yang mungkin dilakukan di media sosial (pos, komentar, suka, bagikan, dll) berarti bahwa ActivityPub jauh lebih rumit daripada SMTP.

Sama seperti surel, federasi ActivityPub hanya terjadi antar peladen. Jadi jika Anda terdaftar pada enterprise.lemmy.ml, Anda hanya terhubung ke API dari enterprise.lemmy.ml, sementara peladen mengurus pengiriman dan penerimaan data dari peladen lainnya (mis. voyager.lemmy.ml). Keuntungan besar dari pendekatan ini adalah pengguna biasa tidak harus melakukan apa pun untuk menggunakan federasi. Bahkan jika Anda menggunakan Lemmy, kemungkinan besar Anda sudah menggunakannya. Salah satu cara untuk mengonfirmasinya adalah dengan membuka komunitas atau profil pengguna. Jika Anda berada di enterprise.lemmy.ml dan Anda melihat pengguna seperti @nutomic@voyager.lemmy.ml, atau komunitas seperti !main@ds9.lemmy.ml, maka itu berarti Anda sudah terfederasi, artinya mereka menggunakan peladen yang berbeda dari Anda.

Salah satu cara Anda bisa mengambil keuntungan dari federasi adalah dengan membuka peladen lain, seperti ds9.lemmy.ml dan jelajahi itu. Jika Anda melihat sebuah komunitas, pos, atau pengguna yang menarik yang Anda ingin berinteraksi dengan mereka, tinggal salin URL-nya dan tempel itu di pencarian dari peladen Anda sendiri. Peladen Anda akan terhubung ke yang disebutkan (menganggap daftar yang diperbolehkan/diblokir memperbolehkannya), dan secara langsung menampilkan konten jarak jauh untuk Anda, sehingga Anda bisa mengikuti sebuah komunitas atau berkomentar di sebuah pos. Berikut adalah beberapa contoh dari pencarian yang bekerja:

  • !main@lemmy.ml (Komunitas)
  • @nutomic@lemmy.ml (Pengguna)
  • https://lemmy.ml/c/programming (Komunitas)
  • https://lemmy.ml/u/nutomic (Pengguna)
  • https://lemmy.ml/post/123 (Pos)
  • https://lemmy.ml/comment/321 (Komentar)

Anda bisa melihat daftar dari peladen yang terhubung dengan mengikuti pada tautan "Peladen" pada bagian bawah dari setiap halaman Lemmy.

Mengambil komunitas

Jika Anda mencari sebuah komunitas untuk pertama kali, awal-awal 20 pos akan diambil. Hanya jika paling tidak satu pengguna dari peladen Anda berlangganan ke komunitas jarak jauh yang akan membuat komunitas tersebut mengirim pembaruan ke peladen Anda. Pembaruan termasuk:

  • Pos dan komentar baru
  • Pilihan (Pilih Atas/Bawah)
  • Penyuntingan dan penghapusan pos dan komentar
  • Tindakan moderator

Anda bisa menyalin URL dari komunitas di bilah alamat peramban Anda dan memasukkannya ke bilah pencarian Anda. Tunggu beberapa saat dan pos akan muncul. Saat ini tidak ada penunjuk sedang memuat untuk pencarian, jadi tunggu beberapa saat jika muncul "no results".

Mengambil pos

Tempel URL dari pos ke bilah pencarian peladen Lemmy Anda. Tunggu beberapa saat sampai posnya muncul. Ini juga akan mengambil profil komunitas dan profil dari pembuat pos.

Mengambil komentar

Jika Anda menemukan sebuah komentar yang menarik di bawah pos di peladen lain, Anda bisa mencari di bawah komentar di menu 3 tombol sebuah ikon tautan. Salin tautan tersebut. Bentuknya seperti https://lemmy.ml/post/56382/comment/40796. Hapus bagian post/XXX dan taruh di bilah pencarian Anda. Untuk contoh tadi, bentuknya seperti https://lemmy.ml/comment/40796. Komentar tersebut, semua komentar induk, pengguna dan komunitas, dan semua pos yang berhubungan diambil dari peladen jarak jauh, jika mereka belum dikenali secara lokal.

Komentar saudara tidak diambil! Jika Anda ingin lebih banyak komentar dari pos lama, Anda harus mencari mereka satu per satu seperti yang dijelaskan di atas.

Penyelesaian Masalah

Berbagai masalah yang bisa terjadi di peladen baru dan bagaimana untuk menyelesaikan mereka.

Banyak fitur Lemmy bergantung pada konfigurasi proksi-balik yang benar. Pastikan yang Anda sama dengan konfigurasi nginx kami.

Umum

Log

Untuk masalah antarmuka, periksa konsol peramban untuk pesan galat apa pun.

Untuk log peladen, jalankan docker-compose logs -f lemmy di folder pemasangan Anda. Anda juga bisa menjalankan docker-compose logs -f lemmy lemmy-ui pictrs untuk mendapatkan log dari layanan yang berbeda.

Jika itu tidak memberikan informasi yang cukup, coba ubah baris RUST_LOG=error di docker-compose.yml ke RUST_LOG=info atau RUST_LOG=verbose, kemudian jalankan docker-compose restart lemmy.

Membuat pengguna admin tidak bekerja

Pastikan bahwa websocket bekerja dengan benar, dengan memeriksa konsol peramban untuk galat. Di nginx, tajuk berikut penting untuk ini:

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

Membatasi galat ketika banyak pengguna mengakses situs

Periksa bahwa tajuk X-Real-IP dan X-Forwarded-For dikirim ke Lemmy oleh proksi-balik. Kalau tidak, itu akan menghitung semua tindakan terhadap batas dari proksi-balik IP. Di nginx, itu seharusnya tertampil sebagai:

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Federasi

Peladen lain tidak bisa mengambil konten lokal (komunitas, pos, dll.)

Proksi-balik Anda (mis. nginx) perlu meneruskan permintaan dengan tajuk Accept: application/activity+json ke bagian-belakang. Itu ditangani oleh baris berikut:

set $proxpass "http://0.0.0.0:{{ lemmy_ui_port }}";
if ($http_accept = "application/activity+json") {
set $proxpass "http://0.0.0.0:{{ lemmy_port }}";
}
if ($http_accept = "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") {
set $proxpass "http://0.0.0.0:{{ lemmy_port }}";
}
proxy_pass $proxpass;

Anda bisa memeriksa bahwa itu bekerja dengan benar dengan menjalankan perintah berikut, semuanya seharusnya mengembalikan JSON yang valid:

curl -H "Accept: application/activity+json" https://your-instance.com/u/some-local-user
curl -H "Accept: application/activity+json" https://your-instance.com/c/some-local-community
curl -H "Accept: application/activity+json" https://your-instance.com/post/123 # id dari sebuah pos lokal
curl -H "Accept: application/activity+json" https://your-instance.com/comment/123 # id dari sebuah komentar lokal

Mengambil konten jarak jauh bekerja, tapi mengepos/berkomentar di komunitas jarak jauh gagal

Periksa bahwa federasi dibolehkan pada kedua belah peladen.

Juga pastikan bahwa waktu di peladen Anda sudah akurat. Aktifitas ditandai dengan waktu dan akan dihapus jika meleset lebih dari 10 detik.

Petunjuk Pencadangan dan Pemulihan

Docker dan Ansible

Ketika menggunakan Docker atau Ansible, seharusnya ada folder volumes yang mengandung baik basis data dan seluruh gambar. Salin folder ini ke peladen baru untuk memulihkan data Anda

Pencadangan basis data bertahap

Untuk pencadangan DB bertahap ke berkas .sql, Anda bisa menjalankan:

docker-compose exec postgres pg_dumpall -c -U lemmy >  lemmy_dump_`date +%Y-%m-%d"_"%H_%M_%S`.sql

Contoh skrip pencadangan

#!/bin/sh
# Pencadangan DB
ssh MY_USER@MY_IP "docker-compose exec postgres pg_dumpall -c -U lemmy" >  ~/BACKUP_LOCATION/INSTANCE_NAME_dump_`date +%Y-%m-%d"_"%H_%M_%S`.sql

# Pencadangan folder volumes
rsync -avP -zz --rsync-path="sudo rsync" MY_USER@MY_IP:/LEMMY_LOCATION/volumes ~/BACKUP_LOCATION/FOLDERNAME

Memulihkan DB

Jika Anda perlu untuk memulihkan dari berkas pg_dumpall, pertama-tama Anda perlu membersihkan basis data telah ada Anda.

# Drop the existing DB
docker exec -i FOLDERNAME_postgres_1 psql -U lemmy -c "DROP SCHEMA public CASCADE; CREATE SCHEMA public;"

# Restore from the .sql backup
cat db_dump.sql  |  docker exec -i FOLDERNAME_postgres_1 psql -U lemmy # restores the db

# This also might be necessary when doing a db import with a different password.
docker exec -i FOLDERNAME_postgres_1 psql -U lemmy -c "alter user lemmy with password 'bleh'"

Mengubah nama domain Anda

Jika Anda belum terfederasi, Anda bisa mengubah nama domain Anda di DB. Peringatan: jangan lakukan ini setelah Anda terfederasi atau itu akan merusak federasi.

Pergi ke psql dari Docker Anda:

docker-compose exec postgres psql -U lemmy

-- Post
update post set ap_id = replace (ap_id, 'old_domain', 'new_domain');
update post set url = replace (url, 'old_domain', 'new_domain');
update post set body = replace (body, 'old_domain', 'new_domain');
update post set thumbnail_url = replace (thumbnail_url, 'old_domain', 'new_domain');

-- Comments
update comment set ap_id = replace (ap_id, 'old_domain', 'new_domain');
update comment set content = replace (content, 'old_domain', 'new_domain');

-- User
update user_ set actor_id = replace (actor_id, 'old_domain', 'new_domain');
update user_ set inbox_url = replace (inbox_url, 'old_domain', 'new_domain');
update user_ set shared_inbox_url = replace (shared_inbox_url, 'old_domain', 'new_domain');
update user_ set avatar = replace (avatar, 'old_domain', 'new_domain');

-- Community
update community set actor_id = replace (actor_id, 'old_domain', 'new_domain');
update community set followers_url = replace (followers_url, 'old_domain', 'new_domain');
update community set inbox_url = replace (inbox_url, 'old_domain', 'new_domain');
update community set shared_inbox_url = replace (shared_inbox_url, 'old_domain', 'new_domain');

Lihat juga

  • https://stackoverflow.com/questions/24718706/backup-restore-a-dockerized-postgresql-database

Federasi

Tinjauan Federasi

Dokumen ini untuk siapa saja yang ingin mengetahui bagaimana federasi Lemmy bekerja, tanpa terlalu teknis. Ini dimaksudkan untuk memberikan tinjauan umum tingkat tinggi terhadap federasi ActivityPub di Lemmy. Jika Anda mengimplementasikan ActivityPub sendiri dan ingin kompatibel dengan Lemmy, baca Garis Besar API ActivityPub kami.

Konvensi dokumentasi

Untuk mempermudah, kadang kala Anda akan melihat sesuatu diformat seperti Create/Note atau Delete/Event atau Undo/Follow. Hal sebelum garis miring adalah Aktivitas dan setelahnya adalah Objek di dalam Aktivitas, di properti object. Jadi itu dibaca sebagai berikut:

  • Create/Note: sebuah aktivitas Create yang mengandung Note di bidang object
  • Delete/Event: sebuah aktivitas Delete yang mengandung Event di bidang object
  • Undo/Follow: sebuah aktivitas Undo yang mengandung Follow di bidang object

Di Lemmy, kami menggunakan beberapa hal spesifik yang merujuk kepada item ActivityPub. Mereka sejatinya adalah implementasi kami terhadap konsep ActivityPub:

  • Komunitas: Group
  • Pengguna: Person
  • Pos: Page
  • Komentar: Note

Dokumentasi ini memiliki tiga bagian utama:

  • Filosofi Federasi menjabarkan gambaran umum bagaimana ini ditujukan untuk federasi
  • Aktivitas Pengguna menjelaskan tindakan apa yang Pengguna bisa lakukan untuk berinteraksi
  • Aktivitas Komunitas menjelaskan apa yang Komunitas lakukan sebagai respons terhadap tindakan beberapa Pengguna

Filosofi Federasi

Aktor utama di Lemmy adalah Komunitas. Setiap komunitas berada di suatu peladen tunggal dan terdiri dari daftar Pos dan daftar pengikut. Interaksi utama adalah Pengguna mengirim Pos atau Komentar terkait aktivitas ke kotak masuk Komunitas, yang kemudian mengumumkannya ke seluruh pengikutnya.

Setiap Komunitas memiliki Pengguna pembuat tertentu, yang bertanggung jawab untuk mengatur peraturan, mengangkat moderator, dan menghapus konten yang melanggar peraturan.

Selain moderasi di tingkat komunitas, setiap peladen memiliki seperangkat Pengguna administrator, yang mempunyai kekuasaan untuk melakukan penghapusan dan pelarangan tingkat situs.

Pengguna mengikuti Komunitas yang mereka tertarik kepada mereka untuk menerima Pos dan Komentar. Mereka juga memilih pada Pos dan Komentar, dan juga membuat yang baru. Komentar dikelola dalam struktur pohon dan biasanya diurut berdasarkan jumlah pilihan. Pesan langsung antar Pengguna juga didukung.

Pengguna tidak bisa mengikuti satu sama lain dan Komunitas juga tidak bisa mengikuti apa pun.

Implementasi federasi kami sudah komplit fitur, tapi kami sampai saat ini belum fokus untuk mengikuti spesifikasi ActivityPub. Karena itu, Lemmy kemungkinan besar tidak akan kompatibel dengan implementasi yang mengharapkan untuk mengirim dan menerima aktivitas yang valid. Ini adalah sesuatu yang kami akan perbaiki di masa mendatang. Periksa #698 untuk gambaran penyimpangan kami.

Aktivitas Pengguna

Mengikuti sebuah Komunitas

Setiap halaman Komunitas memiliki tombol "Ikuti". Mengkliknya akan memicu sebuah aktivitas Follow untuk dikirim dari pengguna ke kotak masuk Komunitas. Komunitas akan secara otomatis merespons dengan aktivitas Accept/Follow ke kotak masuk pengguna. Itu juga akan menambahkan pengguna tersebut ke daftar pengikutnya dan mengirimkan setiap aktivitas terkait Pos/Komentar di Komunitas ke pengguna.

Batal Mengikuti Komunitas

Setelah mengikuti sebuah Komunitas, tombol "Ikuti" berubah menjadi "Batal Ikuti". Mengklik ini akan mengirim aktivitas Undo/Follow ke kotak masuk Komunitas. Komunitas tersebut menghapus Pengguna dari daftar pengikutnya dan tidak akan mengirim aktivitas apa pun lagi ke ia.

Membuat Pos

Ketika pengguna membuat Pos di Komunitas tertentu, itu akan dikirim sebagai Create/Page ke kotak masuk Komunitas tersebut.

Membuat Komentar

Ketika sebuah Komentar baru dibuat untuk sebuah Pos, baik ID Pos dan ID Komentar induk (jika ada) ditulis ke bidang in_reply_to. Ini memungkinkan untuk menetapkannya ke Pos yang benar dan membangun pohon Komentar. Kemudian itu dikirim ke kotak masuk Komunitas sebagai Create/Note

Peladen asal juga memindai Komentar untuk sebutan Pengguna apa pun dan mengirim aktivitas Create/Note ke Pengguna tersebut.

Menyunting Pos

Mengubah konten dari Pos yang sudah ada. Hanya bisa dilakukan oleh Pengguna yang membuat.

Menyunting Komentar

Mengubah konten dari Komentar yang sudah ada. Hanya bisa dilakukan oleh Pengguna yang membuat.

Suka dan Tidak Suka

Pengguna bisa suka dan tidak sukai Pos atau Komentar apa pun. Itu dikirim sebagai Like/Page, Dislike/Note, dll. ke kotak masuk Komunitas.

Penghapusan

Pembuat dari Pos, Komentar, atau Komunitas bisa menghapus yang dibuatnya. Itu kemudian dikirim ke pengikut Komunitas. Kemudian itu disembunyikan dari seluruh pengguna.

Pembersihan

Moderator bisa membersihkan Pos dan Komentar dari Komunitas mereka. Administrator bisa membersihkan Pos dan Komentar apa pun dari seluruh peladen ia sendiri. Komunitas juga bisa dibersihkan oleh administrator. Kemudian, itu disembunyikan dari seluruh pengguna.

Pembersihan dikirim ke seluruh pengikut dari sebuah Komunitass, supaya mereka akan terkena efeknya di sana. Pengecualian dari ini adalah jika administrator membersihkan sesuatu dari Komunitas yang dihos di peladen yang berbeda. Jika begitu, pembersihan hanya berefek secara lokal.

Mengurungkan Tindakan Sebelumnya

Tidak ada yang dihapus dari basis data, hanya menyembunyikannya dari pengguna. Komunitas/Pos/Komentar yang telah dihapus atau dibersihkan memiliki tombol "pulihkan". Tombol ini menghasilkan aktivitas Undo yang menetapkan aktivitas penghapusan/pembersihan sebelumnya sebagai objek, seperti Undo/Remove/Post atau Undo/Delete/Community.

Mengklik tombol pilih naik dari pos/komentar yang sudah dipilih naikkan (atau pilih turun dari pos/komentar yang sudah dipilih turunkan) akan juga menghasilkan Undo. Dalam contoh tersebut akan menghasilkan Undo/Like/Post atau Undo/Dislike/Comment.

Buat Pesan Pribadi

Di profil pengguna ada tombol "Kirim Pesan", yang akan membuka dialog perizinan untuk mengirimkan pesan pribadi ke pengguna ini. Ini dikirim sebagai Create/Note ke kotak masuk pengguna tersebut. Pesan pribadi hanya bisa ditujukan kepada satu pengguna tunggal.

Sunting Pesan Pribadi

Update/Note mengubah teks dari pesan yang telah dikirim sebelumnya.

Hapus Pesan Pribadi

Delete/Note menghapus pesan pribadi.

Memulihkan Pesan Pribadi

Undo/Delete/Note mengurungkan penghapusan pesan pribadi.

Aktivitas Komunitas

Komunitas itu secara dasarnya adalah bot, yang hanya akan melakukan sesuatu sebagai balasan untuk tindakan dari pengguna. Pengguna yang pertama kali membuat komunitas akan menjadi moderator pertama dan bisa menambahkan moderator tambahan. Secara umum, kapan pun komunitas menerima aktivitas yang valid di kotak masuknya, aktivitas tersebut akan diteruskan ke seluruh pengikutnya.

Menerima Ikuti

Jika komunitas menerima aktivitas Follow, maka komunitas akan secara otomatis membalas dengan Accept/Follow. Komunitas juga menambahkan pengguna tersebut ke daftar pengikutnya.

Batal Ikuti

Ketika menerima Undo/Follow, Komunitas menghapus Pengguna tersebut dari daftar pengikutnya.

Mengumumkan

Jika Komunitas menerima aktivitas terkait Pos atau Komentar (Buat, Perbarui, Suka, Tidak Suka, Hapus, Bersihkan, Urung), Komunitas akan mengumumkannya ke pengikutnya. Untuk ini, Mengumumkan dibuat dengan Komunitas sebagai aktor dan aktivitas yang diterima sebagai objek. Karena itu, peladen tersebut dapat terus pembaruan terkait aktivitas di Komunitas yang diikutinya.

Menghapus Komunitas

Jika pembuat atau administrator menghapus sebuah Komunitas, itu mengirim Delete/Group ke seluruh pengikutnya.

Protokol Federasi Lemmy

Protokol Lemmy (atau Protokol Federasi Lemmy) merupakan bagian dari Protokol ActivityPub, dengan beberapa tambahan.

Dokumen ini ditujukan untuk pengembang yang familiar dengan protokol ActivityPub dan ActivityStreams. Dokumen ini memberikan gambaran rinci tentang aktor, objek, dan aktivitas yang digunakan oleh Lemmy.

Sebelum membaca bagian ini, coba lihat pada Tinjauan Federasi kami untuk mendapatkan gambaran bagaimana federasi Lemmy bekerja pada tingkat tinggi.

Konteks

[
  "https://www.w3.org/ns/activitystreams",
  {
    "stickied": "as:stickied",
    "pt": "https://join-lemmy.org#",
    "sc": "http://schema.org#",
    "matrixUserId": {
      "type": "sc:Text",
      "id": "as:alsoKnownAs"
    },
    "sensitive": "as:sensitive",
    "comments_enabled": {
      "type": "sc:Boolean",
      "id": "pt:commentsEnabled"
    },
    "moderators": "as:moderators"
  },
  "https://w3id.org/security/v1"
]

Konteks identik untuk semua aktivitas dan objek.

Aktor

Komunitas

Aktor terotomatisasi. Pengguna bisa mengirim pos atau komentar ke ini, yang mana komunitas meneruskannya ke pengikutnya dalam bentuk Announce.

Mengirim aktivitas ke pengguna: Accept/Follow, Announce.

Menerima aktivitas dari pengguna: Follow, Undo/Follow, Create, Update, Like, Dislike, Remove (hanya admin/moderator), Delete (hanya pembuat), Undo (hanya untuk tindakan sendiri)

{
  "id": "https://enterprise.lemmy.ml/c/tenforward",
  "type": "Group",
  "preferredUsername": "main",
  "name": "Ten Forward",
  "summary": "<p>Lounge and recreation facility</p>\n<hr />\n<p>Welcome to the <a href=\"https://memory-alpha.fandom.com/wiki/USS_Enterprise_(NCC-1701-D)\">Enterprise</a>!.</p>\n",
  "source": {
    "content": "Lounge and recreation facility\n\n---\n\nWelcome to the [Enterprise](https://memory-alpha.fandom.com/wiki/USS_Enterprise_(NCC-1701-D))!.",
    "mediaType": "text/markdown"
  },
  "sensitive": false,
  "icon": {
    "type": "Image",
    "url": "https://enterprise.lemmy.ml/pictrs/image/waqyZwLAy4.webp"
  },
  "image": {
    "type": "Image",
    "url": "https://enterprise.lemmy.ml/pictrs/image/Wt8zoMcCmE.jpg"
  },
  "inbox": "https://enterprise.lemmy.ml/c/tenforward/inbox",
  "followers": "https://enterprise.lemmy.ml/c/tenforward/followers",
  "moderators": "https://enterprise.lemmy.ml/c/tenforward/moderators",
  "postingRestrictedToMods": false,
  "endpoints": {
    "sharedInbox": "https://enterprise.lemmy.ml/inbox"
  },
  "outbox": "https://enterprise.lemmy.ml/c/tenforward/outbox",
  "publicKey": {
    "id": "https://enterprise.lemmy.ml/c/tenforward#main-key",
    "owner": "https://enterprise.lemmy.ml/c/tenforward",
    "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzRjKTNtvDCmugplwEh+g\nx1bhKm6BHUZfXfpscgMMm7tXFswSDzUQirMgfkxa9ubfr1PDFKffA2vQ9x6CyuO/\n70xTafdOHyV1tSqzgKz0ZvFZ/VCOo6qy1mYWVkrtBm/fKzM+87MdkKYB/zI4VyEJ\nLfLQgjwxBAEYUH3CBG71U0gO0TwbimWNN0vqlfp0QfThNe1WYObF88ZVzMLgFbr7\nRHBItZjlZ/d8foPDidlIR3l2dJjy0EsD8F9JM340jtX7LXqFmU4j1AQKNHTDLnUF\nwYVhzuQGNJ504l5LZkFG54XfIFT7dx2QwuuM9bSnfPv/98RYrq1Si6tCkxEt1cVe\n4wIDAQAB\n-----END PUBLIC KEY-----\n"
  },
  "published": "2019-06-02T16:43:50.799554+00:00",
  "updated": "2021-03-10T17:18:10.498868+00:00"
}
Nama BidangDeskripsi
preferredUsernameNama aktor
nameJudul komunitas
sensitiveTrue menunjukkan bahwa semua pos di komunitas adalah NSFW
attributedToPertama, pembuat komunitas, kemudian moderator lainnya
contentTeks untuk bilah samping komunitas, biasanya memuat deskripsi dan peraturan
iconIkon, ditampilkan di sebelah nama komunitas
imageGambar spanduk, ditampilkan di bagian atas halaman komunitas
inboxURL kotak masuk ActivityPub
outboxURL kotak keluar ActivityPub, hanya mengandung 20 pos terakhir, tidak ada komentar, pilihan suara, atau aktivitas lainnya
followersURL koleksi pengikut, hanya mengandung jumlah pengikut, tidak ada penunjuk terhadap pengikut individual
endpointsURL kotak masuk bersama
publishedTanggal waktu komunitas dibuat
updatedTanggal waktu komunitas terakhir diubah
publicKeyKunci publik yang digunakan untuk memverifikasi tanda tangan dari aktor ini

Pengguna

Orang, yang berinteraksi secara umum dengan komunitas, di mana ia mengirim dan menerima pos dan/atau komentar. Bisa juga membuat dan memoderasi komunitas dan mengirim pesan pribadi ke pengguna lain.

Mengirim aktivitas ke komunitas: Follow, Undo/Follow, Create, Update, Like, Dislike, Remove (hanya admin/moderator), Delete (hanya pembuat), Undo (hanya untuk tindakan sendiri).

Menerima aktivitas dari komunitas: Accept/Follow, Announce

Menerima dan mengirim aktivitas dari/ke pengguna lain: Create/Note, Update/Note, Delete/Note, Undo/Delete/Note (semua itu terkait dengan pesan pribadi)

{
  "id": "https://enterprise.lemmy.ml/u/picard",
  "type": "Person",
  "preferredUsername": "picard",
  "name": "Jean-Luc Picard",
  "summary": "<p>Captain of the starship <strong>Enterprise</strong>.</p>\n",
  "source": {
    "content": "Captain of the starship **Enterprise**.",
    "mediaType": "text/markdown"
  },
  "icon": {
    "type": "Image",
    "url": "https://enterprise.lemmy.ml/pictrs/image/ed9ej7.jpg"
  },
  "image": {
    "type": "Image",
    "url": "https://enterprise.lemmy.ml/pictrs/image/XenaYI5hTn.png"
  },
  "matrixUserId": "@picard:matrix.org",
  "inbox": "https://enterprise.lemmy.ml/u/picard/inbox",
  "outbox": "https://enterprise.lemmy.ml/u/picard/outbox",
  "endpoints": {
    "sharedInbox": "https://enterprise.lemmy.ml/inbox"
  },
  "published": "2020-01-17T01:38:22.348392+00:00",
  "updated": "2021-08-13T00:11:15.941990+00:00",
  "publicKey": {
    "id": "https://enterprise.lemmy.ml/u/picard#main-key",
    "owner": "https://enterprise.lemmy.ml/u/picard",
    "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0lP99/s5Vv+XbPdkeqIJ\nwoD4GFnHmBnBHdEKChEUWfWj1TtioC/rGNoXFQeXQA3Amhy4nxSceiDnUgwkkuQY\nv0MtIW58NzgknEavtllxL+LSds5pg3gANaDIk8UiWTkqXTg0GnlJMpCK1Chen0l/\nszL6DEvUyTSuS5ZYDXFgewF89Pe7U0S15V5U2Harv7AgJYDyxmUL0D1pGuUCRqcE\nl5MTHJjrXeNnH1w2g8aly8YlO/Cr0L51rFg/lBF23vni7ZLv8HbmWh6YpaAf1R8h\nE45zKR7OHqymdjzrg1ITBwovefpwMkVgnJ+Wdr4HPnFlBSkXPoZeM11+Z8L0anzA\nXwIDAQAB\n-----END PUBLIC KEY-----\n"
  }
}
Nama BidangDeskripsi
preferredUsernameNama aktor
nameNama tampilan pengguna
contentBio pengguna
iconAvatar pengguna, ditampilkan di sebelah nama pengguna
imageSpanduk pengguna, ditampilkan di bagian atas profil pengguna
inboxURL kotak masuk ActivityPub
endpointsURL kotak masuk bersama
publishedTanggal waktu pengguna mendaftar
updatedTanggal waktu profil pengguna terakhir diubah
publicKeyKunci publik yang digunakan untuk memverifikasi tanda tangan dari aktor ini

Kotak masuk pengguna sebenarnya belum diimplementasikan dan hanya sebagai papan nama untuk implementasi ActivityPub yang membutuhkannya.

Objek

Pos

Halaman dengan judul, dan opsional ada URL dan konten teks. URL biasanya merujuk ke gambar, yang mana kelukunya disertakan. Setiap pos dimiliki oleh hanya satu komunitas.

{
  "id": "https://enterprise.lemmy.ml/post/55143",
  "type": "Page",
  "attributedTo": "https://enterprise.lemmy.ml/u/picard",
  "to": [
    "https://enterprise.lemmy.ml/c/tenforward",
    "https://www.w3.org/ns/activitystreams#Public"
  ],
  "name": "Post title",
  "content": "<p>This is a post in the /c/tenforward community</p>\n",
  "mediaType": "text/html",
  "source": {
    "content": "This is a post in the /c/tenforward community",
    "mediaType": "text/markdown"
  },
  "url": "https://enterprise.lemmy.ml/pictrs/image/eOtYb9iEiB.png",
  "attachment": [
    {
      "type": "Link",
      "href": "https://enterprise.lemmy.ml/pictrs/image/eOtYb9iEiB.png"
    }
  ],
  "image": {
    "type": "Image",
    "url": "https://enterprise.lemmy.ml/pictrs/image/eOtYb9iEiB.png"
  },
  "sensitive": false,
  "commentsEnabled": true,
  "stickied": true,
  "published": "2021-02-26T12:35:34.292626+00:00"
}
Nama BidangDeskripsi
attributedToID dari pengguna yang membuat pos tersebut
toID dari komunitas di mana pos tersebut dipos
nameJudul pos
contentBadan/Konten pos
urlTautan apa pun untuk dibagian
imageKeluku untuk url, hanya ada jika tautannya adalah tautan gambar
commentsEnabledFalse menunjukkan bahwa pos tersebut dikunci dan tidak ada komentar lagi yang bisa ditambahkan
sensitiveTrue menandai pos tersebut sebagai NSFW, mengaburkan kelukunya, dan menyembunyikannya dari pengguna dari pengguna yang pengaturan NSFW-nya dimatikan
stickiedTrue menunjukkan bahwa pos tersebut ditampilkan di bagian atas komunitas
publishedTanggal waktu pos dibuat
updatedTanggal waktu pos disunting (tidak ada jika tidak pernah disunting)

Komentar

Balasan kepada pos, atau balasan ke komentar lain. Hanya mengandung teks (termasuk referensi ke pengguna atau komunitas lain). Lemmy menampilkan komentar dalam struktur pohon.

{
  "id": "https://enterprise.lemmy.ml/comment/38741",
  "type": "Note",
  "attributedTo": "https://enterprise.lemmy.ml/u/picard",
  "to": ["https://www.w3.org/ns/activitystreams#Public"],
  "cc": [
    "https://enterprise.lemmy.ml/c/tenforward",
    "https://enterprise.lemmy.ml/u/picard"
  ],
  "inReplyTo": "https://enterprise.lemmy.ml/post/55143",
  "content": "<p>first comment!</p>\n",
  "mediaType": "text/html",
  "source": {
    "content": "first comment!",
    "mediaType": "text/markdown"
  },
  "tag": [
    {
      "href": "https://enterprise.lemmy.ml/u/picard",
      "type": "Mention",
      "name": "@picard@enterprise.lemmy.ml"
    }
  ],
  "published": "2021-03-01T13:42:43.966208+00:00",
  "updated": "2021-03-01T13:43:03.955787+00:00"
}
Nama BidangDeskripsi
attributedToID dari pengguna yang membuat pos
toKomunitas di mana komentar tersebut dibuat
contentTeks komentar
inReplyToID pos di mana komentar tersebut dibuat, dan komentar induk (jika ada). Jika komentar ini adalah komentar induk, bidang ini hanya berisi ID pos saja
publishedTanggal waktu komentar dibuat
updatedTanggal waktu komentar disunting (tidak ada jika tidak pernah disunting)

Pesan Pribadi

Pesan langsung dari satu pengguna ke pengguna lain. Tidak bisa ada pengguna ketiga yang bergabung. Pengutasan belum diimplementasikan, jadi bidang inReplyTo tidak ada.

{
  "id": "https://enterprise.lemmy.ml/private_message/1621",
  "type": "ChatMessage",
  "attributedTo": "https://enterprise.lemmy.ml/u/picard",
  "to": [
    "https://queer.hacktivis.me/users/lanodan"
  ],
  "content": "<p>Hello hello, testing</p>\n",
  "mediaType": "text/html",
  "source": {
    "content": "Hello hello, testing",
    "mediaType": "text/markdown"
  },
  "published": "2021-10-21T10:13:14.597721+00:00"
}
Nama BidangDeskripsi
attributedToID pengguna yang membuat pesan pribadi
toID penerima
contentTeks pesan pribadi
publishedTanggal waktu pesan dibuat
updatedTanggal waktu pesan disunting (tidak ada jika tidak pernah disunting)

Koleksi

Kotak Keluar Komunitas

{
  "type": "OrderedCollection",
  "id": "https://ds9.lemmy.ml/c/testcom/outbox",
  "totalItems": 2,
  "orderedItems": [
    {
      "actor": "https://ds9.lemmy.ml/c/testcom",
      "to": [
        "https://www.w3.org/ns/activitystreams#Public"
      ],
      "object": {
        "type": "Page",
        "id": "https://ds9.lemmy.ml/post/2328",
        "attributedTo": "https://ds9.lemmy.ml/u/nutomic",
        "to": [
          "https://ds9.lemmy.ml/c/testcom",
          "https://www.w3.org/ns/activitystreams#Public"
        ],
        "cc": [],
        "name": "another outbox test",
        "mediaType": "text/html",
        "commentsEnabled": true,
        "sensitive": false,
        "stickied": false,
        "published": "2021-11-18T17:19:45.895163+00:00"
      },
      "cc": [
        "https://ds9.lemmy.ml/c/testcom/followers"
      ],
      "type": "Announce",
      "id": "https://ds9.lemmy.ml/activities/announce/b204fe9f-b13d-4af2-9d22-239ac2d892e6"
    },
    {
      "actor": "https://ds9.lemmy.ml/c/testcom",
      "to": [
        "https://www.w3.org/ns/activitystreams#Public"
      ],
      "object": {
        "type": "Page",
        "id": "https://ds9.lemmy.ml/post/2327",
        "attributedTo": "https://ds9.lemmy.ml/u/nutomic",
        "to": [
          "https://ds9.lemmy.ml/c/testcom",
          "https://www.w3.org/ns/activitystreams#Public"
        ],
        "cc": [],
        "name": "outbox test",
        "mediaType": "text/html",
        "commentsEnabled": true,
        "sensitive": false,
        "stickied": false,
        "published": "2021-11-18T17:19:05.763109+00:00"
      },
      "cc": [
        "https://ds9.lemmy.ml/c/testcom/followers"
      ],
      "type": "Announce",
      "id": "https://ds9.lemmy.ml/activities/announce/c6c960ce-c8d8-4231-925e-3ba367468f18"
    }
  ]
}

Saat ini, kotak keluar hanya mengandung aktivitas Create/Post.

Pengikut Komunitas

{
  "id": "http://enterprise.lemmy.ml/c/main/followers",
  "type": "Collection",
  "totalItems": 3,
  "items": []
}

Koleksi/Statistik pengikut hanya digunakan untuk menampilkan jumlah pengikut komunitas. ID aktor tidak diikutkan untuk melindungi privasi pengguna.

Moderator Komunitas

{
  "type": "OrderedCollection",
  "id": "https://enterprise.lemmy.ml/c/tenforward/moderators",
  "orderedItems": [
    "https://enterprise.lemmy.ml/u/picard"
  ]
}

Kotak Keluar Pengguna

{
  "type": "OrderedCollection",
  "id": "http://ds9.lemmy.ml/u/lemmy_alpha/outbox",
  "orderedItems": [],
  "totalItems": 0
}

Aktivitas

Pengguna ke Komunitas

Ikuti

Ketika pengguna mengklik "Langgan" di komunitas, aktivitas Follow dikirim. Secara otomatis komunitas membalas dengan Accept/Follow.

{
  "actor": "http://ds9.lemmy.ml/u/lemmy_alpha",
  "object": "http://enterprise.lemmy.ml/c/main",
  "type": "Follow",
  "id": "http://ds9.lemmy.ml/activities/follow/6abcd50b-b8ca-4952-86b0-a6dd8cc12866"
}

Batal Ikuti

Ketika pengguna mengklik "Berhenti Berlangganan" di komunitas, aktivitas Undo/Follow dikirim. Setelah menerima aktivitas tersebut, komunitas menghapus pengguna tersebut dari daftar pengikutnya.

{
  "actor": "http://ds9.lemmy.ml/u/lemmy_alpha",
  "object": {
    "actor": "http://ds9.lemmy.ml/u/lemmy_alpha",
    "object": "http://enterprise.lemmy.ml/c/main",
    "type": "Follow",
    "id": "http://ds9.lemmy.ml/activities/follow/dc2f1bc5-f3a0-4daa-a46b-428cbfbd023c"
  },
  "type": "Undo",
  "id": "http://ds9.lemmy.ml/activities/undo/dd83c482-8ebd-4b6c-9008-c8373bd1a86a"
}

Lapor Pos atau Komentar

Melaporkan pos atau komentar sebagai pelanggaran peraturan, supaya admin/moderator bisa meninjaunya.

{
  "actor": "http://ds9.lemmy.ml/u/lemmy_alpha",
  "to": [
    "http://enterprise.lemmy.ml/c/main"
  ],
  "object": "http://enterprise.lemmy.ml/post/7",
  "summary": "report this post",
  "type": "Flag",
  "id": "http://ds9.lemmy.ml/activities/flag/98b0933f-5e45-4a95-a15f-e0dc86361ba4"
}

Komunitas ke Pengguna

Menerima Ikuti

Secara otomatis dikirim oleh komunitas sebagai balasan untuk aktivitas Follow. Saat yang bersamaan, komunitas menambahkan pengguna tersebut ke daftar pengikutnya.

{
  "actor": "http://enterprise.lemmy.ml/c/main",
  "object": {
    "actor": "http://ds9.lemmy.ml/u/lemmy_alpha",
    "object": "http://enterprise.lemmy.ml/c/main",
    "type": "Follow",
    "id": "http://ds9.lemmy.ml/activities/follow/6abcd50b-b8ca-4952-86b0-a6dd8cc12866"
  },
  "type": "Accept",
  "id": "http://enterprise.lemmy.ml/activities/accept/75f080cc-3d45-4654-8186-8f3bb853fa27"
}

Mengumumkan

Ketika komunitas menerima aktivitas pos atau komentar, itu kemudian dibungkus menjadi aktivitas Announce dan mengirimkannya ke seluruh pengikutnya.

{
  "actor": "http://enterprise.lemmy.ml/c/main",
  "to": [
    "https://www.w3.org/ns/activitystreams#Public"
  ],
  "object": {
    "actor": "http://enterprise.lemmy.ml/u/lemmy_beta",
    "to": [
      "https://www.w3.org/ns/activitystreams#Public"
    ],
    "object": {
      "type": "Page",
      "id": "http://enterprise.lemmy.ml/post/7",
      "attributedTo": "http://enterprise.lemmy.ml/u/lemmy_beta",
      "to": [
        "http://enterprise.lemmy.ml/c/main",
        "https://www.w3.org/ns/activitystreams#Public"
      ],
      "name": "post 4",
      "mediaType": "text/html",
      "commentsEnabled": true,
      "sensitive": false,
      "stickied": false,
      "published": "2021-11-01T12:11:22.871846+00:00"
    },
    "cc": [
      "http://enterprise.lemmy.ml/c/main"
    ],
    "type": "Create",
    "id": "http://enterprise.lemmy.ml/activities/create/2807c9ec-3ad8-4859-a9e0-28b59b6e499f"
  },
  "cc": [
    "http://enterprise.lemmy.ml/c/main/followers"
  ],
  "type": "Announce",
  "id": "http://enterprise.lemmy.ml/activities/announce/8030b171-803a-4108-94b1-342688f375cf"
}

Bisa Diumumkan

Semua aktivitas di bawah ini dikirim dari pengguna ke komunitas. Komunitas kemudian membungkusnya sebagai aktivitas Announce dan mengirimkannya ke pengikutnya.

Buat atau Perbarui Pos

Ketika pengguna membuat pos baru, itu dikirim ke komunitas terkait. Menyunting pos yang sudah dibuat sebelumnya akan mengirim aktivitas yang hampir identik, perbedaannya adalah type menjadi Update. Penyebutan di pos belum didukung.

{
  "actor": "http://ds9.lemmy.ml/u/lemmy_alpha",
  "to": [
    "https://www.w3.org/ns/activitystreams#Public"
  ],
  "object": {
    "type": "Page",
    "id": "http://ds9.lemmy.ml/post/1",
    "attributedTo": "http://ds9.lemmy.ml/u/lemmy_alpha",
    "to": [
      "http://enterprise.lemmy.ml/c/main",
      "https://www.w3.org/ns/activitystreams#Public"
    ],
    "name": "test post",
    "content": "<p>test body</p>\n",
    "mediaType": "text/html",
    "source": {
      "content": "test body",
      "mediaType": "text/markdown"
    },
    "url": "https://lemmy.ml/pictrs/image/xl8W7FZfk9.jpg",
    "attachment": [
      {
        "type": "Link",
        "href": "https://lemmy.ml/pictrs/image/xl8W7FZfk9.jpg"
      }
    ],
    "commentsEnabled": true,
    "sensitive": false,
    "stickied": false,
    "published": "2021-10-29T15:10:51.557399+00:00"
  },
  "cc": [
    "http://enterprise.lemmy.ml/c/main"
  ],
  "type": "Create",
  "id": "http://ds9.lemmy.ml/activities/create/eee6a57a-622f-464d-b560-73ae1fcd3ddf"
}

Buat atau Perbarui Komentar

Balasan kepada pos, atau komentar lain. Bisa mengandung penyebutan pengguna lain. Menyunting komentar yang sudah dibuat sebelumnya akan mengirim aktivitas yang hampir identik, perbedaannya adalah type menjadi Update.

{
  "actor": "http://ds9.lemmy.ml/u/lemmy_alpha",
  "to": [
    "https://www.w3.org/ns/activitystreams#Public"
  ],
  "object": {
    "type": "Note",
    "id": "http://ds9.lemmy.ml/comment/1",
    "attributedTo": "http://ds9.lemmy.ml/u/lemmy_alpha",
    "to": [
      "https://www.w3.org/ns/activitystreams#Public"
    ],
    "content": "hello",
    "mediaType": "text/html",
    "source": {
      "content": "hello",
      "mediaType": "text/markdown"
    },
    "inReplyTo": "http://ds9.lemmy.ml/post/1",
    "published": "2021-11-01T11:45:49.794920+00:00"
  },
  "cc": [
    "http://enterprise.lemmy.ml/c/main",
    "http://ds9.lemmy.ml/u/lemmy_alpha"
  ],
  "tag": [
    {
      "href": "http://ds9.lemmy.ml/u/lemmy_alpha",
      "type": "Mention",
      "name": "@lemmy_alpha@ds9.lemmy.ml"
    }
  ],
  "type": "Create",
  "id": "http://ds9.lemmy.ml/activities/create/1e77d67c-44ac-45ed-bf2a-460e21f60236"
}

Sukai Pos atau Komentar

Pilih naik untuk pos atau komentar.

{
  "actor": "http://ds9.lemmy.ml/u/lemmy_alpha",
  "to": [
    "http://enterprise.lemmy.ml/c/main"
  ],
  "object": "http://ds9.lemmy.ml/comment/1",
  "cc": [
    "https://www.w3.org/ns/activitystreams#Public"
  ],
  "type": "Like",
  "id": "http://ds9.lemmy.ml/activities/like/fd61d070-7382-46a9-b2b7-6bb253732877"
}

Tidak Sukai Pos atau Komentar

Pilih turun untuk pos atau komentar.

{
  "actor": "http://enterprise.lemmy.ml/u/lemmy_beta",
  "to": [
    "http://enterprise.lemmy.ml/c/main"
  ],
  "object": "http://ds9.lemmy.ml/post/1",
  "cc": [
    "https://www.w3.org/ns/activitystreams#Public"
  ],
  "type": "Dislike",
  "id": "http://enterprise.lemmy.ml/activities/dislike/64d40d40-a829-43a5-8247-1fb595b3ca1c"
}

Urung Sukai atau Tidak Sukai Pos atau Komentar

Hapus suara (pilih atas atau pilih turun) yang dilakukan oleh pengguna yang sama.

{
  "actor": "http://ds9.lemmy.ml/u/lemmy_alpha",
  "to": [
    "http://enterprise.lemmy.ml/c/main"
  ],
  "object": {
    "actor": "http://ds9.lemmy.ml/u/lemmy_alpha",
    "to": [
      "http://enterprise.lemmy.ml/c/main"
    ],
    "object": "http://ds9.lemmy.ml/comment/1",
    "cc": [
      "https://www.w3.org/ns/activitystreams#Public"
    ],
    "type": "Like",
    "id": "http://ds9.lemmy.ml/activities/like/efcf7ae2-dfcc-4ff4-9ce4-6adf251ff004"
  },
  "cc": [
    "https://www.w3.org/ns/activitystreams#Public"
  ],
  "type": "Undo",
  "id": "http://ds9.lemmy.ml/activities/undo/3518565c-24a7-4d9e-8e0a-f7a2f45ac618"
}

Hapus Pos atau Komentar

Hapus pos atau komentar. Ini hanya bisa dilakukan oleh pembuat pos atau komentar tersebut.

{
  "actor": "http://ds9.lemmy.ml/u/lemmy_alpha",
  "to": [
    "https://www.w3.org/ns/activitystreams#Public"
  ],
  "object": "http://ds9.lemmy.ml/post/1",
  "cc": [
    "http://enterprise.lemmy.ml/c/main"
  ],
  "type": "Delete",
  "id": "http://ds9.lemmy.ml/activities/delete/f2abee48-c7bb-41d5-9e27-8775ff32db12"
}

Bersihkan Pos atau Komentar

Bersihkan pos atau komentar. Ini hanya bisa dilakukan oleh moderator komunitas atau admin dari peladen di mana komunitas tersebut berada. Perbedaan dari penghapusan adalah aktivitas pembersihan mempunyai bidang ringkasan, yang mengandung alasan pembersihan, yang diberikan oleh moderator atau admin.

{
  "actor": "http://enterprise.lemmy.ml/u/lemmy_beta",
  "to": [
    "https://www.w3.org/ns/activitystreams#Public"
  ],
  "object": "http://ds9.lemmy.ml/comment/1",
  "cc": [
    "http://enterprise.lemmy.ml/c/main"
  ],
  "type": "Delete",
  "summary": "bad comment",
  "id": "http://enterprise.lemmy.ml/activities/delete/42ca1a79-f99e-4518-a2ca-ba2df221eb5e"
}

Urung Penghapusan atau Pembersihan

Urung tindakan oleh aktivitas di bidang objek. Dalam contoh di bawah, komentar yang dibersihkan dipulihkan.

{
  "actor": "http://enterprise.lemmy.ml/u/lemmy_beta",
  "to": [
    "https://www.w3.org/ns/activitystreams#Public"
  ],
  "object": {
    "actor": "http://enterprise.lemmy.ml/u/lemmy_beta",
    "to": [
      "https://www.w3.org/ns/activitystreams#Public"
    ],
    "object": "http://ds9.lemmy.ml/comment/1",
    "cc": [
      "http://enterprise.lemmy.ml/c/main"
    ],
    "type": "Delete",
    "summary": "bad comment",
    "id": "http://enterprise.lemmy.ml/activities/delete/2598435c-87a3-49cd-81f3-a44b03b7af9d"
  },
  "cc": [
    "http://enterprise.lemmy.ml/c/main"
  ],
  "type": "Undo",
  "id": "http://enterprise.lemmy.ml/activities/undo/a850cf21-3866-4b3a-b80b-56aa00997fee"
}

Tambah Moderator

Tambah moderator baru ke sebuah komunitas. Harus dikirim dari moderator komunitas tersebut, atau admin dari peladen di mana komunitas tersebut berada.

{
  "actor": "http://enterprise.lemmy.ml/u/lemmy_beta",
  "to": [
    "https://www.w3.org/ns/activitystreams#Public"
  ],
  "object": "http://ds9.lemmy.ml/u/lemmy_alpha",
  "target": "http://enterprise.lemmy.ml/c/main/moderators",
  "cc": [
    "http://enterprise.lemmy.ml/c/main"
  ],
  "type": "Add",
  "id": "http://enterprise.lemmy.ml/activities/add/ec069147-77c3-447f-88c8-0ef1df10403f"
}

Keluarkan Moderator

Keluarkan moderator yang saat itu dari sebuah komunitas. Harus dikirim dari moderator komunitas tersebut, atau admin dari peladen di mana komunitas tersebut berada.

{
  "actor": "http://enterprise.lemmy.ml/u/lemmy_beta",
  "to": [
    "https://www.w3.org/ns/activitystreams#Public"
  ],
  "object": "http://ds9.lemmy.ml/u/lemmy_alpha",
  "cc": [
    "http://enterprise.lemmy.ml/c/main"
  ],
  "type": "Remove",
  "target": "http://enterprise.lemmy.ml/c/main/moderators",
  "id": "http://enterprise.lemmy.ml/activities/remove/aab114f8-cfbd-4935-a5b7-e1a64603650d"
}

Larang Pengguna

Larang pengguna dari sebuah komunitas, sehingga ia tidak bisa berpartisipasi di komunitas tersebut.

{
  "actor": "http://enterprise.lemmy.ml/u/lemmy_beta",
  "to": [
    "https://www.w3.org/ns/activitystreams#Public"
  ],
  "object": "http://ds9.lemmy.ml/u/lemmy_alpha",
  "cc": [
    "http://enterprise.lemmy.ml/c/main"
  ],
  "target": "http://enterprise.lemmy.ml/c/main",
  "type": "Block",
  "remove_data": "true",
  "summary": "spam post",
  "expires": "2021-11-01T12:23:50.151874+00:00",
  "id": "http://enterprise.lemmy.ml/activities/block/5d42fffb-0903-4625-86d4-0b39bb344fc2"
}

Urung Larang Pengguna

Urung pelarangan pengguna.

{
  "actor": "http://enterprise.lemmy.ml/u/lemmy_beta",
  "to": [
    "https://www.w3.org/ns/activitystreams#Public"
  ],
  "object": "http://ds9.lemmy.ml/u/lemmy_alpha",
  "cc": [
    "http://enterprise.lemmy.ml/c/main"
  ],
  "target": "http://enterprise.lemmy.ml/c/main",
  "type": "Block",
  "remove_data": "true",
  "summary": "spam post",
  "expires": "2021-11-01T12:23:50.151874+00:00",
  "id": "http://enterprise.lemmy.ml/activities/block/5d42fffb-0903-4625-86d4-0b39bb344fc2"
}

Pengguna ke Pengguna

Buat atau Perbarui Pesan Pribadi

Buat pesan pribadi antar dua pengguna.

{{#include ../../../include/crates/apub/assets/lemmy/activities/private_message/create.json}}

Hapus Pesan Pribadi

Hapus pesan pribadi.

{{#include ../../../include/crates/apub/assets/lemmy/activities/private_message/delete.json}}

Urung Hapus Pesan Pribadi

Pulihkan pesan pribadi yang dihapus. object kembali dihasilkan dari awal, karena itu ID aktivitas dan bidang lainnya berbeda dengan yang sebelumnya.

{{#include ../../../include/crates/apub/assets/lemmy/activities/private_message/undo_delete.json}}

Pengembangan Klien

Ekstra API HTTP Lemmy

Dokumen ini mengandung ekstra yang tidak ada di dokumentasi API.

Contoh Curl

Contoh GET

curl "http://localhost:8536/api/v2/community/list?sort=Hot"`

Contoh POST

curl -i -H \
"Content-Type: application/json" \
-X POST \
-d '{
  "comment_id": 374,
  "score": 1,
  "auth": eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6MiwiaXNzIjoidGVzdC5sZW1teS5tbCJ9.P77RX_kpz1a_geY5eCp29sl_5mAm-k27Cwnk8JcIZJk
}' \
http://localhost:8536/api/v2/comment/like

Fitur Khusus API HTTP

Fitur berikut tidak bisa diakses dari API WebSocket:

Umpan RSS/Atom

  • Semua - /feeds/all.xml?sort=Hot
  • Komunitas - /feeds/c/community-name.xml?sort=Hot
  • Pengguna - /feeds/u/user-name.xml?sort=Hot

Gambar

Lemmy meneruskan permintaan gambar ke Pictrs yang berjalan di lokal.

GET /pictrs/image/{filename}?format={webp, jpg, ...}&thumbnail={96}

Format dan keluku opsional.

Buat (Permintaan)

Konten yang diunggah harus merupakan data format/multi-bagian dengan array gambar yang terletak di dalam kunci images[].

POST /pictrs/image

Buat (respons)

{
  "files": [
    {
      "delete_token": "{token}",
      "file": "{file}.jpg"
    }
  ],
  "msg": "ok"
}

Hapus

GET /pictrs/image/delete/{delete_token}/{file}

Panduan Membuat Tema

Lemmy menggunakan Bootstrap v4 dan sangat sedikit kelas CSS kostum, jadi tema yang kompatibel dengan Bootstrap v4 seharusnya bekerja dengan baik.

Membuat

  • Gunakan alat seperti bootstrap.build untuk membuat tema Bootstrap v4. Ketika sudah, ekspor bootstrap.min.css dan simpan juga _variables.scss.

Menguji

  • Untuk menguji tema, Anda bisa antara menggunakan alat web peramban Anda atau plugin seperti Stylus untuk menyalin tempel tema ketika menjelajah Lemmy.

Menambahkan

  1. Fork lemmy-ui.
  2. Salin {my-theme-name}.min.css ke src/assets/css/themes. (Anda juga bisa menyalin _variables.scss ).
  3. Pergi ke src/shared/utils.ts dan tambahkan {my-theme-name} ke daftar tema.
  4. Uji lokal
  5. Lakukan permintaan dorong (pull request) dengan perubahan tersebut.

Membuat Antarmuka Kustom

Bagian belakang dan antarmuka terpisah dan berjalan di kontainer Docker mandiri. Mereka hanya berkomunikasi lewat API Lemmy, yang membuat mudah untuk menulis antarmuka alternatif.

Ini membuka banyak potensi untuk antarmuka kustom, yang bisa mengubah banyak desain dan pengalaman pengguna Lemmy. Contoh, mungkin bisa untuk membuat sebuah antarmuka dalam gaya forum tradisional seperti phpBB atau gaya tanya-jawab seperti stackoverflow, dll. Semuanya tanpa harus memikirkan tentang kueri basis data, autentikasi, atau ActivityPub, yang semua bisa Anda dapatkan secara gratis.

Pengembangan

Anda bisa menggunakan bahasa apa pun untuk membuat antarmuka kustom. Pilihan termudah adalah dengan fork antarmuka resmi, lemmy-lite, atau lemmy-frontend-example. Apa pun itu, prinsipnya sama: bind ke LEMMY_EXTERNAL_HOST (baku: localhost:8536) dan mengelola permintaan menggunakan API Lemmy di LEMMY_INTERNAL_HOST (baku: lemmy:8536). Gunakan juga LEMMY_HTTPS untuk membuat tautan dengan protokol yang benar.

Langkah selanjutnya adalah membangun image Docker dari antarmuka Anda. Jika Anda fork proyek yang sudah ada sebelumnya, seharusnya ada Dockerfile di sana dan instruksi untuk membangunnya. Kalau tidak, coba cari dalam bahasa Anda di dockerhub, image resmi biasanya mempunyai instruksi membangun di README mereka. Buat sebuah image Docker dengan tanda, kemudian cari bagian berikut di docker/dev/docker-compose.yml:

  lemmy-ui:
    image: dessalines/lemmy-ui:v0.8.10
    ports:
      - "1235:1234"
    restart: always
    environment:
      - LEMMY_INTERNAL_HOST=lemmy:8536
      - LEMMY_EXTERNAL_HOST=localhost:8536
      - LEMMY_HTTPS=false
    depends_on: 
      - lemmy

Yang hanya harus Anda lakukan adalah mengganti nilai untuk image dengan tanda dari image Docker Anda (dan kalau bisa variabel lingkungannya, jika Anda membutuhkan yang berbeda). Kemudian jalankan ./docker_update.sh, dan setelah penyusunan, antarmuka Anda akan tersedia di http://localhost:1235. Anda juga bisa membuat perubahan yang sama ke docker/federation/docker-compose.yml dan jalankan ./start-local-instances.bash untuk menguji federasi dengan antarmuka Anda.

Pasang dengan Docker

Setelah membangun image Docker, Anda perlu memasukkannya ke sebuah registri Docker (seperti dockerhub). Kemudian perbarui docker-compose.yml di peladen Anda, mengganti image untuk lemmy-ui, seperti yang dijelaskan di atas. Jalankan docker-compose.yml, kemudian setelah beberapa saat peladen Anda akan menggunakan antarmuka yang baru.

Perlu dicatat, jika peladen Anda dipasang menggunakan Ansible, ini akan menimpa docker-compose.yml di setiap pemulaian, mengembalikannya ke antarmuka baku. Jika begitu, Anda harus menyalin folder ansible/ dari proyek ini ke repositori Anda, dan atur docker-compose.yml langsung di repo.

Mungkin juga untuk menggunakan berbagai antarmuka untuk satu peladen yang sama, antara menggunakan subdomain atau subfolder. Untuk itu, jangan sunting bagian lemmy-ui di docker-compose.yml, tapi gandakan itu, atur nama, image, dan porta sehingga satu sama lain berbeda. Kemudian sunting konfigurasi nginx untuk meneruskan permintaan ke antarmuka yang sesuai, tergantung subdomain atau jalurnya.

Terjemahan

Anda bisa menambahkan repositori lemmy-translations ke proyek Anda sebagai git submodule. Dengan begitu, Anda bisa memanfaatkan terjemahan yang sama dengan yang digunakan di antarmuka resmi dan juga akan bisa menerima terjemahan baru yang dikontribusikan lewat Weblate.

Pembatasan

Lemmy melakukan pembatasan untuk banyak tindakan berdasarkan IP klien. Tetapi, jika Anda melakukan panggilan API di sisi peladen (cth. seperti rendering sisi peladen, atau pra-rendering javascript), Lemmy akan mengambil IP dari kontainer Docker. Artinya semua permintaan datang dari IP yang sama, dan akan dibatasi lebih cepat. Untuk menghindari permasalahan ini, Anda perlu meneruskan tajuk X-REAL-IP dan X-FORWARDED-FOR ke Lemmy (tajuk diatur oleh konfigurasi nginx kami).

Berikut adalah contoh potongan untuk NodeJS:

function setForwardedHeaders(
  headers: IncomingHttpHeaders
): { [key: string]: string } {
  let out = {
    host: headers.host,
  };
  if (headers['x-real-ip']) {
    out['x-real-ip'] = headers['x-real-ip'];
  }
  if (headers['x-forwarded-for']) {
    out['x-forwarded-for'] = headers['x-forwarded-for'];
  }

  return out;
}

let headers = setForwardedHeaders(req.headers);
let client = new LemmyHttp(httpUri, headers);

Berkontribusi

Informasi tentang berkontribusi ke Lemmy, entah itu penerjemahan, menguji, pendesainan, atau pemrograman.

Pelacak Isu/Repositori

Penerjemahan

Periksa Weblate Lemmy untuk penerjemahan. Anda bisa juga membantu dengan menerjemahkan dokumentasi ini.

Arsitektur

Antarmuka

  • Antarmuka ditulis dengan Typescript, menggunakan kerangka mirip-React yang dikenal sebagai Inferno. Semua elemen antarmuka merupakan komponen .tsx yang dapat digunakan ulang.
  • Repositori antarmuka adalah lemmy-ui.
  • Rutenya adalah src/shared/routes.ts.
  • Komponen berada di src/shared/components.

Bagian-Belakang

  • Bagian-belakang dengan Rust, menggunakan Diesel dan Actix.
  • Kode peladen dibagi ke bagian utama di src. Mereka termasuk:
    • db - Aksi basis data tingkat rendah.
      • Penambahan basis data dilakukan menggunakan migrasi Diesel. Jalankan diesel migration generate xxxxx untuk menambahkan sesuatu yang baru.
    • api - Interaksi pengguna tingkat tinggi (hal seperti CreateComment)
    • routes - Endpoint peladen.
    • apub - Konversi activitypub.
    • websocket - Membuat peladen websocket.

Linting/Pemformatan

  • Setiap pengodean antarmuka dan bagian-belakang secara otomatis diformat kemudian dilinting menggunakan husky dan lint-staged.
  • Rust dengan cargo fmt dan cargo clippy.
  • Typescript dengan prettier dan eslint.

Pengembangan Docker

Dependensi

Distro berbasis Debian

sudo apt install git docker-compose
sudo systemctl start docker
git clone https://github.com/LemmyNet/lemmy

Distro berbasis Arch

sudo pacman -S git docker-compose
sudo systemctl start docker
git clone https://github.com/LemmyNet/lemmy

Jalankan

cd docker/dev
./docker_update.sh

dan pergi ke http://localhost:1236

*Catatan: banyak fitur (seperti dokumen dan gambar) tidak akan berfungsi tanpa menggunakan profil nginx seperti itu di ansible/templates/nginx.conf.

Untuk mempercepat pengompilasian Docker, tambahkan yang di bawah ini ke /etc/docker/daemon.json dan mulai ulang Docker.

{
  "features": {
    "buildkit": true
  }
}

Jika penyusunan masih lambat, sebaiknya Anda gunakan penyusunan lokal.

Pengembangan Lokal

Pasang persyaratan penyusunan

Pasang Rust menggunakan opsi yang direkomendasikan di rust-lang.org (rustup).

Distro berbasis Debian

sudo apt install git cargo libssl-dev pkg-config libpq-dev yarn curl gnupg2 espeak
# pasang yarn
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt update && sudo apt install yarn

Distro berbasis Arch

sudo pacman -S git cargo libssl-dev pkg-config libpq-dev yarn curl gnupg2 espeak
# pasang yarn (stabil)
curl -o- -L https://yarnpkg.com/install.sh | bash

macOS

Pasang Homebrew jika Anda belum memasangnya.

Terakhir, pasang Node dan Yarn.

brew install node yarn

Dapatkan kode sumber bagian-belakang

git clone https://github.com/LemmyNet/lemmy.git
# atau alternatif dari gitea
# git clone https://yerbamate.ml/LemmyNet/lemmy.git

Susun bagian-belakang (Rust)

cargo build
# untuk pengembangan, gunakan `cargo check`

Dapatkan kode sumber antarmuka

git clone https://github.com/LemmyNet/lemmy-ui.git --recurse-submodules

Siapkan PostgreSQL

Distro berbasis Debian

sudo apt install postgresql
sudo systemctl start postgresql

# jalankan db-init.sh, atau inisialisasi basis data postgres secara manual:
sudo -u postgres psql -c "create user lemmy with password 'password' superuser;" -U postgres
sudo -u postgres psql -c 'create database lemmy with owner lemmy;' -U postgres
export LEMMY_DATABASE_URL=postgres://lemmy:password@localhost:5432/lemmy

Distro berbasis Arch

sudo pacman -S postgresql
sudo systemctl start postgresql

# jalankan db-init.sh, atau inisialisasi basis data postgres secara manual:
sudo -u postgres psql -c "create user lemmy with password 'password' superuser;" -U postgres
sudo -u postgres psql -c 'create database lemmy with owner lemmy;' -U postgres
export LEMMY_DATABASE_URL=postgres://lemmy:password@localhost:5432/lemmy

macOS

brew install postgresql
brew services start postgresql
/usr/local/opt/postgres/bin/createuser -s postgres

# jalankan db-init.sh, atau inisialisasi basis data postgres secara manual:
psql -c "create user lemmy with password 'password' superuser;" -U postgres
psql -c 'create database lemmy with owner lemmy;' -U postgres
export LEMMY_DATABASE_URL=postgres://lemmy:password@localhost:5432/lemmy

Jalankan sebuah peladen pengembangan lokal

cd lemmy
cargo run

Kemudian buka localhost:1235 di peramban Anda. Untuk memuat ulang perubahan bagian-belakang, Anda akan harus menjalankan ulang cargo run. Anda bisa menggunakan cargo check sebagai jalan cepat untuk menemukan galat penyusunan.

Untuk melakukan pengembangan antarmuka:

cd lemmy-ui
yarn
yarn dev

dan pergi ke localhost:1234. Simpanan antarmuka seharusnya menyusun ulang proyek tersebut.

Mohon dicatat bahwa penyiapan ini tidak termasuk pengunggahan gambar. Jika Anda ingin menguji itu, Anda harus menggunakan pengembangan Docker.

Pengujian

Rust

Setelah memasang dependensi pengembangan lokal, jalankan perintah berikut:

psql -U lemmy -c "DROP SCHEMA public CASCADE; CREATE SCHEMA public;"
./test.sh

Federasi

Pasang dependensi pengembangan lokal dan tambahkan baris berikut ke /etc/hosts:

127.0.0.1       lemmy-alpha
127.0.0.1       lemmy-beta
127.0.0.1       lemmy-gamma
127.0.0.1       lemmy-delta
127.0.0.1       lemmy-epsilon

Kemudian gunakan skrip berikut untuk menjalankan pengujian:

cd api_tests
./run-federation-test.bash

Pengembangan Federasi

Menjalankan secara lokal

Pasang dependensi yang dijelaskan di pengembangan Docker. Kemudian, jalankan berikut

cd docker/federation
./start-local-instances.bash

Pengujian federasi membangun lima peladen:

PeladenNama PenggunaLokasiCatatan
lemmy-alphalemmy_alpha127.0.0.1:8540terfederasi dengan seluruh peladen lainnya
lemmy-betalemmy_beta127.0.0.1:8550terfederasi dengan seluruh peladen lainnya
lemmy-gammalemmy_gamma127.0.0.1:8560terfederasi dengan seluruh peladen lainnya
lemmy-deltalemmy_delta127.0.0.1:8570hanya memperbolehkan federasi dengan lemmy-beta
lemmy-epsilonlemmy_epsilon127.0.0.1:8580menggunakan daftar-hitam, memblokir lemmy-alpha

Anda bisa masuk ke setiap itu dengan nama peladen dan lemmy sebagai kata sandinya, misal (lemmy_alpha, lemmy).

Untuk memulai federasi antar peladen, kunjungi salah satu dari itu dan cari satu pengguna, komunitas, atau pos, seperti ini. Mohon dicatat bahwa bagian-belakang Lemmy berjalan di porta yang berbeda dari antarmuka, jadi Anda harus menambahkan angka porta di bilah URL dengan satu.

  • !main@lemmy-alpha:8541
  • http://lemmy-beta:8551/post/3
  • @lemmy-gamma@lemmy-gamma:8561

Kontainer Firefox merupakan cara terbaik untuk menguji interaksi mereka.

Jalankan di sebuah peladen

Gunakan hanya untuk pengujian, tidak di peladen aktif, dan ketahuilah bahwa mengaktifkan federasi dapat merusak peladen Anda.

Ikuti instruksi pemasangan normal, entah menggunakan Ansible atau secara manual. Kemudian, ganti baris image: dessalines/lemmy:v0.x.x di /lemmy/docker-compose.yml dengan image: dessalines/lemmy:federation. Tambah dan konfigurasi blok federasi ini ke lemmy.hjson Anda.

Setelah itu, dan kapan pun yang Anda inginkan untuk memperbarui ke versi terbaru, jalankan perintah ini di peladen:

cd /lemmy/
sudo docker-compose pull
sudo docker-compose up -d

Model Keamanan

  • Verifikasi tanda digital HTTP : Ini menjamin bahwa aktifitas memang datang dari aktifitas yang diklaim
  • check_is_apub_valid : Memastikan bahwa itu ada di daftar peladen yang diperbolehkan
  • Pemeriksaan tingkat rendah : Untuk memastikan bahwa pengguna bisa membuat/memperbarui/menghapus pos di peladen yang sama dengan pos tersebut

Untuk poin terakhir, harap dicatat bahwa kita tidak memeriksa apakah aktor yang mengirimkan aktifitas membuat sebuah pos sebenarnya sama dengan pembuat pos, atau pengguna yang menghapus pos merupakan moderator/admin. Hal tersebut diperiksa oleh kode API, dan merupakan tanggung jawab setiap peladen untuk memeriksa izin pengguna. Ini tidak meninggalkan vektor serangan apa pun, karena sebagai pengguna peladen normal tidak bisa melakukan aksi yang melanggar peraturan API. Satu-satunya yang bisa melakukannya adalah admin (dan perangkat lunak yang digunakan oleh admin). Tapi admin bisa melakukan apa pun di peladen, termasuk mengirim aktifitas dari akun pengguna lainnya. Jadi kita tidak akan mendapatkan keamanan apa pun dengan memeriksa izin mod dan serupa.

Pencabangan dan Rilis

Cabang

Secara umum, pengelolaan kami terhadap cabang seperti yang dijelaskan pada A stable mainline branching model for Git (Model Pencabangan Jalur Utama yang Stabil untuk Git). Satu perbedaan adalah kami menghidari rebase dan gantinya gabung (merge) cabang dasar ke cabang aktif saat itu. Ini membantu menghindari dorong-paksa (force push) dan konflik.

Rilis

  • Untuk rilis besar: buat sebuah cabang baru release/v0.x
  • Untuk rilis kecil: cherry-pick perubahan yang dinginkan ke cabang release/v0.x
  • Buat sebuah beta atau versi kandidat rilis menggunakan docker/prod/deploy.sh
  • Lakukan yang sama untuk lemmy-ui: ./deploy.sh 0.x.0-rc-x
  • Terapkan ke peladen uji federasi
    • Menjaga satu peladen pada versi stabil terbaru untuk menguji kompatibilitas federasi (otomatisasi ini dengan Ansible)
    • ansible-playbook -i federation playbooks/site.yml --vault-password-file vault_pass -e rc_version=0.x.0-rc.x
  • Uji coba bahwa seluruhnya bekerja sesuai yang diharapkan, buat rilis beta/rc baru jika dibutuhkan
  • Terapkan ke lemmy.ml, untuk menemukan masalah yang tersisa
  • Jika itu berjalan baik, buat rilis 0.x.0 yang resmi dengan docker/prod/deploy.sh
  • Mengumumkan rilis di Lemmy, Matrix, Mastodon

Sumber/Pustaka

Sumber ActivityPub

Dokumen Resmi

Penjelasan

Contoh dan Pustaka

Kode Etik

  • Kami berkomitmen untuk menyediakan lingkungan yang ramah dan aman bagi semua orang, tanpa memandang tingkat pengalaman, identitas dan ekspresi gender, orientasi seksual, kecacatan, penampilan pribadi, ukuran tubuh, ras, etnis, usia, agama, kebangsaan, atau lainnya yang serupa.
  • Hindari menggunakan alias seksual atau nama panggilan lain yang dapat mengganggu lingkungan yang ramah dan aman bagi semua orang.
  • Harap bersikap baik dan sopan. Tidak perlu jahat atau kasar.
  • Hormati bahwa setiap orang memiliki pendapat yang berbeda dan bahwa setiap pilihan desain atau implementasi membawa timbal baliknya masing-masing. Jarang ada jawaban yang benar.
  • Pertahankan kritik yang tidak terstruktur seminimal mungkin. Jika Anda memiliki ide kuat yang ingin Anda coba, buat turunan (fork) dan lihat cara kerjanya.
  • Kami akan mengecualikan Anda dari interaksi jika Anda menghina, merendahkan, atau melecehkan siapa pun. Itu bukan perilaku yang disambut baik. Kami menafsirkan istilah "pelecehan" seperti yang berada di definisi Citizen Code of Conduct; jika Anda memiliki ketidakjelasan tentang apa yang mungkin termasuk dalam konsep itu, silakan baca definisi tersebut. Secara khusus, kami tidak menoleransi perilaku yang mengecualikan orang-orang yang termasuk kelompok yang terpinggirkan secara sosial.
  • Pelecehan pribadi juga tidak dapat diterima. Tidak peduli siapa Anda, jika Anda merasa telah atau sedang dilecehkan atau dibuat tidak nyaman oleh anggota komunitas, harap hubungi salah satu ops saluran atau tim moderasi Lemmy segera. Baik Anda kontributor tetap atau pendatang baru, kami peduli untuk menjadikan komunitas ini tempat yang aman bagi Anda dan kami mendukung Anda.
  • Demikian juga segala perilaku spam, troll, memicu, memancing, atau mencuri perhatian lainnya tidak diperbolehkan.

Kirim Pesan ke Tim Moderasi di Mastodon

Kirim Surel ke Tim Moderasi

Moderasi

Ini merupakan kebijakan untuk menegakkan kode etik komunitas. Jika Anda rasa sebuah utas memerlukan moderasi, mohon hubungi tim moderasi Lemmy.

  1. Konten yang melanggar kode etik Lemmy, termasuk konten yang penuh kebencian, menyakitkan, menindas, atau eksklusifitas, tidak diperbolehkan (Mengutuk diperbolehkan, tetapi tidak menargetkan pengguna lain dan tidak dengan cara yang penuh kebencian).
  2. Konten yang dianggap tidak pantas oleh moderator, baik yang tercantum dalam kode etik atau tidak, juga tidak diperbolehkan.
  3. Moderator pertama-tama akan menanggapi konten tersebut dengan peringatan, pada saat yang sama konten yang menyinggung kemungkinan akan dihapus bila memungkinkan.
  4. Jika peringatan tersebut tidak diindahkan, pengguna akan “ditendang”, yaitu dikeluarkan dari saluran komunikasi untuk menenangkan diri.
  5. Jika pengguna kembali dan terus membuat masalah, mereka akan dilarang, yaitu dikecualikan tanpa batas waktu.
  6. Moderator dapat memilih atas pilihan mereka untuk membatalkan larangan pengguna jika itu adalah pelanggaran pertama dan mereka menawarkan pihak yang tersinggung permintaan maaf yang tulus.
  7. Jika seorang moderator melarang seseorang dan menurut Anda itu tidak dibenarkan, silakan bicarakan dengan moderator itu, atau dengan moderator lain, secara pribadi. Keluhan tentang larangan dalam saluran tidak diperbolehkan.
  8. Moderator memiliki standar yang lebih tinggi daripada anggota komunitas lainnya. Jika seorang moderator membuat situasi yang tidak pantas, mereka seharusnya mengharapkan lebih sedikit kelonggaran daripada yang lain.

Di komunitas Lemmy, kami berusaha untuk mengambil langkah ekstra untuk saling menjaga satu sama lain. Jangan hanya bertujuan untuk secara teknis tidak dapat ditembus, cobalah untuk menjadi diri Anda yang terbaik. Secara khusus, hindari berhubungan dengan masalah yang menyinggung atau sensitif, terutama jika itu di luar topik; ini terlalu sering menyebabkan pertengkaran yang tidak perlu, perasaan terluka, dan kepercayaan yang rusak; lebih buruk, itu dapat membuat orang menjauh dari komunitas sepenuhnya.

Dan jika seseorang mempermasalahkan sesuatu yang Anda katakan atau lakukan, tahan keinginan untuk bersikap defensif. Berhentilah melakukan apa yang mereka keluhkan dan minta maaf. Bahkan jika Anda merasa telah disalahtafsirkan atau dituduh secara tidak adil, kemungkinan besar ada sesuatu yang dapat Anda komunikasikan dengan lebih baik — ingatlah bahwa adalah tanggung jawab Anda untuk membuat orang lain nyaman. Semua orang ingin bersahabat dan kami semua di sini pertama dan terutama karena kami ingin berbicara tentang teknologi yang keren. Anda akan menemukan bahwa orang akan bersemangat untuk mengambil niat baik dan memaafkan selama Anda mendapatkan kepercayaan mereka.

Kebijakan penegakan yang tercantum di atas berlaku untuk semua tempat resmi Lemmy; termasuk repositori git di bawah github.com/LemmyNet dan yerbamate.ml/LemmyNet, saluran Matrix, lemmy.ml, dan peladen lain di bawah domain itu. Untuk proyek lain yang mengadopsi Kode Etik Lemmy, silakan hubungi pengelola proyek tersebut untuk penegakan. Jika Anda ingin menggunakan kode etik ini untuk proyek Anda sendiri, pertimbangkan untuk menyebutkan secara eksplisit kebijakan moderasi Anda atau membuat salinan dengan kebijakan moderasi Anda sendiri untuk menghindari kebingungan.

Diadaptasi dari Kode Etik Rust, yang dimana berdasarkan pada Kebijakan terhadap Troll Node.js dan juga Contributor Covenant v1.3.0.