diff --git a/wger/.env.example b/wger/.env.example index ca5ebd7..6d88bf7 100644 --- a/wger/.env.example +++ b/wger/.env.example @@ -1,154 +1,7 @@ +# https://github.com/wger-project/docker/blob/master/config/prod.env + # Django's secret key, change to a 50 character random string if you are running # this instance publicly. For an online generator, see e.g. https://djecrety.ir/ SECRET_KEY=wger-docker-supersecret-key-1234567890!@#$%^&*(-_) - # Signing key used for JWT, use something different than the secret key -SIGNING_KEY=wger-docker-secret-jwtkey-1234567890!@#$%^&*(-_=+) - -# The server's timezone, for a list of possible names: -# https://en.wikipedia.org/wiki/List_of_tz_database_time_zones -TIME_ZONE=America/Moncton - -# -# Consult the deployment section in the readme if you are running this behind a -# reverse proxy with HTTPS enabled - -CSRF_TRUSTED_ORIGINS=https://wger.shoebottom.ca -X_FORWARDED_PROTO_HEADER_SET=True - -# -# Static files -# If you are running the application behind a reverse proxy or changed the port, the -# links for some images *might* break (specially in the mobile app). Also note that -# the API response is cached and contains the host, if you change this setting, just run -# docker compose exec web python3 manage.py warmup-exercise-api-cache --force -MEDIA_URL=https://wger.shoebottom.ca/media/ -STATIC_URL=https://wger.shoebottom.ca/static/ - -# -# These settings usually don't need changing -# - -# -# Application -WGER_INSTANCE=https://wger.de # Wger instance from which to sync exercises, images, etc. -ALLOW_REGISTRATION=True -ALLOW_GUEST_USERS=True -ALLOW_UPLOAD_VIDEOS=False -# Users won't be able to contribute to exercises if their account age is -# lower than this amount in days. -MIN_ACCOUNT_AGE_TO_TRUST=21 -# Synchronzing exercises -# It is recommended to keep the local database synchronized with the wger -# instance specified in WGER_INSTANCE since there are new added or translations -# improved. For this you have different possibilities: -# - Sync exercises on startup: -# SYNC_EXERCISES_ON_STARTUP=True -# DOWNLOAD_EXERCISE_IMAGES_ON_STARTUP=True -# - Sync them in the background with celery. This will setup a job that will run -# once a week at a random time (this time is selected once when starting the server) -SYNC_EXERCISES_CELERY=True -SYNC_EXERCISE_IMAGES_CELERY=True -SYNC_EXERCISE_VIDEOS_CELERY=True -# - Manually trigger the process as needed: -# docker compose exec web python3 manage.py sync-exercises -# docker compose exec web python3 manage.py download-exercise-images -# docker compose exec web python3 manage.py download-exercise-videos - -# Synchronzing ingredients -# You can also syncronize the ingredients from a remote wger instance, and have -# basically the same options as for the ingredients: -# - Sync them in the background with celery. This will setup a job that will run -# once a week at a random time (this time is selected once when starting the server) -SYNC_INGREDIENTS_CELERY=True -# - Manually trigger the process as needed: -# docker compose exec web python3 manage.py sync-ingredients - -# When scanning products with the barcode scanner, it is possible to dynamically -# fetch the ingredient if it is not known in the local database. This option controlls -# where to try to download the ingredient and their images. -# Possible values OFF, WGER or None. Note that it is recommended to keep this as WGER -# so that we don't overwhelm the Open Food Facts servers. Needs to have USE_CELERY -# set to true -DOWNLOAD_INGREDIENTS_FROM=WGER - -# Whether celery is configured and should be used. Can be left to true with -# this setup but can be deactivated if you are using the app in some other way -USE_CELERY=True - -# -# Celery -CELERY_BROKER=redis://cache:6379/2 -CELERY_BACKEND=redis://cache:6379/2 -CELERY_FLOWER_PASSWORD=adminadmin - -# -# Database -DJANGO_DB_ENGINE=django.db.backends.postgresql -DJANGO_DB_DATABASE=wger -DJANGO_DB_USER=wger -DJANGO_DB_PASSWORD=wger -DJANGO_DB_HOST=db -DJANGO_DB_PORT=5432 -DJANGO_PERFORM_MIGRATIONS=True # Perform any new database migrations on startup - -# -# Cache -DJANGO_CACHE_BACKEND=django_redis.cache.RedisCache -DJANGO_CACHE_LOCATION=redis://cache:6379/1 -DJANGO_CACHE_TIMEOUT=1296000 # in seconds - 60*60*24*15, 15 Days -DJANGO_CACHE_CLIENT_CLASS=django_redis.client.DefaultClient -#DJANGO_CACHE_CLIENT_PASSWORD=abcde... # Only if you changed the redis config - -# -# Brute force login attacks -# https://django-axes.readthedocs.io/en/latest/index.html -AXES_ENABLED=True -AXES_FAILURE_LIMIT=10 -AXES_COOLOFF_TIME=30 # in minutes -AXES_HANDLER=axes.handlers.cache.AxesCacheHandler -AXES_LOCKOUT_PARAMETERS=ip_address -AXES_IPWARE_PROXY_COUNT=1 -AXES_IPWARE_META_PRECEDENCE_ORDER=HTTP_X_FORWARDED_FOR,REMOTE_ADDR -# -# Others -DJANGO_DEBUG=False -WGER_USE_GUNICORN=True -EXERCISE_CACHE_TTL=18000 # in seconds - 5*60*60, 5 hours -SITE_URL=https://wger.shoebottom.ca - -# -# JWT auth -ACCESS_TOKEN_LIFETIME=10 # The lifetime duration of the access token, in minutes -REFRESH_TOKEN_LIFETIME=24 # The lifetime duration of the refresh token, in hours - -# -# Other possible settings - -# Recaptcha keys. You will need to create an account and register your domain -# https://www.google.com/recaptcha/ -# RECAPTCHA_PUBLIC_KEY=abcde... -# RECAPTCHA_PRIVATE_KEY=abcde... -USE_RECAPTCHA=False - -# Clears the static files before copying the new ones (i.e. just calls collectstatic -# with the appropriate flag: "manage.py collectstatic --no-input --clear"). Usually -# This can be left like this but if you have problems and new static files are not -# being copied correctly, clearing everything might help -DJANGO_CLEAR_STATIC_FIRST=False - -# -# Email -# https://docs.djangoproject.com/en/4.1/topics/email/#smtp-backend -# ENABLE_EMAIL=False -# EMAIL_HOST=email.example.com -# EMAIL_PORT=587 -# EMAIL_HOST_USER=username -# EMAIL_HOST_PASSWORD=password -# EMAIL_USE_TLS=True -# EMAIL_USE_SSL=False -FROM_EMAIL='wger Workout Manager ' - -# Set your name and email to be notified if an internal server error occurs. -# Needs a working email configuration -# DJANGO_ADMINS=your name,email@example.com \ No newline at end of file +SIGNING_KEY=wger-docker-secret-jwtkey-1234567890!@#$%^&*(-_=+) \ No newline at end of file diff --git a/wger/docker-compose.yml b/wger/docker-compose.yml index 1a0745f..5448ff5 100644 --- a/wger/docker-compose.yml +++ b/wger/docker-compose.yml @@ -9,16 +9,45 @@ services: web: image: wger/server:latest container_name: wger_web - depends_on: - db: - condition: service_healthy - cache: - condition: service_healthy + environment: + - DJANGO_DB_ENGINE=django.db.backends.sqlite3 + - DJANGO_DB_DATABASE=/home/wger/db/database.sqlite # Within the container, so be careful + - DJANGO_PERFORM_MIGRATIONS=True # Perform any new database migrations on startup + - TZ=America/Moncton + - CSRF_TRUSTED_ORIGINS=https://wger.shoebottom.ca + - X_FORWARDED_PROTO_HEADER_SET=True + - MEDIA_URL=https://wger.shoebottom.ca/media/ + - STATIC_URL=https://wger.shoebottom.ca/static/ + - WGER_INSTANCE=https://wger.de # Wger instance from which to sync exercises, images, etc. + - ALLOW_REGISTRATION=True + - ALLOW_GUEST_USERS=True + - ALLOW_UPLOAD_VIDEOS=False + - MIN_ACCOUNT_AGE_TO_TRUST=21 + - DOWNLOAD_INGREDIENTS_FROM=WGER + - USE_CELERY=False + - AXES_ENABLED=True + - AXES_FAILURE_LIMIT=10 + - AXES_COOLOFF_TIME=30 # in minutes + - AXES_HANDLER=axes.handlers.cache.AxesCacheHandler + - AXES_LOCKOUT_PARAMETERS=ip_address + - AXES_IPWARE_PROXY_COUNT=1 + - AXES_IPWARE_META_PRECEDENCE_ORDER=HTTP_X_FORWARDED_FOR,REMOTE_ADDR + - DJANGO_DEBUG=False + - WGER_USE_GUNICORN=True + - EXERCISE_CACHE_TTL=18000 # in seconds - 5*60*60, 5 hours + - SITE_URL=https://wger.shoebottom.ca + - ACCESS_TOKEN_LIFETIME=10 # The lifetime duration of the access token, in minutes + - REFRESH_TOKEN_LIFETIME=24 # The lifetime duration of the refresh token, in hours + - USE_RECAPTCHA=False + - DJANGO_CLEAR_STATIC_FIRST=True + - FROM_EMAIL='wger Workout Manager ' + env_file: - ../stack.env volumes: - - /docker/appdata/wger/web/static:/home/wger/static - - /docker/appdata/wger/web/media:/home/wger/media + - /docker/appdata/wger/db:/home/wger/db + - /docker/appdata/wger/static:/home/wger/static + - /docker/appdata/wger/media:/home/wger/media expose: - 8000 healthcheck: @@ -36,8 +65,8 @@ services: - web volumes: - /docker/appdata/wger/nginx.conf:/etc/nginx/conf.d/default.conf - - /docker/appdata/wger/web/static:/wger/static:ro - - /docker/appdata/wger/web/media:/wger/media:ro + - /docker/appdata/wger/static:/wger/static:ro + - /docker/appdata/wger/media:/wger/media:ro ports: - "9002:80" healthcheck: @@ -47,67 +76,3 @@ services: retries: 5 start_period: 30s restart: unless-stopped - - db: - image: postgres:15-alpine - container_name: wger_db - environment: - - POSTGRES_USER=wger - - POSTGRES_PASSWORD=wger - - POSTGRES_DB=wger - volumes: - - /docker/appdata/wger/postgres:/var/lib/postgresql/data/ - expose: - - 5432 - healthcheck: - test: pg_isready -U wger - interval: 10s - timeout: 5s - retries: 5 - start_period: 30s - restart: unless-stopped - - cache: - image: redis - container_name: wger_cache - expose: - - 6379 - volumes: - - /docker/appdata/wger/cache:/data - healthcheck: - test: redis-cli ping - interval: 10s - timeout: 5s - retries: 5 - start_period: 30s - restart: unless-stopped - - celery_worker: - image: wger/server:latest - container_name: wger_worker - command: /start-worker - env_file: - - ../stack.env - volumes: - - /docker/appdata/wger/web/media:/home/wger/media - depends_on: - web: - condition: service_healthy - healthcheck: - test: celery -A wger inspect ping - interval: 10s - timeout: 5s - retries: 5 - start_period: 30s - - celery_beat: - image: wger/server:latest - container_name: wger_beat - command: /start-beat - volumes: - - /docker/appdata/wger/beat:/home/wger/beat/ - env_file: - - ../stack.env - depends_on: - celery_worker: - condition: service_healthy