mirror of
https://github.com/muety/wakapi.git
synced 2023-08-10 21:12:56 +03:00
Generate default user.
This commit is contained in:
parent
f9a2efaffb
commit
080e91973c
16
README.md
16
README.md
@ -16,12 +16,17 @@
|
|||||||
* Set target port in `config.ini`
|
* Set target port in `config.ini`
|
||||||
* Build executable: `go build`
|
* Build executable: `go build`
|
||||||
* Run server: `./wakapi`
|
* Run server: `./wakapi`
|
||||||
* On your development computers, edit your local `~/.wakatime.cfg` file and add `api_url = https://your.server:someport/api/heartbeat`
|
* Edit your local `~/.wakatime.cfg` file
|
||||||
|
* `api_url = https://your.server:someport/api/heartbeat`
|
||||||
|
* `api_key = the_api_key_printed_to_the_console_after_starting_the_server`
|
||||||
|
* Open [http://localhost:3000](http://localhost:3000) in your browser
|
||||||
|
|
||||||
**First run** (create user account): When running the server for the very first time, the database gets populated. Afterwards you have to create yourself a user account. Until proper user sign up and login is implemented, this is done via SQL, like this.
|
### User Accounts
|
||||||
* `mysql -u yourusername -p -H your.hostname`
|
* When starting wakapi for the first time, a default user _**admin**_ with password _**admin**_ is created. The corresponding API key is printed to the console.
|
||||||
* `USE yourdatabasename;`
|
* Additional users, at the moment, can be added only via SQL statements on your database, like this:
|
||||||
* `INSERT INTO users (id, api_key) VALUES ('your_cool_nickname', '728f084c-85e0-41de-aa2a-b6cc871200c1');` (the latter value is your api key from `~/.wakatime.cfg`)
|
* Connect to your database server: `mysql -u yourusername -p -H your.hostname` (alternatively use GUI tools like _MySQL Workbench_)
|
||||||
|
* Select your database: `USE yourdatabasename;`
|
||||||
|
* ADd the new user: `INSERT INTO users (id, password, api_key) VALUES ('your_nickname', MD5('your_password'), '728f084c-85e0-41de-aa2a-b6cc871200c1');` (the latter value should be a random [UUIDv4](https://tools.ietf.org/html/rfc4122), as can be found in your `~/.wakatime.cfg`)
|
||||||
|
|
||||||
## Best Practices
|
## Best Practices
|
||||||
It is recommended to use wakapi behind a **reverse proxy**, like [Caddy](https://caddyserver.com) or _nginx_ to enable **TLS encryption** (HTTPS).
|
It is recommended to use wakapi behind a **reverse proxy**, like [Caddy](https://caddyserver.com) or _nginx_ to enable **TLS encryption** (HTTPS).
|
||||||
@ -34,6 +39,7 @@ However, if you want to expose your wakapi instance to the public anyway, you ne
|
|||||||
* Enhanced UI
|
* Enhanced UI
|
||||||
* Loading spinner
|
* Loading spinner
|
||||||
* Responsiveness
|
* Responsiveness
|
||||||
|
* Support for SQLite database
|
||||||
* Dockerize
|
* Dockerize
|
||||||
* Unit tests
|
* Unit tests
|
||||||
|
|
||||||
|
23
main.go
23
main.go
@ -1,6 +1,8 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"crypto/md5"
|
||||||
|
"encoding/hex"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
@ -13,6 +15,7 @@ import (
|
|||||||
"github.com/jinzhu/gorm"
|
"github.com/jinzhu/gorm"
|
||||||
"github.com/joho/godotenv"
|
"github.com/joho/godotenv"
|
||||||
"github.com/rs/cors"
|
"github.com/rs/cors"
|
||||||
|
uuid "github.com/satori/go.uuid"
|
||||||
ini "gopkg.in/ini.v1"
|
ini "gopkg.in/ini.v1"
|
||||||
|
|
||||||
"github.com/n1try/wakapi/middlewares"
|
"github.com/n1try/wakapi/middlewares"
|
||||||
@ -87,7 +90,8 @@ func main() {
|
|||||||
db.AutoMigrate(&models.User{})
|
db.AutoMigrate(&models.User{})
|
||||||
db.AutoMigrate(&models.Heartbeat{}).AddForeignKey("user_id", "users(id)", "RESTRICT", "RESTRICT")
|
db.AutoMigrate(&models.Heartbeat{}).AddForeignKey("user_id", "users(id)", "RESTRICT", "RESTRICT")
|
||||||
|
|
||||||
// Migrate custom languages
|
// Custom migrations and initial data
|
||||||
|
addDefaultUser(db, config)
|
||||||
migrateLanguages(db, config)
|
migrateLanguages(db, config)
|
||||||
|
|
||||||
// Services
|
// Services
|
||||||
@ -148,6 +152,23 @@ func migrateLanguages(db *gorm.DB, cfg *models.Config) {
|
|||||||
if result.Error != nil {
|
if result.Error != nil {
|
||||||
log.Fatal(result.Error)
|
log.Fatal(result.Error)
|
||||||
}
|
}
|
||||||
|
if result.RowsAffected > 0 {
|
||||||
log.Printf("Migrated %+v rows for custom language %+s.\n", result.RowsAffected, k)
|
log.Printf("Migrated %+v rows for custom language %+s.\n", result.RowsAffected, k)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func addDefaultUser(db *gorm.DB, cfg *models.Config) {
|
||||||
|
pw := md5.Sum([]byte(models.DefaultPassword))
|
||||||
|
pwString := hex.EncodeToString(pw[:])
|
||||||
|
apiKey := uuid.Must(uuid.NewV4()).String()
|
||||||
|
u := &models.User{ID: models.DefaultUser, Password: pwString, ApiKey: apiKey}
|
||||||
|
result := db.FirstOrCreate(u, &models.User{ID: u.ID})
|
||||||
|
if result.Error != nil {
|
||||||
|
log.Println("Unable to create default user.")
|
||||||
|
log.Fatal(result.Error)
|
||||||
|
}
|
||||||
|
if result.RowsAffected > 0 {
|
||||||
|
log.Printf("Created default user '%s' with password '%s' and API key '%s'.\n", u.ID, models.DefaultPassword, u.ApiKey)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1,5 +1,10 @@
|
|||||||
package models
|
package models
|
||||||
|
|
||||||
|
const (
|
||||||
|
DefaultUser string = "admin"
|
||||||
|
DefaultPassword string = "admin"
|
||||||
|
)
|
||||||
|
|
||||||
type User struct {
|
type User struct {
|
||||||
ID string `json:"id" gorm:"primary_key"`
|
ID string `json:"id" gorm:"primary_key"`
|
||||||
ApiKey string `json:"api_key" gorm:"unique"`
|
ApiKey string `json:"api_key" gorm:"unique"`
|
||||||
|
Loading…
Reference in New Issue
Block a user