modified: controllers/application/academy/academyCategoryController.js

modified:   controllers/application/academy/academyControllers.js
	modified:   controllers/application/academy/helpers/chatHelpers.js
	modified:   controllers/application/academy/middlewares/404.js
	modified:   controllers/application/academy/middlewares/adminAuth.js
	modified:   controllers/application/academy/middlewares/auth.js
	modified:   controllers/application/academy/middlewares/blockCheck.js
	modified:   controllers/application/academy/middlewares/exception.js
	modified:   controllers/application/academy/middlewares/index.js
	modified:   controllers/application/academy/middlewares/isHalfRegister.js
	modified:   controllers/application/academy/middlewares/isRegister.js
	modified:   controllers/application/academy/middlewares/lastOnline.js
	modified:   controllers/application/academy/middlewares/upload.js
	modified:   controllers/application/academy/models/AcademyCategoryModel.js
	modified:   controllers/application/academy/models/AcademyContentModel.js
	modified:   controllers/application/academy/models/AcademyLikeModel.js
	modified:   controllers/application/academy/models/AcademyModel.js
	modified:   controllers/application/academy/models/AcademyPaymentModel.js
	modified:   controllers/application/academy/models/AdminModel.js
	modified:   controllers/application/academy/models/AdvertisingCategoryModel.js
	modified:   controllers/application/academy/models/AdvertisingCommentModel.js
	modified:   controllers/application/academy/models/AdvertisingFeaturesModel.js
	modified:   controllers/application/academy/models/AdvertisingLikeModel.js
	modified:   controllers/application/academy/models/AdvertisingModel.js
	modified:   controllers/application/academy/models/AdvertisingProfile.js
	modified:   controllers/application/academy/models/AdvertisingRatingModel.js
	modified:   controllers/application/academy/models/AdvertisingTypeModel.js
	modified:   controllers/application/academy/models/CommentModel.js
	modified:   controllers/application/academy/models/CourseComentModel.js
	modified:   controllers/application/academy/models/CourseModel.js
	modified:   controllers/application/academy/models/CoursePaymentModel.js
	modified:   controllers/application/academy/models/ExpertiseModel.js
	modified:   controllers/application/academy/models/IsPaymentCourseModel.js
	modified:   controllers/application/academy/models/LikeModel.js
	modified:   controllers/application/academy/models/MessageModel.js
	modified:   controllers/application/academy/models/NotificationModel.js
	modified:   controllers/application/academy/models/OfferModel.js
	modified:   controllers/application/academy/models/OfferTypeModel.js
	modified:   controllers/application/academy/models/PaymentModel.js
	modified:   controllers/application/academy/models/PostModel.js
	modified:   controllers/application/academy/models/ProjectModel.js
	modified:   controllers/application/academy/models/RequestModel.js
	modified:   controllers/application/academy/models/SettingsModel.js
	modified:   controllers/application/academy/models/StateCity.js
	modified:   controllers/application/academy/models/TaxModel.js
	modified:   controllers/application/academy/models/TicketMessageModel.js
	modified:   controllers/application/academy/models/TicketModel.js
	modified:   controllers/application/academy/models/TypeAndPriceModel.js
	modified:   controllers/application/academy/models/UserModel.js
	modified:   controllers/application/academy/models/VersionModel.js
	modified:   controllers/application/academy/models/license.js
	modified:   controllers/application/advertising/advertisingController.js
	modified:   controllers/application/citysController.js
	modified:   controllers/application/expertise/expertiseController.js
	modified:   controllers/application/financial/financialController.js
	modified:   controllers/application/login/changePasswordController.js
	modified:   controllers/application/login/loginController.js
	modified:   controllers/application/login/loginWithUserName.js
	modified:   controllers/application/login/verifyController.js
	modified:   controllers/application/messages/messageController.js
	modified:   controllers/application/notification/notificationController.js
	modified:   controllers/application/offer/offerController.js
	modified:   controllers/application/payment/paymentController.js
	modified:   controllers/application/payment/paymentControllerWeb.js
	modified:   controllers/application/posts/likeController.js
	modified:   controllers/application/posts/postController.js
	modified:   controllers/application/profile/profileController.js
	modified:   controllers/application/projects/createProjectController.js
	modified:   controllers/application/projects/getProjectController.js
	modified:   controllers/application/projects/projectTypesController.js
	modified:   controllers/application/projects/requestProjectController.js
	modified:   controllers/application/projects/updateProjectController.js
	modified:   controllers/application/provincesController.js
	modified:   controllers/application/register/registerController.js
	modified:   controllers/application/register/userFullNameController.js
	modified:   controllers/application/register/userTypeController.js
	modified:   controllers/application/register/usernameController.js
	modified:   controllers/application/register/verifyController.js
	modified:   controllers/application/search-web/searchController.js
	modified:   controllers/application/search/searchController.js
	modified:   controllers/application/settings/settingsController.js
	modified:   controllers/application/tickets/ticketsController.js
	modified:   controllers/application/users/getUserController.js
	modified:   controllers/application/verify/addressController.js
	modified:   controllers/application/verify/authController.js
	modified:   controllers/application/verify/colorsController.js
	modified:   controllers/application/verify/conversationController.js
	modified:   controllers/application/verify/cooperationTypeController.js
	modified:   controllers/application/verify/expertiseController.js
	modified:   controllers/application/verify/genderController.js
	modified:   controllers/application/verify/servicesController.js
	modified:   controllers/application/verify/setNationalCardImageController.js
	modified:   controllers/application/verify/setProfileImageController.js
	modified:   controllers/application/verify/sizesController.js
	modified:   controllers/application/version/versionController.js
	modified:   controllers/application/workroom/workroomController.js
	modified:   controllers/panel/advertising/academyCategoryController.js
	modified:   controllers/panel/advertising/advertisingController.js
	modified:   controllers/panel/comments/advertisingCommentController.js
	modified:   controllers/panel/comments/commentController.js
	modified:   controllers/panel/expertise/expertiseController.js
	modified:   controllers/panel/financial/financialController.js
	modified:   controllers/panel/login/loginController.js
	modified:   controllers/panel/posts/postController.js
	modified:   controllers/panel/projects/projectController.js
	modified:   controllers/panel/projects/projectTypesController.js
	modified:   controllers/panel/settings/settingsController.js
	modified:   controllers/panel/shops/shopsController.js
	modified:   controllers/panel/tickets/ticketsController.js
	modified:   controllers/panel/users/usersController.js
	modified:   controllers/panel/version/versionController.js
	modified:   helpers/chatHelpers.js
	modified:   index.js
	deleted:    logs/sms-irs/13-03-2024.log
	modified:   middlewares/404.js
	modified:   middlewares/adminAuth.js
	modified:   middlewares/auth.js
	modified:   middlewares/blockCheck.js
	modified:   middlewares/exception.js
	modified:   middlewares/index.js
	modified:   middlewares/isHalfRegister.js
	modified:   middlewares/isRegister.js
	modified:   middlewares/lastOnline.js
	modified:   middlewares/upload.js
	modified:   models/AcademyCategoryModel.js
	modified:   models/AcademyContentModel.js
	modified:   models/AcademyLikeModel.js
	modified:   models/AcademyModel.js
	modified:   models/AcademyPaymentModel.js
	modified:   models/AdminModel.js
	modified:   models/AdvertisingCategoryModel.js
	modified:   models/AdvertisingCommentModel.js
	modified:   models/AdvertisingFeaturesModel.js
	modified:   models/AdvertisingLikeModel.js
	modified:   models/AdvertisingModel.js
	modified:   models/AdvertisingProfile.js
	modified:   models/AdvertisingRatingModel.js
	modified:   models/AdvertisingTypeModel.js
	modified:   models/CommentModel.js
	modified:   models/CourseComentModel.js
	modified:   models/CourseModel.js
	modified:   models/CoursePaymentModel.js
	modified:   models/ExpertiseModel.js
	modified:   models/IsPaymentCourseModel.js
	modified:   models/LikeModel.js
	modified:   models/MessageModel.js
	modified:   models/NotificationModel.js
	modified:   models/OfferModel.js
	modified:   models/OfferTypeModel.js
	modified:   models/PaymentModel.js
	modified:   models/PostModel.js
	modified:   models/ProjectModel.js
	modified:   models/RequestModel.js
	modified:   models/SettingsModel.js
	modified:   models/StateCity.js
	modified:   models/TaxModel.js
	modified:   models/TicketMessageModel.js
	modified:   models/TicketModel.js
	modified:   models/TypeAndPriceModel.js
	modified:   models/UserModel.js
	modified:   models/VersionModel.js
	modified:   models/license.js
	modified:   routes/application/academy/index.js
	modified:   routes/application/advertising/index.js
	modified:   routes/application/city/index.js
	modified:   routes/application/expertise/index.js
	modified:   routes/application/financial/index.js
	modified:   routes/application/login/index.js
	modified:   routes/application/messages/index.js
	modified:   routes/application/notification/index.js
	modified:   routes/application/offers/index.js
	modified:   routes/application/posts/index.js
	modified:   routes/application/profile/index.js
	modified:   routes/application/projects/index.js
	modified:   routes/application/provinces/index.js
	modified:   routes/application/register/index.js
	modified:   routes/application/search-web/index.js
	modified:   routes/application/search/index.js
	modified:   routes/application/settings/index.js
	modified:   routes/application/tickets/index.js
	modified:   routes/application/users/index.js
	modified:   routes/application/verify/index.js
	modified:   routes/application/version/index.js
	modified:   routes/application/workroom/index.js
	modified:   routes/index.js
	modified:   routes/panel/advertising/index.js
	modified:   routes/panel/comments/index.js
	modified:   routes/panel/expertise/index.js
	modified:   routes/panel/financial/index.js
	modified:   routes/panel/login/index.js
	modified:   routes/panel/posts/index.js
	modified:   routes/panel/projects/index.js
	modified:   routes/panel/settings/index.js
	modified:   routes/panel/shops/index.js
	modified:   routes/panel/tickets/index.js
	modified:   routes/panel/users/index.js
	modified:   routes/panel/version/index.js
	modified:   scripts/dns/db.modstagram.com
	modified:   scripts/dns/db.modstagram.ir
	modified:   scripts/dns/named.conf.local.snippet
	modified:   scripts/nginx/api.modstagram.com.conf
	modified:   scripts/nginx/app.modstagram.com.conf
	modified:   scripts/nginx/blog.modstagram.com.conf
	modified:   scripts/nginx/cdn.modstagram.com.conf
	modified:   scripts/nginx/cdn.modstagram.com.http.conf
	modified:   scripts/nginx/modstagram-redirects.conf
	modified:   scripts/nginx/modstagram.com.conf
	modified:   scripts/nginx/panel.modstagram.com.conf
	modified:   scripts/nginx/pay.modstagram.com.conf
	modified:   scripts/server-setup.sh
	modified:   services/AdvertisingCron.js
	modified:   services/ProjectCron.js
	modified:   services/TokenService.js
	deleted:    storage/courses/videos/course-69f8b2da55f31efffa601c57-1778257437373.mp4
	deleted:    storage/courses/videos/course-69f8b2da55f31efffa601c57-1778257586892.mp4
	deleted:    storage/courses/videos/course-69f8b2da55f31efffa601c57-1778257829783.mp4
	deleted:    storage/courses/videos/course-69f8b2da55f31efffa601c57-1778257903018.mp4
	deleted:    storage/posts/videos/1766758940571-0-video_2025-05-21_16-30-58.mp4
	deleted:    storage/posts/videos/1766781626514-0-video_2025-05-21_16-30-58.mp4
	deleted:    storage/posts/videos/1766824222908-0-Find 'modeling videos' on TikTok - TikTok Search_7.mp4
	deleted:    storage/posts/videos/1766824281937-0-Find 'modeling videos' on TikTok - TikTok Search_6.mp4
	deleted:    storage/posts/videos/1766824360366-0-Find 'bridal makeup' on TikTok - TikTok Search_4.mp4
	deleted:    storage/posts/videos/1766824425868-0-Find 'Makeup' on TikTok - TikTok Search_25.mp4
	deleted:    storage/posts/videos/1766824503238-0-Find 'Makeup' on TikTok - TikTok Search.mp4
	deleted:    storage/posts/videos/1766824554864-0-Jalal.hafed (@jalal.hafed) Official.mp4
	deleted:    storage/posts/videos/1766824618322-0-Find 'Hairdressing' on TikTok - TikTok Search_3.mp4
	deleted:    storage/posts/videos/1766824689078-0-Find 'Beauty clinic' on TikTok - TikTok Search_22.mp4
	deleted:    storage/posts/videos/1766824721659-0-Find 'Beauty clinic' on TikTok - TikTok Search_13.mp4
	deleted:    storage/posts/videos/1766824796958-0-Find 'photography' on TikTok - TikTok Search_6.mp4
	deleted:    storage/posts/videos/1766825351987-0-aaaa.mp4
	deleted:    storage/posts/videos/1766825448136-0-sasasa.mp4
	deleted:    storage/posts/videos/1766825535111-0-qqq.mp4
	deleted:    "storage/posts/videos/1766825855902-0-Nail desin by Labella beauty salon\360\237\214\270\360\237\222\205\360\237\217\273  #nail #nailart #manicure #manicure\360\237\222\205 #salon #pedicure #labella.mp4"
	deleted:    storage/posts/videos/1766825905907-0-dsdsdsdsdsds.mp4
	deleted:    "storage/posts/videos/1766826114243-0-Every piece of jewelry tells a story\360\237\217\271  @mirjaliligold @mohseneh_b.mp4"
	deleted:    "storage/posts/videos/1766826180365-0-Romeo, save me\360\237\246\242.mp4"
	deleted:    storage/posts/videos/1766826458195-0-aaaaa.mp4
	deleted:    storage/posts/videos/1766826609640-0-asasa.mp4
	deleted:    storage/posts/videos/1766826685281-0-s.mp4
	deleted:    storage/posts/videos/1766826815345-0-asasa.mp4
	deleted:    storage/posts/videos/1766826842822-0-aaa.mp4
	deleted:    "storage/posts/videos/1766827337926-0-Snow, mountains, and me\342\200\246 a story that never gets old!  #backstage #stylish #snow #style#streetstyle.mp4"
	deleted:    "storage/posts/videos/1766828100639-0-\330\263\330\263\330\263\330\263.mp4"
	deleted:    storage/posts/videos/1766828130001-0-aaa.mp4
	deleted:    storage/posts/videos/1766828157845-0-ssss.mp4
	deleted:    storage/posts/videos/1766828203643-0-aaaa.mp4
	deleted:    "storage/posts/videos/1766828345460-0-You deserve to be happy, and you can\342\200\231t stay where your heart doesn\342\200\231t belong  #\330\252\331\210\331\204\330\257\331\205_\331\205\330\250\330\247\330\261\332\251 #\330\242\330\250\333\214 #\330\247\331\207\331\210\330\247\330\262 #\330\252\331\210\331\204\330\257 #\330\250\331\204\330\247\332\257\330\261 @gallery.nilai.mp4"
	deleted:    storage/posts/videos/1766828424672-0-1111.mp4
	deleted:    storage/posts/videos/1766828464781-0-sss.mp4
	deleted:    storage/posts/videos/1766828486889-0-aaaa.mp4
	deleted:    storage/posts/videos/1766828514279-0-sss.mp4
	deleted:    storage/posts/videos/1766828727356-0-ddd.mp4
	deleted:    "storage/posts/videos/1766828816020-0-Jewlery project  Brand- @houseofme_official  Dop- @_alishariatt  Videographer- @peyman_bozorgomid  Assistant- @amir.kh.k  Model- @ana.elitee  #jewleryphotography #fashionreels #\330\261\333\214\331\204.mp4"
	deleted:    "storage/posts/videos/1766828848513-0-Some of my favorite shots Models- @saharjalilii @setayesh.ghalenoeii @parmisaadat @paaarand @asalllbayat @bitakhaajoii  #photographer #\330\271\332\251\330\247\330\263\333\214_\331\201\330\264\331\206 #photosoftheday.mp4"
	deleted:    "storage/posts/videos/1766831745457-0-\330\263\330\263\330\263.mp4"
	deleted:    "storage/posts/videos/1766831795030-0-\330\264\330\264\330\264\330\264.mp4"
	deleted:    "storage/posts/videos/1766833279276-0-\330\247\330\262 \332\206\330\264\330\247\331\205 \331\207\331\204\330\252 \330\257\330\247\330\257\331\205\342\200\214 \331\210\331\204\333\214 .....mp4"
	deleted:    "storage/posts/videos/1766835292259-0-\330\263\333\214\330\263.mp4"
	deleted:    storage/posts/videos/1766835327424-0-a.mp4
	deleted:    storage/posts/videos/1766835787091-0-s.mp4
	deleted:    storage/posts/videos/1767012113143-0-aaa.mp4
	deleted:    "storage/posts/videos/1767012137018-0-Makeup by-\360\237\221\207\360\237\217\275\360\237\215\267 @pegah.mua  @kiavash_royalvideo.mp4"
	deleted:    storage/posts/videos/1767012672738-0-dddd.mp4
	deleted:    storage/posts/videos/1767012722043-0-Instagram.mp4
	deleted:    "storage/posts/videos/1768740975998-0-Faouzia\343\200\212Desert Rose\343\200\213.mp4"
	deleted:    storage/posts/videos/1768741493380-0-a.mp4
	deleted:    "storage/posts/videos/1771318409261-0-\330\266\330\265\330\266\330\265\330\266\330\265\330\266.mp4"
	deleted:    "storage/posts/videos/1771319189820-0-\330\263\330\263\330\263\330\263.mp4"
	deleted:    storage/posts/videos/1771937200099-0-WhatsApp Video 2025-05-17 at 11.50.09.mp4
	deleted:    storage/posts/videos/1772005435124-0-qqqq.mp4
	deleted:    storage/posts/videos/1772005611958-0-aaaaa.mp4
	deleted:    storage/posts/videos/1772006456443-0-qqqqww.mp4
	deleted:    storage/posts/videos/1772006543741-0-1111.mp4
	deleted:    storage/posts/videos/1772006606627-0-wewewe.mp4
	deleted:    storage/posts/videos/1772006663579-0-wwww.mp4
	deleted:    storage/posts/videos/1772006685382-0-333.mp4
	deleted:    storage/posts/videos/1772006740696-0-www.mp4
	deleted:    storage/posts/videos/1772006786181-0-4444.mp4
	deleted:    storage/posts/videos/1772009213487-0-aaaa.mp4
	deleted:    storage/posts/videos/1772009260843-0-sss.mp4
	deleted:    "storage/posts/videos/1772013946491-0-\330\250\330\250\330\250\330\250\330\250.mp4"
	deleted:    "storage/posts/videos/1772089789739-0-\330\266\330\266\330\266\330\266.mp4"
	deleted:    storage/posts/videos/1772090631353-0-qqqq.mp4
	deleted:    "storage/posts/videos/1772092053138-0-\330\265\330\265\330\265.mp4"
	deleted:    storage/posts/videos/1772101142214-0-2222.mp4
	deleted:    "storage/posts/videos/1772101261385-0-\330\266\330\266\330\266\330\266.mp4"
	deleted:    storage/posts/videos/1772101312006-0-Instagram.mp4
	deleted:    "storage/posts/videos/1772101434744-0-\330\263\333\214\330\263\333\214\330\263\333\214.mp4"
	deleted:    "storage/posts/videos/1772203614700-0-\330\263\330\247\331\205\330\250\330\261\331\207 \330\250\331\204\331\210\331\206\330\257 \330\250\330\261\330\247\333\214 \331\201\330\247\330\267\331\205\331\207 \330\271\330\262\333\214\330\262\331\205\360\237\222\225.mp4"
	deleted:    "storage/posts/videos/1772203641829-0-\330\257\332\251\331\204\330\261\331\207 \331\210 \330\261\331\206\332\257 \331\210 \332\251\331\210\330\252\330\247\331\207\333\214 \330\250\330\261\330\247\333\214 \330\263\331\210\330\257\330\247 \331\202\330\264\331\206\332\257\331\205\360\237\222\225.mp4"
	deleted:    "storage/posts/videos/1772203698315-0-\330\247\333\214\331\206 \332\251\330\247\330\261 \330\262\333\214\330\250\330\247\331\205\331\210\331\206 \330\250\330\261\330\247\333\214 \330\255\330\250\333\214\330\250\331\207 \330\256\330\247\331\206\331\205 \330\271\330\262\333\214\330\262\360\237\222\225.mp4"
	deleted:    "storage/posts/videos/1772205300232-0-\330\264\330\264\330\264\330\264.mp4"
	deleted:    "storage/posts/videos/1772205333900-0-\330\265\330\265\330\265\330\265\330\265.mp4"
	deleted:    "storage/posts/videos/1772207461030-0-\330\265\330\265\330\265.mp4"
	deleted:    "storage/posts/videos/1772207616124-0-\330\264\330\264\330\264.mp4"
	deleted:    "storage/posts/videos/1772207684446-0-\330\253\330\253\330\253\330\253.mp4"
	deleted:    "storage/posts/videos/1772208440984-0-\331\201\331\201\331\201.mp4"
	deleted:    "storage/posts/videos/1772208506469-0-\330\253\330\253\330\253\330\253.mp4"
	deleted:    "storage/posts/videos/1772208627195-0-\330\264\330\264\330\264\330\264.mp4"
	deleted:    "storage/posts/videos/1772208646258-0-\330\250\330\263\333\214\330\263.mp4"
	deleted:    storage/posts/videos/1772208704438-0-111.mp4
	deleted:    "storage/posts/videos/1772211057722-0-\330\266\330\266\330\266.mp4"
	deleted:    "storage/posts/videos/1772211118907-0-\330\265\330\265\330\265\330\265.mp4"
	deleted:    "storage/posts/videos/1772211184550-0-\330\253\330\253\330\253.mp4"
	deleted:    "storage/posts/videos/1772211618341-0-\330\265\330\265\330\265\330\265.mp4"
	deleted:    storage/posts/videos/1772211740270-0-4444.mp4
