mirror of
https://github.com/c0mmando/hackliberty-conf.git
synced 2024-10-01 05:05:41 -04:00
inital commit
This commit is contained in:
parent
24448583fa
commit
448eb8b874
742
docker-compose.yml
Normal file
742
docker-compose.yml
Normal file
@ -0,0 +1,742 @@
|
||||
version: '3.7'
|
||||
|
||||
networks:
|
||||
matrix:
|
||||
registration:
|
||||
dimension:
|
||||
gitea:
|
||||
privatebin:
|
||||
ots:
|
||||
element:
|
||||
chat:
|
||||
cinny:
|
||||
lemmy:
|
||||
bookstack:
|
||||
tor:
|
||||
write:
|
||||
|
||||
services:
|
||||
synapse:
|
||||
build: ./images/synapse-docker
|
||||
restart: unless-stopped
|
||||
container_name: synapse
|
||||
user: "991:991"
|
||||
environment:
|
||||
- SYNAPSE_CONFIG_DIR=/data
|
||||
- SYNAPSE_CONFIG_PATH=/data/homeserver.yaml
|
||||
volumes:
|
||||
- ./files:/data:Z
|
||||
depends_on:
|
||||
- postgres
|
||||
networks:
|
||||
- matrix
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
cap_drop:
|
||||
- ALL
|
||||
extra_hosts:
|
||||
- "host.docker.internal:host-gateway"
|
||||
labels:
|
||||
- "com.centurylinklabs.watchtower.enable=false"
|
||||
|
||||
postgres:
|
||||
image: docker.io/postgres:14.5-alpine
|
||||
container_name: postgres
|
||||
user: "70:70"
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- POSTGRES_USER=${POSTGRES_USER}
|
||||
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
|
||||
- POSTGRES_DB=${POSTGRES_DB}
|
||||
- POSTGRES_INITDB_ARGS=--encoding=UTF-8 --lc-collate=C --lc-ctype=C
|
||||
volumes:
|
||||
- ./schemas:/var/lib/postgresql/data:Z
|
||||
ports:
|
||||
- 127.0.0.1:5432:5432
|
||||
networks:
|
||||
- matrix
|
||||
read_only: true
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
cap_drop:
|
||||
- ALL
|
||||
tmpfs:
|
||||
- /var/run/postgresql:size=50M,mode=0770,uid=70,gid=70,noexec,nosuid,nodev
|
||||
labels:
|
||||
- "com.centurylinklabs.watchtower.enable=false"
|
||||
|
||||
swag:
|
||||
image: ghcr.io/linuxserver/swag
|
||||
restart: unless-stopped
|
||||
container_name: swag
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
environment:
|
||||
- PUID=1000
|
||||
- PGID=1000
|
||||
- URL=${SWAG_URL}
|
||||
- SUBDOMAINS=${SWAG_SUBDOMAINS}
|
||||
- VALIDATION=http
|
||||
- EMAIL=${SWAG_EMAIL}
|
||||
- ONLY_SUBDOMAINS=false
|
||||
volumes:
|
||||
- ./swag:/config:Z
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
ports:
|
||||
- 443:443
|
||||
- 80:80
|
||||
- 8448:8448
|
||||
networks:
|
||||
- matrix
|
||||
- registration
|
||||
- gitea
|
||||
- privatebin
|
||||
- ots
|
||||
- element
|
||||
- chat
|
||||
- lemmy
|
||||
- cinny
|
||||
- bookstack
|
||||
- tor
|
||||
- write
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
labels:
|
||||
- "com.centurylinklabs.watchtower.enable=false"
|
||||
|
||||
pantalaimon:
|
||||
build: ./images/pantalaimon
|
||||
container_name: pantalaimon
|
||||
user: "911:911"
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ./pantalaimon_data:/data:Z
|
||||
depends_on:
|
||||
- synapse
|
||||
networks:
|
||||
- matrix
|
||||
ports:
|
||||
- 8008:8008
|
||||
read_only: true
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
cap_drop:
|
||||
- ALL
|
||||
labels:
|
||||
- "com.centurylinklabs.watchtower.enable=false"
|
||||
|
||||
mjolnir:
|
||||
build: ./images/mjolnir
|
||||
container_name: mjolnir
|
||||
user: "911:911"
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ./mjolnir:/data:Z
|
||||
depends_on:
|
||||
- pantalaimon
|
||||
networks:
|
||||
- matrix
|
||||
read_only: true
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
cap_drop:
|
||||
- ALL
|
||||
labels:
|
||||
- "com.centurylinklabs.watchtower.enable=false"
|
||||
|
||||
maubot:
|
||||
image: dock.mau.dev/maubot/maubot:latest
|
||||
container_name: maubot
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ./maubot:/data:Z
|
||||
networks:
|
||||
- matrix
|
||||
|
||||
matrix-registration:
|
||||
build: ./images/synapse-captcha
|
||||
container_name: matrix-registration
|
||||
restart: unless-stopped
|
||||
command: [
|
||||
"--config-path=/data/config.yaml",
|
||||
"serve"
|
||||
]
|
||||
ports:
|
||||
- 127.0.0.1:5000:5000
|
||||
volumes:
|
||||
- ./matrix-registration_data:/data:Z
|
||||
networks:
|
||||
- matrix
|
||||
- tor
|
||||
labels:
|
||||
- "com.centurylinklabs.watchtower.enable=false"
|
||||
|
||||
redis:
|
||||
image: redis:latest
|
||||
container_name: redis
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- matrix
|
||||
labels:
|
||||
- "com.centurylinklabs.watchtower.enable=false"
|
||||
|
||||
dimension:
|
||||
build: ./images/matrix-dimension
|
||||
container_name: dimension
|
||||
user: "1000:1000"
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ./dimension:/data:Z
|
||||
- ./dimension/config:/home/node/matrix-dimension/config/:Z
|
||||
depends_on:
|
||||
- dimension_db
|
||||
networks:
|
||||
- matrix
|
||||
- dimension
|
||||
ports:
|
||||
- 127.0.0.1:8184:8184
|
||||
read_only: true
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
cap_drop:
|
||||
- ALL
|
||||
labels:
|
||||
- "com.centurylinklabs.watchtower.enable=false"
|
||||
|
||||
dimension_db:
|
||||
image: docker.io/postgres:14.5-alpine
|
||||
container_name: dimension_db
|
||||
user: "70:70"
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- POSTGRES_USER=${DIMENSION_DB_USER}
|
||||
- POSTGRES_PASSWORD=${DIMENSION_DB_PASSWORD}
|
||||
- POSTGRES_DB=${DIMENSION_DB_DB}
|
||||
- POSTGRES_INITDB_ARGS=--encoding=UTF-8 --lc-collate=C --lc-ctype=C
|
||||
volumes:
|
||||
- ./dimension/db:/var/lib/postgresql/data:Z
|
||||
ports:
|
||||
- 127.0.0.1:5433:5432
|
||||
networks:
|
||||
- dimension
|
||||
read_only: true
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
cap_drop:
|
||||
- ALL
|
||||
tmpfs:
|
||||
- /var/run/postgresql:size=50M,mode=0770,uid=70,gid=70,noexec,nosuid,nodev
|
||||
labels:
|
||||
- "com.centurylinklabs.watchtower.enable=false"
|
||||
|
||||
grafana:
|
||||
image: docker.io/grafana/grafana:latest
|
||||
container_name: grafana
|
||||
user: "472:472"
|
||||
volumes:
|
||||
- ./grafana-data:/var/lib/grafana:Z
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- 3000:3000
|
||||
networks:
|
||||
- matrix
|
||||
|
||||
prometheus:
|
||||
image: docker.io/prom/prometheus:latest
|
||||
container_name: prometheus
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- 9000:9090
|
||||
volumes:
|
||||
- ./prometheus:/etc/prometheus:Z
|
||||
networks:
|
||||
- matrix
|
||||
command: --web.config.file=/etc/prometheus/web.yml --config.file=/etc/prometheus/prometheus.yml
|
||||
|
||||
node_exporter:
|
||||
image: prom/node-exporter
|
||||
container_name: node-exporter
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- /proc:/host/proc:ro
|
||||
- /sys:/host/sys:ro
|
||||
- /:/rootfs:ro
|
||||
command:
|
||||
- '--path.procfs=/host/proc'
|
||||
- '--path.rootfs=/rootfs'
|
||||
- '--path.sysfs=/host/sys'
|
||||
- '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)($$|/)'
|
||||
restart: unless-stopped
|
||||
expose:
|
||||
- 9100
|
||||
networks:
|
||||
- matrix
|
||||
|
||||
cadvisor:
|
||||
image: gcr.io/cadvisor/cadvisor:latest
|
||||
container_name: cadvisor
|
||||
command:
|
||||
- '-port=9099'
|
||||
- "--housekeeping_interval=30s"
|
||||
- "--docker_only=true"
|
||||
ports:
|
||||
- 9099:9099
|
||||
volumes:
|
||||
- /:/rootfs:ro
|
||||
- /var/run:/var/run:rw
|
||||
- /sys:/sys:ro
|
||||
- /var/lib/docker/:/var/lib/docker:ro
|
||||
networks:
|
||||
- matrix
|
||||
|
||||
postgres-exporter:
|
||||
image: quay.io/prometheuscommunity/postgres-exporter
|
||||
container_name: postgres-exporter
|
||||
restart: always
|
||||
environment:
|
||||
- DATA_SOURCE_URI=postgres:5432/synapse?sslmode=disable
|
||||
- DATA_SOURCE_USER=${POSTGRES_USER}
|
||||
- DATA_SOURCE_PASS=${POSTGRES_PASSWORD}
|
||||
ports:
|
||||
- "9187:9187"
|
||||
networks:
|
||||
- matrix
|
||||
depends_on:
|
||||
- postgres
|
||||
|
||||
nginx-exporter:
|
||||
image: nginx/nginx-prometheus-exporter:0.10.0
|
||||
container_name: nginx-exporter
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "4040:4040"
|
||||
networks:
|
||||
- matrix
|
||||
depends_on:
|
||||
- swag
|
||||
command:
|
||||
- -nginx.scrape-uri
|
||||
- http://swag:81/nginx_status
|
||||
|
||||
gitea:
|
||||
image: gitea/gitea:latest
|
||||
container_name: gitea
|
||||
environment:
|
||||
- USER_UID=1000
|
||||
- USER_GID=1000
|
||||
- GITEA__database__DB_TYPE=postgres
|
||||
- GITEA__database__HOST=gitea-postgres:5432
|
||||
- GITEA__database__NAME=${GITEA_DB_NAME}
|
||||
- GITEA__database__USER=${GITEA_POSTGRES_USER}
|
||||
- GITEA__database__PASSWD=${GITEA_POSTGRES_PASSWORD}
|
||||
restart: always
|
||||
networks:
|
||||
- gitea
|
||||
- tor
|
||||
volumes:
|
||||
- ./gitea:/data
|
||||
- /etc/timezone:/etc/timezone:ro
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
ports:
|
||||
- "3333:3333"
|
||||
depends_on:
|
||||
- gitea-postgres
|
||||
|
||||
gitea-postgres:
|
||||
image: postgres:14
|
||||
container_name: gitea-postgres
|
||||
restart: always
|
||||
environment:
|
||||
- POSTGRES_USER=${GITEA_POSTGRES_USER}
|
||||
- POSTGRES_PASSWORD=${GITEA_POSTGRES_PASSWORD}
|
||||
- POSTGRES_DB=${GITEA_DB_NAME}
|
||||
networks:
|
||||
- gitea
|
||||
volumes:
|
||||
- ./gitea-postgres:/var/lib/postgresql/data
|
||||
labels:
|
||||
- "com.centurylinklabs.watchtower.enable=false"
|
||||
|
||||
privatebin:
|
||||
image: privatebin/fs:latest
|
||||
container_name: privatebin
|
||||
user: "882:882"
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ./privatebin-data:/srv/data:Z
|
||||
- ./privatebin-data/conf.php:/srv/cfg/conf.php:ro
|
||||
networks:
|
||||
- privatebin
|
||||
- tor
|
||||
read_only: true
|
||||
|
||||
ots:
|
||||
image: luzifer/ots:latest
|
||||
container_name: ots
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- ots
|
||||
- tor
|
||||
entrypoint: ["/usr/local/bin/ots"]
|
||||
|
||||
element:
|
||||
image: vectorim/element-web:latest
|
||||
container_name: element
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ./element-data/element-config.json:/app/config.json:ro
|
||||
networks:
|
||||
- element
|
||||
|
||||
chat:
|
||||
image: ghcr.io/schildichat/schildichat-web:latest
|
||||
container_name: chat
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ./chat-data/element-config.json:/app/config.json:ro
|
||||
networks:
|
||||
- chat
|
||||
|
||||
cinny:
|
||||
image: ghcr.io/cinnyapp/cinny:latest
|
||||
container_name: cinny
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ./cinny-data/config.json:/app/config.json:ro
|
||||
networks:
|
||||
- cinny
|
||||
|
||||
lemmy-postgres:
|
||||
image: postgres:15-alpine
|
||||
user: "70:70"
|
||||
container_name: lemmy-postgres
|
||||
hostname: lemmy-postgres
|
||||
environment:
|
||||
- POSTGRES_USER=${LEMMY_POSTGRES_USER}
|
||||
- POSTGRES_PASSWORD=${LEMMY_POSTGRES_PASSWORD}
|
||||
- POSTGRES_DB=${LEMMY_POSTGRES_DB}
|
||||
volumes:
|
||||
- ./lemmy/volumes/postgres:/var/lib/postgresql/data
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- lemmy
|
||||
labels:
|
||||
- "com.centurylinklabs.watchtower.enable=false"
|
||||
|
||||
lemmy:
|
||||
image: dessalines/lemmy:latest
|
||||
container_name: lemmy
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- RUST_LOG="warn,lemmy_server=info,lemmy_api=info,lemmy_api_common=info,lemmy_api_crud=info,lemmy_apub=info,lemmy_db_schema=info,lemmy_db_views=info,lemmy_db_views_actor=info,lemmy_db_views_moderator=info,lemmy_routes=info,lemmy_utils=info,lemmy_websocket=info"
|
||||
volumes:
|
||||
- ./lemmy/lemmy.hjson:/config/config.hjson
|
||||
depends_on:
|
||||
- postgres
|
||||
- pictrs
|
||||
networks:
|
||||
- lemmy
|
||||
|
||||
lemmy-ui:
|
||||
image: dessalines/lemmy-ui:latest
|
||||
container_name: lemmy-ui
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- LEMMY_UI_LEMMY_INTERNAL_HOST=lemmy:8536
|
||||
- LEMMY_UI_LEMMY_EXTERNAL_HOST=links.hackliberty.org
|
||||
- LEMMY_UI_HTTPS=true
|
||||
depends_on:
|
||||
- lemmy
|
||||
networks:
|
||||
- lemmy
|
||||
|
||||
pictrs:
|
||||
image: asonix/pictrs:0.3.1
|
||||
hostname: pictrs
|
||||
container_name: pictrs
|
||||
ports:
|
||||
- "8537:8080"
|
||||
- "6670:6669"
|
||||
user: 991:991
|
||||
volumes:
|
||||
- ./lemmy/volumes/pictrs:/mnt
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- lemmy
|
||||
labels:
|
||||
- "com.centurylinklabs.watchtower.enable=false"
|
||||
|
||||
protonmail-bridge:
|
||||
image: shenxn/protonmail-bridge
|
||||
container_name: protonmail-bridge
|
||||
ports:
|
||||
- "1025:25"
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- ./protonmail:/root
|
||||
networks:
|
||||
- lemmy
|
||||
|
||||
bookstack:
|
||||
image: lscr.io/linuxserver/bookstack:latest
|
||||
container_name: bookstack
|
||||
environment:
|
||||
- PUID=1001
|
||||
- PGID=1001
|
||||
- APP_URL=https://docs.hackliberty.org
|
||||
- DB_HOST=bookstack_db
|
||||
- DB_PORT=3306
|
||||
- DB_USER=${BOOKSTACK_DB_USER}
|
||||
- DB_PASS=${BOOKSTACK_DB_PASS}
|
||||
- DB_DATABASE=${BOOKSTACK_DB_DB}
|
||||
volumes:
|
||||
- ./bookstack:/config:Z
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
- bookstack_db
|
||||
networks:
|
||||
- bookstack
|
||||
|
||||
bookstack_db:
|
||||
image: lscr.io/linuxserver/mariadb
|
||||
container_name: bookstack_db
|
||||
environment:
|
||||
- PUID=1001
|
||||
- PGID=1001
|
||||
- MYSQL_ROOT_PASSWORD=${BOOKSTACK_DB_PASS}
|
||||
- TZ=Europe/London
|
||||
- MYSQL_DATABASE=${BOOKSTACK_DB_DB}
|
||||
- MYSQL_USER=${BOOKSTACK_DB_USER}
|
||||
- MYSQL_PASSWORD=${BOOKSTACK_DB_PASS}
|
||||
volumes:
|
||||
- ./bookstack:/config:Z
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- bookstack
|
||||
labels:
|
||||
- "com.centurylinklabs.watchtower.enable=false"
|
||||
|
||||
watchtower:
|
||||
image: containrrr/watchtower
|
||||
container_name: watchtower
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
command: --interval 14400
|
||||
|
||||
matrix-chatgpt4-bot:
|
||||
image: ghcr.io/matrixgpt/matrix-chatgpt-bot:sha-b78cc35
|
||||
container_name: chatgpt4
|
||||
volumes:
|
||||
- ./chatgpt:/storage
|
||||
env_file:
|
||||
- ./.env
|
||||
|
||||
matrix-chatgpt3-bot:
|
||||
image: ghcr.io/matrixgpt/matrix-chatgpt-bot:latest
|
||||
container_name: chatgpt3
|
||||
volumes:
|
||||
- ./chatgpt3:/storage
|
||||
env_file:
|
||||
- ./.chatgpt3
|
||||
|
||||
tor:
|
||||
image: osminogin/tor-simple:latest
|
||||
container_name: tor
|
||||
volumes:
|
||||
- ./tor-data:/var/lib/tor
|
||||
- ./tor-data/torrc:/etc/tor
|
||||
ports:
|
||||
- 127.0.0.1:9050:9050
|
||||
networks:
|
||||
- tor
|
||||
- matrix
|
||||
|
||||
writefreely:
|
||||
image: algernon/writefreely
|
||||
container_name: writefreely
|
||||
user: "5000:5000"
|
||||
volumes:
|
||||
- ./writefreely:/data:Z
|
||||
ports:
|
||||
- 9999:9999
|
||||
networks:
|
||||
- write
|
||||
- tor
|
||||
|
||||
# WORKERS
|
||||
|
||||
synapse-generic-worker-4:
|
||||
build: ./images/synapse-worker-docker
|
||||
container_name: synapse-generic-worker-4
|
||||
user: "991:991"
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
SYNAPSE_WORKER: synapse.app.generic_worker
|
||||
entrypoint: ["/start.py", "run", "--config-path=/data/homeserver.yaml", "--config-path=/data/workers/worker4.yaml"]
|
||||
volumes:
|
||||
- ./files:/data:Z
|
||||
ports:
|
||||
- 127.0.0.1:8083:8081
|
||||
depends_on:
|
||||
- synapse
|
||||
networks:
|
||||
- matrix
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
cap_drop:
|
||||
- ALL
|
||||
labels:
|
||||
- "com.centurylinklabs.watchtower.enable=false"
|
||||
|
||||
synapse-generic-worker-3:
|
||||
build: ./images/synapse-worker-docker
|
||||
container_name: synapse-generic-worker-3
|
||||
user: "991:991"
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
SYNAPSE_WORKER: synapse.app.generic_worker
|
||||
entrypoint: ["/start.py", "run", "--config-path=/data/homeserver.yaml", "--config-path=/data/workers/worker3.yaml"]
|
||||
volumes:
|
||||
- ./files:/data:Z
|
||||
ports:
|
||||
- 127.0.0.1:8082:8081
|
||||
depends_on:
|
||||
- synapse
|
||||
networks:
|
||||
- matrix
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
cap_drop:
|
||||
- ALL
|
||||
labels:
|
||||
- "com.centurylinklabs.watchtower.enable=false"
|
||||
|
||||
synapse-generic-worker-2:
|
||||
build: ./images/synapse-worker-docker
|
||||
container_name: synapse-generic-worker-2
|
||||
user: "991:991"
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
SYNAPSE_WORKER: synapse.app.generic_worker
|
||||
entrypoint: ["/start.py", "run", "--config-path=/data/homeserver.yaml", "--config-path=/data/workers/worker2.yaml"]
|
||||
volumes:
|
||||
- ./files:/data:Z
|
||||
ports:
|
||||
- 127.0.0.1:8081:8081
|
||||
depends_on:
|
||||
- synapse
|
||||
networks:
|
||||
- matrix
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
cap_drop:
|
||||
- ALL
|
||||
labels:
|
||||
- "com.centurylinklabs.watchtower.enable=false"
|
||||
|
||||
synapse-generic-worker-1:
|
||||
build: ./images/synapse-worker-docker
|
||||
container_name: synapse-generic-worker-1
|
||||
user: "991:991"
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
SYNAPSE_WORKER: synapse.app.generic_worker
|
||||
entrypoint: ["/start.py", "run", "--config-path=/data/homeserver.yaml", "--config-path=/data/workers/worker1.yaml"]
|
||||
volumes:
|
||||
- ./files:/data:Z
|
||||
ports:
|
||||
- 127.0.0.1:8080:8081
|
||||
depends_on:
|
||||
- synapse
|
||||
networks:
|
||||
- matrix
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
cap_drop:
|
||||
- ALL
|
||||
labels:
|
||||
- "com.centurylinklabs.watchtower.enable=false"
|
||||
|
||||
synapse-federation-sender-4:
|
||||
build: ./images/synapse-worker-docker
|
||||
container_name: synapse-federation-sender-4
|
||||
user: "991:991"
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
SYNAPSE_WORKER: synapse.app.generic_worker
|
||||
entrypoint: ["/start.py", "run", "--config-path=/data/homeserver.yaml", "--config-path=/data/workers/federation4.yaml"]
|
||||
volumes:
|
||||
- ./files:/data:Z
|
||||
depends_on:
|
||||
- synapse
|
||||
networks:
|
||||
- matrix
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
cap_drop:
|
||||
- ALL
|
||||
labels:
|
||||
- "com.centurylinklabs.watchtower.enable=false"
|
||||
|
||||
synapse-federation-sender-3:
|
||||
build: ./images/synapse-worker-docker
|
||||
container_name: synapse-federation-sender-3
|
||||
user: "991:991"
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
SYNAPSE_WORKER: synapse.app.generic_worker
|
||||
entrypoint: ["/start.py", "run", "--config-path=/data/homeserver.yaml", "--config-path=/data/workers/federation3.yaml"]
|
||||
volumes:
|
||||
- ./files:/data:Z
|
||||
depends_on:
|
||||
- synapse
|
||||
networks:
|
||||
- matrix
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
cap_drop:
|
||||
- ALL
|
||||
labels:
|
||||
- "com.centurylinklabs.watchtower.enable=false"
|
||||
|
||||
synapse-federation-sender-2:
|
||||
build: ./images/synapse-worker-docker
|
||||
container_name: synapse-federation-sender-2
|
||||
user: "991:991"
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
SYNAPSE_WORKER: synapse.app.generic_worker
|
||||
entrypoint: ["/start.py", "run", "--config-path=/data/homeserver.yaml", "--config-path=/data/workers/federation2.yaml"]
|
||||
volumes:
|
||||
- ./files:/data:Z
|
||||
depends_on:
|
||||
- synapse
|
||||
networks:
|
||||
- matrix
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
cap_drop:
|
||||
- ALL
|
||||
labels:
|
||||
- "com.centurylinklabs.watchtower.enable=false"
|
||||
|
||||
synapse-federation-sender-1:
|
||||
build: ./images/synapse-worker-docker
|
||||
container_name: synapse-federation-sender-1
|
||||
user: "991:991"
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
SYNAPSE_WORKER: synapse.app.generic_worker
|
||||
entrypoint: ["/start.py", "run", "--config-path=/data/homeserver.yaml", "--config-path=/data/workers/federation1.yaml"]
|
||||
volumes:
|
||||
- ./files:/data:Z
|
||||
depends_on:
|
||||
- synapse
|
||||
networks:
|
||||
- matrix
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
cap_drop:
|
||||
- ALL
|
||||
labels:
|
||||
- "com.centurylinklabs.watchtower.enable=false"
|
46
files/config.yaml
Normal file
46
files/config.yaml
Normal file
@ -0,0 +1,46 @@
|
||||
server_location: 'http://synapse:8008'
|
||||
server_name: 'hackliberty.org'
|
||||
shared_secret: 'REDACTED'
|
||||
admin_api_shared_secret: 'REDACTED' # to generate tokens via the web api
|
||||
base_url: '' # e.g. '/element' for https://example.tld/element/register
|
||||
client_redirect: 'https://element.hackliberty.org'
|
||||
riot_instace: 'https://element.hackliberty.org'
|
||||
#riot_instance: 'https://riot.im/app/'
|
||||
db: 'sqlite:////data/db.sqlite3'
|
||||
host: '0.0.0.0'
|
||||
port: 5000
|
||||
rate_limit: ["10000 per day", "100 per minute"]
|
||||
allow_cors: false
|
||||
ip_logging: false
|
||||
logging:
|
||||
disable_existing_loggers: False
|
||||
version: 1
|
||||
root:
|
||||
level: DEBUG
|
||||
handlers: [console, file]
|
||||
formatters:
|
||||
brief:
|
||||
format: '%(name)s - %(levelname)s - %(message)s'
|
||||
precise:
|
||||
format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
|
||||
handlers:
|
||||
console:
|
||||
class: logging.StreamHandler
|
||||
level: INFO
|
||||
formatter: brief
|
||||
stream: ext://sys.stdout
|
||||
file:
|
||||
class: logging.handlers.RotatingFileHandler
|
||||
formatter: precise
|
||||
level: INFO
|
||||
filename: m_reg.log
|
||||
maxBytes: 10485760 # 10MB
|
||||
backupCount: 3
|
||||
encoding: utf8
|
||||
# password requirements
|
||||
password:
|
||||
min_length: 14
|
||||
# username requirements
|
||||
username:
|
||||
validation_regex: [ '[a-zA-Z0-9]' ]
|
||||
invalidation_regex: [ '(info|admin|null|123456|mail|fuck|webmaster|root|test|guest|adm|mysql|user|administrator|oracle|ftp|pi|puppet|ansible|ec2-user|vagrant|azureuse|mod|moderator|host|postgres|synapse|support)' ]
|
218
files/homeserver.yaml
Normal file
218
files/homeserver.yaml
Normal file
@ -0,0 +1,218 @@
|
||||
# Configuration file for Synapse.
|
||||
#
|
||||
# For more information on how to configure Synapse, including a complete accounting of
|
||||
# each option, go to docs/usage/configuration/config_documentation.md or
|
||||
# https://matrix-org.github.io/synapse/latest/usage/configuration/config_documentation.html
|
||||
# Configuration file for Synapse.
|
||||
|
||||
|
||||
|
||||
|
||||
modules:
|
||||
- module: mjolnir.Module
|
||||
config:
|
||||
# Prevent servers/users in the ban lists from inviting users on this
|
||||
# server to rooms. Default true.
|
||||
block_invites: true
|
||||
# Flag messages sent by servers/users in the ban lists as spam. Currently
|
||||
# this means that spammy messages will appear as empty to users. Default
|
||||
# false.
|
||||
block_messages: false
|
||||
# Remove users from the user directory search by filtering matrix IDs and
|
||||
# display names by the entries in the user ban list. Default false.
|
||||
block_usernames: false
|
||||
# The room IDs of the ban lists to honour. Unlike other parts of Mjolnir,
|
||||
# this list cannot be room aliases or permalinks. This server is expected
|
||||
# to already be joined to the room - Mjolnir will not automatically join
|
||||
# these rooms.
|
||||
ban_lists:
|
||||
# EBL
|
||||
- "!GGuqmQVLNyWASNjVQw:envs.net"
|
||||
# matrix-coc-bl
|
||||
#- "!WuBtumawCeOGEieRrp:matrix.org"
|
||||
# matrix-tos-bl
|
||||
#- "!tUPwPPmVTaiKXMiijj:matrix.org"
|
||||
# Public Servers Shared Banlist
|
||||
- "!RRGtWzzVKUJmDVRNnZ:aria-net.org"
|
||||
# asragr-ban-list
|
||||
- "!YImXsibeOfGBYVaElT:asra.gr"
|
||||
# community-moderation-effort-bl:neko.dev
|
||||
- "!fTjMjIzNKEsFlUIiru:neko.dev"
|
||||
#message_max_length:
|
||||
# Limit the characters in a message (event body) that a client can send in an event on this server.
|
||||
# By default there is no limit (beyond the the limit the spec enforces on event size).
|
||||
# Uncomment if you want messages to be limited to 510 characters.
|
||||
#threshold: 510
|
||||
# Limit messages only in certain rooms rooms.
|
||||
# By default all rooms will enforce the limit.
|
||||
# Uncomment if you want messages to only be subject to character limits in certain rooms.
|
||||
#rooms:
|
||||
# - "!vMvyOCeCxHsggkmALd:localhost:9999"
|
||||
# Also hide messages from remote servers that are over the `message_limit`.
|
||||
# By default only events from this server will be limited.
|
||||
# WARNING: Remote users on other servers will still be able to messages over the limit.
|
||||
# Uncomment to enforce the `message_limit` on events from remote servers.
|
||||
#remote_servers: true
|
||||
|
||||
server_name: hackliberty.org
|
||||
public_baseurl: https://hackliberty.org/
|
||||
web_client_location: https://element.hackliberty.org/
|
||||
|
||||
serve_server_wellknown: true
|
||||
|
||||
pid_file: "/data/homeserver.pid"
|
||||
|
||||
presence:
|
||||
enabled: false
|
||||
allow_device_name_lookup_over_federation: false
|
||||
allow_public_rooms_over_federation: true
|
||||
include_profile_data_on_invite: true
|
||||
require_auth_for_profile_requests: true
|
||||
allow_profile_lookup_over_federation: true
|
||||
limit_profile_requests_to_users_who_share_rooms: false
|
||||
|
||||
listeners:
|
||||
- port: 9093
|
||||
type: http
|
||||
resources:
|
||||
- names: [replication]
|
||||
bind_addresses: ['0.0.0.0']
|
||||
|
||||
- port: 8008
|
||||
tls: false
|
||||
type: http
|
||||
x_forwarded: true
|
||||
bind_addresses: ['0.0.0.0']
|
||||
|
||||
resources:
|
||||
- names: [client, federation]
|
||||
compress: false
|
||||
|
||||
- port: 9000
|
||||
tls: false
|
||||
type: metrics
|
||||
bind_addresses: ['0.0.0.0']
|
||||
|
||||
|
||||
redaction_retention_period: 1m
|
||||
user_ips_max_age: 1m
|
||||
|
||||
retention:
|
||||
|
||||
enabled: true
|
||||
|
||||
purge_jobs:
|
||||
- longest_max_lifetime: 1h
|
||||
interval: 30m
|
||||
- shortest_max_lifetime: 1h
|
||||
longest_max_lifetime: 12h
|
||||
interval: 1h
|
||||
- shortest_max_lifetime: 12h
|
||||
longest_max_lifetime: 1d
|
||||
interval: 12h
|
||||
- shortest_max_lifetime: 1d
|
||||
longest_max_lifetime: 10y
|
||||
interval: 24h
|
||||
|
||||
federation_client_minimum_tls_version: 1.2
|
||||
|
||||
caches:
|
||||
global_factor: 2.0
|
||||
|
||||
per_cache_factors:
|
||||
get_users_who_share_room_with_user: 5.0
|
||||
|
||||
sync_response_cache_duration: 2m
|
||||
|
||||
database:
|
||||
name: psycopg2
|
||||
txn_limit: 10000
|
||||
args:
|
||||
user: REDACTED
|
||||
password: REDACTED
|
||||
database: REDACTED
|
||||
host: postgres
|
||||
port: 5432
|
||||
cp_min: 5
|
||||
cp_max: 10
|
||||
|
||||
log_config: "/data/hackliberty.org.log.config"
|
||||
rc_federation:
|
||||
window_size: 1000
|
||||
sleep_limit: 10
|
||||
sleep_delay: 500
|
||||
reject_limit: 50
|
||||
concurrent: 3
|
||||
|
||||
federation_rr_transactions_per_room_per_second: 50
|
||||
|
||||
media_store_path: "/data/media_store"
|
||||
|
||||
max_upload_size: 50M
|
||||
max_image_pixels: 50M
|
||||
|
||||
url_preview_enabled: true
|
||||
url_preview_ip_range_blacklist:
|
||||
- '127.0.0.0/8'
|
||||
- '10.0.0.0/8'
|
||||
- '172.16.0.0/12'
|
||||
- '192.168.0.0/16'
|
||||
- '100.64.0.0/10'
|
||||
- '192.0.0.0/24'
|
||||
- '169.254.0.0/16'
|
||||
- '192.88.99.0/24'
|
||||
- '198.18.0.0/15'
|
||||
- '192.0.2.0/24'
|
||||
- '198.51.100.0/24'
|
||||
- '203.0.113.0/24'
|
||||
- '224.0.0.0/4'
|
||||
- '::1/128'
|
||||
- 'fe80::/10'
|
||||
- 'fc00::/7'
|
||||
- '2001:db8::/32'
|
||||
- 'ff00::/8'
|
||||
- 'fec0::/10'
|
||||
|
||||
url_preview_url_blacklist:
|
||||
- netloc: 'google.com'
|
||||
- netloc: '*.google.com'
|
||||
- scheme: 'http'
|
||||
- netloc: '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$'
|
||||
|
||||
enable_registration: false
|
||||
registration_requires_token: true
|
||||
registration_shared_secret: "REDACTED"
|
||||
|
||||
allow_guest_access: false
|
||||
|
||||
auto_join_rooms:
|
||||
- "#community:hackliberty.org"
|
||||
|
||||
enable_metrics: true
|
||||
|
||||
|
||||
signing_key_path: "/data/hackliberty.org.signing.key"
|
||||
trusted_key_servers:
|
||||
- server_name: "matrix.org"
|
||||
|
||||
inhibit_user_in_use_error: true
|
||||
|
||||
suppress_key_server_warning: true
|
||||
|
||||
report_stats: false
|
||||
|
||||
macaroon_secret_key: "REDACTED"
|
||||
|
||||
form_secret: "REDACTED"
|
||||
|
||||
send_federation: false
|
||||
federation_sender_instances:
|
||||
- federation1
|
||||
- federation2
|
||||
- federation3
|
||||
- federation4
|
||||
|
||||
redis:
|
||||
enabled: true
|
||||
host: redis
|
||||
port: 6379
|
8
images/build.sh
Normal file
8
images/build.sh
Normal file
@ -0,0 +1,8 @@
|
||||
#!/bin/bash
|
||||
|
||||
docker build ./synapse-captcha/
|
||||
docker build ./mjolnir/
|
||||
docker build ./pantalaimon/
|
||||
docker build ./synapse-docker/
|
||||
docker build ./synapse-worker-docker/
|
||||
docker build ./matrix-dimension/
|
1
images/matrix-dimension
Submodule
1
images/matrix-dimension
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 1ee97be49d75f2d89275073963097409498ebcb1
|
1
images/mjolnir
Submodule
1
images/mjolnir
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 2915757b7d04308848061d4c048a9ee827fea9aa
|
1
images/pantalaimon
Submodule
1
images/pantalaimon
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit b5a419e488fe985b0d2ef9a8212e71c27ea6a7d6
|
1
images/synapse-captcha
Submodule
1
images/synapse-captcha
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 1660b52a5d18e1c2f741348a803632a986beac74
|
1
images/synapse-docker
Submodule
1
images/synapse-docker
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 53ae6a44fea2ecc954fc7c57b68bbec320bae028
|
1
images/synapse-worker-docker
Submodule
1
images/synapse-worker-docker
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 215f91bbca874c4679f8bdd0b7f8ca502bd0003d
|
26
swag/nginx/gzip.conf
Normal file
26
swag/nginx/gzip.conf
Normal file
@ -0,0 +1,26 @@
|
||||
gzip on;
|
||||
gzip_disable "msie6";
|
||||
gzip_vary on;
|
||||
gzip_proxied any;
|
||||
gzip_min_length 256;
|
||||
gzip_comp_level 7;
|
||||
gzip_types
|
||||
application/atom+xml
|
||||
application/geo+json
|
||||
application/javascript
|
||||
application/x-javascript
|
||||
application/json
|
||||
application/ld+json
|
||||
application/manifest+json
|
||||
application/rdf+xml
|
||||
application/rss+xml
|
||||
application/xhtml+xml
|
||||
application/xml
|
||||
font/eot
|
||||
font/otf
|
||||
font/ttf
|
||||
image/svg+xml
|
||||
text/css
|
||||
text/javascript
|
||||
text/plain
|
||||
text/xml;
|
90
swag/nginx/include.d/client_worker.conf
Normal file
90
swag/nginx/include.d/client_worker.conf
Normal file
@ -0,0 +1,90 @@
|
||||
## Client API requests
|
||||
location ~ ^/_matrix/client/(api/v1|r0|v3|unstable)/createRoom$ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/client/(api/v1|r0|v3|unstable)/publicRooms$ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/client/(api/v1|r0|v3|unstable)/rooms/.*/joined_members$ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/client/(api/v1|r0|v3|unstable)/rooms/.*/context/.*$ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/client/(api/v1|r0|v3|unstable)/rooms/.*/members$ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/client/(api/v1|r0|v3|unstable)/rooms/.*/state$ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/client/v1/rooms/.*/hierarchy$ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/client/unstable/org.matrix.msc2716/rooms/.*/batch_send$ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/client/unstable/im.nheko.summary/rooms/.*/summary$ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/client/(r0|v3|unstable)/account/3pid$ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/client/(r0|v3|unstable)/account/whoami$ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/client/(r0|v3|unstable)/devices$ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/client/versions$ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/client/(api/v1|r0|v3|unstable)/voip/turnServer$ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/client/(api/v1|r0|v3|unstable)/rooms/.*/event/ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/client/(api/v1|r0|v3|unstable)/joined_rooms$ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/client/v1/rooms/.*/timestamp_to_event$ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/client/(api/v1|r0|v3|unstable)/search$ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
26
swag/nginx/include.d/encryption_worker.conf
Normal file
26
swag/nginx/include.d/encryption_worker.conf
Normal file
@ -0,0 +1,26 @@
|
||||
## Encryption requests
|
||||
location ~ ^/_matrix/client/(r0|v3|unstable)/keys/query$ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/client/(r0|v3|unstable)/keys/changes$ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/client/(r0|v3|unstable)/keys/claim$ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/client/(r0|v3|unstable)/room_keys/ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
# Note that ^/_matrix/client/(r0|v3|unstable)/keys/upload/ requires `worker_main_http_uri`
|
||||
location ~ ^/_matrix/client/(r0|v3|unstable)/keys/upload/ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
96
swag/nginx/include.d/federation_worker.conf
Normal file
96
swag/nginx/include.d/federation_worker.conf
Normal file
@ -0,0 +1,96 @@
|
||||
## Federation requests
|
||||
location ~ ^/_matrix/federation/v1/event/ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/federation/v1/state/ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/federation/v1/state_ids/ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/federation/v1/backfill/ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/federation/v1/get_missing_events/ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/federation/v1/publicRooms {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/federation/v1/query/ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/federation/v1/make_join/ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/federation/v1/make_leave/ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/federation/(v1|v2)/send_join/ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/federation/(v1|v2)/send_leave/ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/federation/(v1|v2)/invite/ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/federation/v1/event_auth/ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/federation/v1/timestamp_to_event/ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/federation/v1/exchange_third_party_invite/ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/federation/v1/user/devices/ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/key/v2/query {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
location ~ ^/_matrix/federation/v1/hierarchy/ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_lc;
|
||||
}
|
||||
|
||||
# Inbound federation transaction request
|
||||
location ~ ^/_matrix/federation/v1/send/ {
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
proxy_pass http://generic_worker_ih;
|
||||
}
|
8
swag/nginx/include.d/homepage.conf
Normal file
8
swag/nginx/include.d/homepage.conf
Normal file
@ -0,0 +1,8 @@
|
||||
location / {
|
||||
root /config/www/hackliberty.org;
|
||||
include /config/nginx/gzip.conf;
|
||||
include /config/nginx/security-headers.conf;
|
||||
# Add Onion-Location Header
|
||||
add_header Onion-Location http://kj3wvs3wyfhm3uhhuqxlrhhcp6dneuau4mmvptlor27ghmrqx63fqnid.onion$request_uri;
|
||||
add_header Content-Security-Policy "default-src 'none'; frame-src https://trocador.app/; connect-src 'self'; font-src 'self'; img-src 'self'; manifest-src 'self'; script-src 'self'; style-src 'self'; form-action 'none'; frame-ancestors 'none'; block-all-mixed-content; base-uri 'none'; require-trusted-types-for 'script'; trusted-types 'none'";
|
||||
}
|
13
swag/nginx/include.d/maubot.conf
Normal file
13
swag/nginx/include.d/maubot.conf
Normal file
@ -0,0 +1,13 @@
|
||||
location /_matrix/maubot/v1/logs {
|
||||
proxy_pass http://maubot:29316;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "Upgrade";
|
||||
proxy_set_header X-Forwarded-For $remote_addr;
|
||||
}
|
||||
|
||||
location /_matrix/maubot {
|
||||
proxy_pass http://maubot:29316;
|
||||
proxy_set_header X-Forwarded-For $remote_addr;
|
||||
}
|
||||
|
19
swag/nginx/include.d/mjolnir-reports.conf
Normal file
19
swag/nginx/include.d/mjolnir-reports.conf
Normal file
@ -0,0 +1,19 @@
|
||||
location ~ ^/_matrix/client/r0/rooms/([^/]*)/report/(.*)$ {
|
||||
# Abuse reports should be sent to Mjölnir.
|
||||
include /config/nginx/proxy.conf;
|
||||
include /config/nginx/resolver.conf;
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
set $upstream_app mjolnir;
|
||||
set $upstream_port 8081;
|
||||
set $upstream_proto http;
|
||||
# Add CORS, otherwise a browser will refuse this request.
|
||||
add_header 'Access-Control-Allow-Credentials' 'true' always;
|
||||
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
|
||||
add_header 'Access-Control-Allow-Headers' 'Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,Keep-Alive,X-Requested-With,If-Modified-Since' always;
|
||||
add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always;
|
||||
add_header 'Access-Control-Max-Age' 1728000;
|
||||
# Alias the regexps, to ensure that they're not rewritten.
|
||||
set $room_id $1;
|
||||
set $event_id $2;
|
||||
proxy_pass $upstream_proto://$upstream_app:$upstream_port/api/1/report/$room_id/$event_id;
|
||||
}
|
24
swag/nginx/include.d/register.conf
Normal file
24
swag/nginx/include.d/register.conf
Normal file
@ -0,0 +1,24 @@
|
||||
location /register {
|
||||
include /config/nginx/proxy.conf;
|
||||
include /config/nginx/resolver.conf;
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
include /config/nginx/gzip.conf;
|
||||
include /config/nginx/security-headers.conf;
|
||||
add_header Onion-Location http://54ct5xaioq64ejuxfpyuxyuati4aplp2dlebr3t5ug7ck62i5tsaiuid.onion$request_uri;
|
||||
set $upstream_app matrix-registration;
|
||||
set $upstream_port 5000;
|
||||
set $upstream_proto http;
|
||||
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
|
||||
}
|
||||
|
||||
location /static {
|
||||
include /config/nginx/proxy.conf;
|
||||
include /config/nginx/resolver.conf;
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
include /config/nginx/gzip.conf;
|
||||
include /config/nginx/security-headers.conf;
|
||||
set $upstream_app matrix-registration;
|
||||
set $upstream_port 5000;
|
||||
set $upstream_proto http;
|
||||
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
|
||||
}
|
7
swag/nginx/include.d/synapse-proxy.conf
Normal file
7
swag/nginx/include.d/synapse-proxy.conf
Normal file
@ -0,0 +1,7 @@
|
||||
proxy_set_header Host $http_host;
|
||||
proxy_set_header X-Real-IP 0.0.0.0;
|
||||
proxy_set_header X-Forwarded-For 0.0.0.0;
|
||||
proxy_set_header X-Forwarded-Host 0.0.0.0;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
|
||||
port_in_redirect off;
|
15
swag/nginx/include.d/upstream_workers.conf
Normal file
15
swag/nginx/include.d/upstream_workers.conf
Normal file
@ -0,0 +1,15 @@
|
||||
upstream generic_worker_ih {
|
||||
ip_hash;
|
||||
server synapse-generic-worker-1:8080;
|
||||
server synapse-generic-worker-2:8081;
|
||||
server synapse-generic-worker-3:8082;
|
||||
server synapse-generic-worker-4:8083;
|
||||
}
|
||||
|
||||
upstream generic_worker_lc {
|
||||
least_conn;
|
||||
server synapse-generic-worker-1:8080;
|
||||
server synapse-generic-worker-2:8081;
|
||||
server synapse-generic-worker-3:8082;
|
||||
server synapse-generic-worker-4:8083;
|
||||
}
|
148
swag/nginx/nginx.conf
Normal file
148
swag/nginx/nginx.conf
Normal file
@ -0,0 +1,148 @@
|
||||
## Version 2022/08/16 - Changelog: https://github.com/linuxserver/docker-baseimage-alpine-nginx/commits/master/root/defaults/nginx/nginx.conf.sample
|
||||
|
||||
### Based on alpine defaults
|
||||
# https://git.alpinelinux.org/aports/tree/main/nginx/nginx.conf?h=3.15-stable
|
||||
|
||||
user abc;
|
||||
|
||||
# Set number of worker processes automatically based on number of CPU cores.
|
||||
include /config/nginx/worker_processes.conf;
|
||||
|
||||
# Enables the use of JIT for regular expressions to speed-up their processing.
|
||||
pcre_jit on;
|
||||
|
||||
# Configures default error logger.
|
||||
#error_log /config/log/nginx/error.log;
|
||||
|
||||
# Includes files with directives to load dynamic modules.
|
||||
include /etc/nginx/modules/*.conf;
|
||||
|
||||
# Include files with config snippets into the root context.
|
||||
include /etc/nginx/conf.d/*.conf;
|
||||
|
||||
events {
|
||||
# The maximum number of simultaneous connections that can be opened by
|
||||
# a worker process.
|
||||
worker_connections 1024;
|
||||
}
|
||||
|
||||
http {
|
||||
# Includes mapping of file name extensions to MIME types of responses
|
||||
# and defines the default type.
|
||||
include /etc/nginx/mime.types;
|
||||
default_type application/octet-stream;
|
||||
|
||||
# Name servers used to resolve names of upstream servers into addresses.
|
||||
# It's also needed when using tcpsocket and udpsocket in Lua modules.
|
||||
#resolver 1.1.1.1 1.0.0.1 2606:4700:4700::1111 2606:4700:4700::1001;
|
||||
include /config/nginx/resolver.conf;
|
||||
|
||||
# Don't tell nginx version to the clients. Default is 'on'.
|
||||
server_tokens off;
|
||||
|
||||
# Specifies the maximum accepted body size of a client request, as
|
||||
# indicated by the request header Content-Length. If the stated content
|
||||
# length is greater than this size, then the client receives the HTTP
|
||||
# error code 413. Set to 0 to disable. Default is '1m'.
|
||||
client_max_body_size 0;
|
||||
|
||||
# Sendfile copies data between one FD and other from within the kernel,
|
||||
# which is more efficient than read() + write(). Default is off.
|
||||
sendfile on;
|
||||
|
||||
# Causes nginx to attempt to send its HTTP response head in one packet,
|
||||
# instead of using partial frames. Default is 'off'.
|
||||
tcp_nopush on;
|
||||
|
||||
# all ssl related config moved to ssl.conf
|
||||
include /config/nginx/ssl.conf;
|
||||
|
||||
# Enable gzipping of responses.
|
||||
#gzip on;
|
||||
|
||||
# Set the Vary HTTP header as defined in the RFC 2616. Default is 'off'.
|
||||
gzip_vary on;
|
||||
|
||||
##
|
||||
# Anonymize the IP Address
|
||||
##
|
||||
|
||||
map $remote_addr $remote_addr_anon {
|
||||
~(?P<ip>\d+\.\d+)\.\d+\. $ip.0.0;
|
||||
~(?P<ip>[^:]+:[^:]+): $ip::;
|
||||
|
||||
# IP addresses to not anonymize (such as your server)
|
||||
127.0.0.1 $remote_addr;
|
||||
::1 $remote_addr;
|
||||
89.147.110.112 $remote_addr;
|
||||
default 0.0.0.0;
|
||||
}
|
||||
# add $http_x_forwarded_for section if needed.
|
||||
|
||||
##
|
||||
# Tag the Access as Normal or Record IP (Specified Error codes)
|
||||
##
|
||||
|
||||
map $status $normal_access {
|
||||
400 0;
|
||||
401 0;
|
||||
403 0;
|
||||
#404 0;
|
||||
405 0;
|
||||
406 0;
|
||||
410 0;
|
||||
default 1;
|
||||
}
|
||||
|
||||
map $status $record_full_ip {
|
||||
400 1;
|
||||
401 1;
|
||||
403 1;
|
||||
#404 1;
|
||||
405 1;
|
||||
406 1;
|
||||
410 1;
|
||||
default 0;
|
||||
}
|
||||
|
||||
##
|
||||
# Set the Logs
|
||||
##
|
||||
|
||||
log_format anon_ip '$remote_addr_anon - $remote_user [$time_local] "$request" '
|
||||
'$status $body_bytes_sent "$http_referer" '
|
||||
'"$http_x_forwarded_for_anon"';
|
||||
|
||||
log_format real_ip '$remote_addr - $remote_user [$time_local] "$request" '
|
||||
'$status $body_bytes_sent "$http_referer" '
|
||||
'"$http_user_agent" "$http_x_forwarded_for"';
|
||||
|
||||
##
|
||||
# Do the Actual Logging ( Can be set in Server section(s) )
|
||||
##
|
||||
|
||||
# Anonymized IP Access Logs
|
||||
access_log /config/log/nginx/access.log anon_ip if=$normal_access;
|
||||
|
||||
# Record real IP address on specified errors codes
|
||||
access_log /config/log/nginx/access.log real_ip if=$record_full_ip;
|
||||
|
||||
# NGINX Error Logs
|
||||
error_log /config/log/nginx/error.log;
|
||||
|
||||
# Helper variable for proxying websockets.
|
||||
map $http_upgrade $connection_upgrade {
|
||||
default upgrade;
|
||||
'' close;
|
||||
}
|
||||
|
||||
# Sets the path, format, and configuration for a buffered log write.
|
||||
# access_log /config/log/nginx/access.log;
|
||||
|
||||
# Includes virtual hosts configs.
|
||||
include /etc/nginx/http.d/*.conf;
|
||||
include /config/nginx/site-confs/*.conf;
|
||||
}
|
||||
|
||||
daemon off;
|
||||
pid /run/nginx.pid;
|
35
swag/nginx/proxy.conf
Normal file
35
swag/nginx/proxy.conf
Normal file
@ -0,0 +1,35 @@
|
||||
## Version 2022/09/01 - Changelog: https://github.com/linuxserver/docker-swag/commits/master/root/defaults/nginx/proxy.conf.sample
|
||||
|
||||
# Timeout if the real server is dead
|
||||
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
|
||||
|
||||
# Proxy Connection Settings
|
||||
proxy_buffers 32 4k;
|
||||
proxy_connect_timeout 240;
|
||||
proxy_headers_hash_bucket_size 128;
|
||||
proxy_headers_hash_max_size 1024;
|
||||
proxy_http_version 1.1;
|
||||
proxy_read_timeout 240;
|
||||
proxy_redirect http:// $scheme://;
|
||||
proxy_send_timeout 240;
|
||||
|
||||
# Proxy Cache and Cookie Settings
|
||||
proxy_cache_bypass $cookie_session;
|
||||
#proxy_cookie_path / "/; Secure"; # enable at your own risk, may break certain apps
|
||||
proxy_no_cache $cookie_session;
|
||||
|
||||
# Proxy Header Settings
|
||||
proxy_set_header Connection $connection_upgrade;
|
||||
proxy_set_header Early-Data $ssl_early_data;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header Proxy "";
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header X-Forwarded-For 0.0.0.0;
|
||||
proxy_set_header X-Forwarded-Host $host:$server_port;
|
||||
proxy_set_header X-Forwarded-Method $request_method;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header X-Forwarded-Server $host;
|
||||
proxy_set_header X-Forwarded-Ssl on;
|
||||
proxy_set_header X-Forwarded-Uri $request_uri;
|
||||
proxy_set_header X-Original-URL $scheme://$http_host$request_uri;
|
||||
proxy_set_header X-Real-IP 0.0.0.0;
|
13
swag/nginx/security-headers.conf
Normal file
13
swag/nginx/security-headers.conf
Normal file
@ -0,0 +1,13 @@
|
||||
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
|
||||
add_header X-Content-Type-Options "nosniff" always;
|
||||
add_header Referrer-Policy "no-referrer" always;
|
||||
add_header Cross-Origin-Opener-Policy "same-origin" always;
|
||||
add_header Origin-Agent-Cluster "?1" always;
|
||||
|
||||
# obsolete and replaced with Content-Security-Policy frame-ancestors 'none'
|
||||
#add_header X-Frame-Options "DENY" always;
|
||||
|
||||
# obsolete, unsafe and replaced with strong Content-Security-Policy
|
||||
add_header X-XSS-Protection "0" always;
|
||||
|
||||
add_header Permissions-Policy "accelerometer=(), ambient-light-sensor=(), autoplay=(), battery=(), bluetooth=(), camera=(), clipboard-read=(), clipboard-write=(), display-capture=(), document-domain=(), encrypted-media=(), fullscreen=(), gamepad=(), geolocation=(), gyroscope=(), hid=(), idle-detection=(), interest-cohort=(), keyboard-map=(), local-fonts=(), magnetometer=(), microphone=(), midi=(), payment=(), picture-in-picture=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), speaker-selection=(), sync-xhr=(), usb=(), xr-spatial-tracking=()" always;
|
2
swag/nginx/security-headers.csp.conf
Normal file
2
swag/nginx/security-headers.csp.conf
Normal file
@ -0,0 +1,2 @@
|
||||
add_header Cross-Origin-Embedder-Policy "require-corp" always;
|
||||
add_header Content-Security-Policy "default-src 'none'; connect-src 'self'; font-src 'self'; img-src 'self'; manifest-src 'self'; script-src 'self'; style-src 'self'; form-action 'none'; frame-ancestors 'none'; block-all-mixed-content; base-uri 'none'; require-trusted-types-for 'script'; trusted-types 'none'" always;
|
13
swag/nginx/site-confs/blog.conf
Normal file
13
swag/nginx/site-confs/blog.conf
Normal file
@ -0,0 +1,13 @@
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
listen [::]:443 ssl http2;
|
||||
|
||||
server_name blog.*;
|
||||
|
||||
include /config/nginx/ssl.conf;
|
||||
include /config/nginx/gzip.conf;
|
||||
|
||||
location / {
|
||||
root /config/www/blog.hackliberty.org;
|
||||
}
|
||||
}
|
27
swag/nginx/site-confs/chat.conf
Normal file
27
swag/nginx/site-confs/chat.conf
Normal file
@ -0,0 +1,27 @@
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
listen [::]:443 ssl http2;
|
||||
|
||||
server_name chat.*;
|
||||
|
||||
include /config/nginx/ssl.conf;
|
||||
include /config/nginx/gzip.conf;
|
||||
|
||||
location / {
|
||||
include /config/nginx/proxy.conf;
|
||||
include /config/nginx/resolver.conf;
|
||||
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
|
||||
add_header Content-Security-Policy "default-src 'none'; connect-src 'self' https://hackliberty.org; font-src 'self'; img-src 'self' https://hackliberty.org blob: data:; manifest-src 'self'; media-src 'self' https://hackliberty.org; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; frame-src 'self' blob:; frame-ancestors 'self'; block-all-mixed-content; base-uri 'none'";
|
||||
add_header Permissions-Policy "accelerometer=(), ambient-light-sensor=(), autoplay=(), battery=(), bluetooth=(), camera=(), clipboard-read=(), clipboard-write=(), display-capture=(), document-domain=(), fullscreen=(), gamepad=(), geolocation=(), gyroscope=(), hid=(), idle-detection=(), interest-cohort=(), keyboard-map=(), local-fonts=(), magnetometer=(), microphone=(), midi=(), payment=(), picture-in-picture=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), speaker-selection=(), usb=(), xr-spatial-tracking=()" always;
|
||||
add_header Referrer-Policy "no-referrer" always;
|
||||
add_header Cross-Origin-Opener-Policy "same-origin" always;
|
||||
add_header Origin-Agent-Cluster "?1" always;
|
||||
add_header X-XSS-Protection "1; mode=block";
|
||||
add_header X-Content-Type-Options "nosniff" always;
|
||||
add_header X-Frame-Options SAMEORIGIN;
|
||||
set $upstream_app chat;
|
||||
set $upstream_port 80;
|
||||
set $upstream_proto http;
|
||||
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
|
||||
}
|
||||
}
|
20
swag/nginx/site-confs/cinny.conf
Normal file
20
swag/nginx/site-confs/cinny.conf
Normal file
@ -0,0 +1,20 @@
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
listen [::]:443 ssl http2;
|
||||
|
||||
server_name cinny.*;
|
||||
|
||||
include /config/nginx/ssl.conf;
|
||||
include /config/nginx/gzip.conf;
|
||||
|
||||
add_header Content-Security-Policy "frame-ancestors 'none'";
|
||||
|
||||
location / {
|
||||
include /config/nginx/proxy.conf;
|
||||
include /config/nginx/resolver.conf;
|
||||
set $upstream_app cinny;
|
||||
set $upstream_port 80;
|
||||
set $upstream_proto http;
|
||||
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
|
||||
}
|
||||
}
|
17
swag/nginx/site-confs/dimension.conf
Normal file
17
swag/nginx/site-confs/dimension.conf
Normal file
@ -0,0 +1,17 @@
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
listen [::]:443 ssl http2;
|
||||
|
||||
server_name dimension.*;
|
||||
|
||||
include /config/nginx/ssl.conf;
|
||||
|
||||
location / {
|
||||
include /config/nginx/proxy.conf;
|
||||
include /config/nginx/resolver.conf;
|
||||
set $upstream_app dimension;
|
||||
set $upstream_port 8184;
|
||||
set $upstream_proto http;
|
||||
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
|
||||
}
|
||||
}
|
18
swag/nginx/site-confs/docs.conf
Normal file
18
swag/nginx/site-confs/docs.conf
Normal file
@ -0,0 +1,18 @@
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
listen [::]:443 ssl http2;
|
||||
|
||||
server_name docs.*;
|
||||
|
||||
include /config/nginx/ssl.conf;
|
||||
include /config/nginx/gzip.conf;
|
||||
|
||||
location / {
|
||||
include /config/nginx/proxy.conf;
|
||||
include /config/nginx/resolver.conf;
|
||||
set $upstream_app bookstack;
|
||||
set $upstream_port 80;
|
||||
set $upstream_proto http;
|
||||
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
|
||||
}
|
||||
}
|
27
swag/nginx/site-confs/element.conf
Normal file
27
swag/nginx/site-confs/element.conf
Normal file
@ -0,0 +1,27 @@
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
listen [::]:443 ssl http2;
|
||||
|
||||
server_name element.*;
|
||||
|
||||
include /config/nginx/ssl.conf;
|
||||
include /config/nginx/gzip.conf;
|
||||
|
||||
location / {
|
||||
include /config/nginx/proxy.conf;
|
||||
include /config/nginx/resolver.conf;
|
||||
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
|
||||
add_header Content-Security-Policy "default-src 'none'; connect-src 'self' https://hackliberty.org; font-src 'self'; img-src 'self' https://hackliberty.org blob: data:; manifest-src 'self'; media-src 'self' https://hackliberty.org; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; frame-src 'self' blob:; frame-ancestors 'self'; block-all-mixed-content; base-uri 'none'";
|
||||
add_header Permissions-Policy "accelerometer=(), ambient-light-sensor=(), autoplay=(), battery=(), bluetooth=(), camera=(), clipboard-read=(), clipboard-write=(), display-capture=(), document-domain=(), fullscreen=(), gamepad=(), geolocation=(), gyroscope=(), hid=(), idle-detection=(), interest-cohort=(), keyboard-map=(), local-fonts=(), magnetometer=(), microphone=(), midi=(), payment=(), picture-in-picture=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), speaker-selection=(), usb=(), xr-spatial-tracking=()" always;
|
||||
add_header Referrer-Policy "no-referrer" always;
|
||||
add_header Cross-Origin-Opener-Policy "same-origin" always;
|
||||
add_header Origin-Agent-Cluster "?1" always;
|
||||
add_header X-XSS-Protection "1; mode=block";
|
||||
add_header X-Content-Type-Options "nosniff" always;
|
||||
add_header X-Frame-Options SAMEORIGIN;
|
||||
set $upstream_app element;
|
||||
set $upstream_port 80;
|
||||
set $upstream_proto http;
|
||||
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
|
||||
}
|
||||
}
|
20
swag/nginx/site-confs/gitea.conf
Normal file
20
swag/nginx/site-confs/gitea.conf
Normal file
@ -0,0 +1,20 @@
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
listen [::]:443 ssl http2;
|
||||
|
||||
server_name git.*;
|
||||
|
||||
include /config/nginx/ssl.conf;
|
||||
|
||||
location / {
|
||||
include /config/nginx/proxy.conf;
|
||||
include /config/nginx/resolver.conf;
|
||||
include /config/nginx/security-headers.conf;
|
||||
add_header Content-Security-Policy "default-src 'none'; connect-src 'self'; font-src * https: data:; img-src * https: data:; manifest-src * https: data:; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; frame-ancestors 'none'; block-all-mixed-content; base-uri 'none'";
|
||||
add_header Onion-Location http://vkp7367tcjpqdwwckigrdrvmwvispvbpg5rlsr2chjxvppfg7hipagyd.onion$request_uri;
|
||||
set $upstream_app gitea;
|
||||
set $upstream_port 3333;
|
||||
set $upstream_proto http;
|
||||
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
|
||||
}
|
||||
}
|
18
swag/nginx/site-confs/grafana.conf
Normal file
18
swag/nginx/site-confs/grafana.conf
Normal file
@ -0,0 +1,18 @@
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
listen [::]:443 ssl http2;
|
||||
|
||||
server_name grafana.*;
|
||||
|
||||
include /config/nginx/ssl.conf;
|
||||
include /config/nginx/gzip.conf;
|
||||
|
||||
location / {
|
||||
include /config/nginx/proxy.conf;
|
||||
include /config/nginx/resolver.conf;
|
||||
set $upstream_app grafana;
|
||||
set $upstream_port 3000;
|
||||
set $upstream_proto http;
|
||||
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
|
||||
}
|
||||
}
|
122
swag/nginx/site-confs/links.conf
Normal file
122
swag/nginx/site-confs/links.conf
Normal file
@ -0,0 +1,122 @@
|
||||
# nginx example config
|
||||
# replace {{yourdomain}} and review the certbot/letsencrypt config
|
||||
|
||||
limit_req_zone $binary_remote_addr zone=links.hackliberty.org_ratelimit:10m rate=1r/s;
|
||||
|
||||
upstream lemmy {
|
||||
# this needs to map to the lemmy (server) docker service hostname
|
||||
server "lemmy:8536";
|
||||
}
|
||||
upstream lemmy-ui {
|
||||
# this needs to map to the lemmy-ui docker service hostname
|
||||
server "lemmy-ui:1234";
|
||||
}
|
||||
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
listen [::]:443 ssl http2;
|
||||
server_name links.hackliberty.org;
|
||||
|
||||
ssl_certificate /config/keys/cert.crt;
|
||||
ssl_certificate_key /config/keys/cert.key;
|
||||
|
||||
# Various TLS hardening settings
|
||||
# https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html
|
||||
ssl_protocols TLSv1.2 TLSv1.3;
|
||||
ssl_prefer_server_ciphers on;
|
||||
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
|
||||
ssl_session_timeout 10m;
|
||||
ssl_session_cache shared:SSL:10m;
|
||||
ssl_session_tickets on;
|
||||
ssl_stapling on;
|
||||
ssl_stapling_verify on;
|
||||
|
||||
# Hide nginx version
|
||||
server_tokens off;
|
||||
|
||||
# Enable compression for JS/CSS/HTML bundle, for improved client load times.
|
||||
# It might be nice to compress JSON, but leaving that out to protect against potential
|
||||
# compression+encryption information leak attacks like BREACH.
|
||||
gzip on;
|
||||
gzip_types text/css application/javascript image/svg+xml;
|
||||
gzip_vary on;
|
||||
|
||||
# Only connect to this site via HTTPS for the two years
|
||||
add_header Strict-Transport-Security "max-age=63072000";
|
||||
|
||||
# Various content security headers
|
||||
add_header Referrer-Policy "same-origin";
|
||||
add_header X-Content-Type-Options "nosniff";
|
||||
add_header X-Frame-Options "DENY";
|
||||
add_header X-XSS-Protection "1; mode=block";
|
||||
|
||||
# Upload limit for pictrs
|
||||
client_max_body_size 20M;
|
||||
|
||||
# frontend
|
||||
location / {
|
||||
# distinguish between ui requests and backend
|
||||
# don't change lemmy-ui or lemmy here, they refer to the upstream definitions on top
|
||||
set $proxpass "http://lemmy-ui";
|
||||
|
||||
if ($http_accept = "application/activity+json") {
|
||||
set $proxpass "http://lemmy";
|
||||
}
|
||||
if ($http_accept = "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") {
|
||||
set $proxpass "http://lemmy";
|
||||
}
|
||||
if ($request_method = POST) {
|
||||
set $proxpass "http://lemmy";
|
||||
}
|
||||
proxy_pass $proxpass;
|
||||
|
||||
rewrite ^(.+)/+$ $1 permanent;
|
||||
|
||||
# Send actual client IP upstream
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
}
|
||||
|
||||
# backend
|
||||
location ~ ^/(api|feeds|nodeinfo|.well-known) {
|
||||
proxy_pass "http://lemmy";
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
|
||||
# Rate limit
|
||||
limit_req zone=links.hackliberty.org_ratelimit burst=30 nodelay;
|
||||
|
||||
# Add IP forwarding headers
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
}
|
||||
|
||||
# pictrs only - for adding browser cache control.
|
||||
location ~ ^/(pictrs) {
|
||||
# allow browser cache, images never update, we can apply long term cache
|
||||
expires 120d;
|
||||
add_header Pragma "public";
|
||||
add_header Cache-Control "public";
|
||||
|
||||
proxy_pass "http://lemmy";
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
|
||||
# Rate limit
|
||||
limit_req zone=links.hackliberty.org_ratelimit burst=30 nodelay;
|
||||
|
||||
# Add IP forwarding headers
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
}
|
||||
|
||||
# Redirect pictshare images to pictrs
|
||||
location ~ /pictshare/(.*)$ {
|
||||
return 301 /pictrs/image/$1;
|
||||
}
|
||||
}
|
102
swag/nginx/site-confs/matrix.conf
Normal file
102
swag/nginx/site-confs/matrix.conf
Normal file
@ -0,0 +1,102 @@
|
||||
server {
|
||||
listen 80 default_server;
|
||||
listen [::]:80 default_server;
|
||||
server_name hackliberty.org paste.* ots.* element.* git.* chat.*;
|
||||
|
||||
location / {
|
||||
return 307 https://$host$request_uri;
|
||||
}
|
||||
}
|
||||
#Workers
|
||||
include /config/nginx/include.d/upstream_workers.conf;
|
||||
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
listen [::]:443 ssl http2;
|
||||
|
||||
listen 8448 ssl http2 default_server;
|
||||
listen [::]:8448 ssl http2 default_server;
|
||||
|
||||
server_name hackliberty.org www.*;
|
||||
|
||||
include /config/nginx/ssl.conf;
|
||||
client_max_body_size 1024M;
|
||||
|
||||
# Well-Known
|
||||
location /.well-known/matrix/server {
|
||||
default_type application/json;
|
||||
add_header Access-Control-Allow-Origin *;
|
||||
return 200 '{"m.server": "hackliberty.org:443"}';
|
||||
}
|
||||
|
||||
location /.well-known/matrix/client {
|
||||
default_type application/json;
|
||||
add_header Access-Control-Allow-Origin *;
|
||||
|
||||
}
|
||||
|
||||
#Home Page
|
||||
include /config/nginx/include.d/homepage.conf;
|
||||
|
||||
# Mjolnir Reports
|
||||
include /config/nginx/include.d/mjolnir-reports.conf;
|
||||
|
||||
# Maubot
|
||||
include /config/nginx/include.d/maubot.conf;
|
||||
|
||||
# Federation_Worker
|
||||
include /config/nginx/include.d/federation_worker.conf;
|
||||
|
||||
# Encryption_Worker
|
||||
include /config/nginx/include.d/encryption_worker.conf;
|
||||
|
||||
# Client_Worker
|
||||
include /config/nginx/include.d/client_worker.conf;
|
||||
|
||||
# Register
|
||||
include /config/nginx/include.d/register.conf;
|
||||
|
||||
# Additional1_Worker | Typing Device Account
|
||||
#include /config/nginx/include.d/additional1_worker.conf;
|
||||
|
||||
# Additional2_Worker | Reciept
|
||||
#include /config/nginx/include.d/additional2_worker.conf;
|
||||
|
||||
# Event_worker
|
||||
#include /config/nginx/include.d/event_worker.conf;
|
||||
|
||||
# Extra Workers
|
||||
#include /config/nginx/include.d/extra_worker.conf;
|
||||
|
||||
# Media Repo
|
||||
#include /config/nginx/include.d/media-repo.conf;
|
||||
|
||||
# /synapse/admin
|
||||
#include /config/nginx/include.d/synapse-admin.conf;
|
||||
|
||||
# Sync_Worker
|
||||
#include /config/nginx/include.d/sync_worker.conf;
|
||||
|
||||
location ~ ^(/_matrix.*) {
|
||||
include /config/nginx/proxy.conf;
|
||||
include /config/nginx/resolver.conf;
|
||||
include /config/nginx/include.d/synapse-proxy.conf;
|
||||
set $upstream_app synapse;
|
||||
set $upstream_port 8008;
|
||||
set $upstream_proto http;
|
||||
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
|
||||
}
|
||||
}
|
||||
|
||||
server {
|
||||
listen 8899;
|
||||
server_name kj3wvs3wyfhm3uhhuqxlrhhcp6dneuau4mmvptlor27ghmrqx63fqnid.onion;
|
||||
location ~ ^/.*$ {
|
||||
root /config/www/hackliberty.org;
|
||||
include /config/nginx/gzip.conf;
|
||||
include /config/nginx/security-headers.conf;
|
||||
# Add Onion-Location Header
|
||||
add_header Onion-Location http://kj3wvs3wyfhm3uhhuqxlrhhcp6dneuau4mmvptlor27ghmrqx63fqnid.onion$request_uri;
|
||||
add_header Content-Security-Policy "default-src 'none'; frame-src https://trocador.app/; connect-src 'self'; font-src 'self'; img-src 'self'; manifest-src 'self'; script-src 'self'; style-src 'self'; form-action 'none'; frame-ancestors 'none'; block-all-mixed-content; base-uri 'none'; require-trusted-types-for 'script'; trusted-types 'none'";
|
||||
}
|
||||
}
|
17
swag/nginx/site-confs/maubot.conf
Normal file
17
swag/nginx/site-confs/maubot.conf
Normal file
@ -0,0 +1,17 @@
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
listen [::]:443 ssl http2;
|
||||
|
||||
server_name maubot.*;
|
||||
|
||||
include /config/nginx/ssl.conf;
|
||||
|
||||
location / {
|
||||
include /config/nginx/proxy.conf;
|
||||
include /config/nginx/resolver.conf;
|
||||
set $upstream_app maubot;
|
||||
set $upstream_port 29316;
|
||||
set $upstream_proto http;
|
||||
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
|
||||
}
|
||||
}
|
48
swag/nginx/site-confs/ots.conf
Normal file
48
swag/nginx/site-confs/ots.conf
Normal file
@ -0,0 +1,48 @@
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
listen [::]:443 ssl http2;
|
||||
|
||||
server_name ots.*;
|
||||
|
||||
ssl_certificate /config/keys/cert.crt;
|
||||
ssl_certificate_key /config/keys/cert.key;
|
||||
ssl_session_timeout 10m;
|
||||
ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
|
||||
ssl_session_tickets off;
|
||||
|
||||
# curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam
|
||||
ssl_dhparam /config/nginx/dhparam4096.pem;
|
||||
|
||||
# intermediate configuration
|
||||
ssl_prefer_server_ciphers on;
|
||||
ssl_protocols TLSv1.2 TLSv1.3;
|
||||
ssl_conf_command Options PrioritizeChaCha;
|
||||
ssl_conf_command Ciphersuites TLS_CHACHA20_POLY1305_SHA256;
|
||||
ssl_ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384;
|
||||
ssl_ecdh_curve X25519:X448:secp521r1:secp384r1;
|
||||
|
||||
# HSTS (ngx_http_headers_module is required) (63072000 seconds)
|
||||
add_header Strict-Transport-Security "max-age=63072000" always;
|
||||
|
||||
# OCSP stapling
|
||||
ssl_stapling on;
|
||||
ssl_stapling_verify on;
|
||||
|
||||
# verify chain of trust of OCSP response using Root CA and Intermediate certs
|
||||
ssl_trusted_certificate /config/keys/cert.crt;
|
||||
|
||||
# Optional additional headers
|
||||
add_header Permissions-Policy "interest-cohort=()";
|
||||
|
||||
# Add Onion-Location Header
|
||||
add_header Onion-Location http://5bi7xhmcmji4gfuok5z4j4bgmif2cryuf6was6c7275i3wwfvoolbryd.onion$request_uri;
|
||||
|
||||
location / {
|
||||
include /config/nginx/proxy.conf;
|
||||
include /config/nginx/resolver.conf;
|
||||
set $upstream_app ots;
|
||||
set $upstream_port 3000;
|
||||
set $upstream_proto http;
|
||||
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
|
||||
}
|
||||
}
|
18
swag/nginx/site-confs/paste.conf
Normal file
18
swag/nginx/site-confs/paste.conf
Normal file
@ -0,0 +1,18 @@
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
listen [::]:443 ssl http2;
|
||||
|
||||
server_name paste.*;
|
||||
include /config/nginx/ssl.conf;
|
||||
|
||||
location / {
|
||||
include /config/nginx/proxy.conf;
|
||||
include /config/nginx/resolver.conf;
|
||||
add_header Onion-Location http://z2hx4persafjkxw3u23dly24tzzynvkzrp5r3zbh6jrjvd7c7qjsgvyd.onion$request_uri;
|
||||
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
|
||||
set $upstream_app privatebin;
|
||||
set $upstream_port 8080;
|
||||
set $upstream_proto http;
|
||||
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
|
||||
}
|
||||
}
|
17
swag/nginx/site-confs/prometheus.conf
Normal file
17
swag/nginx/site-confs/prometheus.conf
Normal file
@ -0,0 +1,17 @@
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
listen [::]:443 ssl http2;
|
||||
|
||||
server_name prometheus.*;
|
||||
|
||||
include /config/nginx/ssl.conf;
|
||||
|
||||
location / {
|
||||
include /config/nginx/proxy.conf;
|
||||
include /config/nginx/resolver.conf;
|
||||
set $upstream_app prometheus;
|
||||
set $upstream_port 9090;
|
||||
set $upstream_proto http;
|
||||
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
|
||||
}
|
||||
}
|
30
swag/nginx/ssl.conf
Normal file
30
swag/nginx/ssl.conf
Normal file
@ -0,0 +1,30 @@
|
||||
## Version 2022/08/20 - Changelog: https://github.com/linuxserver/docker-baseimage-alpine-nginx/commits/master/root/defaults/nginx/ssl.conf.sample
|
||||
|
||||
### Mozilla Recommendations
|
||||
# generated 2022-08-05, Mozilla Guideline v5.6, nginx 1.17.7, OpenSSL 1.1.1k, intermediate configuration
|
||||
# https://ssl-config.mozilla.org/#server=nginx&version=1.17.7&config=intermediate&openssl=1.1.1k&guideline=5.6
|
||||
|
||||
ssl_certificate /config/keys/cert.crt;
|
||||
ssl_certificate_key /config/keys/cert.key;
|
||||
ssl_session_timeout 10m;
|
||||
ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
|
||||
ssl_session_tickets off;
|
||||
|
||||
# curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam
|
||||
ssl_dhparam /config/nginx/dhparam4096.pem;
|
||||
|
||||
# intermediate configuration
|
||||
ssl_prefer_server_ciphers on;
|
||||
ssl_protocols TLSv1.2 TLSv1.3;
|
||||
ssl_conf_command Options PrioritizeChaCha;
|
||||
ssl_ciphers ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
|
||||
|
||||
# HSTS (ngx_http_headers_module is required) (63072000 seconds)
|
||||
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains" always;
|
||||
|
||||
# OCSP stapling
|
||||
ssl_stapling on;
|
||||
ssl_stapling_verify on;
|
||||
|
||||
# verify chain of trust of OCSP response using Root CA and Intermediate certs
|
||||
ssl_trusted_certificate /config/keys/cert.crt;
|
Loading…
Reference in New Issue
Block a user