nobody

nobody

How to get the server ip address?

Hi!

In PHP: $_SERVER[‘SERVER_ADDR’] - in Elixir?

Searched the docs for ip address and the web, no good results.

Thanks!

First 10 of 16 Posts! Switch mode

StefanHoutzager

StefanHoutzager

Maybe you can use System.cmd (and ifconfig in linux)?
http://elixir-lang.org/docs/stable/elixir/System.html

nobody

nobody

hmm, there must be a native method for that?

sysashi

sysashi

Elixir does not have builtin web server. If you are using Phoenix, you can try MyApp.Endpoint.url function. Otherwise check documentation of a webserver.

nobody

nobody

sysashi, thank you for that information, however I was asking for how to get the current ip address of the server and do not see how your answer is connected to that?

btw what is running when I do mix phoenix.server or run a release?

StefanHoutzager

StefanHoutzager

If it’s not there and you find it should you could try to write it yourself (good exercise! :wink: and add it to the language. It’s opensource.

Linuus

Linuus

Try to call the erlang function :inet.getif()

NobbZ

NobbZ

If you want to have your app to know about a specific IP, then hardcode it or set it as a config.

It may be possible that you end up in an environment that has multiple interfaces and as such multiple IPs, even worse if your apps server listens on at least two of them. Which IP do you want to know in this setting?

dom

dom

Something like this should do the trick

{:ok, ifs} = :inet.getif()
ips = Enum.map(ifs, fn {ip, _broadaddr, _mask} -> ip end)

I think getif is not documented, so technically it could disappear eventually. getifaddrs may be a more future-proof option. Note in practice this will return multiple IPs since you’ll have at least a loopback and an external IP.

You’ll find more options if you google something like “erlang get ip”, whatever works in Erlang will also work in Elixir.

sysashi

sysashi

so PHP: $SERVER['SERVERADDR'] in OP’s example will return an IP address of a underlying WEB server, :inet.getif() will return interfaces on a machine where hypothetically you run you WEB server. Not sure if we all talking about the same stuff :slight_smile:

nobody

nobody

My question is of course related to the exact situation you describe and I would like to see to which IP address phoenix binds automatically and why this happens.
Of course the goal is to have some control over this and I would like to tell phoenix to bind to a specific ip address, do you know how to do that, seems like this is not explicitely documented anywhere. Please see my other question about that from today, thanks!

Last Post!

blackham

blackham

A way to make a good guess at your server IP. (It might not be your public IP if you have NAT). Sadly I couldn’t find a way for erlang to return a list of the network routes, so I had to fall back to a System.cmd call. The idea is find the default gateway for the server, see what dev (interface) it us using, then find the IP addr of that device.

I promise there are better ways to do this that will work with ipv6, not rely on a System.cmd (like read /proc), handle multiple IPs assigned to the same device, etc.. but its’ quick and dirty and works for me.:

# Get the name of the default interface (IF)
# Wish erlang hand a command to nicely get the route information
#   Could work with `netstat -rn` too with some changes to the regex
{result, 0} = System.cmd("ip", ["route","list","default"])
default_if = Regex.scan(~r/.*dev (.*) .*/U, result, capture: :all_but_first) |> List.first |> List.first |> String.to_charlist

# Now find the default device in the list of all devices
{:ok, ifs} = :inet.getifaddrs
{_if, attrs} = List.keyfind(ifs, default_if, 0)

# Now grab the IP in {a,b,c,d} format
{:addr, ip} = List.keyfind(attrs, :addr, 0)

# Now make it a string (sorry, binary BitString.. whatever)
{a,b,c,d} = ip
"#{a}.#{b}.#{c}.#{d}"

Where Next?

Trending in Questions Top

jonnycharles
I’m in search of an Elixir library that offers PDF generation capabilities similar to Ruby’s Prawn. While there have been discussions abo...
New
spammy
I’m looking to build a personal workflow to quickly deploy web applications written in elixir/phoenix, for local consumption (ie not on t...
New
silverdr
Using Phoenix.LiveView.TagEngine as an EEx.Engine is deprecated! To compile HEEx, use Phoenix.LiveView.TagEngine.compile/2 instead. Sta...
New
saveman71
Hello ! We want new/edit form pages to POST/PUT to their own URL rather than the resources REST defaults (post /things, put /things/:id)...
New
dli
Before I dive in myself, did anyone successfully sprinkle Hologram into their existing LiveView app? Looking for hints regarding: Addi...
New
bottlenecked
Hi all, I wanted to ask how the community is dealing with post-release steps. Today we have Ecto migrations, which make sure that the db...
New
michallepicki
I am using Oban and occasionally, shortly after a deployment, a handful of jobs can fail because of dependency on other parts of the syst...
New

Other Trending Topics Top

JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Damirados
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge & Solve. They are GUI (Emerge) and State management (S...
New
ausimian
Emily is an Elixir library that runs Nx computations on Apple’s MLX. Install it as the default Nx backend and Nx, defn, Axon, Nx.Serving,...
New
type1fool
I just stumbled on a newly redesigned elixir-lang.org. :tada: It looks like @Software_Mansion did the work, and I think it is generally a...
New
akoutmos
@hugobarauna and I (Alex Koutmos) have been hard at work on writing a book on Nerves that takes you from simply blinking LEDs to building...
New

We're in Beta

About us Mission Statement