This commit is contained in:
Amirreza
2026-07-05 15:59:26 +03:30
parent 06f6260df3
commit b3bb0d0ff3
306 changed files with 23083 additions and 23100 deletions

View File

@@ -1,40 +1,40 @@
$TTL 3600
@ IN SOA ns1.modstagram.com. admin.modstagram.com. (
2026061702 ; Serial — با هر تغییر +1 کنید
3600
1800
604800
86400 )
; ═══════════════════════════════════════
; Nameservers — سرور شما
; ═══════════════════════════════════════
@ IN NS ns1.modstagram.com.
@ IN NS ns2.modstagram.com.
ns1 IN A 185.164.73.197
ns2 IN A 185.164.73.197
; ═══════════════════════════════════════
; ساب‌دامین‌ها — همه به IP سرور
; ═══════════════════════════════════════
@ IN A 185.164.73.197
www IN A 185.164.73.197
api IN A 185.164.73.197
app IN A 185.164.73.197
panel IN A 185.164.73.197
blog IN A 185.164.73.197
pay IN A 185.164.73.197
cdn IN A 185.164.73.197
; ═══════════════════════════════════════
; SPF — ایمیل (همان مقادیر فعلی شما)
; ═══════════════════════════════════════
@ IN TXT "v=spf1 a mx ip4:185.164.73.197 ~all"
* IN TXT "v=spf1 a mx ip4:185.164.73.197 ~all"
; ═══════════════════════════════════════
; ایمیل (اختیاری)
; ═══════════════════════════════════════
@ IN MX 10 mail.modstagram.com.
mail IN A 185.164.73.197
$TTL 3600
@ IN SOA ns1.modstagram.com. admin.modstagram.com. (
2026061702 ; Serial — با هر تغییر +1 کنید
3600
1800
604800
86400 )
; ═══════════════════════════════════════
; Nameservers — سرور شما
; ═══════════════════════════════════════
@ IN NS ns1.modstagram.com.
@ IN NS ns2.modstagram.com.
ns1 IN A 185.164.73.197
ns2 IN A 185.164.73.197
; ═══════════════════════════════════════
; ساب‌دامین‌ها — همه به IP سرور
; ═══════════════════════════════════════
@ IN A 185.164.73.197
www IN A 185.164.73.197
api IN A 185.164.73.197
app IN A 185.164.73.197
panel IN A 185.164.73.197
blog IN A 185.164.73.197
pay IN A 185.164.73.197
cdn IN A 185.164.73.197
; ═══════════════════════════════════════
; SPF — ایمیل (همان مقادیر فعلی شما)
; ═══════════════════════════════════════
@ IN TXT "v=spf1 a mx ip4:185.164.73.197 ~all"
* IN TXT "v=spf1 a mx ip4:185.164.73.197 ~all"
; ═══════════════════════════════════════
; ایمیل (اختیاری)
; ═══════════════════════════════════════
@ IN MX 10 mail.modstagram.com.
mail IN A 185.164.73.197

