Steps to provide Hasura Claims in Keycloak generated JWT
- Create your realm / client
- Inside client configuration go to "Mappers"
- Click on "Create"
- Name it "hasura"
- Choose Mapper Type "Script Mapper"
- Add following script to demonstrate how it works
alias gitlab-run='gitlab-runner exec docker --docker-volumes "/var/run/docker.sock:/var/run/docker.sock" --docker-privileged' |
image: docker:latest | |
variables: | |
PWD: $(pwd) | |
BUILD_BOX: webdeb/phx-dev | |
DATA_BOX: build_data_$CI_PROJECT_ID_$CI_BUILD_REF | |
stages: | |
- build | |
- test |
FROM alpine:3.5 | |
ARG APP | |
EXPOSE 5000 | |
EXPOSE 4369 | |
ENV PORT=5000 \ | |
MIX_ENV=prod | |
RUN apk --no-cache add ncurses openssl |
самый простой способ зайти по ssh на продакшен и у бинарника которым запускаешь проект выполнить attach_console | |
[12:45] | |
или есть сложней способ, сделать тунелирование портов с продакшена | |
их список можно увидеть запустив команду | |
`epmd -names` | |
`ssh -N remote_hose -L port1_from_command_above:localhost:port1_from_command_above -L port2_from_command_above:localhost:port2_from_command_above` | |
запустить свою локальную версию продакшен проекта с таким же значением куки как и продакшен, и вуаля ты можешь видеть все что происходит на продакшене | |
например запустить observer (edited) |
# Requires Erlang/OTP 19.0. Invoke as: | |
# | |
# iex --erl "-proto_dist Elixir.Epmdless -start_epmd false -epmd_module Elixir.Epmdless_epmd_client" --name frobozz3 | |
# A module containing the function that determines the port number | |
# based on a node name. | |
defmodule Epmdless do | |
def dist_port(name) when is_atom(name) do | |
dist_port Atom.to_string name | |
end |
defmodule Karta.Web.ReactPlug do | |
import Plug.Conn | |
def init(options), do: options | |
def call(conn, _opts) do | |
conn | |
|> put_resp_header("content-type", "text/html; charset=utf-8") | |
|> Plug.Conn.send_file(200, Application.app_dir(:karta_web, "priv/static/index.html")) | |
end |
export default class MailgunClient { | |
apiKey: string; | |
domain: string; | |
defaults?: { | |
from?: string; | |
subject?: string; | |
}; | |
constructor(apiKey: string, domain: string, defaults?: Record<string, any>) { | |
this.apiKey = apiKey; |
import { useState } from "react" | |
import { useQuery } from "blitz" | |
const useLazyQuery = (resolver, inputArg, options = {}) => { | |
const [enabled, setEnabled] = useState(false) | |
const [result, extras] = useQuery(resolver, inputArg, { | |
...options, | |
enabled, | |
suspense: false, | |
onSettled: () => setEnabled(false), |