» »

Postavitev mySQL

Postavitev mySQL

M01O ::

Pozdrav
Sem čisto nov v teh zadevah tako, da prosim za malo pomoči.

Postaviti želim mySQL strežnik na katerega bom preko WIFI z Arduinom v mySQL pošiljal neke podatke.
mySQL sem postavil s pomočjo programa XAMPP. Naredil sem tabelo katero sem tudi izvozil v Excel dokument in se tako prepričal, da deluje.

Sedaj pa mi ni povsem jasno kako je lahko ta strežnik viden ostalim računalnikom v omrežju. Njegov naslov je http://localhost:8080/phpmyadmin/
Če na ostalih računalnikih vpišem ta naslov zadeva ne deluje. Tudi če poizkusim http://127.0.0.1:3306/.

Se pravi potrebujem mySQL strežnik, ki bo priklopljen v domače omrežje. Naj rajše za to uporabim kakšne NAS strežnik ali pa Raspberry pi?

Hvala vsem za odgovore!

aerie ::

Vpiši IP naslov računalnika (strežnika). Da zveš kakšen je IP, v command prompt vpiši
ipconfig
.

M01O ::

Sem že poizkusil pa dobim tole

Not Found

HTTP Error 404. The requested resource is not found.


Morda imam kaj narobe v nastavitvah samo ne najdem.

BivšiUser2 ::

A maš porte zdrihtane? Na strežniku z bazo odpri port 3306. Prav tako napravi preko routerja dodeli statični (privatni - 192.168.x.y) ip naslov, potem pa na ta naslov pošiljaj pač kar maš pošiljati. Kakršen koli izpis nastavitev bi bil dobrodošel.
SloTech - če nisi z nami, si persona non grata.

Stari89 ::

Ugibam, da si naložil XAMPP in nato dostopal do baze preko phpMyAdmin. Ugibam tudi, da se prvič srečuješ z Web Development, tako da ti marsikateri osnovni pojmi niso jasni.

XAMPP: X (cross-platform), A (apache), M (MySQL oz. MariaDB), P (PHP), P (Parl). Ni lih program ampak je skupek naštetih servicov, ki ždijo v ozadju. Zraven dodajo še kup bombončkov, recimo phpMyAdmin, s katerim si ti dostopal do baze.
phpMyAdmin: spletna aplikacija spisana v php, ki olajša razvoj MySQL (MariaDB) baze. Ko imaš enkrat bazo postavljeno, tvoja aplikacija NE dostopa do baze preko phpMyAdmin, ampak preko lastnih klicev.
localhost in 127.0.0.1: naslova, ki kažeta na trenutni računalnik. Torej, če razvijaš bazo ali recimo php aplikacijo na svojem kompu in se želiš iz istega kompa povezat gor, napišeš ta naslov. Če se želiš povezat iz kateregakoli drugega kompa na isto bazo/aplikacijo moraš vedet zunanji naslov tega compa. To storiš z vpisom ipconfig v CMD.
CMD: Command-line interface oz. Windowsov terminal. Odpreš ga tako, da pritisneš Ctrl+R, vpišeš "cmd" in stisneš Enter.
ipconfig: Ukaz v CMDju, ki ti izpiše mrežne nastavitve na tvojem kompu, med drugim tudi trenutni IP naslov.



Kaj moraš ti najverjetneje storit:
1. Naložit MySQL (oz. MariaDB) na katerikoli računalnik ali NAS ali Raspberry Pi, ki ima dostop do tvoje mreže (LAN). Priporočljivo na računalnik, ki se ne ugaša, saj ta čas ne bo dostopa do baze, pa še IP se lahko spremeni.
2. Ugotovi IP računalnika in connection string za tvoj DB.
3. Na routerju odpri potrebne porte.
4. Sprogramiraj Arduina, da se poveže na bazo.

AndrejS ::

Local host = 127.0.0.1 in to pomeni da je to on sam. Ti potrebuješ njegov IP, da se lahko drugi gor povežejo

Šmorn ::

Odpri port v firewallu.

Nublet ::

M01O je izjavil:


Sedaj pa mi ni povsem jasno kako je lahko ta strežnik viden ostalim računalnikom v omrežju. Njegov naslov je http://localhost:8080/phpmyadmin/
Če na ostalih računalnikih vpišem ta naslov zadeva ne deluje. Tudi če poizkusim http://127.0.0.1:3306/.

