Skip to content
Merged

Next #1041

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
d79ce5f
933 feature request multi device management UI (#940)
dgraf-gh Apr 24, 2026
e1c1514
939 feature request add a new job system to reitti (#948)
dgraf-gh Apr 28, 2026
c64a277
949 feature request update worker job status UI page (#953)
dgraf-gh May 2, 2026
5462a80
758 feature request show progress when editing place (#954)
dgraf-gh May 3, 2026
34d858b
946 bug no indication for the upload file limit visible (#956)
dgraf-gh May 3, 2026
7c54c6d
934 add new aggregated view tables for multiple devices (#961)
dgraf-gh May 7, 2026
5a3cdd2
936 add merge UI (#965)
dgraf-gh May 15, 2026
69c02af
957 bug host not found in upstream serverarcgisonlinecom in etcnginxn…
dgraf-gh May 15, 2026
6ed5fc4
feat(945): enhance permissions handling in Docker setup (#968)
dgraf-gh May 15, 2026
ae726ff
feat(944): add visibility control for satellite-layer (#969)
dgraf-gh May 15, 2026
e8d54f0
919 feature request show current user location by default in timeline…
dgraf-gh May 15, 2026
a6a79dd
906 bug loading the statistics page takes too long (#975)
dgraf-gh May 16, 2026
1f95ba5
825 feature request in live view clicking on profile do not lead to z…
dgraf-gh May 18, 2026
e1c8276
feat(942): add Nominatim rate limiter to geocoder services (#978)
dgraf-gh May 18, 2026
bcc7e3e
462 feature request memories enhance data model (#980)
dgraf-gh May 22, 2026
332d08b
Add Custom Map Styles (#981)
dgraf-gh Jun 1, 2026
8b5dd13
973 bug multi device support issues (#983)
dgraf-gh Jun 1, 2026
fa867d1
973 bug multi device support issues 2 (#985)
dgraf-gh Jun 2, 2026
55abbca
973 add unlinking api keys (#987)
dgraf-gh Jun 3, 2026
a1729b4
feat(982): add Colota integration to settings page (#988)
dgraf-gh Jun 3, 2026
574d53e
890 feature request timeline animation slow down trips speed up stati…
dgraf-gh Jun 4, 2026
40a9280
991 feature request add device paths to the map (#993)
dgraf-gh Jun 5, 2026
9357300
fix(992): resolve issues with leaflet-based maps not loading (#994)
dgraf-gh Jun 5, 2026
4265c01
995 feature request add missing languages (#998)
dgraf-gh Jun 6, 2026
0785fd8
984 bug switching terrain on a custom map style breaks path rendering…
dgraf-gh Jun 6, 2026
2a699fc
854 feature request restructure timeline when displaying more than a …
dgraf-gh Jun 12, 2026
451408c
1005 bug a few quirks about current multi userdevice implementation (…
dgraf-gh Jun 14, 2026
b394849
1007 feature request udpate data ingestion for device handling (#1009)
dgraf-gh Jun 14, 2026
9e4d7fa
Translation cleanup (#1011)
dgraf-gh Jun 14, 2026
04bf29c
fix(device-cleanup): remove redundant "Main Device" options and defau…
dgraf-gh Jun 15, 2026
0531a14
Device cleanup (#1014)
dgraf-gh Jun 15, 2026
02f06fb
**fix(rename-follow-user): update translation for "Follow user" to "F…
dgraf-gh Jun 15, 2026
23ed0c2
1016 feature request show avatars of devices if configured (#1018)
dgraf-gh Jun 16, 2026
0742d78
1017 bug several UI bugs (#1024)
dgraf-gh Jun 16, 2026
830b9fb
Device UI fixes (#1030)
dgraf-gh Jun 17, 2026
07d510b
- **fix(api): remove redundant maxPoints parameter from `findSimplifi…
dgraf-gh Jun 17, 2026
73e6624
Device UI fixes (#1037)
dgraf-gh Jun 20, 2026
73ddabc
1034 feature request improve visitanomaly detection (#1038)
dgraf-gh Jun 22, 2026
b2d8632
**feat(license): change project license to AGPLv3 (#1039)** (#1040)
dgraf-gh Jun 22, 2026
4ff7fb4
Merge branch 'main' into next
dgraf-gh Jun 22, 2026
e1fd7e6
- **fix(locale): use locale-aware formatting for coordinate strings**
dgraf-gh Jun 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion DOCKER-HUB-DESCRIPTION.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,4 +100,4 @@ The source code for this project is available on GitHub: [https://github.com/ded

## License

This project is licensed under the MIT License.
This project is licensed under the GNU Affero General Public License Version 3 (AGPLv3) License.
48 changes: 35 additions & 13 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -15,32 +15,54 @@ ENV DATA_DIR=/data

# Create application directory
RUN mkdir -p $APP_HOME && \
chown -R reitti:reitti $APP_HOME
chown -R reitti:reitti $APP_HOME && \
chmod 755 $APP_HOME

WORKDIR $APP_HOME

# Copy the application jar
COPY --chown=reitti:reitti target/*.jar $APP_HOME/app.jar
RUN chmod 644 $APP_HOME/app.jar

# Create a script to start the application with configurable UID/GID
RUN cat <<'EOF' > /entrypoint.sh
#!/bin/sh
if [ -n "$APP_UID" ] && [ -n "$APP_GID" ]; then
echo "Changing reitti user/group to UID:$APP_UID / GID:$APP_GID"
apk add --no-cache shadow
groupmod -g $APP_GID reitti
usermod -u $APP_UID reitti
chown -R reitti:reitti $APP_HOME
fi

mkdir -p $DATA_DIR
chown -R reitti:reitti $DATA_DIR
# 1. Only attempt UID/GID modification if we are running as root
if [ "$(id -u)" = '0' ]; then
if [ -n "$APP_UID" ] && [ -n "$APP_GID" ]; then
echo "Changing reitti user/group to UID:$APP_UID / GID:$APP_GID"
apk add --no-cache shadow
groupmod -g "$APP_GID" reitti
usermod -u "$APP_UID" reitti
# Ensure the home directory is owned by the new UID/GID
chown -R reitti:reitti "$APP_HOME"
fi

# 2. Ensure DATA_DIR exists
mkdir -p "$DATA_DIR"
chmod 755 "$DATA_DIR"

# Execute
exec su-exec reitti java $JAVA_OPTS -jar $APP_HOME/app.jar -Dspring.profiles.active=docker "$@"
# 3. Only chown DATA_DIR if the reitti user cannot write to it
# We use su-exec to "test" writability as the reitti user
if ! su-exec reitti [ -w "$DATA_DIR" ]; then
echo "DATA_DIR ($DATA_DIR) is not writable by reitti. Adjusting permissions..."
chown -R reitti:reitti "$DATA_DIR"
else
echo "DATA_DIR ($DATA_DIR) is already writable. Skipping chown."
fi

# Execute as the reitti user
exec su-exec reitti java $JAVA_OPTS -jar "$APP_HOME/app.jar" -Dspring.profiles.active=docker "$@"
else
echo "Warning: Container is running as UID $(id -u), not root."
echo "Environment variables APP_UID/APP_GID will be ignored."
echo "Ensure your volumes have the correct permissions on the host."
exec java $JAVA_OPTS -jar "$APP_HOME/app.jar" -Dspring.profiles.active=docker "$@"
fi
EOF

RUN chmod +x /entrypoint.sh
RUN chmod 755 /entrypoint.sh
# Expose the application port
EXPOSE 8080

Expand Down
682 changes: 661 additions & 21 deletions LICENSE

Large diffs are not rendered by default.

5 changes: 2 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -213,9 +213,8 @@ The included `docker-compose.yml` provides a complete setup with:
| `OIDC_SCOPE` | Your OpenID Connect scopes for your user (optional) | openid,profile | openid,profile |
| `OIDC_AUTHENTICATION_METHOD` | The authentication method the OIDC Client should use (optional) | client_secret_basic | client_secret_basic,none |
| `OIDC_SIGN_UP_ENABLED` | Whether new users should be signed up automatically if they first login via the OIDC Provider. (optional) | true | false |
| `PROCESSING_WAIT_TIME` | How many seconds to wait after the last data input before starting to process all unprocessed data. (⚠️ This needs to be lower than your integrated app reports data in Reitti) | 15 | 15 |
| `DANGEROUS_LIFE` | Enables data management features that can reset/delete all database data (⚠️ USE WITH CAUTION) | false | true |
| `TILES_CACHE` | The url of the tile caching proxy (Set to '' to disable the cache | http://tile-cache | |
| `TILES_CACHE` | The url of the tile caching proxy (Set to '' to disable the cache) | http://tile-cache | |
| `PROCESSING_BATCH_SIZE` | How many geo points should we handle at once. For low-memory environment it could be needed to set this to 100. | 1000 | 100 |
| `SERVER_PORT` | Application server port | 8080 | 8080 |
| `APP_UID` | User ID to run the application as | 1000 | 1000 |
Expand Down Expand Up @@ -400,4 +399,4 @@ click on this [link](https://hosted.weblate.org/engage/reitti/)

## License

This project is licensed under the MIT License, see the LICENSE file for details.
This project is licensed under the GNU Affero General Public License Version 3 (AGPLv3), see the LICENSE file for details.
5 changes: 0 additions & 5 deletions docker-compose-dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -77,11 +77,6 @@ services:
restart: unless-stopped
ports:
- "8084:80"
healthcheck:
test: ["CMD", "curl", "-s", "http://127.0.0.1/osm/0/0/0.png"]
interval: 30s
timeout: 10s
retries: 3
volumes:
- tile-cache-data:/var/cache/nginx
volumes:
Expand Down
5 changes: 0 additions & 5 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,6 @@ services:
tile-cache:
image: dedicatedcode/reitti-tile-cache:latest
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-s", "http://127.0.0.1/osm/0/0/0.png"]
interval: 10s
timeout: 5s
retries: 5
volumes:
- tile-cache-data:/var/cache/nginx
volumes:
Expand Down
8 changes: 5 additions & 3 deletions docker/tiles-cache/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
FROM nginx:alpine
FROM nginx:1.30.1-trixie

# Create cache directories for different tile types
RUN mkdir -p /var/cache/nginx/osm /var/cache/nginx/vector /var/cache/nginx/terrain /var/cache/nginx/satellite
RUN mkdir -p /var/cache/nginx/custom

COPY nginx.conf /etc/nginx/nginx.conf

EXPOSE 80

HEALTHCHECK --interval=10s --timeout=5s --start-period=5s --retries=5 \
CMD curl -f -s -o /dev/null -H "X-Reitti-Upstream-Url: https://tiles.dedicatedcode.com" http://localhost/custom/planet/latest/0/0/0.pbf || exit 1
92 changes: 17 additions & 75 deletions docker/tiles-cache/nginx.conf
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ http {
open_file_cache_errors on;

# Buffers/tuning for proxied tile responses (typically small images/PBF)
# Tune these if you see "upstream sent too big header" or buffer warnings.
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_buffering on;
Expand All @@ -44,32 +43,15 @@ http {
proxy_cache_key "$scheme$proxy_host$request_uri";

# Avoid cache fragmentation by upstream compression variance
# (Tiles are images/PBF; further compression is not helpful.)
proxy_set_header Accept-Encoding "";

# Don’t let Set-Cookie poison the cache
proxy_ignore_headers Set-Cookie;
proxy_hide_header Set-Cookie;

# Larger, longer-lived caches (adjust to your disk/RAM)
# loader_* and manager_* help Nginx (re)load and maintain big caches efficiently
proxy_cache_path /var/cache/nginx/osm
levels=1:2 keys_zone=osm_tiles:512m max_size=2g inactive=90d use_temp_path=off
loader_threshold=300 loader_files=200 loader_sleep=50ms
manager_threshold=300 manager_files=200 manager_sleep=50ms;

proxy_cache_path /var/cache/nginx/vector
levels=1:2 keys_zone=vector_tiles:512m max_size=2g inactive=180d use_temp_path=off
loader_threshold=300 loader_files=200 loader_sleep=50ms
manager_threshold=300 manager_files=200 manager_sleep=50ms;

proxy_cache_path /var/cache/nginx/terrain
levels=1:2 keys_zone=terrain_tiles:512m max_size=2g inactive=180d use_temp_path=off
loader_threshold=300 loader_files=200 loader_sleep=50ms
manager_threshold=300 manager_files=200 manager_sleep=50ms;

proxy_cache_path /var/cache/nginx/satellite
levels=1:2 keys_zone=satellite_tiles:512m max_size=2g inactive=180d use_temp_path=off
proxy_cache_path /var/cache/nginx/custom
levels=1:2 keys_zone=custom_tiles:512m max_size=2g inactive=180d use_temp_path=off
loader_threshold=300 loader_files=200 loader_sleep=50ms
manager_threshold=300 manager_files=200 manager_sleep=50ms;

Expand All @@ -78,79 +60,39 @@ http {
proxy_cache_lock_timeout 5s;
proxy_cache_lock_age 10s;
proxy_cache_background_update on;
proxy_cache_revalidate on; # Revalidate with ETag/Last-Modified when present
proxy_cache_revalidate on;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'"$http_user_agent" "$http_x_forwarded_for" "$http_x_reitti_upstream_url" '
'cache:$upstream_cache_status';

access_log /var/log/nginx/access.log main;

server_tokens off;
resolver 127.0.0.11 ipv6=off valid=300s;

server {
listen 80;

# Optional: strong client cache headers (immutable tile URLs).
# If you prefer more conservative client caching, lower to 30d or comment out.
set $tile_client_cache_control "public, max-age=31536000, immutable";

location /osm/ {
proxy_pass https://tile.openstreetmap.org/;
proxy_set_header Host tile.openstreetmap.org;
proxy_set_header User-Agent "Reitti/1.0 (+https://github.com/dedicatedcode/reitti; contact: reitti@dedicatedcode.com)";
proxy_ssl_server_name on;

proxy_cache osm_tiles;
proxy_cache_valid 200 302 1y;
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;

add_header X-Cache-Status $upstream_cache_status;
add_header Cache-Control $tile_client_cache_control;
expires 1y;
}

location /vector/ {
proxy_pass https://tiles.dedicatedcode.com/planet/latest/;
proxy_set_header Host tiles.dedicatedcode.com;
proxy_set_header User-Agent "Reitti/1.0 (+https://github.com/dedicatedcode/reitti; contact: reitti@dedicatedcode.com)";
proxy_ssl_server_name on;

proxy_cache vector_tiles;
proxy_cache_valid 200 302 1y;
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;

add_header X-Cache-Status $upstream_cache_status;
add_header Cache-Control $tile_client_cache_control;
expires 1y;
}

location /terrain/ {
proxy_pass https://tiles.mapterhorn.com/;
proxy_set_header Host tiles.mapterhorn.com;
proxy_set_header User-Agent "Reitti/1.0 (+https://github.com/dedicatedcode/reitti; contact: reitti@dedicatedcode.com)";
proxy_ssl_server_name on;
location /custom/ {
set $custom_upstream $http_x_reitti_upstream_url;
if ($custom_upstream = "") {
return 400;
}

proxy_cache terrain_tiles;
proxy_cache_valid 200 302 1y;
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
# Strip the /custom/ prefix so the upstream receives the correct path
rewrite ^/custom/(.*) /$1 break;

add_header X-Cache-Status $upstream_cache_status;
add_header Cache-Control $tile_client_cache_control;
expires 1y;
}

location /satellite/ {
proxy_pass https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/;
proxy_set_header Host server.arcgisonline.com;
proxy_pass $custom_upstream;
proxy_set_header Host $proxy_host;
proxy_set_header User-Agent "Reitti/1.0 (+https://github.com/dedicatedcode/reitti; contact: reitti@dedicatedcode.com)";
proxy_ssl_server_name on;

proxy_cache satellite_tiles;
proxy_cache custom_tiles;
proxy_cache_key "$custom_upstream";
proxy_cache_valid 200 302 1y;
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
Expand All @@ -166,4 +108,4 @@ http {
add_header Content-Type text/plain;
}
}
}
}
Loading
Loading