View File

@@ -1,21 +1,21 @@
$TTL 3600
@ IN SOA ns1.modstagram.com. admin.modstagram.com. (
2026061702
3600
1800
604800
86400 )
@ IN NS ns1.modstagram.com.
@ IN NS ns2.modstagram.com.
@ IN A 185.164.73.197
www IN A 185.164.73.197
api IN A 185.164.73.197
app IN A 185.164.73.197
panel IN A 185.164.73.197
blog IN A 185.164.73.197
pay IN A 185.164.73.197
cdn IN A 185.164.73.197
@ IN TXT "v=spf1 a mx ip4:185.164.73.197 ~all"
$TTL 3600
@ IN SOA ns1.modstagram.com. admin.modstagram.com. (
2026061702
3600
1800
604800
86400 )
@ IN NS ns1.modstagram.com.
@ IN NS ns2.modstagram.com.
@ IN A 185.164.73.197
www IN A 185.164.73.197
api IN A 185.164.73.197
app IN A 185.164.73.197
panel IN A 185.164.73.197
blog IN A 185.164.73.197
pay IN A 185.164.73.197
cdn IN A 185.164.73.197
@ IN TXT "v=spf1 a mx ip4:185.164.73.197 ~all"

View File

@@ -1,11 +1,11 @@
// این بلوک‌ها را به /etc/bind/named.conf.local اضافه کنید
zone "modstagram.com" {
type master;
file "/etc/bind/db.modstagram.com";
};
zone "modstagram.ir" {
type master;
file "/etc/bind/db.modstagram.ir";
};
// این بلوک‌ها را به /etc/bind/named.conf.local اضافه کنید
zone "modstagram.com" {
type master;
file "/etc/bind/db.modstagram.com";
};
zone "modstagram.ir" {
type master;
file "/etc/bind/db.modstagram.ir";
};