Se pravi potrebujem mySQL strežnik, ki bo priklopljen v domače omrežje. Naj rajše za to uporabim kakšne NAS strežnik ali pa Raspberry pi?

Prvo kot prvo, http://localhost:8080 == http://127.0.0.1:8080, kot tudi http://127.0.0.1:3306/ == http://localhost:3306/, ker je localhost le human friendly ime za IP 127.0.0.1, kateri je namenjen klicem, ki imajo izvor in destinacijo na istem fizičnem računalniku. Ker pa hočeš pošiljati podatke na ta strežnik iz druge naprave (sklepam da v isti mreži, na istem routerju), potrebuješ še IP naslov, ki ti ga je dodelil router oziroma DHCP strežnik. Za računalnik to najlažje izveš preko ukazne vrstice z ipconfig ukazom, kot je že bilo omenjeno.

Dejansko ne potrebuješ nobenega dodatnega MySQL strežnika, ker si ga že namestil na računalnik, na katerem si delal bazo kot del XAMPP paketa. Če ti ni problem ga laufati 24/7 ga lahko pustiš kar na tem računalniku, le dodeli mu statični IP na tvojem routerju (static DHCP lease), da boš lahko z arduina pošiljal podatke vedno na isto IP:PORT kombinacijo.

Torej, recimo, da ima tvoj računalnik z MySQL bazo IP 192.168.1.2 (kar si našel preko ipconfig). To pomeni, da na arduino delu kode, ki skrbi za vpis v bazo vpišeš IP in PORT kombinacijo 192.168.1.2:3306 (sklepam da si pustil default MySQL port).

Če pa bi rad laufal podatkovno bazo na RPi, potem moraš tam namestiti bazo (ali preko XAMPP ali standalone) ter pogledati kak IP naslov ima RPi. To lahko storiš preko routerja (kjer primerjaš MAC RPi naprave z IPjem, ter mu tudi dodeliš statični ip) ali pa če imaš možnost izvajanja ukazov direktno na RPi uporabiš ukaz v terminalu ifconfig (pazi, ni typo). Ko enkrat izveš IP je postopke na arduino popolnoma enak kot v prejšnjem odstavku, uporabiš pa le IP:PORT za RPi.

HotBurek ::

Postavitev podobnega sitema z Debian, nginx, uwsgi, Python, iptables (manjka MySQL...).

Prvo se namesti svež Debian: (primer za 64 bit) https://cdimage.debian.org/debian-cd/cu...

Idealno je, če se namesti samo osnovni OS, brez GUIja. :)


### Nastavitev Debian-a po novi inštalaciji


## datum in čas
date -s 2017-02-17
time -s 12:08:00



## update sources za updejte in programe
nano /etc/apt/sources.list

primer:
deb http://ftp.si.debian.org/debian/ stretch main contrib non-free
deb-src http://ftp.si.debian.org/debian/ stretch main contrib non-free

deb http://security.debian.org/debian-secur... stretch/updates main contrib non-free
deb-src http://security.debian.org/debian-secur... stretch/updates main contrib non-free

# stretch-updates, previously known as 'volatile'
deb http://ftp.si.debian.org/debian/ stretch-updates main contrib non-free
deb-src http://ftp.si.debian.org/debian/ stretch-updates main contrib non-free



## update software
apt-get update

(za iskanje software-a apt-cache search python)


## postavitev SSH strežnika

apt-get install openssh-server
update-rc.d ssh defaults
service ssh restart
service ssh status


(za preverjanje odprtih portov ukaz netstat -anotlp)

## nastavitev iptables

cd /etc
mkdir iptables
cd iptables
nano rules.v4


primer nastavitev:
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -s 192.168.0.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -s 192.168.0.0/24 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -j ACCEPT


V iptables "engine" se nastavitve shrani z ukazom iptables-restore < /etc/iptables.rules.v4. Prebere pa z iptables-save > /etc/iptables/rules.v4

Ker se ob ponovnem zagonu te nastavitve ne shranijo v "engine", jih je potrebno ponovno uvozit ob vsakem zagonu.

Kreira se fajl:
nano /etc/network/if-pre-up.d/iptables

Ter vpiše tole:
#!/bin/sh
/sbin/iptables-restore < /etc/iptables/rules.v4


