diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..e3f5d83 --- /dev/null +++ b/docker-compose.yml @@ -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: \ No newline at end of file diff --git a/docker/db.env b/docker/db.env new file mode 100644 index 0000000..3ca4a9b --- /dev/null +++ b/docker/db.env @@ -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 diff --git a/src/cmd/collerd/README.md b/src/cmd/collerd/README.md index 28d3571..cee1c6d 100644 --- a/src/cmd/collerd/README.md +++ b/src/cmd/collerd/README.md @@ -21,7 +21,7 @@ The file format is **JSON**: * **id_length** (int): Number of characters for note identifiers (default 5) * **password_length** (int): Number of characters for generated passwords (default 16) * **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) * **expirations** ([]int): List of supported expiration times in seconds (default 300, 86400, 604800, 18144000) * **expiration** (int): Default expiration time in seconds diff --git a/src/cmd/collerd/main.go b/src/cmd/collerd/main.go index 0b9aef7..3145253 100644 --- a/src/cmd/collerd/main.go +++ b/src/cmd/collerd/main.go @@ -50,7 +50,7 @@ func handleMain() int { if *configFileName != "" { err = internal.ReadConfig(*configFileName, config) 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 } logger.Debug("configuration file parsed", slog.Any("file", *configFileName)) @@ -63,7 +63,7 @@ func handleMain() int { db, err := server.NewDatabase(logger, config) 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 } diff --git a/src/server/config.go b/src/server/config.go index dfe344f..6888113 100644 --- a/src/server/config.go +++ b/src/server/config.go @@ -33,7 +33,7 @@ func NewConfig() *Config { IDLength: 5, PasswordLength: 16, ExpirationInterval: 60, // 1 minute - ListenAddress: "127.0.0.1", + ListenAddress: "0.0.0.0", ListenPort: 8080, Expirations: []int{ 300, // 5 minutes diff --git a/src/server/db.go b/src/server/db.go index 06e27ee..b52708b 100644 --- a/src/server/db.go +++ b/src/server/db.go @@ -93,6 +93,7 @@ func (d *Database) StartExpireThread() { func (d *Database) Get(id string) (*Note, error) { var note Note trx := d.db.Where("id = ?", id).Find(¬e) + defer trx.Commit() if trx.Error != nil { d.logger.Warn("could not find note", slog.Any("error", trx.Error)) return nil, trx.Error @@ -134,6 +135,7 @@ func (d *Database) Create(content []byte, password string, encrypted bool, expir note.Encrypted = true } trx := d.db.Create(note) + defer trx.Commit() if trx.Error != nil { d.logger.Warn("could not create note", slog.Any("error", 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 { trx := d.db.Where("id = ?", id).Delete(&Note{}) + defer trx.Commit() if trx.Error != nil { d.logger.Error("could not delete note", slog.Any("error", trx.Error)) return trx.Error diff --git a/src/server/note.go b/src/server/note.go index c3148ee..7127545 100644 --- a/src/server/note.go +++ b/src/server/note.go @@ -21,7 +21,7 @@ type Note struct { } // 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++ { if n.ID != "" { continue @@ -30,7 +30,7 @@ func (n *Note) BeforeCreate(tx *gorm.DB) (err error) { id := internal.GenerateChars(idLength) var note Note - tx.Where("id = ?", id).Find(¬e) + trx.Where("id = ?", id).Find(¬e) if note.ID == "" { n.ID = id