View File

@@ -1,25 +1,25 @@
# API — api.modstagram.com → Node.js port 3002
# مسیر: /etc/nginx/sites-available/api.modstagram.com
server {
listen 80;
server_name api.modstagram.com;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
proxy_pass http://127.0.0.1:3002;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
client_max_body_size 100M;
}
}
# API — api.modstagram.com → Node.js port 3002
# مسیر: /etc/nginx/sites-available/api.modstagram.com
server {
listen 80;
server_name api.modstagram.com;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
proxy_pass http://127.0.0.1:3002;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
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;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
client_max_body_size 100M;
}
}

View File

@@ -1,13 +1,13 @@
# app.modstagram.com → ریدایرکت به api.modstagram.com
# (جایگزین app.modstagram.ir قدیمی)
server {
listen 80;
listen 443 ssl;
server_name app.modstagram.com;
ssl_certificate /etc/letsencrypt/live/api.modstagram.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.modstagram.com/privkey.pem;
return 301 https://api.modstagram.com$request_uri;
}
# app.modstagram.com → ریدایرکت به api.modstagram.com
# (جایگزین app.modstagram.ir قدیمی)
server {
listen 80;
listen 443 ssl;
server_name app.modstagram.com;
ssl_certificate /etc/letsencrypt/live/api.modstagram.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.modstagram.com/privkey.pem;
return 301 https://api.modstagram.com$request_uri;
}

