Создаем сеть: docker network create app-network Войти в БД: docker exec -it postgres psql -U ncp_db -d no_copy_ Выполнить команду: \du Должен быть один пользователь: List of roles Role name | Attributes -----------+------------------------------------------------------------ ncp_db | Superuser, Create role, Create DB, Replication, Bypass RLS суперпользователь БД: postgres/postgres пользователь бд для бэка ncp_db / ncpDbApp Подключение к БД для приложения,если volume не существует : Создаться автоматически. Если уже существует volume : docker exec -it postgres psql -U postgres -d postgres CREATE USER ncp_db WITH PASSWORD 'ncpDbApp'; GRANT ALL PRIVILEGES ON DATABASE no_copy_ TO ncp_db; \du \q ------- psql -U postgres -d no_copy_ -- база GRANT CONNECT ON DATABASE no_copy_ TO ncp_db; -- схема GRANT USAGE ON SCHEMA public TO ncp_db; -- существующие таблицы GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO ncp_db; -- существующие sequence (очень важно для id) GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO ncp_db; -- будущие таблицы ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO ncp_db; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO ncp_db; Зайти в контейнер: docker exec -it {name} bash ------ Создать для сущности FileEntity sequence для икремента индетификатора CREATE SEQUENCE IF NOT EXISTS file_support_id_seq START 1; ALTER TABLE file_entities ALTER COLUMN support_id SET DEFAULT nextval('file_support_id_seq'); ---------- Раздать всем лимиты,у кого их нет INSERT INTO protect_check (user_id, check_limit, count_checked, last_check_at, version) SELECT id as user_id, 10 as check_limit, 0 as count_checked, NULL as last_check_at, 0 as version FROM users WHERE id NOT IN (SELECT user_id FROM protect_check); -------- Обновлять констрейнты для file_entities ALTER TABLE file_entities DROP CONSTRAINT file_entities_status_check; ALTER TABLE file_entities ADD CONSTRAINT file_entities_status_check CHECK (status IN ( 'ACTIVE', 'DELETED', 'PROCESSING', 'VIOLATION', 'CHECKED', 'ERROR', 'TEMP' )); ------- Записи для лимитов поиска INSERT INTO protect_check (user_id, limit_check, count_checked, last_check_at, version) SELECT u.id, 100, -- limit_check = 100 0, -- count_checked = 0 NULL, -- last_check_at = NULL 0 -- version = 0 FROM users u WHERE NOT EXISTS ( SELECT 1 FROM protect_check pc WHERE pc.user_id = u.id ); ------ Скрипты рефералки INSERT INTO referrals (user_id, referral_link, inviter_id, level_id, total_income, is_active, created_at, hold_balance) SELECT u.id as user_id, CONCAT('ref-', u.id, '-', LOWER(SUBSTRING(MD5(RANDOM()::text) FROM 1 FOR 8))) as referral_link, NULL as inviter_id, 'bronze' as level_id, 0 as total_income, false as is_active, NOW() as created_at, 0 as hold_balance FROM users u LEFT JOIN referrals r ON u.id = r.user_id WHERE u.company_id IS NULL AND r.user_id IS NULL ORDER BY u.id; ------- INSERT INTO referral_levels (id, name, min_invitees, reward_percentage) VALUES ('bronze', 'BRONZE', 0, 15), ('silver', 'SILVER', 6, 18), ('gold', 'GOLD', 16, 22), ('platinum', 'PLATINUM', 50, 25); ----------------- Скрипт,для нумерации для уже сохданных файлов WITH max_id AS ( SELECT COALESCE(MAX(support_id), 0) as max_val FROM file_entities ), -- Нумеруем только NULL записи, начиная с max_val + 1 numbered AS ( SELECT f.id, (SELECT max_val FROM max_id) + ROW_NUMBER() OVER (ORDER BY f.created_at, f.id) as new_support_id FROM file_entities f WHERE f.support_id IS NULL ) UPDATE file_entities SET support_id = numbered.new_support_id FROM numbered WHERE file_entities.id = numbered.id; --------------------------------- НАСТРОЙКА NGINX -------------------------------- # admin.not-copy.com server { listen 80; listen [::]:80; server_name admin.not-copy.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl; listen [::]:443 ssl; server_name admin.not-copy.com; ssl_certificate /etc/letsencrypt/live/admin.not-copy.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/admin.not-copy.com/privkey.pem; location /api/ { proxy_pass http://localhost:3003; 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 / { proxy_pass http://localhost:2995; 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; } } # workspace.not-copy.com server { listen 80; listen [::]:80; server_name workspace.not-copy.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl; listen [::]:443 ssl; server_name workspace.not-copy.com; ssl_certificate /etc/letsencrypt/live/workspace.not-copy.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/workspace.not-copy.com/privkey.pem; location /api/ { proxy_pass http://localhost:3003; 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 / { proxy_pass http://localhost:2998; 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; } } # lp.not-copy.com server { listen 80; listen [::]:80; server_name lp.not-copy.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl; listen [::]:443 ssl; server_name lp.not-copy.com; ssl_certificate /etc/letsencrypt/live/lp.not-copy.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/lp.not-copy.com/privkey.pem; location /api/ { proxy_pass http://localhost:3003; 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 / { proxy_pass http://localhost:2993; 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; } } # dev-admin.not-copy.com server { listen 80; listen [::]:80; server_name dev-admin.not-copy.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl; listen [::]:443 ssl; server_name dev-admin.not-copy.com; ssl_certificate /etc/letsencrypt/live/dev-admin.not-copy.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/dev-admin.not-copy.com/privkey.pem; location /api/ { proxy_pass http://localhost:3001; 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 / { proxy_pass http://localhost:2996; 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; } } # dev-workspace.not-copy.com server { listen 80; listen [::]:80; server_name dev-workspace.not-copy.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl; listen [::]:443 ssl; server_name dev-workspace.not-copy.com; ssl_certificate /etc/letsencrypt/live/dev-workspace.not-copy.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/dev-workspace.not-copy.com/privkey.pem; location /api/ { proxy_pass http://localhost:3001; 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 / { proxy_pass http://localhost:3002; 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; } } # dev-lp.not-copy.com server { listen 80; listen [::]:80; server_name dev-lp.not-copy.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl; listen [::]:443 ssl; server_name dev-lp.not-copy.com; ssl_certificate /etc/letsencrypt/live/dev-lp.not-copy.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/dev-lp.not-copy.com/privkey.pem; location /api/ { proxy_pass http://localhost:3001; 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 / { proxy_pass http://localhost:2994; 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; } } # Проверяем конфиг ls -la /etc/nginx/sites-available/ ls -la /etc/nginx/sites-enabled/ # Создание конфига sudo nano /etc/nginx/sites-available/not-copy # Создание симлинк sudo ln -s /etc/nginx/sites-available/not-copy /etc/nginx/sites-enabled/ # Чек sudo nginx -t # Рестарт sudo systemctl reload nginx --------------------------------------------- # ПОЛНАЯ ИНСТРУКЦИЯ: НАСТРОЙКА ПРОКСИ ДЛЯ ОБХОДА БЛОКИРОВОК SEARCHAPI.IO ## Данные для подключения к прокси-серверу IP: 193.46.217.94 Порт HTTP: 3128 Порт SOCKS: 1080 Логин SSH: root Пароль SSH: u7nRtsD6 ## 1. Настройка прокси-сервера ```bash # Подключаемся к серверу ssh root@193.46.217.94 # Вводим пароль: u7nRtsD6 # Обновляем систему и устанавливаем пакеты yum update -y yum install -y epel-release net-tools nano yum install -y 3proxy # Создаем конфигурацию mkdir -p /etc/3proxy cat > /etc/3proxy/3proxy.cfg << 'EOF' nserver 8.8.8.8 nserver 8.8.4.4 timeouts 1 5 30 60 180 1800 15 60 daemon log /var/log/3proxy/3proxy.log logformat "- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T" rotate 30 auth none allow * * * * * proxy -p3128 socks -p1080 EOF # Создаем папку для логов и запускаем прокси mkdir -p /var/log/3proxy /usr/bin/3proxy /etc/3proxy/3proxy.cfg # Проверяем, что запустилось ps aux | grep 3proxy netstat -tulpn | grep -E '3128|1080' # Настраиваем файрвол firewall-cmd --permanent --add-port=3128/tcp firewall-cmd --permanent --add-port=1080/tcp firewall-cmd --reload firewall-cmd --list-ports # Проверяем локальную работу прокси curl -x http://127.0.0.1:3128 https://api.ipify.org # Должен вернуть: 193.46.217.94 # Настраиваем автозапуск echo "/usr/bin/3proxy /etc/3proxy/3proxy.cfg" >> /etc/rc.local chmod +x /etc/rc.local # Проверяем доступность прокси ping -c 4 193.46.217.94 curl -x http://193.46.217.94:3128 https://api.ipify.org # Должен вернуть: 193.46.217.94 # Проверяем работу с SearchAPI через прокси curl -x http://193.46.217.94:3128 "https://www.searchapi.io/api/v1/search?engine=google_lens&api_key=5jyYZC8jSaxhZTwjMUhwtAXi&url=https://dev-workspace.not-copy.com/api/files/public/76d06557-6df1-4fcd-a273-050ec6a35faf&search_type=exact_matches" -o test.json ls -la test.json tail -20 test.json # Файл должен быть полным (заканчиваться на '}') ps aux | grep 3proxy # Проверка статуса netstat -tulpn | grep -E '3128|1080' # Проверка портов tail -f /var/log/3proxy/3proxy.log # Просмотр логов killall 3proxy # Остановка прокси /usr/bin/3proxy /etc/3proxy/3proxy.cfg # Запуск прокси firewall-cmd --permanent --remove-port=3128/tcp firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="IP_ТВОЕГО_СЕРВЕРА" port port="3128" protocol="tcp" accept' firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="IP_ТВОЕГО_СЕРВЕРА" port port="1080" protocol="tcp" accept' firewall-cmd --reload На прокси-сервере: bash ps aux | grep 3proxy # Проверка статуса netstat -tulpn | grep -E '3128|1080' # Проверка портов tail -f /var/log/3proxy/3proxy.log # Просмотр логов killall 3proxy # Остановка прокси /usr/bin/3proxy /etc/3proxy/3proxy.cfg # Запуск прокси На основном сервере: bash curl -x http://193.46.217.94:3128 https://api.ipify.org # Проверка прокси telnet 193.46.217.94 3128 # Проверка порта