commitd32e3d8fdcMerge:d722e793db959207Author: João Vitória Silva <8648976+joaovitoriasilva@users.noreply.github.com> Date: Wed Jun 25 12:52:35 2025 +0100 Merge remote-tracking branch 'origin/l10n_pre-release' into pre-release commitdb959207c1Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Wed Jun 25 12:51:52 2025 +0100 New translations activitymandabovepillscomponent.json (Portuguese) commit595256934eAuthor: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Wed Jun 25 12:50:51 2025 +0100 New translations editactivitymodalcomponent.json (Portuguese) commitc659dcd84fAuthor: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Wed Jun 25 12:50:46 2025 +0100 New translations activitysummarycomponent.json (Portuguese) commit1f8e699753Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Wed Jun 25 12:38:41 2025 +0100 New translations editactivitymodalcomponent.json (Portuguese) commitc93884c2c7Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Wed Jun 25 12:38:40 2025 +0100 New translations editactivitymodalcomponent.json (German) commit9a59c21a75Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Wed Jun 25 12:38:39 2025 +0100 New translations editactivitymodalcomponent.json (Catalan) commit72ea5b5467Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Wed Jun 25 12:38:38 2025 +0100 New translations editactivitymodalcomponent.json (Spanish) commit7f309e9e32Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Wed Jun 25 12:38:37 2025 +0100 New translations editactivitymodalcomponent.json (French) commit0ed4e9134dAuthor: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Wed Jun 25 12:38:36 2025 +0100 New translations activitysummarycomponent.json (Portuguese) commitb22b45f185Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Wed Jun 25 12:38:35 2025 +0100 New translations activitysummarycomponent.json (Dutch) commit78a49d35afAuthor: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Wed Jun 25 12:38:34 2025 +0100 New translations activitysummarycomponent.json (German) commitd03f260e75Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Wed Jun 25 12:38:33 2025 +0100 New translations activitysummarycomponent.json (Catalan) commit1203787f8aAuthor: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Wed Jun 25 12:38:32 2025 +0100 New translations activitysummarycomponent.json (Spanish) commit9a948aea26Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Wed Jun 25 12:38:31 2025 +0100 New translations activitysummarycomponent.json (French) commitcf2a0e8bddAuthor: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Wed Jun 25 12:38:30 2025 +0100 New translations editactivitymodalcomponent.json (Dutch) commitd722e79394Author: João Vitória Silva <8648976+joaovitoriasilva@users.noreply.github.com> Date: Wed Jun 25 12:28:40 2025 +0100 Fix Docker image tag & bump frontend version [docker] fix image tag on docker-compose.yml.example [frontend] bump version on frontend commite15f4e89c7Author: João Vitória Silva <8648976+joaovitoriasilva@users.noreply.github.com> Date: Wed Jun 25 12:18:17 2025 +0100 Bump dependencies commit319b83ae0fAuthor: João Vitória Silva <8648976+joaovitoriasilva@users.noreply.github.com> Date: Wed Jun 25 12:10:53 2025 +0100 Add indoor cycling support & fix config/logging issues [backend] fixed invalid default value for JAEGER_ENABLED [backend] added support for activity type indoor_cycling [backend] fixed logging spacing and added docs to logger [docker] fixed logging spacing [docs] added support for activity type indoor_cycling [frontend] added support for activity type indoor_cycling [frontend] re added activityMaxHR to activitySummaryComponent.json commitf3e298300fMerge:c9e006a710668d3eAuthor: João Vitória Silva <8648976+joaovitoriasilva@users.noreply.github.com> Date: Wed Jun 25 11:20:16 2025 +0100 Merge branch 'docker_immutable_feature' into pre-release commit10668d3ed6Author: João Vitória Silva <8648976+joaovitoriasilva@users.noreply.github.com> Date: Wed Jun 25 09:26:34 2025 +0100 Update env.js commitb138f81f1eAuthor: João Vitória Silva <8648976+joaovitoriasilva@users.noreply.github.com> Date: Tue Jun 24 23:14:58 2025 +0100 Update database.py commit5c7c81f123Author: João Vitória Silva <8648976+joaovitoriasilva@users.noreply.github.com> Date: Tue Jun 24 23:03:14 2025 +0100 Refactor env var usage and runtime config for frontend/backend Backend now uses core.config for environment variables with sensible defaults, reducing direct os.environ access and improving robustness. Dockerfile and start.sh were updated to remove hardcoded env vars and generate a runtime env.js for frontend configuration. Frontend code now reads ENDURAIN_HOST from window.env instead of Vite env, enabling runtime configuration. Obsolete .env file was removed, and documentation was updated to fix a typo in JAEGER_PORT. commitbb2ae4f548Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Mon Jun 23 16:34:27 2025 +0100 New translations activitymandabovepillscomponent.json (Portuguese) commit64f438000fAuthor: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Mon Jun 23 16:34:26 2025 +0100 New translations activitymandabovepillscomponent.json (German) commit4129e66768Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Mon Jun 23 16:34:25 2025 +0100 New translations activitymandabovepillscomponent.json (Catalan) commit7c37b2c375Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Mon Jun 23 16:34:23 2025 +0100 New translations activitymandabovepillscomponent.json (Spanish) commited236a0ee7Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Mon Jun 23 16:34:22 2025 +0100 New translations activitymandabovepillscomponent.json (French) commit825ef122d7Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Mon Jun 23 16:34:21 2025 +0100 New translations activitysummarycomponent.json (Portuguese) commitd04742caeeAuthor: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Mon Jun 23 16:34:20 2025 +0100 New translations activitysummarycomponent.json (Dutch) commit187b56221bAuthor: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Mon Jun 23 16:34:19 2025 +0100 New translations activitysummarycomponent.json (German) commit83847a2d0cAuthor: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Mon Jun 23 16:34:18 2025 +0100 New translations activitysummarycomponent.json (Catalan) commit8a2417360aAuthor: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Mon Jun 23 16:34:17 2025 +0100 New translations activitysummarycomponent.json (Spanish) commit7bf9dfdc66Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Mon Jun 23 16:34:16 2025 +0100 New translations activitysummarycomponent.json (French) commit683b1fd260Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Mon Jun 23 16:34:15 2025 +0100 New translations activitymandabovepillscomponent.json (Dutch) commitc9e006a757Merge:1a5f5cca6cfe4999Author: João Vitória Silva <8648976+joaovitoriasilva@users.noreply.github.com> Date: Mon Jun 23 16:28:37 2025 +0100 Merge branch 'pr/199' into pre-release commit6cfe4999e1Author: João Vitória Silva <8648976+joaovitoriasilva@users.noreply.github.com> Date: Mon Jun 23 16:27:44 2025 +0100 Add HR Zones chart to mobile, move logic to chartUtils [frontend] moved chart functions to chartUtils file [frontend] added HR Zones Bar Chart to mobile view commite475138d11Author: João Vitória Silva <8648976+joaovitoriasilva@users.noreply.github.com> Date: Mon Jun 23 16:15:42 2025 +0100 Refactor HR Zones chart, clean up ActivitySummary [frontend] moved HR Zones graph away from ActivitySummaryComponent [frontend] removed duplicated translation [frontend] reverted changes on ActivitySummaryComponent since chart was removed [frontend] moved chart to ActivityMandAbovePillsComponent [frontend] small adjustments to BarChart commita7d8418d51Author: João Vitória Silva <8648976+joaovitoriasilva@users.noreply.github.com> Date: Mon Jun 23 15:04:05 2025 +0100 Improve formatting, docstrings & fix activityActivityStreams prop [backend] fixed formatting [backend] changed existing docstrings to be more complete [backend] changed imports to be consistent with rest of the code [frontend] fixed formatting [frontend] set new prop on ActivitySummaryComponent to be not required because it is not always necessary (HomeView) [frontend] fixed issue onMounted on ActivitySummaryComponent when new prop is null commit1a5f5cca86Author: João Vitória Silva <8648976+joaovitoriasilva@users.noreply.github.com> Date: Mon Jun 23 13:52:31 2025 +0100 Fix for docs commit1960c3153aMerge:c895ae0d935a5d43Author: João Vitória Silva <8648976+joaovitoriasilva@users.noreply.github.com> Date: Mon Jun 23 13:37:08 2025 +0100 Merge branch 'pr/203' into pre-release commitc895ae0d83Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Mon Jun 23 12:33:21 2025 +0100 New translations activitybellowmpillscomponent.json (Dutch) commit5338c95879Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Mon Jun 23 12:33:20 2025 +0100 New translations activitylapscomponent.json (Dutch) commit7d3930bfbaAuthor: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Mon Jun 23 12:33:19 2025 +0100 New translations generalitems.json (Dutch) commit0838b6cf6eAuthor: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Mon Jun 23 11:11:34 2025 +0100 New translations activitybellowmpillscomponent.json (Dutch) commit9776b6461aAuthor: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Mon Jun 23 11:11:31 2025 +0100 New translations activitylapscomponent.json (Dutch) commit8b2b6c6fc8Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Mon Jun 23 11:10:23 2025 +0100 New translations stravacallbackview.json (Dutch) commit6acf86fb47Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Mon Jun 23 11:10:09 2025 +0100 New translations summaryview.json (Dutch) commit79708f1aa9Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Mon Jun 23 11:10:07 2025 +0100 New translations settingsuserprofilezonecomponent.json (Dutch) commit5e93661fa0Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Mon Jun 23 11:10:06 2025 +0100 New translations settingsintegrationszonecomponent.json (Dutch) commitbfa7093fc4Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Mon Jun 23 11:10:04 2025 +0100 New translations editactivitymodalcomponent.json (Dutch) commit27036db437Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Mon Jun 23 11:10:03 2025 +0100 New translations navbarcomponent.json (Dutch) commitc4143435d1Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Mon Jun 23 11:09:48 2025 +0100 New translations activityview.json (Dutch) commit8b1cc16bc6Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Mon Jun 23 11:09:47 2025 +0100 New translations loginview.json (Dutch) commit3cd447368eAuthor: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Mon Jun 23 11:09:46 2025 +0100 New translations generalitems.json (Dutch) commitbac2b90b88Merge:d0f850dd13afbe86Author: João Vitória Silva <8648976+joaovitoriasilva@users.noreply.github.com> Date: Mon Jun 23 11:06:59 2025 +0100 Merge remote-tracking branch 'origin/l10n_pre-release' into pre-release commitd0f850dd0eMerge:ed4c87d4426500ffAuthor: João Vitória Silva <8648976+joaovitoriasilva@users.noreply.github.com> Date: Mon Jun 23 11:04:10 2025 +0100 Merge branch 'pr/208' into pre-release commit13afbe86aeAuthor: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Mon Jun 23 11:00:40 2025 +0100 New translations gearslistcomponent.json (German) commit59ad9170b0Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Mon Jun 23 10:59:50 2025 +0100 New translations gearview.json (Catalan) commit426500ff2eAuthor: C2gl <97646342+C2gl@users.noreply.github.com> Date: Mon Jun 23 11:59:36 2025 +0200 fixing some typos commited4c87d407Author: João Vitória Silva <8648976+joaovitoriasilva@users.noreply.github.com> Date: Mon Jun 23 10:55:01 2025 +0100 Silence StravaLib token warnings + bump dependencies commit6f24ac158fAuthor: C2gl <97646342+C2gl@users.noreply.github.com> Date: Mon Jun 23 01:10:40 2025 +0200 fully translated commit386e5ae853Author: C2gl <97646342+C2gl@users.noreply.github.com> Date: Mon Jun 23 00:57:42 2025 +0200 done upto strava commit56cb31288dAuthor: C2gl <97646342+C2gl@users.noreply.github.com> Date: Mon Jun 23 00:54:16 2025 +0200 next to translate - gears commit8d3158ef6cAuthor: C2gl <97646342+C2gl@users.noreply.github.com> Date: Mon Jun 23 00:25:31 2025 +0200 initial commit for fork commit935a5d43b5Author: Fredrik Fyksen <fredrik@fyksen.me> Date: Wed Jun 18 15:06:48 2025 +0200 Updated hosting guide commit56a7ff881fAuthor: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Tue Jun 17 21:02:22 2025 +0100 New translations summaryview.json (Dutch) commit9c0acab25aAuthor: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Tue Jun 17 19:35:49 2025 +0100 New translations activityview.json (Dutch) commitbfe8ae1d14Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Tue Jun 17 19:35:48 2025 +0100 New translations summaryview.json (Dutch) commit0c0a375d1aAuthor: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Tue Jun 17 19:35:47 2025 +0100 New translations activitymandabovepillscomponent.json (Dutch) commit8c4619fc8dAuthor: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Tue Jun 17 19:35:46 2025 +0100 New translations editactivitymodalcomponent.json (Dutch) commit9748f7776fAuthor: Zuhdi <rccheattest2@gmail.com> Date: Tue Jun 17 22:57:52 2025 +0700 feat: change hr zone to bar chart - return transform_activity_streams to get_public_activity_stream_by_type - commitfcad6ea3e5Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Tue Jun 17 14:39:27 2025 +0100 New translations summaryview.json (Dutch) commit515427d89bAuthor: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Tue Jun 17 14:39:26 2025 +0100 New translations activitiesview.json (Dutch) commit50a76062f0Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Tue Jun 17 14:39:24 2025 +0100 New translations activitymandabovepillscomponent.json (Dutch) commit95c6b9ef0eAuthor: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Tue Jun 17 14:39:23 2025 +0100 New translations searchview.json (Dutch) commit503b943a2eAuthor: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Tue Jun 17 14:39:22 2025 +0100 New translations settingsuserprofilezonecomponent.json (Dutch) commitb1884f4fe9Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Tue Jun 17 14:39:21 2025 +0100 New translations settingsintegrationszonecomponent.json (Dutch) commit04c899a3a4Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Tue Jun 17 14:39:20 2025 +0100 New translations gearslistcomponent.json (Dutch) commit5163263b88Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Tue Jun 17 14:39:19 2025 +0100 New translations gearsaddeditgearmodalcomponent.json (Dutch) commitae3943d352Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Tue Jun 17 14:39:18 2025 +0100 New translations editactivitymodalcomponent.json (Dutch) commit01a900b166Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Tue Jun 17 14:39:16 2025 +0100 New translations gearview.json (Dutch) commite1c006fd7eAuthor: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Tue Jun 17 14:39:15 2025 +0100 New translations loginview.json (Dutch) commit1f406e5022Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Tue Jun 17 14:39:14 2025 +0100 New translations generalitems.json (Dutch) commit9b43447128Author: João Vitória Silva <joao.vitoria.silva@pm.me> Date: Tue Jun 17 12:53:54 2025 +0100 New translations navbarcomponent.json (Dutch) commitc503c35607Author: Zuhdi <rccheattest2@gmail.com> Date: Tue Jun 17 08:01:37 2025 +0700 chore: fix review commit85c8f9410cAuthor: Zuhdi <rccheattest2@gmail.com> Date: Tue Jun 17 07:15:01 2025 +0700 fix: handle when average_heartrate and max_heartrate is null when import from strava commit7e9b3227c4Author: Zuhdi <rccheattest2@gmail.com> Date: Sun Jun 15 11:44:39 2025 +0700 feat: change default value for hrZones commitbd1ec74968Author: Zuhdi <rccheattest2@gmail.com> Date: Sun Jun 15 11:32:40 2025 +0700 feat: show HR based on zone that calculated from user birthdate (if any)
6.7 KiB
Getting started
Welcome to the guide for getting started on hosting your own production instance of Endurain. Like many other services, Endurain is easiest to get up and running trough Docker compose. It is possible to get Endurain up and running without a domain and reverse proxy, but this guide assumes you want to use a reverse proxy and your domain. Endurain can run on any computer that support OCI containers, but in this guide we are using Debian 13 (should also work with 12).
Prerequisites
- Domain name pointed to your external IP address.
- Open FW rules to your server on port 443 and 80. (trough NAT if you are running ipv4)
- A computer/server with enough disk space for your activity files.
- API key from geocode.maps.co (free, but need to register).
Installing docker and Caddy reverse proxy
We use apt to do this
sudo apt update -y
sudo apt install docker.io docker-compose caddy -y
Confirm your user has the id 1000:
id
If you are not the user 1000, you need to set the UID and GID to your id in the .env file. But to keep this guide as easy to follow as possible, we will assume that you are user 1000.
Create directory structure
Lets use /opt/endurain/ as the root directory for our project.
sudo mkdir /opt/endurain
sudo chown 1000:1000 /opt/endurain
mkdir -p \
/opt/endurain/app/{user_images,files/{bulk_import,processed},logs} \
/opt/endurain/postgres
Docker compose Deployment
In this example of setting up Endurain, we will need two files. One docker-compose.yml and .env.
- docker-compose.yml tells your system how to set up the container, network and storage.
- .env holds our secrets and environment variables.
Splitting up the setup like this make it easy to handle updates to the containers, without touching the secrets and other variables.
Creating the docker-compose and .env file
To make it as easy as possible for selfhoster to get up and running examples of docker-compose.yml and .env is on the git repo. Here are links to the files on the repo:
cd /opt/endurain
wget https://raw.githubusercontent.com/joaovitoriasilva/endurain/refs/heads/master/docker-compose.yml.example
wget https://raw.githubusercontent.com/joaovitoriasilva/endurain/refs/heads/master/env.example
mv docker-compose.yml.example docker-compose.yml
mv .env.example .env
Now we need to make changes to the files to reflect your environment. Inside docker-compose.yml there is not much we need to do. If you want to store the files another place then /opt/endurain this is the file you need to change.
Here is an explaination on what you can set in the .env:
| Environment variable | How to set it |
|---|---|
| DB_PASSWORD | Run openssl rand -hex 32 on a terminal to get a secret |
| POSTGRES_PASSWORD | Set the same value as DB_PASSWORD. |
| SECRET_KEY | Run openssl rand -hex 32 on a terminal to get a secret |
| FERNET_KEY | Run python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())" on a terminal to get a secret or go to https://fernetkeygen.com. Example output is 7NfMMRSCWcoNDSjqBX8WoYH9nTFk1VdQOdZY13po53Y= |
| GEOCODES_MAPS_API | Geocode maps offers a free plan consisting of 1 Request/Second. Registration necessary. |
| TZ | Timezone definition. Insert your timezone. List of available time zones here. Format Europe/Lisbon expected |
| ENDURAIN_HOST | https://endurain.yourdomain.com |
| BEHIND_PROXY | Change to true if behind reverse proxy |
| POSTGRES_DB | Postgres name for the database. |
| POSTGRES_USER | Postgres user for the database. |
Please note:
POSTGRES_DB and POSTGRES_USER is values for the database. If you change it from endurain, you also need to set the environment variables for the app image. Please leave them as endurain if you are unsure.
Start the stack
It is finally time to start the stack!
cd /opt/endurain
sudo docker compose up -d
Check the log output:
docker compose logs -f
If you do not get any errors, continue to next step.
Visit the site
- Visit the site insecurly on http://
IP-OF-YOUR-SERVER:8080 - We still can not login to the site, because the
ENDURAIN_HOSTdoesn't match our local URL.
Configure Caddy as reverse proxy and get SSL cert from letsencrypt
- Before we configure caddy you need to set your DNS provider to point your domain to your external IP.
- You also need to open your firewall on port 443 and 80 to the server.
We use caddy outside docker. This way Debian handles the updates (you just need to run sudo apt get update -y and sudo apt get upgrade -y)
Caddy is configured in the file /etc/caddy/Caddyfile
Open the file in your favourite editor, delete the default text, and paste in this:
endurain.yourdomain.com {
reverse_proxy localhost:8080
}
Restart caddy
sudo systemctl restart caddy
Check the ouput of caddy with:
sudo journalctl -u caddy
You should now be able to access your site on endurain.yourdomain.com
Log in with username: admin password: admin, and remember to change the password
🎉 Weee 🎉 You now have your own instance of Endurain up and running!
How to update
- Take a backup of your files and db.
- Check for new releases of the container image here. Read release notes carefully for breaking changes.
- Log on your server and run:
- Inside
/opt/endurain/docker-compose.yml, change out the version tag (the version after:)
cd /opt/endurain
sudo docker compose pull
sudo docker compose up -d
The same is the case for Postgres. Check for breaking changes in release notes on Postgres Website.
** It is generally pretty safe to upgrade postgres minor version f.eks 17.4 to 17.5, but major is often breaking change (example 17.2 to 18.1 )
Things to think about
You should implement backup strategy for the following directories:
/opt/endurain/app/user_images
/opt/endurain/app/files/bulk_import
/opt/endurain/app/files/processed
/opt/endurain/app/logs
You also need to backup your postgres database. It is not good practice to just backup the volume /opt/endurain/postgres this might be corrupted if the database is in the middle of a wright when the database goes down.
Default Credentials
- Username: admin
- Password: admin