View File

@@ -1,27 +1,27 @@
# blog.modstagram.com — وردپرس / وبلاگ
# اگر وردپرس روی پورت دیگری است، proxy_pass را عوض کنید
server {
listen 80;
server_name blog.modstagram.com;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
# وردپرس معمولاً روی 8080 یا همان nginx جدا است
# اگر مسیر فایل دارید:
root /var/www/blog;
index index.php index.html;
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
root /var/www/blog;
fastcgi_pass unix:/var/run/php/php-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
# blog.modstagram.com — وردپرس / وبلاگ
# اگر وردپرس روی پورت دیگری است، proxy_pass را عوض کنید
server {
listen 80;
server_name blog.modstagram.com;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
# وردپرس معمولاً روی 8080 یا همان nginx جدا است
# اگر مسیر فایل دارید:
root /var/www/blog;
index index.php index.html;
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
root /var/www/blog;
fastcgi_pass unix:/var/run/php/php-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}

View File

@@ -1,46 +1,46 @@
# CDN — cdn.modstagram.com → کش فایل‌های storage
# مسیر: /etc/nginx/sites-available/cdn.modstagram.com
# IP سرور: 185.164.73.197
proxy_cache_path /var/cache/nginx/cdn levels=1:2 keys_zone=cdn_cache:50m inactive=7d max_size=5g;
server {
listen 80;
server_name cdn.modstagram.com;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl http2;
server_name cdn.modstagram.com;
ssl_certificate /etc/letsencrypt/live/cdn.modstagram.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/cdn.modstagram.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
location /storage/ {
proxy_pass http://127.0.0.1:3002/storage/;
proxy_set_header Host api.modstagram.com;
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;
proxy_cache cdn_cache;
proxy_cache_valid 200 1h;
proxy_cache_valid 404 1m;
add_header X-Cache-Status $upstream_cache_status;
add_header Access-Control-Allow-Origin *;
}
location /health {
return 200 "cdn-ok";
add_header Content-Type text/plain;
}
}
# CDN — cdn.modstagram.com → کش فایل‌های storage
# مسیر: /etc/nginx/sites-available/cdn.modstagram.com
# IP سرور: 185.164.73.197
proxy_cache_path /var/cache/nginx/cdn levels=1:2 keys_zone=cdn_cache:50m inactive=7d max_size=5g;
server {
listen 80;
server_name cdn.modstagram.com;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl http2;
server_name cdn.modstagram.com;
ssl_certificate /etc/letsencrypt/live/cdn.modstagram.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/cdn.modstagram.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
location /storage/ {
proxy_pass http://127.0.0.1:3002/storage/;
proxy_set_header Host api.modstagram.com;
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;
proxy_cache cdn_cache;
proxy_cache_valid 200 1h;
proxy_cache_valid 404 1m;
add_header X-Cache-Status $upstream_cache_status;
add_header Access-Control-Allow-Origin *;
}
location /health {
return 200 "cdn-ok";
add_header Content-Type text/plain;
}
}

View File

@@ -1,30 +1,30 @@
# CDN — فقط HTTP (قبل از SSL)
# بعد از certbot فایل cdn.modstagram.com.conf را فعال کنید
proxy_cache_path /var/cache/nginx/cdn levels=1:2 keys_zone=cdn_cache:50m inactive=7d max_size=5g;
server {
listen 80;
server_name cdn.modstagram.com;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location /storage/ {
proxy_pass http://127.0.0.1:3002/storage/;
proxy_set_header Host api.modstagram.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache cdn_cache;
proxy_cache_valid 200 1h;
add_header X-Cache-Status $upstream_cache_status;
add_header Access-Control-Allow-Origin *;
}
location /health {
return 200 "cdn-ok";
add_header Content-Type text/plain;
}
}
# CDN — فقط HTTP (قبل از SSL)
# بعد از certbot فایل cdn.modstagram.com.conf را فعال کنید
proxy_cache_path /var/cache/nginx/cdn levels=1:2 keys_zone=cdn_cache:50m inactive=7d max_size=5g;
server {
listen 80;
server_name cdn.modstagram.com;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location /storage/ {
proxy_pass http://127.0.0.1:3002/storage/;
proxy_set_header Host api.modstagram.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache cdn_cache;
proxy_cache_valid 200 1h;
add_header X-Cache-Status $upstream_cache_status;
add_header Access-Control-Allow-Origin *;
}
location /health {
return 200 "cdn-ok";
add_header Content-Type text/plain;
}
}

View File

@@ -1,50 +1,50 @@
# ریدایرکت دامنه‌های .ir به .com
# مسیر: /etc/nginx/sites-available/modstagram-redirects.conf
# modstagram.ir → modstagram.com
server {
listen 80;
listen 443 ssl;
server_name modstagram.ir www.modstagram.ir;
ssl_certificate /etc/letsencrypt/live/modstagram.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/modstagram.com/privkey.pem;
return 301 https://modstagram.com$request_uri;
}
# app.modstagram.ir → api.modstagram.com
server {
listen 80;
listen 443 ssl;
server_name app.modstagram.ir;
ssl_certificate /etc/letsencrypt/live/api.modstagram.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.modstagram.com/privkey.pem;
return 301 https://api.modstagram.com$request_uri;
}
# api.modstagram.ir → api.modstagram.com
server {
listen 80;
listen 443 ssl;
server_name api.modstagram.ir;
ssl_certificate /etc/letsencrypt/live/api.modstagram.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.modstagram.com/privkey.pem;
return 301 https://api.modstagram.com$request_uri;
}
# panel.modstagram.ir → panel.modstagram.com
server {
listen 80;
listen 443 ssl;
server_name panel.modstagram.ir www.panel.modstagram.ir;
ssl_certificate /etc/letsencrypt/live/panel.modstagram.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/panel.modstagram.com/privkey.pem;
return 301 https://panel.modstagram.com$request_uri;
}
# ریدایرکت دامنه‌های .ir به .com
# مسیر: /etc/nginx/sites-available/modstagram-redirects.conf
# modstagram.ir → modstagram.com
server {
listen 80;
listen 443 ssl;
server_name modstagram.ir www.modstagram.ir;
ssl_certificate /etc/letsencrypt/live/modstagram.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/modstagram.com/privkey.pem;
return 301 https://modstagram.com$request_uri;
}
# app.modstagram.ir → api.modstagram.com
server {
listen 80;
listen 443 ssl;
server_name app.modstagram.ir;
ssl_certificate /etc/letsencrypt/live/api.modstagram.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.modstagram.com/privkey.pem;
return 301 https://api.modstagram.com$request_uri;
}
# api.modstagram.ir → api.modstagram.com
server {
listen 80;
listen 443 ssl;
server_name api.modstagram.ir;
ssl_certificate /etc/letsencrypt/live/api.modstagram.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.modstagram.com/privkey.pem;
return 301 https://api.modstagram.com$request_uri;
}
# panel.modstagram.ir → panel.modstagram.com
server {
listen 80;
listen 443 ssl;
server_name panel.modstagram.ir www.panel.modstagram.ir;
ssl_certificate /etc/letsencrypt/live/panel.modstagram.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/panel.modstagram.com/privkey.pem;
return 301 https://panel.modstagram.com$request_uri;
}

View File

@@ -1,23 +1,23 @@
# فرانت — modstagram.com → Next.js port 3001
# مسیر: /etc/nginx/sites-available/modstagram.com
server {
listen 80;
server_name modstagram.com www.modstagram.com;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
proxy_pass http://127.0.0.1:3001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# Cloudflare Flexible: origin sees HTTP but users use HTTPS — force proto for Next.js assets
proxy_set_header X-Forwarded-Proto https;
}
}
# فرانت — modstagram.com → Next.js port 3001
# مسیر: /etc/nginx/sites-available/modstagram.com
server {
listen 80;
server_name modstagram.com www.modstagram.com;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
proxy_pass http://127.0.0.1:3001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# Cloudflare Flexible: origin sees HTTP but users use HTTPS — force proto for Next.js assets
proxy_set_header X-Forwarded-Proto https;
}
}

