mirror of
https://github.com/hrfee/jfa-go.git
synced 2024-11-09 11:50:11 +00:00
Compare commits
No commits in common. "11eae035d900a6c07592e8b6d5a41e11248e8a5d" and "d7c94edc6193a1045d84317cd2a93dfa4d223cf8" have entirely different histories.
11eae035d9
...
d7c94edc61
@ -3,5 +3,42 @@ title: "Building/Contributing for developers"
|
|||||||
date: 2021-07-25T00:33:36+01:00
|
date: 2021-07-25T00:33:36+01:00
|
||||||
draft: false
|
draft: false
|
||||||
---
|
---
|
||||||
|
# Code
|
||||||
|
I use 4 spaces for indentation. Go should ideally be formatted with `goimports` and/or `gofmt`. I don't use a formatter on typescript, so don't worry about that.
|
||||||
|
|
||||||
[See the wiki page](https://wiki.jfa-go.com/docs/dev/).
|
Code in Go should ideally use `PascalCase` for exported values, and `camelCase` for non-exported, JSON for transferring data should use `snake_case`, and Typescript should use `camelCase`. Forgive me for my many inconsistencies in this, and feel free to fix them if you want.
|
||||||
|
|
||||||
|
Functions in Go that need to access `*appContext` should be generally be receivers, except when the behaviour could be seen as somewhat independent from it (`email.go` is the best example, its behaviour is broadly independent from the main app except from a couple config values).
|
||||||
|
|
||||||
|
|
||||||
|
# Compiling
|
||||||
|
|
||||||
|
The Makefile is more suited towards development than other build methods, and provides separate build stages to speed up compilation when only making changes to specific aspects of the project.
|
||||||
|
|
||||||
|
Prefix each of these with `make DEBUG=on `:
|
||||||
|
* `all` will download deps and build everything. The executable and data will be placed in `build`. This is only necessary the first time.
|
||||||
|
* `npm` will download all node.js build-time dependencies.
|
||||||
|
* `compile` will only compile go code into the `build/jfa-go` executable.
|
||||||
|
* `typescript` will compile typescript w/ sourcemaps into `build/data/web/js`.
|
||||||
|
* `bundle-css` will bundle CSS and place it in `build/data/web/css`.
|
||||||
|
* `inline` will inline the css and javascript used in the single-file crash report webpage.
|
||||||
|
* `configuration` will generate the `config-base.json` (used to render settings in the web ui) and `config-default.ini` and put them in `build/data`.
|
||||||
|
* `email` will compile email mjml, and copy the text versions in to `build/data`.
|
||||||
|
* `swagger`: generates swagger documentation for the API.
|
||||||
|
* `copy` will copy iconography, html, language files and static data into `build/data`.
|
||||||
|
|
||||||
|
## Environment variables
|
||||||
|
|
||||||
|
* `DEBUG=on/off`: If on, compiles with type-checking for typescript, sourcemaps, non-minified css and no symbol stripping.
|
||||||
|
* `INTERNAL=on/off`: Whether or not to embed file assets into the binary itself, or store them separately beside the binary.
|
||||||
|
* `UPDATER=on/off/docker`: Enable/Disable the updater, or set a special update type (currently only docker, which disables self-updating the binary).
|
||||||
|
* `TRAY=on/off`: Enable/disable the tray icon, which lets you start/stop/autostart on login. For linux, requires `libappindicator3-dev` for debian or the equivalent on other distributions.
|
||||||
|
* `GOESBUILD=on`: Use a locally installed `esbuild` binary. NPM doesn't provide builds for all os/architectures, so `npx esbuild` might not work for you, so the binary is compiled/installed with `go get`.
|
||||||
|
* `GOBINARY=<path to go>`: Alternative path to go executable. Useful for testing with unstable go releases.
|
||||||
|
* `VERSION=v<semver>`: Alternative verision number, useful to test update functionality.
|
||||||
|
* `COMMIT=<short commit>`: Self explanatory.
|
||||||
|
* `LDFLAGS=<ldflags>`: Passed to `go build -ldflags`.
|
||||||
|
* `E2EE=on/off`: Enable/disable end-to-end encryption support for Matrix, which is currently very broken. Must subsequently be enabled (with Advanced settings enabled) in Settings > Matrix.
|
||||||
|
* `TAGS=<tags>`: Passed to `go build -tags`.
|
||||||
|
* `OS=<os>`: Unrelated to GOOS, if set to `windows`, `-H=windowsgui` is passed to ldflags, which stops a windows terminal popping up when run.
|
||||||
|
* `RACE=on/off`: If on, compiles with the go race detector included.
|
||||||
|
43
README.md
43
README.md
@ -22,25 +22,32 @@ If you want a bit more of a guarantee of support, I've seen these projects menti
|
|||||||
* [Jellyseerr](https://github.com/Fallenbagel/jellyseerr) is a fork of Overseerr, which can manage users and mainly acts as an Ombi alternative.
|
* [Jellyseerr](https://github.com/Fallenbagel/jellyseerr) is a fork of Overseerr, which can manage users and mainly acts as an Ombi alternative.
|
||||||
* [Organizr](https://github.com/causefx/Organizr) doesn't focus on Jellyfin, but allows putting self-hosted services into "tabs" on a central page, and allows creating users, which lets one control who can access what.
|
* [Organizr](https://github.com/causefx/Organizr) doesn't focus on Jellyfin, but allows putting self-hosted services into "tabs" on a central page, and allows creating users, which lets one control who can access what.
|
||||||
---
|
---
|
||||||
jfa-go is a user management app for [Jellyfin](https://github.com/jellyfin/jellyfin) (and [Emby](https://emby.media/) as 2nd class) that provides invite-based account creation as well as other features that make one's instance much easier to manage.
|
jfa-go is a user management app for [Jellyfin](https://github.com/jellyfin/jellyfin) (and now [Emby](https://emby.media/)) that provides invite-based account creation as well as other features that make one's instance much easier to manage.
|
||||||
|
|
||||||
|
a rewrite of [jellyfin-accounts](https://github.com/hrfee/jellyfin-accounts) (original naming for both, ik
|
||||||
|
😂).
|
||||||
|
|
||||||
#### Features
|
#### Features
|
||||||
* 🧑 Invite based account creation: Send invites to your friends or family, and let them choose their own username and password without relying on you.
|
* 🧑 Invite based account creation: Send invites to your friends or family, and let them choose their own username and password without relying on you.
|
||||||
* Send invites via a link and/or email, discord, telegram or matrix
|
* Send invites via a link and/or email
|
||||||
* Granular control over invites: Validity period as well as number of uses can be specified.
|
* Granular control over invites: Validity period as well as number of uses can be specified.
|
||||||
* Account profiles: Assign settings profiles to invites so new users have your predefined permissions, homescreen layout, etc. applied to their account on creation.
|
* Account profiles: Assign settings profiles to invites so new users have your predefined permissions, homescreen layout, etc. applied to their account on creation.
|
||||||
* Password validation: Ensure users choose a strong password.
|
* Password validation: Ensure users choose a strong password.
|
||||||
* CAPTCHAs and contact method verificatoin can be enabled to avoid bots.
|
* CAPTCHAs can be enabled to avoid bots
|
||||||
* ⌛ User expiry: Specify a validity period, and new users accounts will be disabled/deleted after it. The period can be manually extended too.
|
* ⌛ User expiry: Specify a validity period, and new users accounts will be disabled/deleted after it. The period can be manually extended too.
|
||||||
* 🔗 Ombi Integration: Automatically creates Ombi accounts for new users using their email address and login details, and your own defined set of permissions. See [wiki](https://wiki.jfa-go.com/docs/ombi/) for a warning on this one.
|
* 🔗 Ombi Integration: Automatically creates Ombi accounts for new users using their email address and login details, and your own defined set of permissions.
|
||||||
* Account management: Bulk or individually; apply settings, delete, disable/enable, send messages and much more.
|
* Account management: Apply settings to your users individually or en masse, and delete users, optionally sending them an email notification with a reason.
|
||||||
* 📣 Announcements: Bulk message your users with announcements about your server.
|
|
||||||
* Telegram/Discord/Matrix Integration: Verify users via a chat bot, and send Password Resets, Announcements, etc. through it.
|
* Telegram/Discord/Matrix Integration: Verify users via a chat bot, and send Password Resets, Announcements, etc. through it.
|
||||||
* "My Account" Page: Allows users to reset their password, manage contact details, view their account expiry date, and send referrals. Can be customized with markdown.
|
* "My Account" Page: Allows users to reset their password, manage contact details, view their account expiry date, and send referrals. Custom messages can be added, with markdown.
|
||||||
* Referrals: Users can be given special invites to send to their friends and families, similar to some invite-only services like Bluesky.
|
* Referrals: Users can be given special invites to send to their friends and families.
|
||||||
|
* 📨 Email storage: Add your existing users email addresses through the UI, and jfa-go will ask new users for them on account creation.
|
||||||
|
* Email addresses can optionally be used instead of usernames
|
||||||
* 🔑 Password resets: When users forget their passwords and request a change in Jellyfin, jfa-go reads the PIN from the created file and sends it straight to them via email/telegram.
|
* 🔑 Password resets: When users forget their passwords and request a change in Jellyfin, jfa-go reads the PIN from the created file and sends it straight to them via email/telegram.
|
||||||
* Can also be done through the "My Account" page if enabled.
|
* Can also be done through the "My Account" page if enabled.
|
||||||
* Admin Notifications: Get notified when someone creates an account, or an invite expires.
|
* Admin Notifications: Get notified when someone creates an account, or an invite expires.
|
||||||
|
* 📣 Announcements: Bulk message your users with announcements about your server.
|
||||||
|
* Authentication via Jellyfin: Instead of using separate credentials for jfa-go and Jellyfin, jfa-go can use it as the authentication provider.
|
||||||
|
* Enables the usage of jfa-go by multiple people
|
||||||
* 🌓 Customizations
|
* 🌓 Customizations
|
||||||
* Customize emails with variables and markdown
|
* Customize emails with variables and markdown
|
||||||
* Specify contact and help messages to appear in emails and pages
|
* Specify contact and help messages to appear in emails and pages
|
||||||
@ -65,7 +72,7 @@ docker create \
|
|||||||
-p 8056:8056 \
|
-p 8056:8056 \
|
||||||
# -p 8057:8057 if using tls
|
# -p 8057:8057 if using tls
|
||||||
-v /path/to/.config/jfa-go:/data \ # Path to wherever you want to store the config file and other data
|
-v /path/to/.config/jfa-go:/data \ # Path to wherever you want to store the config file and other data
|
||||||
-v /path/to/jellyfin:/jf \ # Only needed for password resets through Jellyfin, ignore if not using or using Emby
|
-v /path/to/jellyfin:/jf \ # Path to Jellyfin config directory, ignore if using Emby
|
||||||
-v /etc/localtime:/etc/localtime:ro \ # Makes sure time is correct
|
-v /etc/localtime:/etc/localtime:ro \ # Makes sure time is correct
|
||||||
hrfee/jfa-go # hrfee/jfa-go:unstable for latest build from git
|
hrfee/jfa-go # hrfee/jfa-go:unstable for latest build from git
|
||||||
```
|
```
|
||||||
@ -73,7 +80,7 @@ docker create \
|
|||||||
##### [Debian/Ubuntu](https://apt.hrfee.dev)
|
##### [Debian/Ubuntu](https://apt.hrfee.dev)
|
||||||
```sh
|
```sh
|
||||||
sudo apt-get update && sudo apt-get install curl apt-transport-https gnupg
|
sudo apt-get update && sudo apt-get install curl apt-transport-https gnupg
|
||||||
curl https://apt.hrfee.dev/hrfee.pubkey.gpg | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/apt.hrfee.dev.gpg
|
curl https://apt.hrfee.dev/hrfee.pubkey.gpg | sudo apt-key add -
|
||||||
|
|
||||||
# For stable releases
|
# For stable releases
|
||||||
echo "deb https://apt.hrfee.dev trusty main" | sudo tee /etc/apt/sources.list.d/hrfee.list
|
echo "deb https://apt.hrfee.dev trusty main" | sudo tee /etc/apt/sources.list.d/hrfee.list
|
||||||
@ -101,7 +108,7 @@ Available on the AUR as:
|
|||||||
##### Other platforms
|
##### Other platforms
|
||||||
Download precompiled binaries from:
|
Download precompiled binaries from:
|
||||||
* [The releases section](https://github.com/hrfee/jfa-go/releases) (stable)
|
* [The releases section](https://github.com/hrfee/jfa-go/releases) (stable)
|
||||||
* [dl.jfa-go.com](https://dl.jfa-go.com) (nightly)
|
* [Buildrone](https://builds.hrfee.dev/view/hrfee/jfa-go) (nightly)
|
||||||
|
|
||||||
unzip the `jfa-go`/`jfa-go.exe` executable to somewhere useful.
|
unzip the `jfa-go`/`jfa-go.exe` executable to somewhere useful.
|
||||||
* For \*nix/macOS users, `chmod +x jfa-go` then place it somewhere in your PATH like `/usr/bin`.
|
* For \*nix/macOS users, `chmod +x jfa-go` then place it somewhere in your PATH like `/usr/bin`.
|
||||||
@ -140,8 +147,6 @@ Usage of jfa-go:
|
|||||||
alternate port to host web ui on.
|
alternate port to host web ui on.
|
||||||
-pprof
|
-pprof
|
||||||
Exposes pprof profiler on /debug/pprof.
|
Exposes pprof profiler on /debug/pprof.
|
||||||
-restore string
|
|
||||||
path to database backup to restore.
|
|
||||||
-swagger
|
-swagger
|
||||||
Enable swagger at /swagger/index.html
|
Enable swagger at /swagger/index.html
|
||||||
```
|
```
|
||||||
@ -149,9 +154,18 @@ Usage of jfa-go:
|
|||||||
#### Systemd
|
#### Systemd
|
||||||
jfa-go does not run as a daemon by default. Run `jfa-go systemd` to create a systemd `.service` file in your current directory, which you can copy into `~/.config/systemd/user` or somewhere else.
|
jfa-go does not run as a daemon by default. Run `jfa-go systemd` to create a systemd `.service` file in your current directory, which you can copy into `~/.config/systemd/user` or somewhere else.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
If you're switching from jellyfin-accounts, copy your existing `~/.jf-accounts` to:
|
||||||
|
|
||||||
|
* `XDG_CONFIG_DIR/jfa-go` (usually ~/.config/jfa-go) on \*nix systems,
|
||||||
|
* `%AppData%/jfa-go` on Windows,
|
||||||
|
* `~/Library/Application Support/jfa-go` on macOS.
|
||||||
|
|
||||||
|
(or specify config/data path with `-config/-data` respectively.)
|
||||||
|
|
||||||
#### Contributing
|
#### Contributing
|
||||||
See [the wiki page](https://wiki.jfa-go.com/docs/dev/).
|
See [the wiki page](https://wiki.jfa-go.com/docs/dev/) or [CONTRIBUTING.md](https://github.com/hrfee/jfa-go/blob/main/CONTRIBUTING.md).
|
||||||
##### Translation
|
##### Translation
|
||||||
[![Translation status](https://weblate.jfa-go.com/widgets/jfa-go/-/multi-auto.svg)](https://weblate.jfa-go.com/engage/jfa-go/)
|
[![Translation status](https://weblate.jfa-go.com/widgets/jfa-go/-/multi-auto.svg)](https://weblate.jfa-go.com/engage/jfa-go/)
|
||||||
|
|
||||||
@ -161,3 +175,4 @@ For translations, use the weblate instance [here](https://weblate.jfa-go.com/eng
|
|||||||
Big thanks to those who sponsor me. You can see them below:
|
Big thanks to those who sponsor me. You can see them below:
|
||||||
|
|
||||||
[<img src="https://sponsors-endpoint.hrfee.pw/sponsor/avatar/0" width="35">](https://sponsors-endpoint.hrfee.pw/sponsor/profile/0)
|
[<img src="https://sponsors-endpoint.hrfee.pw/sponsor/avatar/0" width="35">](https://sponsors-endpoint.hrfee.pw/sponsor/profile/0)
|
||||||
|
[<img src="https://sponsors-endpoint.hrfee.pw/sponsor/avatar/1" width="35">](https://sponsors-endpoint.hrfee.pw/sponsor/profile/0)
|
||||||
|
@ -173,22 +173,22 @@
|
|||||||
"description": "Enable this to use Jellyfin users instead of the below username and pw."
|
"description": "Enable this to use Jellyfin users instead of the below username and pw."
|
||||||
},
|
},
|
||||||
"admin_only": {
|
"admin_only": {
|
||||||
"name": "Allow admin users only on \"Admin\" pages",
|
"name": "Allow admin users only",
|
||||||
"required": false,
|
"required": false,
|
||||||
"requires_restart": true,
|
"requires_restart": true,
|
||||||
"depends_true": "jellyfin_login",
|
"depends_true": "jellyfin_login",
|
||||||
"type": "bool",
|
"type": "bool",
|
||||||
"value": true,
|
"value": true,
|
||||||
"description": "Allows only admin users on Jellyfin to access the admin page. Doesn't apply to the \"My Accounts\" page."
|
"description": "Allows only admin users on Jellyfin to access the admin page."
|
||||||
},
|
},
|
||||||
"allow_all": {
|
"allow_all": {
|
||||||
"name": "Allow all users to login to \"Admin\" pages",
|
"name": "Allow all users to login",
|
||||||
"required": false,
|
"required": false,
|
||||||
"requires_restart": true,
|
"requires_restart": true,
|
||||||
"depends_true": "jellyfin_login",
|
"depends_true": "jellyfin_login",
|
||||||
"type": "bool",
|
"type": "bool",
|
||||||
"value": false,
|
"value": false,
|
||||||
"description": "Allow all Jellyfin users to access jfa-go. Not recommended, add individual users in the Accounts tab instead. Doesn't apply to the \"My Accounts\" page."
|
"description": "Allow all Jellyfin users to access jfa-go. Not recommended, add individual users in the Accounts tab instead."
|
||||||
},
|
},
|
||||||
"username": {
|
"username": {
|
||||||
"name": "Web Username",
|
"name": "Web Username",
|
||||||
@ -620,7 +620,7 @@
|
|||||||
"order": [],
|
"order": [],
|
||||||
"meta": {
|
"meta": {
|
||||||
"name": "User Page/\"My Account\"",
|
"name": "User Page/\"My Account\"",
|
||||||
"description": "The User Page (My Account) allows users to access and modify info directly, such as changing/adding contact methods, seeing their expiry date, sending referrals or changing their password. Password resets can also be initiated from here, given a contact method or username. Access control settings set in \"General\" do not apply to this page, nor does \"Access jfa-go\" in the Accounts tab.",
|
"description": "The User Page (My Account) allows users to access and modify info directly, such as changing/adding contact methods, seeing their expiry date, sending referrals or changing their password. Password resets can also be initiated from here, given a contact method or username. ",
|
||||||
"depends_true": "ui|jellyfin_login"
|
"depends_true": "ui|jellyfin_login"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
|
@ -1,25 +1,21 @@
|
|||||||
<span class="lg:w-[55%]"></span> <!-- the if statement around the 55% width below messes up tailwind, so we force include it here --!>
|
|
||||||
<div id="modal-login" class="modal">
|
<div id="modal-login" class="modal">
|
||||||
<div class="my-[10%] row items-stretch relative mx-auto w-11/12 sm:w-4/5 lg:w-1/2">
|
<div class="my-[10%] row items-stretch relative mx-auto w-11/12 sm:w-4/5 lg:w-1/2">
|
||||||
{{ $hasTwoCards := 0 }}
|
|
||||||
{{ if index . "LoginMessageEnabled" }}
|
{{ if index . "LoginMessageEnabled" }}
|
||||||
{{ if .LoginMessageEnabled }}
|
{{ if .LoginMessageEnabled }}
|
||||||
{{ $hasTwoCards = 1 }}
|
<div class="card mx-2 flex-initial w-[100%] lg:w-[35%] mb-4 lg:mb-0 dark:~d_neutral @low content">
|
||||||
<div class="card mx-2 flex-initial w-full lg:w-[35%] mb-4 lg:mb-0 dark:~d_neutral @low content">
|
|
||||||
{{ .LoginMessageContent }}
|
{{ .LoginMessageContent }}
|
||||||
</div>
|
</div>
|
||||||
{{ end }}
|
{{ end }}
|
||||||
{{ end }}
|
{{ end }}
|
||||||
{{ if index . "userPageEnabled" }}
|
{{ if index . "userPageEnabled" }}
|
||||||
{{ if and .userPageEnabled .showUserPageLink }}
|
{{ if and .userPageEnabled .showUserPageLink }}
|
||||||
{{ $hasTwoCards = 1 }}
|
<div class="card mx-2 flex-initial w-[100%] lg:w-[35%] mb-4 lg:mb-0 dark:~d_neutral @low content">
|
||||||
<div class="card mx-2 flex-initial w-full lg:w-[35%] mb-4 lg:mb-0 dark:~d_neutral @low content">
|
|
||||||
<span class="heading row">{{ .strings.loginNotAdmin }}</span>
|
<span class="heading row">{{ .strings.loginNotAdmin }}</span>
|
||||||
<a class="button ~info h-12 w-full" href="{{ .urlBase }}/my/account"><i class="ri-account-circle-fill mr-2"></i>{{ .strings.myAccount }}</a>
|
<a class="button ~info h-12 w-full" href="{{ .urlBase }}/my/account"><i class="ri-account-circle-fill mr-2"></i>{{ .strings.myAccount }}</a>
|
||||||
</div>
|
</div>
|
||||||
{{ end }}
|
{{ end }}
|
||||||
{{ end }}
|
{{ end }}
|
||||||
<form class="card mx-2 form-login w-full {{ if eq $hasTwoCards 1 }}lg:w-[55%]{{ end }} mb-0" href="">
|
<form class="card mx-2 form-login w-[100%] lg:w-[55%] mb-0" href="">
|
||||||
<span class="heading">{{ .strings.login }}</span>
|
<span class="heading">{{ .strings.login }}</span>
|
||||||
<input type="text" class="field input ~neutral @high mt-4 mb-2" placeholder="{{ .strings.username }}" id="login-user">
|
<input type="text" class="field input ~neutral @high mt-4 mb-2" placeholder="{{ .strings.username }}" id="login-user">
|
||||||
<input type="password" class="field input ~neutral @high mb-4" placeholder="{{ .strings.password }}" id="login-password">
|
<input type="password" class="field input ~neutral @high mb-4" placeholder="{{ .strings.password }}" id="login-password">
|
||||||
|
Loading…
Reference in New Issue
Block a user