Added redis and discourse with plus support

This commit is contained in:
root 2025-01-29 19:34:30 +00:00
parent 32dc3e2ff0
commit 6594e44b3a
2 changed files with 51 additions and 45 deletions

View File

@ -3,10 +3,13 @@
# Discourse Service # Discourse Service
PATH=$HOME/.docker/cli-plugins:/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin PATH=$HOME/.docker/cli-plugins:/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
. /etc/federated
get_appvars get_appvars
config_discourse() { config_discourse() {
echo -ne "\n* Configuring discourse container.." echo -ne "* Configuring discourse container.."
[[ ! -d "/federated/apps/redis" ]] && failcheck "Redis needs installed first. Run installapp redis"
if [ ! -d "/federated/apps/discourse" ]; then if [ ! -d "/federated/apps/discourse" ]; then
mkdir -p /federated/apps/discourse/data/discourse/bitnami/discourse mkdir -p /federated/apps/discourse/data/discourse/bitnami/discourse
@ -14,7 +17,6 @@ config_discourse() {
fi fi
cat > /federated/apps/discourse/docker-compose.yml <<EOF cat > /federated/apps/discourse/docker-compose.yml <<EOF
version: "3.7"
services: services:
discourse: discourse:
image: docker.io/bitnami/discourse:\${IMAGE_VERSION} image: docker.io/bitnami/discourse:\${IMAGE_VERSION}
@ -30,7 +32,7 @@ services:
- ./data/discourse/bitnami/discourse:/bitnami/discourse - ./data/discourse/bitnami/discourse:/bitnami/discourse
labels: labels:
- "traefik.enable=true" - "traefik.enable=true"
- "traefik.http.routers.discourse.rule=Host(\`discourse.$DOMAIN\`)" - "traefik.http.routers.discourse.rule=Host(\`discourse.$DOMAIN\`, \`forum.$DOMAIN\`)"
- "traefik.http.routers.discourse.entrypoints=websecure" - "traefik.http.routers.discourse.entrypoints=websecure"
- "traefik.http.routers.discourse.tls.certresolver=letsencrypt" - "traefik.http.routers.discourse.tls.certresolver=letsencrypt"
@ -56,63 +58,76 @@ networks:
EOF EOF
DISCOURSE_SECRET=$(create_password); DISCOURSE_SECRET=$(create_password);
REDIS_SECRET=$(awk -F= '/REDIS_PASSWORD/ { print $2 }' /federated/apps/redis/.env)
[[ "${PLUS}" = "true" ]] && sed -i "s/letsencrypt/httpresolver/g" /federated/apps/discourse/docker-compose.yml
cat > /federated/apps/discourse/.env <<EOF cat > /federated/apps/discourse/.env <<EOF
IMAGE_VERSION="3.2.5" IMAGE_VERSION="3.3.3"
DISCOURSE_HOST=discourse.$DOMAIN DISCOURSE_HOST=discourse.$DOMAIN
DISCOURSE_USERNAME=admin@$DOMAIN DISCOURSE_USERNAME=admin
DISCOURSE_PASSWORD=$ADMINPASS DISCOURSE_PASSWORD=$ADMINPASS
DISCOURSE_EMAIL=admin@$DOMAIN DISCOURSE_EMAIL=admin@$DOMAIN
DISCOURSE_SITE_NAME="$COMPANY Forum" DISCOURSE_SITE_NAME="$COMPANY Forum"
DISCOURSE_DATABASE_HOST=10.0.0.2 DISCOURSE_DATABASE_HOST=postgresql.$DOMAIN
DISCOURSE_DATABASE_PORT_NUMBER=5432 DISCOURSE_DATABASE_PORT_NUMBER=5432
DISCOURSE_DATABASE_USER=discourse DISCOURSE_DATABASE_USER=discourse
DISCOURSE_DATABASE_NAME=discourse DISCOURSE_DATABASE_NAME=discourse
DISCOURSE_DATABASE_PASSWORD=$DISCOURSE_SECRET DISCOURSE_DATABASE_PASSWORD=$DISCOURSE_SECRET
#DISCOURSE_REDIS_HOST=redis.$DOMAIN DISCOURSE_REDIS_HOST=redis.$DOMAIN
#DISCOURSE_REDIS_PORT_NUMBER=6379 DISCOURSE_REDIS_PORT_NUMBER=6379
#DISCOURSE_REDIS_PASSWORD=$REDIS_SECRET DISCOURSE_REDIS_PASSWORD=$REDIS_SECRET
DISCOURSE_SMTP_HOST=mail.$DOMAIN DISCOURSE_SMTP_HOST=mail.$DOMAIN
DISCOURSE_SMTP_PORT=587 DISCOURSE_SMTP_PORT=587
DISCOURSE_SMTP_USER=fcore DISCOURSE_SMTP_USER=fcore
DISCOURSE_SMTP_PASSWORD=$ADMINPASS DISCOURSE_SMTP_PASSWORD=$ADMINPASS
DISCOURSE_SMTP_PROTOCOL=tls DISCOURSE_SMTP_PROTOCOL=tls
BITNAMI_DEBUG=true BITNAMI_DEBUG=true
DISCOURSE_HOSTNAME=forum.$DOMAIN
DISCOURSE_SMTP_ADDRESS=mail.$DOMAIN
DISCOURSE_SMTP_USER_NAME=fcore
DISCOURSE_SMTP_ENABLE_START_TLS=true
RAILS_ENV=production
DISCOURSE_DB_HOST=postgresql.$DOMAIN
DISCOURSE_DB_PORT=5432
DISCOURSE_DB_USERNAME=discourse
DISCOURSE_DB_PASSWORD=$DISCOURSE_SECRET
DISCOURSE_DB_NAME=discourse
DISCOURSE_REDIS_PORT=6379
DISCOURSE_PASSENGER_EXTRA_FLAGS="--max-request-queue-size 1500 --min-instances 25 --max-pool-size 150 --pool-idle-time 800"
DISCOURSE_ASSET_RATE_LIMITERS=limiter60
DISCOURSE_RATE_LIMITERS=limiter60
DISCOURSE_MAX_REQS_PER_IP_EXCEPTIONS=172.99.0.13
EOF EOF
chmod 600 /federated/apps/discourse/.env chmod 600 /federated/apps/discourse/.env
MYSQL_ROOTPASSWORD="BOwSp7RpdmjulTY5XH1ULKOVwZpyNeDI" # Tune discourse for each memory size
# Create database and user in mysql MEMTOTAL=$(awk '/MemTotal/ {printf( "%d\n", $2 / 1024 )}' /proc/meminfo)
#docker exec pdnsmysql bash -c "mysql -uroot -p$MYSQL_ROOTPASSWORD -h 10.0.0.2 -e 'create database discourse;'" &> /dev/null [[ "${MEMTOTAL}" = "3815" ]] && sed -i "s/DISCOURSE_PASSENGER_EXTRA_FLAGS=.*/DISCOURSE_PASSENGER_EXTRA_FLAGS=\"--max-request-queue-size 100 --min-instances 3 --max-pool-size 15 --pool-idle-time 400\"/g" /federated/apps/discourse/.env
#docker exec pdnsmysql bash -c "mysql -uroot -p$MYSQL_ROOTPASSWORD -h 10.0.0.2 -e \"CREATE USER 'discourse'@'%' IDENTIFIED BY '$DISCOURSE_SECRET';\"" &> /dev/null [[ "${MEMTOTAL}" = "7747" ]] && sed -i "s/DISCOURSE_PASSENGER_EXTRA_FLAGS=.*/DISCOURSE_PASSENGER_EXTRA_FLAGS=\"--max-request-queue-size 200 --min-instances 5 --max-pool-size 25 --pool-idle-time 500\"/g" /federated/apps/discourse/.env
#docker exec pdnsmysql bash -c "mysql -uroot -p$MYSQL_ROOTPASSWORD -h 10.0.0.2 -e \"grant all privileges on discourse.* to 'discourse'@'%';\"" &> /dev/null [[ "${MEMTOTAL}" = "15610" ]] && sed -i "s/DISCOURSE_PASSENGER_EXTRA_FLAGS=.*/DISCOURSE_PASSENGER_EXTRA_FLAGS=\"--max-request-queue-size 400 --min-instances 10 --max-pool-size 50 --pool-idle-time 600\"/g" /federated/apps/discourse/.env
#docker exec pdnsmysql bash -c "mysql -uroot -p$MYSQL_ROOTPASSWORD -h 10.0.0.2 -e 'flush privileges;'" &> /dev/null [[ "${MEMTOTAL}" = "31334" ]] && sed -i "s/DISCOURSE_PASSENGER_EXTRA_FLAGS=.*/DISCOURSE_PASSENGER_EXTRA_FLAGS=\"--max-request-queue-size 750 --min-instances 15 --max-pool-size 75 --pool-idle-time 700\"/g" /federated/apps/discourse/.env
[[ "${MEMTOTAL}" = "62786" ]] && sed -i "s/DISCOURSE_PASSENGER_EXTRA_FLAGS=.*/DISCOURSE_PASSENGER_EXTRA_FLAGS=\"--max-request-queue-size 1500 --min-instances 25 --max-pool-size 150 --pool-idle-time 800\"/g" /federated/apps/discourse/.env
# Create database and user in postgresql # Create database and user in postgresql
docker exec postgresql bash -c "PGPASSWORD=LUemlFaADvgD0QCVn9KDaqy9qKpn05Ed psql -U postgres -h 10.0.0.2 -w -c \"CREATE USER discourse WITH PASSWORD '$DISCOURSE_SECRET'\"" docker exec postgresql psql -U postgres -c "CREATE USER discourse WITH PASSWORD '$DISCOURSE_SECRET'" &> /dev/null
docker exec postgresql bash -c "PGPASSWORD=LUemlFaADvgD0QCVn9KDaqy9qKpn05Ed psql -U postgres -h 10.0.0.2 -w -c \"CREATE DATABASE discourse\"" docker exec postgresql psql -U postgres -c "CREATE DATABASE discourse" &> /dev/null
docker exec postgresql bash -c "PGPASSWORD=LUemlFaADvgD0QCVn9KDaqy9qKpn05Ed psql -U postgres -h 10.0.0.2 -w -c \"GRANT ALL PRIVILEGES ON DATABASE discourse TO discourse\"" docker exec postgresql psql -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE discourse TO discourse" &> /dev/null
#docker exec postgresql psql -U postgres -c "CREATE USER discourse WITH PASSWORD '$DISCOURSE_SECRET'" &> /dev/null
#docker exec postgresql psql -U postgres -c "CREATE DATABASE discourse" &> /dev/null
#docker exec postgresql psql -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE discourse TO discourse" &> /dev/null
echo -ne "done.\n" echo -ne "done.\n"
} }
start_discourse() { start_discourse() {
# Start service with command to make sure it's up before proceeding # Start service with command to make sure it's up before proceeding
start_service "discourse" "nc -z 192.168.0.43 8080 &> /dev/null" "7" start_service "discourse" "nc -z 192.168.0.43 8080 &> /dev/null" "19"
if [[ "${PLUS}" != "true" ]]; then
docker exec pdns pdnsutil add-record $DOMAIN discourse A 86400 $EXTERNALIP &> /dev/null docker exec pdns pdnsutil add-record $DOMAIN discourse A 86400 $EXTERNALIP &> /dev/null
[ $? -ne 0 ] && fail "Couldn't add dns record for discourse" docker exec pdns pdnsutil add-record $DOMAIN forum A 86400 $EXTERNALIP &> /dev/null
fi
kill -9 $SPINPID &> /dev/null
echo -ne "done.\n" echo -ne "done.\n"
} }
email_discourse() { email_discourse() {
echo -ne "* Sending email to customer.." echo -ne "* Sending email to customer.."
spin &
SPINPID=$!
cat > /federated/apps/mail/data/root/certs/mailfile <<EOF cat > /federated/apps/mail/data/root/certs/mailfile <<EOF
<html> <html>
@ -184,13 +199,10 @@ EOF
docker exec mail bash -c "mail -r admin@$DOMAIN -a \"Content-type: text/html\" -s \"Application installed on $DOMAIN\" $EMAIL < /root/certs/mailfile" docker exec mail bash -c "mail -r admin@$DOMAIN -a \"Content-type: text/html\" -s \"Application installed on $DOMAIN\" $EMAIL < /root/certs/mailfile"
rm /federated/apps/mail/data/root/certs/mailfile rm /federated/apps/mail/data/root/certs/mailfile
kill -9 $SPINPID &> /dev/null
echo -ne "done.\n" echo -ne "done.\n"
} }
uninstall_discourse() { uninstall_discourse() {
echo -ne "* Uninstalling discourse container.." echo -ne "* Uninstalling discourse container.."
spin &
SPINPID=$!
# First stop the service # First stop the service
cd /federated/apps/discourse && docker compose -f docker-compose.yml -p discourse down &> /dev/null cd /federated/apps/discourse && docker compose -f docker-compose.yml -p discourse down &> /dev/null
@ -202,6 +214,10 @@ uninstall_discourse() {
# Delete the app directory # Delete the app directory
rm -rf /federated/apps/discourse rm -rf /federated/apps/discourse
kill -9 $SPINPID &> /dev/null if [[ "${PLUS}" != "true" ]]; then
docker exec pdns pdnsutil delete-rrset $DOMAIN discourse A &> /dev/null
docker exec pdns pdnsutil delete-rrset $DOMAIN forum A &> /dev/null
fi
echo -ne "done.\n" echo -ne "done.\n"
} }

View File

@ -3,10 +3,11 @@
# Redis Service # Redis Service
PATH=$HOME/.docker/cli-plugins:/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin PATH=$HOME/.docker/cli-plugins:/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
. /etc/federated
get_appvars get_appvars
config_redis() { config_redis() {
echo -ne "\n* Configuring redis container.." echo -ne "* Configuring redis container.."
if [ ! -d "/federated/apps/redis" ]; then if [ ! -d "/federated/apps/redis" ]; then
mkdir -p /federated/apps/redis/data/bitnami/redis/data mkdir -p /federated/apps/redis/data/bitnami/redis/data
@ -14,7 +15,6 @@ config_redis() {
fi fi
cat > /federated/apps/redis/docker-compose.yml <<EOF cat > /federated/apps/redis/docker-compose.yml <<EOF
version: "3.7"
services: services:
redis: redis:
image: bitnami/redis:\${IMAGE_VERSION} image: bitnami/redis:\${IMAGE_VERSION}
@ -28,11 +28,6 @@ services:
- ./.env - ./.env
volumes: volumes:
- ./data/bitnami/redis/data:/bitnami/redis/data - ./data/bitnami/redis/data:/bitnami/redis/data
# labels:
# - "traefik.enable=true"
# - "traefik.http.routers.redis.rule=Host(\`redis.$DOMAIN\`)"
# - "traefik.http.routers.redis.entrypoints=websecure"
# - "traefik.http.routers.redis.tls.certresolver=letsencrypt"
networks: networks:
core: core:
@ -47,7 +42,7 @@ REDIS_PASSWORD=$REDIS_SECRET
EOF EOF
chmod 600 /federated/apps/redis/.env chmod 600 /federated/apps/redis/.env
sysctl "vm.overcommit_memory=1" sysctl "vm.overcommit_memory=1" &> /dev/null
echo -ne "done.\n" echo -ne "done.\n"
} }
@ -55,19 +50,14 @@ start_redis() {
# Start service with command to make sure it's up before proceeding # Start service with command to make sure it's up before proceeding
start_service "redis" "nc -z 192.168.0.45 6379 &> /dev/null" "7" start_service "redis" "nc -z 192.168.0.45 6379 &> /dev/null" "7"
kill -9 $SPINPID &> /dev/null
echo -ne "done.\n" echo -ne "done.\n"
} }
uninstall_redis() { uninstall_redis() {
spin &
SPINPID=$!
# First stop the service # First stop the service
cd /federated/apps/redis && docker compose -f docker-compose.yml -p redis down &> /dev/null cd /federated/apps/redis && docker compose -f docker-compose.yml -p redis down &> /dev/null
# Delete the app directory # Delete the app directory
rm -rf /federated/apps/redis rm -rf /federated/apps/redis
kill -9 $SPINPID &> /dev/null
echo -ne "done.\n" echo -ne "done.\n"
} }