View File

@@ -1,24 +1,24 @@
# پنل ادمین — panel.modstagram.com
# مسیر: /etc/nginx/sites-available/panel.modstagram.com
# قبل از فعال‌سازی: npm run build در modstagram_panel
server {
listen 80;
server_name panel.modstagram.com;
root /root/modstagram_panel/build;
index index.html;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
try_files $uri $uri/ /index.html;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
}
# پنل ادمین — panel.modstagram.com
# مسیر: /etc/nginx/sites-available/panel.modstagram.com
# قبل از فعال‌سازی: npm run build در modstagram_panel
server {
listen 80;
server_name panel.modstagram.com;
root /root/modstagram_panel/build;
index index.html;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
try_files $uri $uri/ /index.html;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
}

View File

@@ -1,19 +1,19 @@
# pay.modstagram.com — درگاه پرداخت
# فعلاً به API هدایت می‌شود (مسیرهای payment در بک‌اند)
server {
listen 80;
server_name pay.modstagram.com;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
proxy_pass http://127.0.0.1:3002;
proxy_set_header Host api.modstagram.com;
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;
}
}
# pay.modstagram.com — درگاه پرداخت
# فعلاً به API هدایت می‌شود (مسیرهای payment در بک‌اند)
server {
listen 80;
server_name pay.modstagram.com;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
proxy_pass http://127.0.0.1:3002;
proxy_set_header Host api.modstagram.com;
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;
}
}

