2021-07-31 16:29:30 +00:00
# Project Info
2023-01-07 16:42:15 +00:00
First of all, I want to thank everyone who made pull requests for Uptime Kuma. I never thought the GitHub Community would be so nice! Because of this, I also never thought that other people would actually read and edit my code. It is not very well structured or commented, sorry about that.
2021-07-31 16:29:30 +00:00
2023-08-24 16:01:47 +00:00
The project was created with vite.js (vue3). Then I created a subdirectory called "server" for the server part. Both frontend and backend share the same package.json.
2021-07-31 16:29:30 +00:00
2023-08-24 16:01:47 +00:00
The frontend code builds into "dist" directory. The server (express.js) exposes the "dist" directory as the root of the endpoint. This is how production is working.
2021-10-03 08:04:16 +00:00
2021-10-13 00:01:34 +00:00
## Key Technical Skills
2021-10-03 08:04:16 +00:00
2023-08-24 16:01:47 +00:00
- Node.js (You should know about promise, async/await and arrow function etc.)
2021-10-03 08:04:16 +00:00
- Socket.io
- SCSS
- Vue.js
- Bootstrap
- SQLite
2021-10-13 00:01:34 +00:00
## Directories
2021-10-03 08:04:16 +00:00
2023-02-01 14:39:09 +00:00
- config (dev config files)
2021-10-03 08:04:16 +00:00
- data (App data)
2023-02-01 14:39:09 +00:00
- db (Base database and migration scripts)
2021-10-03 08:04:16 +00:00
- dist (Frontend build)
2023-02-01 14:39:09 +00:00
- docker (Dockerfiles)
2021-10-03 08:04:16 +00:00
- extra (Extra useful scripts)
- public (Frontend resources for dev only)
- server (Server source code)
- src (Frontend source code)
- test (unit test)
2021-07-31 16:29:30 +00:00
2021-10-13 00:01:34 +00:00
## Can I create a pull request for Uptime Kuma?
2021-08-24 06:42:35 +00:00
2023-08-24 16:01:47 +00:00
Yes or no, it depends on what you will try to do. Since I don't want to waste your time, be sure to **create an empty draft pull request or open an issue, so we can have a discussion first** . Especially for a large pull request or you don't know if it will be merged or not.
2022-06-01 06:08:10 +00:00
2022-09-19 11:56:30 +00:00
Here are some references:
2022-03-02 06:25:37 +00:00
2023-08-02 09:30:54 +00:00
### ✅ Usually accepted:
2023-01-24 17:37:19 +00:00
- Bug fix
- Security fix
2022-03-02 06:25:37 +00:00
- Adding notification providers
2023-08-02 09:30:54 +00:00
- Adding new language files (see [these instructions ](https://github.com/louislam/uptime-kuma/blob/master/src/lang/README.md ))
2023-01-24 17:37:19 +00:00
- Adding new language keys: `$t("...")`
2022-03-02 06:25:37 +00:00
2023-08-02 09:30:54 +00:00
### ⚠️ Discussion required:
2022-03-02 06:25:37 +00:00
- Large pull requests
2022-04-29 05:39:30 +00:00
- New features
2021-10-25 04:06:01 +00:00
2023-08-02 09:30:54 +00:00
### ❌ Won't be merged:
2023-08-24 16:01:47 +00:00
- A dedicated PR for translating existing languages (see [these instructions ](https://github.com/louislam/uptime-kuma/blob/master/src/lang/README.md ))
- Do not pass the auto-test
2022-06-01 06:08:10 +00:00
- Any breaking changes
2023-06-18 15:45:50 +00:00
- Duplicated pull requests
2022-06-01 06:08:10 +00:00
- Buggy
2022-09-19 11:56:30 +00:00
- UI/UX is not close to Uptime Kuma
2023-06-18 15:45:50 +00:00
- Modifications or deletions of existing logic without a valid reason.
- Adding functions that is completely out of scope
- Converting existing code into other programming languages
- Unnecessarily large code changes that are hard to review and cause conflicts with other PRs.
2022-09-19 11:56:30 +00:00
2023-06-18 15:45:50 +00:00
The above cases may not cover all possible situations.
2023-01-07 16:32:13 +00:00
I (@louislam) have the final say. If your pull request does not meet my expectations, I will reject it, no matter how much time you spend on it. Therefore, it is essential to have a discussion beforehand.
2023-08-24 16:01:47 +00:00
I will assign your pull request to a [milestone ](https://github.com/louislam/uptime-kuma/milestones ), if I plan to review and merge it.
2022-09-19 11:56:30 +00:00
2023-08-24 16:01:47 +00:00
Also, please don't rush or ask for an ETA, because I have to understand the pull request, make sure it is no breaking changes and stick to my vision of this project, especially for large pull requests.
2022-06-01 06:08:10 +00:00
2021-10-25 04:06:01 +00:00
### Recommended Pull Request Guideline
2022-04-27 18:18:47 +00:00
Before deep into coding, discussion first is preferred. Creating an empty pull request for discussion would be recommended.
2022-04-12 05:53:52 +00:00
2021-10-25 04:06:01 +00:00
1. Fork the project
1. Clone your fork repo to local
1. Create a new branch
1. Create an empty commit
`git commit -m "[empty commit] pull request for <YOUR TASK NAME>" --allow-empty`
1. Push to your fork repo
2021-10-26 03:28:38 +00:00
1. Create a pull request: https://github.com/louislam/uptime-kuma/compare
2021-12-02 10:15:14 +00:00
1. Write a proper description
2021-10-25 04:06:01 +00:00
1. Click "Change to draft"
2022-04-12 05:53:52 +00:00
1. Discussion
2021-08-24 06:42:35 +00:00
2021-10-13 00:01:34 +00:00
## Project Styles
2021-07-31 16:29:30 +00:00
2023-08-24 16:01:47 +00:00
I personally do not like something that requires so many configurations before you can finally start the app. I hope Uptime Kuma installation will be as easy as like installing a mobile app.
2021-07-31 16:29:30 +00:00
2023-08-24 16:01:47 +00:00
- Easy to install for non-Docker users, no native build dependency is needed (for x86_64/armv7/arm64), no extra config, and no extra effort required to get it running
2021-10-10 06:40:19 +00:00
- Single container for Docker users, no very complex docker-compose file. Just map the volume and expose the port, then good to go
2023-08-24 16:01:47 +00:00
- Settings should be configurable in the frontend. Environment variables are discouraged, unless it is related to startup such as `DATA_DIR`
2021-07-31 16:29:30 +00:00
- Easy to use
2023-02-01 14:39:09 +00:00
- The web UI styling should be consistent and nice
2021-07-31 16:29:30 +00:00
2021-10-13 00:01:34 +00:00
## Coding Styles
2021-08-24 06:06:23 +00:00
2021-10-03 08:04:16 +00:00
- 4 spaces indentation
2021-09-12 17:23:51 +00:00
- Follow `.editorconfig`
- Follow ESLint
2022-04-25 18:20:13 +00:00
- Methods and functions should be documented with JSDoc
2021-08-24 06:06:23 +00:00
2023-02-01 14:39:09 +00:00
## Name Conventions
2021-08-24 06:06:23 +00:00
- Javascript/Typescript: camelCaseType
2022-06-17 07:07:55 +00:00
- SQLite: snake_case (Underscore)
- CSS/SCSS: kebab-case (Dash)
2021-08-24 06:06:23 +00:00
2021-10-13 00:01:34 +00:00
## Tools
2021-09-12 17:23:51 +00:00
2023-08-02 09:30:54 +00:00
- [`Node.js` ](https://nodejs.org/ ) >= 14
- [`npm` ](https://www.npmjs.com/ ) >= 8.5
- [`git` ](https://git-scm.com/ )
- IDE that supports [`ESLint` ](https://eslint.org/ ) and EditorConfig (I am using [`IntelliJ IDEA` ](https://www.jetbrains.com/idea/ ))
2023-08-03 06:09:45 +00:00
- A SQLite GUI tool (f.ex. [`SQLite Expert Personal` ](https://www.sqliteexpert.com/download.html ) or [`DBeaver Community` ](https://dbeaver.io/download/ ))
2021-07-31 16:29:30 +00:00
2023-09-10 20:02:26 +00:00
## Git Branches
- `master` : 2.X.X development. If you want to add a new feature, your pull request should base on this.
- `1.23.X` : 1.23.X development. If you want to fix a bug for v1 and v2, your pull request should base on this.
- All other branches are unused, outdated or for dev.
2023-02-01 14:39:09 +00:00
## Install Dependencies for Development
2021-07-31 16:29:30 +00:00
```bash
2021-10-03 08:04:16 +00:00
npm ci
2021-08-31 12:36:17 +00:00
```
2022-04-25 18:20:13 +00:00
## Dev Server
2021-07-31 16:29:30 +00:00
2022-04-25 18:20:13 +00:00
(2022-04-26 Update)
We can start the frontend dev server and the backend dev server in one command.
Port `3000` and port `3001` will be used.
2021-07-31 16:29:30 +00:00
2021-09-23 14:48:19 +00:00
```bash
2022-04-25 18:20:13 +00:00
npm run dev
2021-07-31 16:29:30 +00:00
```
2023-08-24 16:01:47 +00:00
But sometimes, you would like to restart the server, but not the frontend, you can run these commands in two terminals:
2023-02-01 14:39:09 +00:00
```
npm run start-frontend-dev
npm run start-server-dev
```
2022-04-25 18:20:13 +00:00
## Backend Server
2021-07-31 16:29:30 +00:00
2022-04-29 03:35:03 +00:00
It binds to `0.0.0.0:3001` by default.
2021-07-31 16:29:30 +00:00
It is mainly a socket.io app + express.js.
2022-04-25 18:27:37 +00:00
express.js is used for:
- entry point such as redirecting to a status page or the dashboard
- serving the frontend built files (index.html, .js and .css etc.)
2023-08-24 16:01:47 +00:00
- serving internal APIs of the status page
2021-07-31 16:29:30 +00:00
2022-04-25 18:20:13 +00:00
### Structure in /server/
2023-02-01 14:39:09 +00:00
- jobs/ (Jobs that are running in another process)
2023-08-24 16:01:47 +00:00
- model/ (Object model, auto-mapping to the database table name)
2021-10-03 08:04:16 +00:00
- modules/ (Modified 3rd-party modules)
2023-02-01 14:39:09 +00:00
- monitor_types (Monitor Types)
2021-11-17 06:09:12 +00:00
- notification-providers/ (individual notification logic)
2021-10-03 08:04:16 +00:00
- routers/ (Express Routers)
2021-12-02 10:15:14 +00:00
- socket-handler (Socket.io Handlers)
2023-02-01 14:39:09 +00:00
- server.js (Server entry point)
- uptime-kuma-server.js (UptimeKumaServer class, main logic should be here, but some still in `server.js` )
2021-07-31 16:29:30 +00:00
2022-04-25 18:20:13 +00:00
## Frontend Dev Server
2021-10-13 00:01:34 +00:00
2023-08-24 16:01:47 +00:00
It binds to `0.0.0.0:3000` by default. The frontend dev server is used for development only.
2021-10-13 00:01:34 +00:00
2022-04-25 18:20:13 +00:00
For production, it is not used. It will be compiled to `dist` directory instead.
2021-07-31 16:29:30 +00:00
2021-09-12 17:23:51 +00:00
You can use Vue.js devtools Chrome extension for debugging.
2021-07-31 16:29:30 +00:00
2021-10-13 00:01:34 +00:00
### Build the frontend
2021-07-31 16:29:30 +00:00
```bash
npm run build
```
2021-10-13 00:01:34 +00:00
### Frontend Details
2021-07-31 16:29:30 +00:00
Uptime Kuma Frontend is a single page application (SPA). Most paths are handled by Vue Router.
2021-09-12 17:23:51 +00:00
The router is in `src/router.js`
2021-07-31 16:29:30 +00:00
2023-08-24 16:01:47 +00:00
As you can see, most data in the frontend is stored at the root level, even though you changed the current router to any other pages.
2021-07-31 16:29:30 +00:00
2021-09-12 17:23:51 +00:00
The data and socket logic are in `src/mixins/socket.js` .
2021-07-31 16:29:30 +00:00
2021-10-13 00:01:34 +00:00
## Database Migration
2021-07-31 16:29:30 +00:00
2021-10-03 08:04:16 +00:00
1. Create `patch-{name}.sql` in `./db/`
2. Add your patch filename in the `patchList` list in `./server/database.js`
2021-07-31 16:29:30 +00:00
2021-10-13 00:01:34 +00:00
## Unit Test
2021-07-31 16:29:30 +00:00
2021-10-13 00:01:34 +00:00
```bash
2021-10-05 12:27:43 +00:00
npm run build
npm test
```
2022-09-19 11:39:30 +00:00
## Dependencies
2022-10-02 11:38:33 +00:00
Both frontend and backend share the same package.json. However, the frontend dependencies are eventually not used in the production environment, because it is usually also baked into dist files. So:
2022-09-19 11:39:30 +00:00
- Frontend dependencies = "devDependencies"
- Examples: vue, chart.js
- Backend dependencies = "dependencies"
- Examples: socket.io, sqlite3
- Development dependencies = "devDependencies"
- Examples: eslint, sass
### Update Dependencies
2021-10-05 10:17:54 +00:00
2023-08-24 16:01:47 +00:00
Since previously updating Vite 2.5.10 to 2.6.0 broke the application completely, from now on, it should update the patch release version only.
2021-10-05 10:17:54 +00:00
2021-10-13 00:01:34 +00:00
Patch release = the third digit ([Semantic Versioning](https://semver.org/))
2021-10-06 07:36:45 +00:00
2023-08-12 14:28:12 +00:00
If for security / bug / other reasons, a library must be updated, breaking changes need to be checked by the person proposing the change.
2023-02-01 14:39:09 +00:00
2021-10-13 00:01:34 +00:00
## Translations
2021-10-06 07:36:45 +00:00
2023-08-24 16:01:47 +00:00
Please add **all** the strings which are translatable to `src/lang/en.json` (If translation keys are omitted, they can not be translated).
2023-08-02 09:30:54 +00:00
2023-08-24 16:01:47 +00:00
**Don't include any other languages in your initial Pull-Request** (even if this is your mother tongue), to avoid merge-conflicts between weblate and `master` .
The translations can then (after merging a PR into `master` ) be translated by awesome people donating their language skills.
2023-08-02 09:30:54 +00:00
If you want to help by translating Uptime Kuma into your language, please visit the [instructions on how to translate using weblate ](https://github.com/louislam/uptime-kuma/blob/master/src/lang/README.md ).
## Spelling & Grammar
Feel free to correct the grammar in the documentation or code.
2023-08-24 16:01:47 +00:00
My mother language is not English and my grammar is not that great.
2021-10-20 16:03:55 +00:00
2021-10-26 15:56:14 +00:00
## Wiki
2021-12-02 10:15:14 +00:00
Since there is no way to make a pull request to wiki's repo, I have set up another repo to do that.
2021-10-26 15:56:14 +00:00
2021-10-26 16:02:20 +00:00
https://github.com/louislam/uptime-kuma-wiki
2021-10-26 15:56:14 +00:00
2023-09-10 20:02:26 +00:00
## Docker
#### Arch
- amd64
- arm64
- armv7
### Docker Tags
#### v2
- `2` , `latest-2` : v2 with full features such as Chromium and bundled MariaDB
- `2.x.x`
- `2-slim` : v2 with basic features
- `2.x.x-slim`
- `beta2` : Latest beta build
- `2.x.x-beta.x`
- `nightly2` : Dev build
- `base2` : Basic Debian setup without Uptime Kuma source code (Full features)
- `base2-slim` : Basic Debian setup without Uptime Kuma source code
- `pr-test2` : For testing pull request without setting up a local environment
#### v1
- `1` , `latest` , `1-debian` , `debian` : Latest version of v1
- `1.x.x` , `1.x.x-debian`
- `1.x.x-beta.x` : Beta build
- `beta` : Latest beta build
- `nightly` : Dev build
- `base-debian` : Basic Debian setup without Uptime Kuma source code
- `pr-test` : For testing pull request without setting up a local environment
- `base-alpine` : (Deprecated) Basic Alpine setup without Uptime Kuma source code
- `1-alpine` , `alpine` : (Deprecated)
- `1.x.x-alpine` : (Deprecated)
2021-12-02 10:15:14 +00:00
## Maintainer
2021-10-20 16:03:55 +00:00
2021-10-20 16:08:46 +00:00
Check the latest issues and pull requests:
2021-10-20 16:03:55 +00:00
https://github.com/louislam/uptime-kuma/issues?q=sort%3Aupdated-desc
### Release Procedures
2021-12-02 10:15:14 +00:00
2021-10-20 16:03:55 +00:00
1. Draft a release note
2022-03-22 08:45:07 +00:00
2. Make sure the repo is cleared
2023-02-21 07:45:18 +00:00
3. If the healthcheck is updated, remember to re-compile it: `npm run build-docker-builder-go`
2023-09-05 17:35:47 +00:00
3. `npm run release-final` with env vars: `VERSION` and `GITHUB_TOKEN`
2022-03-22 08:45:07 +00:00
4. Wait until the `Press any key to continue`
5. `git push`
6. Publish the release note as 1.X.X
7. Press any key to continue
2023-02-13 08:26:45 +00:00
8. Deploy to the demo server: `npm run deploy-demo-server`
2021-10-20 16:08:46 +00:00
Checking:
2021-12-02 10:15:14 +00:00
2021-10-20 16:08:46 +00:00
- Check all tags is fine on https://hub.docker.com/r/louislam/uptime-kuma/tags
- Try the Docker image with tag 1.X.X (Clean install / amd64 / arm64 / armv7)
2021-12-02 10:15:14 +00:00
- Try clean installation with Node.js
2021-10-26 15:56:14 +00:00
2022-03-20 03:08:33 +00:00
### Release Beta Procedures
1. Draft a release note, check "This is a pre-release"
2. Make sure the repo is cleared
3. `npm run release-beta` with env vars: `VERSION` and `GITHUB_TOKEN`
2022-03-22 08:45:07 +00:00
4. Wait until the `Press any key to continue`
2022-03-20 03:08:33 +00:00
5. Publish the release note as 1.X.X-beta.X
6. Press any key to continue
2021-10-26 15:56:14 +00:00
### Release Wiki
#### Setup Repo
2021-12-02 10:15:14 +00:00
```bash
2021-10-26 15:56:14 +00:00
git clone https://github.com/louislam/uptime-kuma-wiki.git
cd uptime-kuma-wiki
git remote add production https://github.com/louislam/uptime-kuma.wiki.git
```
#### Push to Production Wiki
2021-12-02 10:15:14 +00:00
```bash
2021-10-26 15:56:14 +00:00
git pull
git push production master
```
2023-09-07 08:35:15 +00:00
## Useful Commands
Change the base of a pull request such as `master` to `1.23.X`
```
git rebase --onto < new parent > < old parent >
```