diff --git a/wger/.env.example b/wger/.env.example new file mode 100644 index 0000000..8e70b1b --- /dev/null +++ b/wger/.env.example @@ -0,0 +1,154 @@ +# 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://my.domain.example.com,https://118.999.881.119 +# 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://your-domain.example.com/media/ +# STATIC_URL=https://your-domain.example.com/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=False +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=http://localhost + +# +# 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 diff --git a/wger/docker-compose.yml b/wger/docker-compose.yml new file mode 100644 index 0000000..529d658 --- /dev/null +++ b/wger/docker-compose.yml @@ -0,0 +1,94 @@ +# +# Please consult the `Deployment` section in the readme if you want to deploy +# this. You *need* to keep this nginx service, even if you have your own, +# otherwise the static files will not be served correctly! If you do remove +# it, configure yours similarly to what's in config/nginx.conf +# Also take a look at the "Static files" section in the .env file + +services: + web: + image: wger/server:latest + container_name: wger_web + depends_on: + db: + condition: service_healthy + cache: + condition: service_healthy + env_file: + - ../stack.env + volumes: + - /docker/appdata/wger/web/static:/home/wger/static + - /docker/appdata/wger/web/media:/home/wger/media + ports: + - "8000:8000" + healthcheck: + test: wget --no-verbose --tries=1 --spider http://localhost:8000 + interval: 10s + timeout: 5s + start_period: 300s + retries: 5 + 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