View File

@@ -1,125 +1,125 @@
#!/bin/bash
# Modstagram Server Setup - IP: 185.164.73.197
# Run: bash server-setup.sh
set -e
SERVER_IP="185.164.73.197"
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
ADMIN_EMAIL="${SSL_ADMIN_EMAIL:-admin@modstagram.com}"
echo "=========================================="
echo " Modstagram Server Setup"
echo " IP: $SERVER_IP"
echo "=========================================="
echo ""
echo ">>> [1/6] Install BIND9, Nginx, Certbot..."
apt-get update -y
apt-get install -y bind9 bind9utils nginx certbot python3-certbot-nginx
mkdir -p /var/www/certbot
mkdir -p /var/cache/nginx/cdn
echo ""
echo ">>> [2/6] Configure DNS..."
cp "$SCRIPT_DIR/dns/db.modstagram.com" /etc/bind/db.modstagram.com
cp "$SCRIPT_DIR/dns/db.modstagram.ir" /etc/bind/db.modstagram.ir
if ! grep -q 'zone "modstagram.com"' /etc/bind/named.conf.local 2>/dev/null; then
cat "$SCRIPT_DIR/dns/named.conf.local.snippet" >> /etc/bind/named.conf.local
fi
if ! grep -q 'allow-query' /etc/bind/named.conf.options; then
sed -i '/options {/a \ allow-query { any; };\n listen-on { any; };' /etc/bind/named.conf.options
fi
named-checkconf
systemctl restart bind9
systemctl enable bind9
echo " DNS active (port 53)"
echo ""
echo ">>> [3/6] Configure Nginx..."
for conf in api.modstagram.com modstagram.com panel.modstagram.com app.modstagram.com blog.modstagram.com pay.modstagram.com cdn.modstagram.com.http; do
src="$SCRIPT_DIR/nginx/${conf}.conf"
dst_name="${conf/.http/}.conf"
dst="/etc/nginx/sites-available/${dst_name}"
cp "$src" "$dst"
ln -sf "$dst" "/etc/nginx/sites-enabled/${dst_name}"
done
rm -f /etc/nginx/sites-enabled/default 2>/dev/null || true
nginx -t
systemctl reload nginx
systemctl enable nginx
echo " Nginx active"
echo ""
echo ">>> [4/6] Firewall (optional)..."
if command -v ufw >/dev/null 2>&1; then
ufw allow 22/tcp 2>/dev/null || true
ufw allow 53/tcp 2>/dev/null || true
ufw allow 53/udp 2>/dev/null || true
ufw allow 80/tcp 2>/dev/null || true
ufw allow 443/tcp 2>/dev/null || true
ufw --force enable 2>/dev/null || true
else
echo " ufw not installed, skipping"
fi
echo ""
echo ">>> [5/6] SSL (Let's Encrypt)..."
echo " DNS must point to $SERVER_IP"
certbot --nginx --non-interactive --agree-tos --email "$ADMIN_EMAIL" \
-d modstagram.com -d www.modstagram.com || echo " WARN: modstagram.com SSL failed"
certbot --nginx --non-interactive --agree-tos --email "$ADMIN_EMAIL" \
-d api.modstagram.com || echo " WARN: api SSL failed"
certbot --nginx --non-interactive --agree-tos --email "$ADMIN_EMAIL" \
-d panel.modstagram.com || echo " WARN: panel SSL failed"
certbot --nginx --non-interactive --agree-tos --email "$ADMIN_EMAIL" \
-d blog.modstagram.com || echo " WARN: blog SSL failed"
certbot --nginx --non-interactive --agree-tos --email "$ADMIN_EMAIL" \
-d pay.modstagram.com || echo " WARN: pay SSL failed"
certbot --nginx --non-interactive --agree-tos --email "$ADMIN_EMAIL" \
-d cdn.modstagram.com || echo " WARN: cdn SSL failed"
cp "$SCRIPT_DIR/nginx/cdn.modstagram.com.conf" /etc/nginx/sites-available/cdn.modstagram.com.conf
ln -sf /etc/nginx/sites-available/cdn.modstagram.com.conf /etc/nginx/sites-enabled/cdn.modstagram.com.conf
nginx -t && systemctl reload nginx
cp "$SCRIPT_DIR/nginx/modstagram-redirects.conf" /etc/nginx/sites-available/modstagram-redirects.conf
ln -sf /etc/nginx/sites-available/modstagram-redirects.conf /etc/nginx/sites-enabled/modstagram-redirects.conf
nginx -t && systemctl reload nginx 2>/dev/null || echo " WARN: redirects need SSL first"
(crontab -l 2>/dev/null | grep -v "certbot renew"; echo "0 3 * * * certbot renew --quiet --nginx && systemctl reload nginx") | crontab -
echo ""
echo ">>> [6/6] Restart apps..."
if command -v pm2 >/dev/null 2>&1; then
pm2 restart all || true
fi
echo ""
echo "=========================================="
echo " DONE!"
echo "=========================================="
echo ""
echo " Registrar panel:"
echo " 1) Glue: ns1.modstagram.com -> $SERVER_IP"
echo " 2) Glue: ns2.modstagram.com -> $SERVER_IP"
echo " 3) NS: ns1.modstagram.com, ns2.modstagram.com"
echo " 4) Remove ParsPack CDN"
echo ""
echo " Test:"
echo " dig @127.0.0.1 api.modstagram.com +short"
echo " wget -qO- http://127.0.0.1:3002/api/v1/version"
echo ""
#!/bin/bash
# Modstagram Server Setup - IP: 185.164.73.197
# Run: bash server-setup.sh
set -e
SERVER_IP="185.164.73.197"
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
ADMIN_EMAIL="${SSL_ADMIN_EMAIL:-admin@modstagram.com}"
echo "=========================================="
echo " Modstagram Server Setup"
echo " IP: $SERVER_IP"
echo "=========================================="
echo ""
echo ">>> [1/6] Install BIND9, Nginx, Certbot..."
apt-get update -y
apt-get install -y bind9 bind9utils nginx certbot python3-certbot-nginx
mkdir -p /var/www/certbot
mkdir -p /var/cache/nginx/cdn
echo ""
echo ">>> [2/6] Configure DNS..."
cp "$SCRIPT_DIR/dns/db.modstagram.com" /etc/bind/db.modstagram.com
cp "$SCRIPT_DIR/dns/db.modstagram.ir" /etc/bind/db.modstagram.ir
if ! grep -q 'zone "modstagram.com"' /etc/bind/named.conf.local 2>/dev/null; then
cat "$SCRIPT_DIR/dns/named.conf.local.snippet" >> /etc/bind/named.conf.local
fi
if ! grep -q 'allow-query' /etc/bind/named.conf.options; then
sed -i '/options {/a \ allow-query { any; };\n listen-on { any; };' /etc/bind/named.conf.options
fi
named-checkconf
systemctl restart bind9
systemctl enable bind9
echo " DNS active (port 53)"
echo ""
echo ">>> [3/6] Configure Nginx..."
for conf in api.modstagram.com modstagram.com panel.modstagram.com app.modstagram.com blog.modstagram.com pay.modstagram.com cdn.modstagram.com.http; do
src="$SCRIPT_DIR/nginx/${conf}.conf"
dst_name="${conf/.http/}.conf"
dst="/etc/nginx/sites-available/${dst_name}"
cp "$src" "$dst"
ln -sf "$dst" "/etc/nginx/sites-enabled/${dst_name}"
done
rm -f /etc/nginx/sites-enabled/default 2>/dev/null || true
nginx -t
systemctl reload nginx
systemctl enable nginx
echo " Nginx active"
echo ""
echo ">>> [4/6] Firewall (optional)..."
if command -v ufw >/dev/null 2>&1; then
ufw allow 22/tcp 2>/dev/null || true
ufw allow 53/tcp 2>/dev/null || true
ufw allow 53/udp 2>/dev/null || true
ufw allow 80/tcp 2>/dev/null || true
ufw allow 443/tcp 2>/dev/null || true
ufw --force enable 2>/dev/null || true
else
echo " ufw not installed, skipping"
fi
echo ""
echo ">>> [5/6] SSL (Let's Encrypt)..."
echo " DNS must point to $SERVER_IP"
certbot --nginx --non-interactive --agree-tos --email "$ADMIN_EMAIL" \
-d modstagram.com -d www.modstagram.com || echo " WARN: modstagram.com SSL failed"
certbot --nginx --non-interactive --agree-tos --email "$ADMIN_EMAIL" \
-d api.modstagram.com || echo " WARN: api SSL failed"
certbot --nginx --non-interactive --agree-tos --email "$ADMIN_EMAIL" \
-d panel.modstagram.com || echo " WARN: panel SSL failed"
certbot --nginx --non-interactive --agree-tos --email "$ADMIN_EMAIL" \
-d blog.modstagram.com || echo " WARN: blog SSL failed"
certbot --nginx --non-interactive --agree-tos --email "$ADMIN_EMAIL" \
-d pay.modstagram.com || echo " WARN: pay SSL failed"
certbot --nginx --non-interactive --agree-tos --email "$ADMIN_EMAIL" \
-d cdn.modstagram.com || echo " WARN: cdn SSL failed"
cp "$SCRIPT_DIR/nginx/cdn.modstagram.com.conf" /etc/nginx/sites-available/cdn.modstagram.com.conf
ln -sf /etc/nginx/sites-available/cdn.modstagram.com.conf /etc/nginx/sites-enabled/cdn.modstagram.com.conf
nginx -t && systemctl reload nginx
cp "$SCRIPT_DIR/nginx/modstagram-redirects.conf" /etc/nginx/sites-available/modstagram-redirects.conf
ln -sf /etc/nginx/sites-available/modstagram-redirects.conf /etc/nginx/sites-enabled/modstagram-redirects.conf
nginx -t && systemctl reload nginx 2>/dev/null || echo " WARN: redirects need SSL first"
(crontab -l 2>/dev/null | grep -v "certbot renew"; echo "0 3 * * * certbot renew --quiet --nginx && systemctl reload nginx") | crontab -
echo ""
echo ">>> [6/6] Restart apps..."
if command -v pm2 >/dev/null 2>&1; then
pm2 restart all || true
fi
echo ""
echo "=========================================="
echo " DONE!"
echo "=========================================="
echo ""
echo " Registrar panel:"
echo " 1) Glue: ns1.modstagram.com -> $SERVER_IP"
echo " 2) Glue: ns2.modstagram.com -> $SERVER_IP"
echo " 3) NS: ns1.modstagram.com, ns2.modstagram.com"
echo " 4) Remove ParsPack CDN"
echo ""
echo " Test:"
echo " dig @127.0.0.1 api.modstagram.com +short"
echo " wget -qO- http://127.0.0.1:3002/api/v1/version"
echo ""