Quando il forum non funziona....e decidi di fartene uno per conto tuo!

:asd:

Il recente down del forum mi ha portato a riaprire un vecchio cassetto di un progetto che avevo fatto per imparare Golang diversi anni fa e visto che avevo un weekend quasi interamente libero, mi sono messo a cazzeggiare ad aggiungere cose e in realtà i risultati non sono male.

Il concetto chiave è una cosa estremamente ottimizzata, con features moderne su come si gestisce un forum oggi, che possa gestire community piccole/medie anche con una VPS da 5 dollari al mese, ed è per questo che una decisione architetturale obbligata è stata usare sqlite come database (cmq c’è la possibilità di switchare su postgresql con un cambio di config).

Visto che sono in una fase ancora embrionale dove sto lavorando molto sulle specifiche e vorrei rimanere sull’essenziale che conta senza fronzoli, avete suggerimenti che dovrei tenere in considerazione?

Che features vorreste nel forum?

Allo stato attuale, si presenta come un binario con 2 files db e un file toml di config (non obbligatorio), fine: col binario fai tutto, anche eventuali comandi di amministrazione, facendo una prova di carico (con un forum al 15% di NGI come numero posts) ho ottenuto risultati veramente incoraggianti:- co

  • 2Mln di post nel db (50k topics) e 2k utenti, circa 2gb di file
  • 140 utenti al secondo che navigavano il forum
  • 60 utenti al secondo che scrivevano post

Ho ottenuto un carico di memoria medio di 250Mb e un tempo di latenza non superiore ai 400ms (ed è ancora un prototipo).

In settimana ho in programma di completare altre features e fare un test di carico generando un db delle dimensioni di NGI (500k di topics, 20mln di posts, 80k utenti, verrà circa 20gb di database) così vedo se arrivo anche a gestire una mole di dati come abbiamo qui.

Infine, sul lato features al momento sto gestendo queste:

  • Profili utente: pagina profilo pubblica con bio, avatar, località, sito web, statistiche
  • Sistema a ruoli con 7 ruoli: utente, membro, regolare, leader, moderatore, admin, proprietario
  • Categorie: categorie gestite dall’amministratore con nome, slug, colore, icona, posizione
  • Sottocategorie: nidificazione multi-livello fino a profondità 3
  • @MenzioniMenzioni: Sintassi @nomeutente con completamento automatico e notifica
  • Tag: tag gestiti dall’amministratore con colore, descrizione, massimo 5 per discussione
  • Scope dei tag: I tag possono essere globali o limitati a una categoria (ereditati dalle sottocategorie)
  • Reazioni Mi piace: attiva/disattiva mi piace sui post
  • Segnalibri: salva/rimuovi post con nota facoltativa
  • Bozze: salvataggio automatico delle bozze per chiave di contesto, multi-dispositivo
  • Notifiche in-app: risposta, menzione, mi piace, segnalazione risolta, stato discussione, sistema
  • Iscrizioni alle discussioni: livello di notifica per discussione: silenziato, normale, monitoraggio, osservazione
  • Livelli di fiducia: 4 livelli (0-3) basati su attività, mi piace e segnalazioni
  • Timer discussioni: chiusura automatica, apertura automatica, pubblicazione programmata
  • Discussioni in evidenza: per categoria e globali
  • Segnala post: gli utenti possono segnalare post: spam, inappropriato, fuori tema, messaggio personalizzato
  • Coda di moderazione: visualizzazione staff delle segnalazioni in sospeso con contesto
  • Risolvi segnalazioni: approva, rifiuta o rinvia segnalazioni con nota di risoluzione
  • Elimina post: l’eliminazione soft sostituisce il contenuto, registrato nel log di moderazione
  • Chiudi / Riapri discussione: blocca o sblocca discussioni per nuove risposte
  • Sposta discussione: riassegna discussione a categoria diversa
  • Silenzia utente: i post dell’utente richiedono approvazione del moderatore
  • Sospendi utente: blocca completamente l’accesso dell’utente con durata opzionale
  • Log di moderazione: traccia di audit completa di tutte le azioni di moderazione, visibile allo staff
  • Chiusura automatica discussioni: chiusura automatica delle discussioni configurabile basata sull’inattività
  • Whisper posts: visibilità solo per lo staff all’interno delle discussioni

Poi ho un’altra lista altrettanto lunga di desiderata ma finchè non ho consolidato una prima versione la lascio da parte.

Fra esperienza pluriennale in golang e l’aiuto dell’AI sto implementando cose a velocità luce, non mi vergogno a dirlo, anche perchè poi tutto il generato di solito ne faccio una review completa e le cose che non vanno bene le correggo.

Bonus:

Appena ho altri aggiornamenti condivido, intanto spero di raccogliere un pò di suggerimenti.

:fuckbye:

7 Likes

Il castello di porkchop express?

15 Likes

L’idea è farne un progetto open source da buttare su github e cercare di fare il culo a discourse :asd:

2 Likes

La cosa fa la sua impressione, non ti nego questo, è che di software di forum self hosted c’è ampia scelta (anche se non molte sono funzionali).

Fatti mettere su Awesome Selfhosted, comunque

1 Like

Tu mica eri quello che mi odiava? :rotfl:
Che nick avevi su manicomio? Jurassic Pork?

Comunque vi ospito volentieri, potete avere le sezioni che volete, moderazione vostra. :asd:

Non dimenticare il ban e il permaban :asd:

2 Likes

Ma piantala che a breve (sic) tu sarai il mio superadmin e content creator principale.

Basta firmare un contratto in cui ti impegni a versare una pesantissima penale in caso di tradimento.

Ti ringrazio per il pensiero ma inserire qui frase carina di rispettoso rifiuto

Ma per curiosità, “content creator” chevvordì? Stai cercando qualcuno che ti apra thread per intrattenere coseacaso, il paio di scoppiati incel che vengono daquell’altro forum, i fuoriusciti di destra scappati da questo forum e margio?
Esiste un essere mitologico con tale motivazione e pazienza?
Ma piuttosto fai prima a copia incollarti i thread di hans, no? :asd:

Sto cercando te.

mavaccagare :rotfl:

Non resisterai.

1 Like

Nono, grazie dell’invito, ma qui siamo in tech zone, chi viene a fare marketing lo si mette alla porta :asd:

2 Likes

Una curiosità tecnica da persona non esperta: ma per il search non si possono usare/vengono usati framework specializzati, come xapian, invece di affidarsi a fare query sul database? Xapian è alla base di tool che uso per le email, mu, (ed è per esempio usato anche da cyrus imap per il server side search), ed è ultra veloce.

Io sono molto dubbioso su sqlite ma se c’e’ l’opzione per postgres puo’ essere interessante.

Una cosa che ti consiglio fortemente e’ di mettere in chiaro, magari in un altro repo, i test che fai girare perche’ spesso e volentieri, i vari agent scazzano alla grande i test e non (solo) nel senso di test finti ma che testano la roba sbagliata per cui ti sembra poi che tutto vada bene, salvo poi in uso reale le cose vanno male.

Se metti anche i test in un repo pubblico, puoi avere chi va a controllare e ti sa dire se c’e’ qualcosa di concettualmente sbagliato in questo o quel test.

Avevo valutato Meilisearch da affiancare, ma consumerebbe un sacco di risorse (con 500k posts hai mediamente 1gb di ram occupato in ram dagli indici), quindi l’ho escluso.

Xapian che hai citato non ha binding in golang, e come Meilisearch consumerebbe un tot di risorse solo per l’indicizzazione.

Uno dei requirement base che sto cercando di mantenere è un footprint in termini di memoria/disco/cpu molto basso, infatti le grandissime community non sono un target, anche se è possibile cambiare il db sotto da sqlite a postgresql, che già potrebbe essere sufficiente se uno si fa un setup di un certo livello (con replica etc.. per distribuire il carico).

Per le ottimizzazioni di questo tipo ho in lista di valutare queste 2 soluzioni:

Entrambi hanno dei pro interessanti ma ovviamente impattano sul requirement di cui sopra in maniera non trascurabile, magari se riesco li tengo come moduli da attivare in base alle necessità dell’utente.

Adesso sto basando la struttura base su sqlite con FTS5 che “vive” già dentro il file di sqlite e offre ottime prestazioni.

Diciamo che se riesco a far girare tutto in maniera performante su una VPS da 5$ (quindi mediamente 1 core, 1-2gb di ram, 20-40gb disco) per community piccole e medie ho raggiunto il mio obiettivo primario, e per quelle medie che necessitano di più risorse dovrebbe essere sufficiente una VPS da 10$ (quindi praticamente caratteristiche raddoppiate, 2 core, 2-4gb di ram, 40-80gb disco).

Chiaro, d’accordissimo su tutta la linea, per ora i test di carico li sto facendo con un loadertest che mi chiama le api (quindi alla fine è già un e2e test da un altro punto di vista) come un utente che legge e scrive, a carico sostenuto con n routine in parallelo a simulare accessi simultanei (e per ora mi va bene anche per capire se aggiungendo cose poi vado a perdere prestazioni e footprint), poi magari faccio una suite di test di carico per K6 o simili che è più standard.

1 Like

Ma nessuno ha suggerimenti sulle features?

Non so se l’hanno già scritto ma a me piacerebbe poter “biforcare” una discussione senza bisogno che arrivino i mod a fare split.

Ho sempre pensato che i thread fossero eccessivamente lineari e non aiutassero il nascere spontaneo di sottodiscussioni.

In pratica, invece di avere i thread che sono un elenco di post associati a un titolo, avere qualcosa di più simile a un grafo che si può autogestire con i voti o il consenso dei partecipanti.

Molto semplice lo so :sisi:

Tipo come se rispondere a un reply generasse il suo branch di discussione insomma?