Ter izvede ukaz chmod +x /etc/network/if-pre-up.d/iptables


Po restartu bi server moral bit dosegljiv iz lokalnega omrežja na portu 22.


## Postavitev nginx

Namestitev:
apt-get install nginx

Potem kreiranja defaul folderja za nov content in prvi testič delovanja.

Kreiramo folder in html file:
cd /var/www
mkdir mymysql
cd mymysql
nano hell-oh.html


V sam file se shrani nek basic html. Primer (manjkajo špičasti oklepaji/zaklepaji):
!DOCTYPE html
head
title mymysql site /title
meta charset="utf-8"/
/head
body
Hello world...
/body


Nginx config se nahaja v dveh folderjih, sites-available ter sites-enabled. Kako deluje?

(neobvezno) Prvo se kreira folder za logging.
cd /var/log/nginx
mkdir mymysql
chown www-data:amd mymysql/


Ok. Next se kreira config file v folderju sites-available.

cd /etc/nginx/sites-available
nano mymysql


Sam config za port 80 za html:
server {

listen 80;

server_name _;

root /var/www/mymysql;

location / {
try_files $uri /mymysql.html =404;
allow 192.168.0.0/24;
deny all;
}

access_log /var/log/nginx/mymysql/access-http.log;
error_log /var/log/nginx/mymysql/error-http.log error;
}


Če je config pravilen, se preveri z nginx -t ukazom.

Ta config, shranje v sites-available folderju postane aktiven tako, da se ga zlinka v folder sites-enabled:
ln -s /etc/nginx/sites-available/mymysql /etc/nginx/sites-enabled

Linke se pa preveri z ls -l v folderju /etc/nginx/sites-enabled

Ostale fajle (linke), ki so v folderju sites-enabled, se lahko pa pobriše. Sploh default, ki je verjetno na portu 80.

Potem pa restart serverja:
service nginx restart
service nginx status


Če vse štima, bi server moral vrnit html pejđ.


## postavitev uwsgi

Uwusgi bo poganjal Python skripto, ki jo kliče nginx.

apt-get install uwsgi

Config fajli so v /etc/uwsgi. Podobno kot nginx, v apps-available so config fajli, v apps-enabled pa polinkani.

V /etc/uwsgi/apps-avaliable naredimo config:
cd /etc/uwsgi/apps-available
nano mymysql.ini


Primer config fajla:
[uwsgi]
plugins = cgi
socket = 127.0.0.1:9999
cgi = /var/www/mymysql/
cgi-allowed-ext = .py
cgi-helper = .py = python3.5
master = true
processes = 1
threads = 1


V iptables rules.v4 dodamo port 9999
iptables-save > /etc/iptables/rules.v4
nano /etc/iptables/rules.v4


Nekej "na sredini" dodamo:
-A INPUT -i lo -p tcp -m tcp --dport 9999 -j ACCEPT

Potem pa iptables-restore < /etc/iptables/rules.v4

Potem gremo v folder /etc/uwsgi/apps-enabled ter dodamo link:
ln -s /etc/uwsgi/apps-available/mymysql.ini /etc/uwsgi/apps-enabled
ls -l


Ter se restarta service:
service uwsgi restart
service uwsgi status
netstat -anotlp


Port 9999 bi moral bit up.

Potem nastavitev nginx za uwsgi. V location (nano /etc/nginx/sites-available/mymysql) se nastavi:
location / {
try_files /hello.py =404;
include uwsgi_params;
uwsgi_modifier1 9;
uwsgi_pass 127.0.0.1:9999;
}


Ter:
nginx -t
service nginx restart


## Namestitev Python interperterja

apt-get install python3.5
python3.5 -V


## Python skripta

V folder /var/www/mymysql se shrani Python skripta hello.py. Primer:
#!/usr/bin/python3.5

# print header
print("Content-Type: text/plain; charset=utf-8;");
print("");

# print content
print("Hello world!");


Ter test, če web strežnik vrača Hello world! text. Za debug; v browserju F12, na strežniku pa /var/log/uwsgi, kjer so python errorji.

Lahko so težave tudi s pravicami fajlov v /var/www/mymysql.
cd /var/www/mymysql
chown root:www-data hello.py
chmod g+x hello.py
ls -l



## Branje inputov

Ko to dela, lahko preko HTTP GET (ali POST) podatke pošiljamo na server in jih shranjujemo v fajle, mysql itn.

