mirror of
https://github.com/ruanbekker/docker-selfhosted-server.git
synced 2025-04-19 16:11:39 +02:00
commit
22fca48f2c
20
.drone.yml
20
.drone.yml
@ -8,3 +8,23 @@ steps:
|
||||
image: busybox
|
||||
commands:
|
||||
- echo hi
|
||||
|
||||
- name: gotify
|
||||
image: fredix/drone-gotify
|
||||
settings:
|
||||
gotifytoken:
|
||||
from_secret: plugin_gotifytoken
|
||||
gotifyendpoint:
|
||||
from_secret: plugin_gotifyendpoint
|
||||
gotifytitle:
|
||||
from_secret: plugin_gotifytitle
|
||||
gotifypriority:
|
||||
from_secret: plugin_gotifypriority
|
||||
message: >
|
||||
{{#success build.status}}
|
||||
build {{build.number}} succeeded on {{repo.name}}. Good job {{build.author}} {{build.link}}
|
||||
{{else}}
|
||||
build {{build.number}} failed on {{repo.name}}. Fix me please {{build.author}} {{build.link}}
|
||||
{{/success}}
|
||||
when:
|
||||
status: [ success, failure ]
|
||||
|
19
README.md
19
README.md
@ -1,2 +1,21 @@
|
||||
# docker-selfhosted-server
|
||||
My Hobby Server for Self-Hosted Applications on Docker
|
||||
|
||||
## Usage
|
||||
|
||||
In each application directory resides a `sample-env` file, which includes the required environment variables that you can copy to `.env`:
|
||||
|
||||
```
|
||||
$ cd folder/
|
||||
$ cp sample-env .env
|
||||
# modify .env to desired values
|
||||
```
|
||||
|
||||
## Included Applications
|
||||
|
||||
I will add more over time:
|
||||
|
||||
- `traefik`
|
||||
- `bitwarden`
|
||||
- `rocket-chat`
|
||||
- `grafana loki`
|
||||
|
23
bitwarden/bitwarden/frontend/bitwarden.conf
Normal file
23
bitwarden/bitwarden/frontend/bitwarden.conf
Normal file
@ -0,0 +1,23 @@
|
||||
server {
|
||||
listen 80;
|
||||
server_name _;
|
||||
client_max_body_size 128M;
|
||||
|
||||
location / {
|
||||
proxy_pass http://bitwarden-backend:80;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
}
|
||||
|
||||
location /notifications/hub {
|
||||
proxy_pass http://bitwarden-backend:3012;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
}
|
||||
|
||||
location /notifications/hub/negotiate {
|
||||
proxy_pass http://bitwarden-backend:80;
|
||||
}
|
||||
}
|
80
bitwarden/docker-compose.yml
Normal file
80
bitwarden/docker-compose.yml
Normal file
@ -0,0 +1,80 @@
|
||||
# resource
|
||||
# https://github.com/JulianRunnels/Bitwarden_Self_Host/blob/master/docker-compose.yml
|
||||
# https://medium.com/swlh/set-up-your-own-personal-password-vault-313d76374046
|
||||
|
||||
# to use grafana loki for logging:
|
||||
# logging:
|
||||
# driver: loki
|
||||
# options:
|
||||
# loki-url: http://$SERVER_IP:3100/loki/api/v1/push
|
||||
# loki-external-labels: job=dockerlogs
|
||||
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
bitwarden-frontend:
|
||||
image: nginx:1.15-alpine
|
||||
container_name: bitwarden-frontend
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- $DOCKER_VOLUME_PATH/bitwarden/frontend/bitwarden.conf:/etc/nginx/conf.d/bitwarden.conf
|
||||
networks:
|
||||
- public
|
||||
depends_on:
|
||||
- bitwarden-backend
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.bitwarden.rule=Host(`bitwarden.$DOMAIN`)"
|
||||
- "traefik.http.routers.bitwarden.entrypoints=https"
|
||||
- "traefik.http.routers.bitwarden.tls.certresolver=dns-cloudflare"
|
||||
- "traefik.http.routers.bitwarden.service=bitwarden-service"
|
||||
- "traefik.http.services.bitwarden-service.loadbalancer.server.port=80"
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "1m"
|
||||
|
||||
bitwarden-backend:
|
||||
image: vaultwarden/server:latest
|
||||
container_name: bitwarden-backend
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- $DOCKER_VOLUME_PATH/bitwarden/backend/data:/data
|
||||
environment:
|
||||
- WEBSOCKET_ENABLED=true
|
||||
- SIGNUPS_ALLOWED=false
|
||||
networks:
|
||||
- public
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "1m"
|
||||
|
||||
bitwarden-backup:
|
||||
image: bruceforce/bw_backup:latest
|
||||
container_name: bitwarden-backup
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
- bitwarden-backend
|
||||
volumes:
|
||||
- $DOCKER_VOLUME_PATH/bitwarden/backend/data:/data
|
||||
- $DOCKER_VOLUME_PATH/bitwarden/backend/backup:/backup
|
||||
- /etc/timezone:/etc/timezone:ro
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
environment:
|
||||
- DB_FILE=/data/db.sqlite3
|
||||
- BACKUP_FILE=/backup/backup.sqlite3
|
||||
- CRON_TIME=0 1 * * *
|
||||
- TIMESTAMP=false
|
||||
- UID=0
|
||||
- GID=0
|
||||
networks:
|
||||
- public
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "1m"
|
||||
|
||||
networks:
|
||||
public:
|
||||
name: public
|
2
bitwarden/sample-env
Normal file
2
bitwarden/sample-env
Normal file
@ -0,0 +1,2 @@
|
||||
DOCKER_VOLUME_PATH=.
|
||||
DOMAIN=
|
175
logging-loki/docker-compose.yml
Normal file
175
logging-loki/docker-compose.yml
Normal file
@ -0,0 +1,175 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
loki-redis:
|
||||
image: bitnami/redis:latest
|
||||
restart: unless-stopped
|
||||
container_name: loki-redis
|
||||
environment:
|
||||
ALLOW_EMPTY_PASSWORD: "yes"
|
||||
ports:
|
||||
- 6379
|
||||
networks:
|
||||
- public
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "1m"
|
||||
|
||||
loki-minio:
|
||||
image: minio/minio:latest
|
||||
container_name: loki-minio
|
||||
volumes:
|
||||
- $DOCKER_VOLUME_PATH/loki/minio/data:/data
|
||||
env_file: .env
|
||||
environment:
|
||||
- MINIO_ROOT_USER=${MINIO_ROOT_USER:-EXAMPLEACCESSKEY}
|
||||
- MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD:-EXAMPLEACCESSSECRET}
|
||||
command: server /data
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
|
||||
interval: 30s
|
||||
timeout: 20s
|
||||
retries: 3
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- public
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "1m"
|
||||
|
||||
|
||||
loki-consul:
|
||||
container_name: loki-consul
|
||||
image: consul:1.9
|
||||
command: agent -log-level=info -dev -client 0.0.0.0
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- $DOCKER_VOLUME_PATH/loki/consul/config:/consul/config
|
||||
- $DOCKER_VOLUME_PATH/loki/consul/data:/consul/data
|
||||
networks:
|
||||
- public
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "1m"
|
||||
|
||||
loki-distributor:
|
||||
image: grafana/loki:2.2.1
|
||||
container_name: loki-distributor
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- 3100:3100
|
||||
depends_on:
|
||||
- loki-redis
|
||||
- loki-consul
|
||||
- loki-minio
|
||||
volumes:
|
||||
- $DOCKER_VOLUME_PATH/loki/configs/loki/consul_config.yaml:/etc/loki/config.yaml
|
||||
command: -config.file=/etc/loki/config.yaml -target=distributor
|
||||
networks:
|
||||
- public
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "1m"
|
||||
|
||||
loki-querier:
|
||||
image: grafana/loki:2.2.1
|
||||
container_name: loki-querier
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- 3100
|
||||
depends_on:
|
||||
- loki-redis
|
||||
- loki-consul
|
||||
- loki-minio
|
||||
volumes:
|
||||
- $DOCKER_VOLUME_PATH/loki/configs/loki/consul_config.yaml:/etc/loki/config.yaml
|
||||
command: -config.file=/etc/loki/config.yaml -target=querier
|
||||
networks:
|
||||
- public
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "1m"
|
||||
|
||||
loki-ingester:
|
||||
image: grafana/loki:2.2.1
|
||||
container_name: loki-ingester
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- 3100
|
||||
depends_on:
|
||||
- loki-redis
|
||||
- loki-consul
|
||||
- loki-minio
|
||||
volumes:
|
||||
- $DOCKER_VOLUME_PATH/loki/configs/loki/consul_config.yaml:/etc/loki/config.yaml
|
||||
command: -config.file=/etc/loki/config.yaml -target=ingester
|
||||
networks:
|
||||
- public
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "1m"
|
||||
|
||||
loki-table-manager:
|
||||
image: grafana/loki:2.2.1
|
||||
container_name: loki-table-manager
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- 3100
|
||||
depends_on:
|
||||
- loki-redis
|
||||
- loki-consul
|
||||
- loki-minio
|
||||
volumes:
|
||||
- $DOCKER_VOLUME_PATH/loki/configs/loki/consul_config.yaml:/etc/loki/config.yaml
|
||||
command: -config.file=/etc/loki/config.yaml -target=table-manager
|
||||
networks:
|
||||
- public
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "1m"
|
||||
|
||||
promtail:
|
||||
image: grafana/promtail:latest
|
||||
container_name: promtail
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- $DOCKER_VOLUME_PATH/loki/configs/promtail/promtail-config.yaml:/etc/promtail/docker-config.yaml
|
||||
- /var/log:/var/log
|
||||
- /var/lib/docker/:/var/lib/docker:ro
|
||||
command: -config.file=/etc/promtail/docker-config.yaml
|
||||
depends_on:
|
||||
- loki-ingester
|
||||
networks:
|
||||
- public
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "1m"
|
||||
|
||||
fluent-bit:
|
||||
image: grafana/fluent-bit-plugin-loki:latest
|
||||
container_name: fluent-bit
|
||||
environment:
|
||||
- LOKI_URL=http://loki-distributor:3100/loki/api/v1/push
|
||||
volumes:
|
||||
- $DOCKER_VOLUME_PATH/loki/configs/fluentbit/fluent-bit.conf:/fluent-bit/etc/fluent-bit.conf
|
||||
ports:
|
||||
- "24224:24224"
|
||||
- "24224:24224/udp"
|
||||
networks:
|
||||
- public
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "1m"
|
||||
|
||||
networks:
|
||||
public:
|
||||
name: public
|
15
logging-loki/loki/configs/fluentbit/fluent-bit.conf
Normal file
15
logging-loki/loki/configs/fluentbit/fluent-bit.conf
Normal file
@ -0,0 +1,15 @@
|
||||
[INPUT]
|
||||
Name forward
|
||||
Listen 0.0.0.0
|
||||
Port 24224
|
||||
[Output]
|
||||
Name grafana-loki
|
||||
Match *
|
||||
Url ${LOKI_URL}
|
||||
RemoveKeys source,container_id
|
||||
Labels {job="fluentbit"}
|
||||
LabelKeys container_name
|
||||
BatchWait 1s
|
||||
BatchSize 1001024
|
||||
LineFormat json
|
||||
LogLevel info
|
82
logging-loki/loki/configs/loki/consul_config.yaml
Normal file
82
logging-loki/loki/configs/loki/consul_config.yaml
Normal file
@ -0,0 +1,82 @@
|
||||
auth_enabled: false
|
||||
|
||||
server:
|
||||
http_listen_port: 3100
|
||||
|
||||
ingester:
|
||||
lifecycler:
|
||||
ring:
|
||||
kvstore:
|
||||
store: consul
|
||||
consul:
|
||||
host: loki-consul:8500
|
||||
heartbeat_timeout: 1m
|
||||
replication_factor: 1
|
||||
num_tokens: 128
|
||||
heartbeat_period: 5s
|
||||
join_after: 0s
|
||||
min_ready_duration: 10s
|
||||
interface_names:
|
||||
- "eth0"
|
||||
final_sleep: 30s
|
||||
chunk_idle_period: 5m
|
||||
chunk_retain_period: 30s
|
||||
|
||||
schema_config:
|
||||
configs:
|
||||
- from: 2020-05-15
|
||||
store: boltdb-shipper
|
||||
object_store: s3
|
||||
schema: v11
|
||||
index:
|
||||
prefix: loki_
|
||||
period: 24h
|
||||
|
||||
storage_config:
|
||||
aws:
|
||||
bucketnames: loki
|
||||
endpoint: minio.$DOMAIN
|
||||
access_key_id: EXAMPLEACCESSKEY
|
||||
secret_access_key: EXAMPLEACCESSSECRET
|
||||
insecure: false
|
||||
s3forcepathstyle: true
|
||||
#s3: s3://EXAMPLEACCESSKEY:EXAMPLEACCESSSECRET@minio.:3000/loki
|
||||
#s3forcepathstyle: true
|
||||
|
||||
boltdb_shipper:
|
||||
active_index_directory: /loki/index
|
||||
cache_location: /loki/index_cache
|
||||
resync_interval: 5s
|
||||
shared_store: s3
|
||||
|
||||
limits_config:
|
||||
enforce_metric_name: false
|
||||
reject_old_samples: true
|
||||
reject_old_samples_max_age: 168h
|
||||
|
||||
chunk_store_config:
|
||||
chunk_cache_config:
|
||||
redis:
|
||||
endpoint: "loki-redis:6379"
|
||||
timeout: 100ms
|
||||
expiration: 0s
|
||||
max_look_back_period: 0s
|
||||
write_dedupe_cache_config:
|
||||
redis:
|
||||
endpoint: "loki-redis:6379"
|
||||
timeout: 100ms
|
||||
expiration: 0s
|
||||
|
||||
table_manager:
|
||||
chunk_tables_provisioning:
|
||||
inactive_read_throughput: 1
|
||||
inactive_write_throughput: 1
|
||||
provisioned_read_throughput: 5
|
||||
provisioned_write_throughput: 5
|
||||
index_tables_provisioning:
|
||||
inactive_read_throughput: 1
|
||||
inactive_write_throughput: 1
|
||||
provisioned_read_throughput: 5
|
||||
provisioned_write_throughput: 5
|
||||
retention_deletes_enabled: false
|
||||
retention_period: 0s
|
55
logging-loki/loki/configs/promtail/promtail-config.yaml
Normal file
55
logging-loki/loki/configs/promtail/promtail-config.yaml
Normal file
@ -0,0 +1,55 @@
|
||||
server:
|
||||
http_listen_port: 9080
|
||||
grpc_listen_port: 0
|
||||
|
||||
positions:
|
||||
filename: /tmp/positions.yaml
|
||||
|
||||
clients:
|
||||
- url: http://loki-distributor:3100/loki/api/v1/push
|
||||
|
||||
scrape_configs:
|
||||
- job_name: logs
|
||||
pipeline_stages:
|
||||
static_configs:
|
||||
- targets:
|
||||
- localhost
|
||||
labels:
|
||||
job: hostlogs
|
||||
environment: home
|
||||
__path__: /var/log/*.log
|
||||
|
||||
|
||||
- job_name: containers
|
||||
static_configs:
|
||||
- targets:
|
||||
- localhost
|
||||
labels:
|
||||
job: containerlogs
|
||||
__path__: /var/lib/docker/containers/*/*log
|
||||
|
||||
pipeline_stages:
|
||||
- json:
|
||||
expressions:
|
||||
output: log
|
||||
stream: stream
|
||||
attrs:
|
||||
- json:
|
||||
expressions:
|
||||
tag:
|
||||
source: attrs
|
||||
- regex:
|
||||
expression: (?P<image_name>(?:[^|]*[^|])).(?P<container_name>(?:[^|]*[^|])).(?P<image_id>(?:[^|]*[^|])).(?P<container_id>(?:[^|]*[^|]))
|
||||
source: tag
|
||||
- timestamp:
|
||||
format: RFC3339Nano
|
||||
source: time
|
||||
- labels:
|
||||
tag:
|
||||
stream:
|
||||
image_name:
|
||||
container_name:
|
||||
image_id:
|
||||
container_id:
|
||||
- output:
|
||||
source: output
|
4
logging-loki/sample-env
Normal file
4
logging-loki/sample-env
Normal file
@ -0,0 +1,4 @@
|
||||
DOMAIN=
|
||||
MINIO_ROOT_USER=
|
||||
MINIO_ROOT_PASSWORD=
|
||||
DOCKER_VOLUME_PATH=.
|
128
rocket-chat/docker-compose.yml
Normal file
128
rocket-chat/docker-compose.yml
Normal file
@ -0,0 +1,128 @@
|
||||
version: "3.7"
|
||||
|
||||
services:
|
||||
rocketchat:
|
||||
image: rocketchat/rocket.chat:latest
|
||||
container_name: rocketchat
|
||||
restart: unless-stopped
|
||||
command: >
|
||||
bash -c
|
||||
"for i in `seq 1 30`; do
|
||||
INSTANCE_IP=$$(hostname -i) node main.js &&
|
||||
s=$$? && break || s=$$?;
|
||||
echo \"Tried $$i times. Waiting 5 secs...\";
|
||||
sleep 5;
|
||||
done; (exit $$s)"
|
||||
volumes:
|
||||
- ${DOCKER_VOLUME_PATH}/rocketchat/app/data/uploads:/app/uploads
|
||||
- /tmp:/tmp
|
||||
environment:
|
||||
- PORT=3000
|
||||
- ROOT_URL=http://chat.$DOMAIN
|
||||
- MONGO_URL=mongodb://rocketchat-mongo:27017/rocketchat
|
||||
- MONGO_OPLOG_URL=mongodb://rocketchat-mongo:27017/local
|
||||
ports:
|
||||
- 9458:9458 # prometheus
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.rocketchat-app.rule=Host(`chat.$DOMAIN`)"
|
||||
- "traefik.http.routers.rocketchat-app.entrypoints=https"
|
||||
- "traefik.http.routers.rocketchat-app.tls.certresolver=dns-cloudflare"
|
||||
- "com.centurylinklabs.watchtower.enable=true"
|
||||
depends_on:
|
||||
- rocketchat-mongo
|
||||
networks:
|
||||
- public
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "1m"
|
||||
|
||||
rocketchat-mongo:
|
||||
image: mongo:4.0
|
||||
container_name: rocketchat-mongo
|
||||
restart: unless-stopped
|
||||
command: mongod --oplogSize 128 --replSet rs0
|
||||
volumes:
|
||||
- ${DOCKER_VOLUME_PATH}/rocketchat/mongo/data/db:/data/db
|
||||
- ${DOCKER_VOLUME_PATH}/rocketchat/mongo/data/backups:/dump
|
||||
networks:
|
||||
- public
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "1m"
|
||||
|
||||
rocketchat-mongo-init-replica:
|
||||
image: mongo:4.0
|
||||
container_name: rocketchat-mono-init-replica
|
||||
command: >
|
||||
bash -c
|
||||
"for i in `seq 1 30`; do
|
||||
mongo rocketchat-mongo/rocketchat --eval \"
|
||||
rs.initiate({
|
||||
_id: 'rs0',
|
||||
members: [ { _id: 0, host: 'localhost:27017' } ]})\" &&
|
||||
s=$$? && break || s=$$?;
|
||||
echo \"Tried $$i times. Waiting 5 secs...\";
|
||||
sleep 5;
|
||||
done; (exit $$s)"
|
||||
depends_on:
|
||||
- rocketchat-mongo
|
||||
networks:
|
||||
- public
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "1m"
|
||||
|
||||
rocketchat-hubot:
|
||||
image: rocketchat/hubot-rocketchat:v1.0.11
|
||||
container_name: rocketchat-hubot
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- MONGODB_URL=mongodb://rocketchat-mongo:27017/hubot-brain
|
||||
- ROCKETCHAT_URL=rocketchat:3000
|
||||
- ROCKETCHAT_ROOM=GENERAL
|
||||
- ROCKETCHAT_USER=${ROCKETCHAT_USER}
|
||||
- ROCKETCHAT_PASSWORD=${ROCKETCHAT_PASSWORD}
|
||||
- BOT_NAME=${ROCKETCHAT_BOT_NAME}
|
||||
- RESPOND_TO_DM=true
|
||||
- LISTEN_ON_ALL_PUBLIC=true
|
||||
- EXTERNAL_SCRIPTS=${ROCKETCHAT_EXTERNAL_SCRIPTS}
|
||||
- TZ=${TZ}
|
||||
depends_on:
|
||||
- rocketchat
|
||||
volumes:
|
||||
- ${DOCKER_VOLUME_PATH}/rocketchat/hubot/data/hubotscripts:/home/hubot/scripts
|
||||
ports:
|
||||
- 3011:8081
|
||||
networks:
|
||||
- public
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "1m"
|
||||
|
||||
rocketchat-mongo-express:
|
||||
image: mongo-express
|
||||
container_name: roccketchat-mongo-express
|
||||
environment:
|
||||
- ME_CONFIG_MONGODB_URL=mongodb://rocketchat-mongo:27017/
|
||||
- ME_CONFIG_MONGODB_ENABLE_ADMIN=true
|
||||
- ME_CONFIG_BASICAUTH_USERNAME=admin
|
||||
- ME_CONFIG_BASICAUTH_PASSWORD=$ME_CONFIG_BASICAUTH_PASSWORD
|
||||
ports:
|
||||
- 18087:8081
|
||||
networks:
|
||||
- public
|
||||
depends_on:
|
||||
- rocketchat-mongo
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "1m"
|
||||
|
||||
networks:
|
||||
public:
|
||||
name: public
|
10
rocket-chat/sample-env
Normal file
10
rocket-chat/sample-env
Normal file
@ -0,0 +1,10 @@
|
||||
DOMAIN=
|
||||
ME_CONFIG_BASICAUTH_PASSWORD=
|
||||
DOCKER_VOLUME_PATH=.
|
||||
ROCKETCHAT_ROOM=GENERAL
|
||||
ROCKETCHAT_USER=hubot
|
||||
ROCKETCHAT_PASSWORD=
|
||||
ROCKETCHAT_BOT_NAME=hubot
|
||||
# https://developer.rocket.chat/guides/bots-guides/create-and-run-a-bot/run-a-hubot-bot
|
||||
ROCKETCHAT_EXTERNAL_SCRIPTS=hubot-help,hubot-diagnostics,hubot-seen,hubot-links,hubot-pugme,hubot-memes,hubot-isup
|
||||
TZ=/usr/share/zoneinfo/Africa/Johannesburg
|
82
traefik/docker-compose.yml
Normal file
82
traefik/docker-compose.yml
Normal file
@ -0,0 +1,82 @@
|
||||
# Resources
|
||||
# - https://www.smarthomebeginner.com/cloudflare-settings-for-traefik-docker/
|
||||
# - https://www.smarthomebeginner.com/traefik-2-docker-tutorial/
|
||||
# - https://gist.github.com/coltenkrauter/124ec31d616fa4c0dcf25d79462a6237
|
||||
# - https://faun.pub/deploy-nextcloud-with-docker-compose-traefik-2-postgresql-and-redis-fd1ffc166173
|
||||
# - https://github.com/jnsgruk/nextcloud-docker-compose/blob/master/traefik/docker-compose.yml
|
||||
# - https://doc.traefik.io/traefik/middlewares/basicauth/
|
||||
# Generate auth:
|
||||
# echo $(htpasswd -nb user password) | sed -e s/\\$/\\$\\$/g
|
||||
# https://gist.github.com/coltenkrauter/124ec31d616fa4c0dcf25d79462a6237
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
traefik:
|
||||
image: traefik:livarot
|
||||
container_name: traefik
|
||||
restart: unless-stopped
|
||||
env_file: .env
|
||||
command:
|
||||
- "--api=true"
|
||||
- "--api.dashboard=true"
|
||||
- "--certificatesresolvers.letsencrypt.acme.httpchallenge=true"
|
||||
- "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=http"
|
||||
- "--certificatesresolvers.letsencrypt.acme.email=$EMAIL"
|
||||
- "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
|
||||
- "--certificatesresolvers.dns-cloudflare.acme.email=$EMAIL"
|
||||
- "--certificatesresolvers.dns-cloudflare.acme.storage=/cloudflare/acme.json"
|
||||
- "--certificatesresolvers.dns-cloudflare.acme.dnsChallenge.provider=cloudflare"
|
||||
- "--certificatesresolvers.dns-cloudflare.acme.dnsChallenge.resolvers=1.1.1.1:53,1.0.0.1:53"
|
||||
- "--certificatesresolvers.dns-cloudflare.acme.dnsChallenge.delayBeforeCheck=90"
|
||||
- "--entrypoints.http.address=:80"
|
||||
- "--entrypoints.https.address=:443"
|
||||
- "--entrypoints.https.forwardedHeaders.trustedIPs=173.245.48.0/20,103.21.244.0/22,103.22.200.0/22,103.31.4.0/22,141.101.64.0/18,108.162.192.0/18,190.93.240.0/20,188.114.96.0/20,197.234.240.0/22,198.41.128.0/17,162.158.0.0/15,104.16.0.0/13,104.24.0.0/14,172.64.0.0/13,131.0.72.0/22,104.16.0.0/13,104.24.0.0/14" # allow cloudflare source ips to set x-forwarded-for headers - https://www.cloudflare.com/ips-v4
|
||||
- "--entrypoints.https.http.tls.certresolver=dns-cloudflare"
|
||||
- "--entrypoints.https.http.tls.domains[0].main=$DOMAIN"
|
||||
- "--entrypoints.https.http.tls.domains[0].sans=*.$DOMAIN"
|
||||
- "--entrypoints.https.http.tls.domains[1].main=$DOMAIN2"
|
||||
- "--entrypoints.https.http.tls.domains[1].sans=*.$DOMAIN2"
|
||||
- "--entrypoints.https.http.tls.options=tls-opts@file"
|
||||
- "--log.level=INFO"
|
||||
- "--log.format=json"
|
||||
- "--metrics.prometheus=true"
|
||||
- "--ping=true"
|
||||
- "--providers.docker=true"
|
||||
- "--providers.docker.endpoint=unix:///var/run/docker.sock"
|
||||
- "--providers.docker.exposedbydefault=false"
|
||||
- "--providers.docker.network=public"
|
||||
- "--providers.docker.swarmMode=false"
|
||||
environment:
|
||||
- CF_API_EMAIL=$CF_API_EMAIL
|
||||
- CF_API_KEY=$CF_API_KEY
|
||||
ports:
|
||||
- 80:80
|
||||
- 443:443
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
- $DOCKER_VOLUME_PATH/traefik/auth:/auth
|
||||
- $DOCKER_VOLUME_PATH/traefik/letsencrypt:/letsencrypt
|
||||
- $DOCKER_VOLUME_PATH/traefik/cloudflare:/cloudflare
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
# catchall for redirecting http to https
|
||||
- "traefik.http.routers.http-catchall.entrypoints=http"
|
||||
- "traefik.http.routers.http-catchall.rule=HostRegexp(`{host:.+}`)"
|
||||
- "traefik.http.routers.http-catchall.middlewares=redirect-to-https"
|
||||
- "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https"
|
||||
- "traefik.http.routers.traefik-rtr.entrypoints=https"
|
||||
- "traefik.http.routers.traefik-rtr.rule=Host(`traefik.$DOMAIN`)"
|
||||
- "traefik.http.routers.traefik-rtr.service=api@internal"
|
||||
- "traefik.http.routers.traefik-rtr.middlewares=dashboard-auth"
|
||||
- "traefik.http.middlewares.dashboard-auth.basicauth.usersfile=/auth/passwords"
|
||||
- "traefik.http.services.api@internal.loadbalancer.server.port=8080"
|
||||
networks:
|
||||
- public
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "1m"
|
||||
|
||||
networks:
|
||||
public:
|
||||
name: public
|
3
traefik/sample-env
Normal file
3
traefik/sample-env
Normal file
@ -0,0 +1,3 @@
|
||||
DOCKER_VOLUME_PATH=.
|
||||
DOMAIN=
|
||||
DOMAIN2=
|
Loading…
x
Reference in New Issue
Block a user