- Commit database transactions - Listen to all interfaces by default - Use logger in collerd - Add docker-compose file with PostgreSQL Signed-off-by: Julien Riou <julien@riou.xyz>
This commit is contained in:
parent
01031a24ab
commit
7d7614637b
7 changed files with 45 additions and 6 deletions
31
docker-compose.yml
Normal file
31
docker-compose.yml
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
---
|
||||||
|
services:
|
||||||
|
server:
|
||||||
|
image: coller:latest
|
||||||
|
build: .
|
||||||
|
container_name: collerd
|
||||||
|
restart: always
|
||||||
|
networks:
|
||||||
|
- coller
|
||||||
|
ports:
|
||||||
|
- "8080:8080"
|
||||||
|
volumes:
|
||||||
|
- "./docker/collerd.json:/etc/collerd.json:ro"
|
||||||
|
command: collerd -config /etc/collerd.json
|
||||||
|
|
||||||
|
db:
|
||||||
|
image: postgres:17
|
||||||
|
hostname: db
|
||||||
|
container_name: collerd_db
|
||||||
|
restart: always
|
||||||
|
env_file: docker/db.env
|
||||||
|
networks:
|
||||||
|
- coller
|
||||||
|
volumes:
|
||||||
|
- coller:/var/lib/postgresql/data
|
||||||
|
|
||||||
|
networks:
|
||||||
|
coller:
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
coller:
|
5
docker/db.env
Normal file
5
docker/db.env
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
POSTGRES_USER=coller
|
||||||
|
POSTGRES_PASSWORD=wwav93psLNc9RFrMNCYiixLqkxCMFMnm
|
||||||
|
POSTGRES_DB=coller
|
||||||
|
POSTGRES_INITDB_ARGS="--data-checksums"
|
||||||
|
POSTGRES_HOST_AUTH_METHOD=scram-sha-256
|
|
@ -21,7 +21,7 @@ The file format is **JSON**:
|
||||||
* **id_length** (int): Number of characters for note identifiers (default 5)
|
* **id_length** (int): Number of characters for note identifiers (default 5)
|
||||||
* **password_length** (int): Number of characters for generated passwords (default 16)
|
* **password_length** (int): Number of characters for generated passwords (default 16)
|
||||||
* **expiration_interval** (int): Number of seconds to wait between two expiration runs
|
* **expiration_interval** (int): Number of seconds to wait between two expiration runs
|
||||||
* **listen_address** (string): Address to listen for the web server (default "127.0.0.1")
|
* **listen_address** (string): Address to listen for the web server (default "0.0.0.0")
|
||||||
* **listen_port** (int): Port to listen for the web server (default 8080)
|
* **listen_port** (int): Port to listen for the web server (default 8080)
|
||||||
* **expirations** ([]int): List of supported expiration times in seconds (default 300, 86400, 604800, 18144000)
|
* **expirations** ([]int): List of supported expiration times in seconds (default 300, 86400, 604800, 18144000)
|
||||||
* **expiration** (int): Default expiration time in seconds
|
* **expiration** (int): Default expiration time in seconds
|
||||||
|
|
|
@ -50,7 +50,7 @@ func handleMain() int {
|
||||||
if *configFileName != "" {
|
if *configFileName != "" {
|
||||||
err = internal.ReadConfig(*configFileName, config)
|
err = internal.ReadConfig(*configFileName, config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
slog.Error("cannot parse configuration file", slog.Any("error", err))
|
logger.Error("cannot parse configuration file", slog.Any("error", err))
|
||||||
return internal.RC_ERROR
|
return internal.RC_ERROR
|
||||||
}
|
}
|
||||||
logger.Debug("configuration file parsed", slog.Any("file", *configFileName))
|
logger.Debug("configuration file parsed", slog.Any("file", *configFileName))
|
||||||
|
@ -63,7 +63,7 @@ func handleMain() int {
|
||||||
|
|
||||||
db, err := server.NewDatabase(logger, config)
|
db, err := server.NewDatabase(logger, config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
slog.Error("could not connect to the database", slog.Any("error", err))
|
logger.Error("could not connect to the database", slog.Any("error", err))
|
||||||
return internal.RC_ERROR
|
return internal.RC_ERROR
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,7 @@ func NewConfig() *Config {
|
||||||
IDLength: 5,
|
IDLength: 5,
|
||||||
PasswordLength: 16,
|
PasswordLength: 16,
|
||||||
ExpirationInterval: 60, // 1 minute
|
ExpirationInterval: 60, // 1 minute
|
||||||
ListenAddress: "127.0.0.1",
|
ListenAddress: "0.0.0.0",
|
||||||
ListenPort: 8080,
|
ListenPort: 8080,
|
||||||
Expirations: []int{
|
Expirations: []int{
|
||||||
300, // 5 minutes
|
300, // 5 minutes
|
||||||
|
|
|
@ -93,6 +93,7 @@ func (d *Database) StartExpireThread() {
|
||||||
func (d *Database) Get(id string) (*Note, error) {
|
func (d *Database) Get(id string) (*Note, error) {
|
||||||
var note Note
|
var note Note
|
||||||
trx := d.db.Where("id = ?", id).Find(¬e)
|
trx := d.db.Where("id = ?", id).Find(¬e)
|
||||||
|
defer trx.Commit()
|
||||||
if trx.Error != nil {
|
if trx.Error != nil {
|
||||||
d.logger.Warn("could not find note", slog.Any("error", trx.Error))
|
d.logger.Warn("could not find note", slog.Any("error", trx.Error))
|
||||||
return nil, trx.Error
|
return nil, trx.Error
|
||||||
|
@ -134,6 +135,7 @@ func (d *Database) Create(content []byte, password string, encrypted bool, expir
|
||||||
note.Encrypted = true
|
note.Encrypted = true
|
||||||
}
|
}
|
||||||
trx := d.db.Create(note)
|
trx := d.db.Create(note)
|
||||||
|
defer trx.Commit()
|
||||||
if trx.Error != nil {
|
if trx.Error != nil {
|
||||||
d.logger.Warn("could not create note", slog.Any("error", trx.Error))
|
d.logger.Warn("could not create note", slog.Any("error", trx.Error))
|
||||||
return nil, trx.Error
|
return nil, trx.Error
|
||||||
|
@ -143,6 +145,7 @@ func (d *Database) Create(content []byte, password string, encrypted bool, expir
|
||||||
|
|
||||||
func (d *Database) Delete(id string) error {
|
func (d *Database) Delete(id string) error {
|
||||||
trx := d.db.Where("id = ?", id).Delete(&Note{})
|
trx := d.db.Where("id = ?", id).Delete(&Note{})
|
||||||
|
defer trx.Commit()
|
||||||
if trx.Error != nil {
|
if trx.Error != nil {
|
||||||
d.logger.Error("could not delete note", slog.Any("error", trx.Error))
|
d.logger.Error("could not delete note", slog.Any("error", trx.Error))
|
||||||
return trx.Error
|
return trx.Error
|
||||||
|
|
|
@ -21,7 +21,7 @@ type Note struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate ID and compress content before saving to the database
|
// Generate ID and compress content before saving to the database
|
||||||
func (n *Note) BeforeCreate(tx *gorm.DB) (err error) {
|
func (n *Note) BeforeCreate(trx *gorm.DB) (err error) {
|
||||||
for i := 0; i < ID_MAX_RETRIES; i++ {
|
for i := 0; i < ID_MAX_RETRIES; i++ {
|
||||||
if n.ID != "" {
|
if n.ID != "" {
|
||||||
continue
|
continue
|
||||||
|
@ -30,7 +30,7 @@ func (n *Note) BeforeCreate(tx *gorm.DB) (err error) {
|
||||||
id := internal.GenerateChars(idLength)
|
id := internal.GenerateChars(idLength)
|
||||||
|
|
||||||
var note Note
|
var note Note
|
||||||
tx.Where("id = ?", id).Find(¬e)
|
trx.Where("id = ?", id).Find(¬e)
|
||||||
|
|
||||||
if note.ID == "" {
|
if note.ID == "" {
|
||||||
n.ID = id
|
n.ID = id
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue