Runbook
Các lệnh hay dùng khi vận hành / debug landing_page_backend. Đoạn elixir chạy trong IEx (make bash → iex -S mix phx.server).
Tài khoản
LandingPage.Accounts.create_account %{email: "you@pancake.vn"}
LandingPage.Run.get_login_link "you@pancake.vn"
Migration
make migrate
# hoặc trực tiếp
docker compose exec landing-page mix ecto.migrate
docker compose exec landing-page mix ecto.setup # create + migrate + seed
docker compose exec landing-page mix ecto.reset
Logical replication
# Luồng đầy đủ lần đầu
make migrate-all
# Từng bước
make upgrade-data
make update-primary-config
make init-primary
make init-data-repica
make init-replica
# Thêm bảng vào publication
make add-table-replica table=form_data
Oban (job nền)
import Ecto.Query
# Đếm job theo trạng thái
from(j in Oban.Job, group_by: j.state, select: {j.state, count(j.id)})
|> LandingPage.Repo.all()
# Trạng thái queue
Oban.check_queue(:default)
Oban.check_queue(:email)
# Retry / cancel
Oban.retry_job(123456)
Oban.cancel_job(123456)
Reindex Elasticsearch
LandingPage.ElasticIndex.reindex_pages()
LandingPage.ElasticIndex.reindex_form_data()
(Điều chỉnh tên hàm theo code thực tế nếu khác.)
Cache / Redis
Redis.get("landing:page:#{page_id}:render")
Redis.del("landing:page:#{page_id}:render")
LandingPage.Cache.invalidate(:page, page_id)
Import địa chỉ Việt Nam
# Chuẩn 2025
LandingPage.Geo.import_new_vietnam_addresses()
# Chuẩn cũ (tỉnh / huyện / xã)
LandingPage.Geo.import_country_addresses(84, is_new: false, delete_old: true)
LandingPage.Geo.import_vn_provinces()
LandingPage.Geo.import_vn_districts()
LandingPage.Geo.import_vn_commune()
(Đường dẫn module có thể khác — tra cứu code thực tế nếu cần.)
Outbox dispatcher
LandingPage.Outbox.Dispatcher.status()
LandingPage.Outbox.Dispatcher.flush()
Quantum (cron)
Quantum.Job.all(LandingPage.Scheduler)
LandingPage.Scheduler.deactivate_job(:analytics_aggregate)
LandingPage.Scheduler.activate_job(:analytics_aggregate)
Rabbit / Kafka
# Restart consumer (chỉ dev)
LandingPage.Rabbit.Supervisor.restart_consumers()
LandingPage.EventStreaming.Supervisor.restart_consumers()
Kiểm tra nhanh
LandingPage.Repo.aggregate("pages", :count)
LandingPageWeb.Endpoint.config(:url)
Process.list() |> length()
:erlang.memory()
Verify domain
LandingPage.Domains.verify_txt("yourdomain.com")
LandingPage.Domains.issue_certificate("yourdomain.com")
(Module thật ở lib/landing_page/domains/.)
Reset (chỉ dev)
docker compose exec landing-page mix ecto.reset
Đảm bảo bạn đang ở container dev, tuyệt đối không phải staging / prod.