Primer v Pythonu, kako shranit podatke v fajl za klice HTTP GET (http://192.168.0.4/hello.py?arduinodata.... Podatke (1234) se shranjuje vsak dan v nov fajl, skupaj s časom vnosa in client IPjem.

Da se pa popravit, pa se namesto v fajle, vpiše v mysql (npr. z python3-sqlalchemy).

Upam, da komu pride prav.

#!/usr/bin/python3.5

# import
import os;
import datetime;
import traceback;

# define
requesturi = "";
querystring = "";
remoteaddress = "";

# database path
databasepath = "/var/database";

# allow upload clients
allowips = ["192.168.0.7", "192.168.0.177"];


def getdate():
    dtstart = datetime.datetime.now();
    day = dtstart.day;

    if len(str(day)) == 1:
        day = "0" + str(day);
    month = str(dtstart.month);
    if len(str(month)) == 1:
        month = "0" + str(month);
    _date = str(dtstart.year) + "-" + str(month) + "-" + str(day);

    return _date;

def gettime():
    dtstart = datetime.datetime.now();
    second = dtstart.second;

    if second < 10:
        second = "0" + str(second);
    minute = dtstart.minute;
    if minute < 10:
        minute = "0" + str(minute);
    hour = dtstart.hour;
    if hour < 10:
        hour = "0" + str(hour);
    _time = str(hour) + ":" + str(minute) + ":" + str(second);

    return _time;



if __name__ == "__main__":

    # read input request parameters
    for par in os.environ.keys():
        if str(par) == "REQUEST_URI":
            requesturi = os.environ[par];
        elif str(par) == "QUERY_STRING":
            querystring = os.environ[par];
        elif str(par) == "REMOTE_ADDR":
            remoteaddress = os.environ[par];

    if remoteaddress in allowips:

        # http://192.168.0.4/hello.py?arduinodata=1000

        if requesturi.startswith("/hello.py?arduinodata="):
            data = requesturi.replace("/hello.py?arduinodata=", "");

            if os.path.exists(databasepath):
                try:
                    # /var/database/arduino-2018-03-26.txt

                    filename = "/arduino-" + getdate() + ".txt";
                    if not os.path.exists(databasepath + filename):
                        file = open(databasepath + filename, "w");
                        file.write(gettime() + "|" + str(remoteaddress) + "|" + data + "\n");
                        file.close();
                    else:
                        file = open(databasepath + "/arduino-" + getdate() + ".txt", "a+");
                        file.write(gettime() + "|" + str(remoteaddress) + "|" + data + "\n");
                        file.close();

                    print("Content-Type: text/plain; charset=utf-8;");
                    print("");
                    print("#ok");
                    print("#data " + str(data) + " added to file " + str(filename));

                except Exception as exc:
                    error = traceback.format_exc();
                    print("Content-Type: text/plain; charset=utf-8;");
                    print("");
                    print(str(error));

            else:
                print("Content-Type: text/plain; charset=utf-8;");
                print("");
                print("Path " + str(databasepath) + "does not exist");

        else:
            print("Content-Type: text/plain; charset=utf-8;");
            print("");
            print("No API...");
    else:
        print("Content-Type: text/plain; charset=utf-8;");
        print("");
        print("Mister Den Aj");
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window

M01O ::

Sem ugotovil, da je težava skoraj zagotovo z nastavitvami.
Na novo sem namestil še Windows 7 in vse je videti da tam deluje. Se spomnim, da sem imel ob inštalaciji težave z nastavitvami portov. pomoje delno tudi zaradi tega ker na računalnik med preizkušanjem namestim boga in pol programov, ki jih potem uporabljam ali ne...


Hvala vsem za izčrpne odgovore. Res človeku polepšate dan ko pomagate po forumih.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Python - pošlji aplikacijo na server

Oddelek: Programiranje
201222 (457) HotBurek
»

Python v Wordpress

Oddelek: Programiranje
81069 (864) Halfdead987
»

Domač server!

Oddelek: Pomoč in nasveti
221603 (1049) s1m0n
»

Debian Gnu/Linux kot workstation (strani: 1 2 3 437 38 39 40 )

Oddelek: Operacijski sistemi
1960111344 (27018) RedDrake
»

mysql linux problem

Oddelek: Omrežja in internet
141229 (1082) Trubadur

Več podobnih tem