diff --git a/ansible/roles/redis/handlers/main.yml b/ansible/roles/redis/handlers/main.yml index f5774f52b..f1c4ca86e 100644 --- a/ansible/roles/redis/handlers/main.yml +++ b/ansible/roles/redis/handlers/main.yml @@ -10,17 +10,17 @@ - name: restart redis user become: yes - command: docker restart redis_user + command: docker restart redis-user listen: restart redis_user - name: restart redis story become: yes - command: docker restart redis_story + command: docker restart redis-story listen: restart redis_story - name: restart redis session become: yes - command: docker restart redis_session + command: docker restart redis-session listen: restart redis_session - name: restart redis pubsub become: yes - command: docker restart redis_pubsub + command: docker restart redis-pubsub listen: restart redis_pubsub diff --git a/apps/reader/views.py b/apps/reader/views.py index 7a6bbcc22..7e15949a5 100644 --- a/apps/reader/views.py +++ b/apps/reader/views.py @@ -1,73 +1,114 @@ +import base64 +import concurrent import datetime +import random +import re +import socket +import ssl import time +import urllib.error +import urllib.parse +import urllib.request +import zlib + import redis import requests -import random -import zlib -import concurrent -import re -import ssl -import socket -import base64 -import urllib.request, urllib.error, urllib.parse -from django.shortcuts import get_object_or_404 -from django.shortcuts import render -from django.contrib.auth.decorators import login_required -from django.template.loader import render_to_string -from django.db import IntegrityError -from django.db.utils import DatabaseError -from django.db.models import Q -from django.views.decorators.cache import never_cache -from django.urls import reverse +from django.conf import settings from django.contrib.auth import login as login_user from django.contrib.auth import logout as logout_user +from django.contrib.auth.decorators import login_required from django.contrib.auth.models import User -from django.http import HttpResponse, HttpResponseRedirect, HttpResponseForbidden, Http404, UnreadablePostError -from django.conf import settings +from django.contrib.sites.models import Site from django.core.mail import EmailMultiAlternatives from django.core.validators import validate_email -from django.contrib.sites.models import Site +from django.db import IntegrityError +from django.db.models import Q +from django.db.utils import DatabaseError +from django.http import ( + Http404, + HttpResponse, + HttpResponseForbidden, + HttpResponseRedirect, + UnreadablePostError, +) +from django.shortcuts import get_object_or_404, render +from django.template.loader import render_to_string +from django.urls import reverse from django.utils import feedgenerator from django.utils.encoding import smart_str -from mongoengine.queryset import OperationError -from mongoengine.queryset import NotUniqueError -from apps.recommendations.models import RecommendedFeed -from apps.analyzer.models import MClassifierTitle, MClassifierAuthor, MClassifierFeed, MClassifierTag -from apps.analyzer.models import apply_classifier_titles, apply_classifier_feeds -from apps.analyzer.models import apply_classifier_authors, apply_classifier_tags -from apps.analyzer.models import get_classifiers_for_user, sort_classifiers_by_feed -from apps.profile.models import Profile, MCustomStyling, MDashboardRiver -from apps.reader.models import UserSubscription, UserSubscriptionFolders, RUserStory, RUserUnreadStory, Feature -from apps.reader.forms import SignupForm, LoginForm, FeatureForm -from apps.rss_feeds.models import MFeedIcon, MStarredStoryCounts, MSavedSearch +from django.views.decorators.cache import never_cache +from mongoengine.queryset import NotUniqueError, OperationError + +from apps.analyzer.models import ( + MClassifierAuthor, + MClassifierFeed, + MClassifierTag, + MClassifierTitle, + apply_classifier_authors, + apply_classifier_feeds, + apply_classifier_tags, + apply_classifier_titles, + get_classifiers_for_user, + sort_classifiers_by_feed, +) from apps.notifications.models import MUserFeedNotification +from apps.profile.models import MCustomStyling, MDashboardRiver, Profile +from apps.reader.forms import FeatureForm, LoginForm, SignupForm +from apps.reader.models import ( + Feature, + RUserStory, + RUserUnreadStory, + UserSubscription, + UserSubscriptionFolders, +) +from apps.recommendations.models import RecommendedFeed +from apps.rss_feeds.models import MFeedIcon, MSavedSearch, MStarredStoryCounts from apps.search.models import MUserSearch -from apps.statistics.models import MStatistics, MAnalyticsLoader +from apps.statistics.models import MAnalyticsLoader, MStatistics from apps.statistics.rstats import RStats + # from apps.search.models import SearchStarredStory try: - from apps.rss_feeds.models import Feed, MFeedPage, DuplicateFeed, MStory, MStarredStory + from apps.rss_feeds.models import ( + DuplicateFeed, + Feed, + MFeedPage, + MStarredStory, + MStory, + ) except: pass -from apps.social.models import MSharedStory, MSocialProfile, MSocialServices -from apps.social.models import MSocialSubscription, MActivity, MInteraction -from apps.categories.models import MCategory -from apps.social.views import load_social_page -from apps.rss_feeds.tasks import ScheduleImmediateFetches -from utils import json_functions as json -from utils.user_functions import get_user, ajax_login_required -from utils.user_functions import extract_user_agent -from utils.feed_functions import relative_timesince -from utils.story_functions import format_story_link_date__short -from utils.story_functions import format_story_link_date__long -from utils.story_functions import strip_tags -from utils import log as logging -from utils.view_functions import get_argument_or_404, render_to, is_true -from utils.view_functions import required_params -from utils.ratelimit import ratelimit -from vendor.timezones.utilities import localtime_for_timezone import tweepy +from apps.categories.models import MCategory +from apps.rss_feeds.tasks import ScheduleImmediateFetches +from apps.social.models import ( + MActivity, + MInteraction, + MSharedStory, + MSocialProfile, + MSocialServices, + MSocialSubscription, +) +from apps.social.views import load_social_page +from utils import json_functions as json +from utils import log as logging +from utils.feed_functions import relative_timesince +from utils.ratelimit import ratelimit +from utils.story_functions import ( + format_story_link_date__long, + format_story_link_date__short, + strip_tags, +) +from utils.user_functions import ajax_login_required, extract_user_agent, get_user +from utils.view_functions import ( + get_argument_or_404, + is_true, + render_to, + required_params, +) +from vendor.timezones.utilities import localtime_for_timezone + BANNED_URLS = [ "brentozar.com", ] @@ -75,6 +116,7 @@ ALLOWED_SUBDOMAINS = [ 'dev', 'www', 'hwww', + 'dwww', # 'beta', # Comment to redirect beta -> www, uncomment to allow beta -> staging (+ dns changes) 'staging', 'hstaging', diff --git a/docker/redis/redis_replica.conf.j2 b/docker/redis/redis_replica.conf.j2 index 7cbf10013..b26c91a3a 100644 --- a/docker/redis/redis_replica.conf.j2 +++ b/docker/redis/redis_replica.conf.j2 @@ -1 +1 @@ -replicaof {{ inventory_hostname|regex_replace('\-?\d+', '')|regex_replace('hdb\-', 'db-')|regex_replace('db-redis-session', 'db-redis-sessions') }}.service.nyc1.consul 6379 +replicaof {{ inventory_hostname|regex_replace('\-?\d+', '')|regex_replace('hdb\-', 'db-') }}.service.nyc1.consul {{ redis_port }} diff --git a/terraform/digitalocean.tf b/terraform/digitalocean.tf index fbde9a509..8ffbafb6e 100644 --- a/terraform/digitalocean.tf +++ b/terraform/digitalocean.tf @@ -103,7 +103,7 @@ resource "digitalocean_droplet" "www" { } resource "digitalocean_droplet" "app-django" { - count = 9 + count = 0 image = var.droplet_os name = "app-django${count.index + 1}" region = var.droplet_region @@ -121,7 +121,7 @@ resource "digitalocean_droplet" "app-django" { } resource "digitalocean_droplet" "app-counts" { - count = 2 + count = 0 image = var.droplet_os name = "app-counts${count.index + 1}" region = var.droplet_region @@ -139,7 +139,7 @@ resource "digitalocean_droplet" "app-counts" { } resource "digitalocean_droplet" "app-push" { - count = 2 + count = 0 image = var.droplet_os name = "app-push${count.index + 1}" region = var.droplet_region @@ -157,7 +157,7 @@ resource "digitalocean_droplet" "app-push" { } resource "digitalocean_droplet" "app-refresh" { - count = 8 + count = 0 image = var.droplet_os name = "app-refresh${count.index + 1}" region = var.droplet_region @@ -228,7 +228,7 @@ resource "digitalocean_droplet" "discovery" { } resource "digitalocean_droplet" "node-text" { - count = 4 + count = 0 image = var.droplet_os name = contains([0], count.index) ? "node-text" : "node-text${count.index + 1}" region = var.droplet_region @@ -246,7 +246,7 @@ resource "digitalocean_droplet" "node-text" { } resource "digitalocean_droplet" "node-socket" { - count = 2 + count = 0 image = var.droplet_os name = "node-socket${count.index + 1}" region = var.droplet_region @@ -264,7 +264,7 @@ resource "digitalocean_droplet" "node-socket" { } resource "digitalocean_droplet" "node-favicons" { - count = 2 + count = 0 image = var.droplet_os name = "node-favicons${count.index + 1}" region = var.droplet_region @@ -282,7 +282,7 @@ resource "digitalocean_droplet" "node-favicons" { } resource "digitalocean_droplet" "node-images" { - count = 2 + count = 0 image = var.droplet_os name = "node-images${count.index + 1}" region = var.droplet_region @@ -310,6 +310,7 @@ resource "digitalocean_volume" "node_page_volume" { } resource "digitalocean_droplet" "node-page" { + count = 0 image = var.droplet_os name = "node-page" region = var.droplet_region @@ -384,7 +385,7 @@ resource "digitalocean_droplet" "db-redis-sessions" { resource "digitalocean_droplet" "db-redis-story" { count = 1 image = var.droplet_os - name = "db-redis-story${count.index + 2}" + name = "db-redis-story${count.index + 1}" region = var.droplet_region # size = contains([1], count.index) ? "m-8vcpu-64gb" : var.redis_story_droplet_size size = var.redis_story_droplet_size @@ -596,7 +597,7 @@ resource "digitalocean_droplet" "db-sentry" { # apd -l "task-celery4*" --tags stop; servers=$(for i in {39..48}; do echo -n "-target=\"digitalocean_droplet.task-celery[$i]\" " ; done); tf apply -refresh=false `eval echo $servers` resource "digitalocean_droplet" "task-celery" { - count = 79 + count = 0 image = var.droplet_os name = format("task-celery%02v", count.index + 1) region = var.droplet_region @@ -615,7 +616,7 @@ resource "digitalocean_droplet" "task-celery" { } resource "digitalocean_droplet" "task-work" { - count = 3 + count = 0 image = var.droplet_os name = "task-work${count.index + 1}" region = var.droplet_region