Files
Server-Setup/README.md
T
2026-07-12 15:38:05 +03:00

20 KiB
Raw Blame History

👀 Server-Setup Overview

This repository helps you build a complete self-hosted environment on your own VPS or home server. Host your own file server, Git repositories, video conferencing platform, online office suite, RSS reader, file sharing service, uptime monitoring, forms, synchronization tools, email server, vpn server and many other applications—all under your own control.

Server-Setup Demo Image

Terminal icerisinde yukari asagi yapmak icin 'Shift+Page_Up' ve 'Shift+Page_Down' tuslarini kullanabilirsin
'sudo dmesg -D' kodu ile terminale yazirilan auid yazilarini o oturum icin kisa sureli durdurur

BASE(Yunohost)

Video-Voice Call(Element,Synapse)
Rss(FreshRSS)
Github Repo Clone(Gitea)
Realtime Server Monitoring(Glances)
Advanced Form Platform(Lime Survey) Share files and notes with outserver safely(Lufi)
Run your 'html,css,js' page(my_webapp)
Store Files,Notes,Calendar,Forms,Photos and OnlyOffice(Nextcloud,OnlyOffice)
Local file sharing(PairDrop)
Realtime website analytics(Umami)
Realtime apps'web urls' monitoring(Uptime Kuma)
Webmail Client(Snappy Mail)
File convertion utility(Vert)

VPN Server(Wireguard VPN)For long-term compatibility, it does not run inside YunoHost

Real VNC Viewer(For connecting to server easily)
File Zilla(For upload your website documents to server)

📦 Setup

ssh root@SUNUCU_IP

apt update && apt full-upgrade -y
reboot

ssh root@SUNUCU_IP

apt install -y curl wget sudo gnupg2 ca-certificates

ya da

terminal:
vncviewer <vnc_ip>:<vnc_port>
enter the vnc password(max 8 character)

Enter your user:root and password:server password
apt update
apt full-upgrade -y
apt autoremove -y
reboot

cat /etc/os-release
hostnamectl
hostname -I
ip a
timedatectl

-test those-

Debian 12
IPv4
IPv6 (inet6 2a01:c303:2456:2954::1/64 scope global, ipv6 is 2a01:c303:2456:2954::1)
Saat doğru mu
Network doğru mu

CLOUDFLARE DNS RECORDS

Sign In into cloudflare and chose DNS Records>Connect a Domain
Configure AI training & search policies: Search:Allow
Agent:Allow
Training:Block
Import DNS Records:Manual only
All Records should be DNS only
A domain IPV4
AAAA domain IPV6
CNAME www furk4ngg.me
A * IPV4
AAAA * IPV6

A chat.domain IPV4
A cloud.domain IPV4
A convert.domain IPV4
A docs.domain IPV4
A forms.domain IPV4
A git.domain IPV4
A lufi.domain IPV4
A mail.domain IPV4
A pair.domain IPV4
A rss.domain IPV4
A syn.domain IPV4
A uptime.domain IPV4
A usage.domain IPV4
A visitors.domain IPV4

AAAA chat.domain IPV6
AAAA cloud.domain IPV6
AAAA convert.domain IPV6
AAAA docs.domain IPV6
AAAA forms.domain IPV6
AAAA git.domain IPV6
AAAA lufi.domain IPV6
AAAA mail.domain IPV6
AAAA pair.domain IPV6
AAAA rss.domain IPV6
AAAA syn.domain IPV6
AAAA uptime.domain IPV6
AAAA usage.domain IPV6
AAAA visitors.domain IPV6

In your domain provider,update your nameserver based on cloudflare nameserver such as 'sam.ns.cloudflare.com' and 'kack.ns.cloudflare.com'

hostnamectl set-hostname domain

apt update && apt full-upgrade -y

curl https://install.yunohost.org | bash

After completing the local YunoHost configuration, create the following domains from 'YunoHost>Domains' for the DNS records that we created:
Element -> chat.domain and Synapse -> syn.domain
FressRSS -> rss.domain
Gitea -> git.domain
Glances -> usage.domain
Lime Survey -> forms.domain
Lufi -> lufi.domain
my_webapp -> domain
Nextcloud -> cloud.domain
Only Office -> docs.domain
Pair Drop -> pair.domain
Umami -> visitors.domain
Uptime Kuma -> uptime.domain
Snappy -> mail.domain
Vert -> convert.domain

Yunohost App Permissions

visitors(Ziyaretçiler) all_users(Tum yunohost kullanicilari)

Element -> all_users
Synapse -> all_users
FreshRSS -> all_users
Gitea -> visitors,all_users
Glances -> all_users
Lime Survey -> visitors,all_users
Lufi -> all_users
my_webapp -> visitors,all_users
Nextcloud -> visitors,all_users,admins
Only Office -> visitors,all_users
Pair Drop -> all_users
Umami(visitors.domain) -> all_users
Uptime Kuma -> all_users
Snappy -> all_users
Vert -> all_users

Display tile in portal -> (Yes)

URL CERTIFICATES

DNS A record is correct.
DNS AAAA record is correct.
The nameservers have been updated.
HTTP is reachable from outside.
Nginx is running.
The server can connect to the Let's Encrypt API.
Cloudflare proxy is disabled (DNS only).
After the nameserver changes have fully propagated,

sudo yunohost domain cert install

-Web App Ayarlari (Make index work instead of index.html)-

sudo nano /etc/nginx/conf.d/domain.d/my_webapp.conf
index index.php index.html; --> index index.html index.htm;

try_files $uri $uri/ /index.php?$args =404; --> try_files $uri $uri/ $uri.html =404;

location = /favicon.ico {
    log_not_found off;
    access_log off;
}

location = /robots.txt {
    allow all;
    log_not_found off;
    access_log off;
}

location /maintenance/ {
    deny all;
}

location ~ ^/(.+/|)\.(?!well-known/) {
    deny all;
}

sudo nano /etc/nginx/conf.d/furk4ngg.me.d/my_webapp.d/custom_headers.conf

add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Cross-Origin-Opener-Policy "same-origin" always;
add_header Cross-Origin-Resource-Policy "same-origin" always;

Test
sudo nginx -t

if its ok
sudo systemctl reload nginx or sudo systemctl restart nginx

-Lufi Settings-

Install Lufi with LDAP configuration? -> (Yes)

-Uptime Kuma-

Choose SQLite database

-Umami Settings-

visitors.domain -> all_users
visitors.domain/api -> visitors
visitors.domain/recorder -> visitors
visitors.domain/script -> visitors

-Element Settings-

Enable fedration features by default -> (Yes)
chat.domain -> all_users
chat.domain/bundles -> visitors

syn.domain -> all_users
syn.domain/_synapse -> visitors
syn.domain/livekit -> visitors
syn.domain/_matrix -> visitors
syn.domain/.well-known/matrix -> visitors

-Gitea Settings-

Enable LFS support on this instance -> (Yes)
Enable support hover SSH protocol -> (Yes)
git.domain -> all_users,visitors
admin -> admins
git.domain.megit.furk4ngg.me/v2 -> visitors

-Lime Survey-

forms.domain/admin -> admin page
https://forms.domain/index.php/dashboard/view

-NextCloud Settings-

Add the users' home directory in Nextcloud? -> (No)

📦 OnlyOffice Setup

Verify that the server settings were successfully updated
Check healthcheck and api.js

sudo yunohost service status | grep -i onlyoffice
curl https://docs.domain/healthcheck
curl -I https://docs.domain/web-apps/apps/api/documents/api.js

Verify that the secret keys match

sudo grep -n -A5 -B5 "secret" /var/www/onlyoffice/config/local.json

"secret": {
"browser": {
"string": "secret_key"
Paste that key into 'Nextcloud>Administration Settings>ONLYOFFICE'
ONLYOFFICE Docs address: https://docs.domain
Secret Key: Paste secret_key here

Test>

sudo yunohost app shell nextcloud
php occ config:app:get onlyoffice jwt_secret

secret key

Verify the SSL certificate

curl -Iv https://docs.domain

Run the curl tests

sudo -i

php /var/www/nextcloud/occ app:disable richdocuments
php /var/www/nextcloud/occ app:disable richdocumentscode
php /var/www/nextcloud/occ app:disable office
php /var/www/nextcloud/occ app:list | grep -i "onlyoffice\|richdocuments\|richdocumentscode\|office"
sudo apt update
sudo apt install php8.2-xml php8.2-mbstring php8.2-zip php8.2-gd php8.2-curl
sudo systemctl restart php8.2-fpm
php -m | grep -E "SimpleXML|mbstring|zip|gd|curl"

Verify occ

sudo -i
php /var/www/nextcloud/occ status

Verify Server Time

timedatectl status

Final diagnosis

sudo tail -100 /var/log/onlyoffice/docservice.log

Create a new document
If the page loads forever, first open F12 → Console
If analytics.js fails to load:
Disable Firefox Enhanced Tracking Protection or turn off uBlock, AdGuard, Brave Shields, or any similar blocker for this site
CTRL + F5

-Mail Settings-

(Cloudflare)
All Records should be DNS only
MX domain mail.domain (Priority 10)
TXT domain "v=spf1 a mx -all"
TXT _dmarc "v=DMARC1; p=none"
TXT mail._domainkey "v=DKIM1; h=sha256; k=rsa; p='long value that you can see in diagnosis screen'"
CAA domain issue "letsencrypt.org"
PTR domain mail.domain

sudo yunohost diagnosis run  
sudo yunohost service status | grep -E "postfix|dovecot|rspamd|opendkim"  

sudo postconf myhostname
sudo grep -R "mail.domain" /etc/opendkim /etc/postfix /etc/dovecot 2>/dev/null

Which ports are open? ->
IMAP
sudo ss -tln | grep -E ":143|:993"

143 → IMAP + STARTTLS
993 → IMAPS (SSL/TLS)

SMTP
sudo ss -tln | grep -E ":25|:465|:587"

25
465
587

Is STARTTLS actually working? ->
SMTP
openssl s_client -starttls smtp -connect domain:587

Verify return code: 0 (ok)

IMAP
openssl s_client -connect domain:993
openssl s_client -starttls imap -connect domain:143

Is SMTP Authentication working ->

doveadm auth test furk4ngg@domain

auth succeeded

Can LDAP see the email address? ->

postmap -q "furk4ngg@domain" ldap:/etc/postfix/ldap-accounts.cf  

What is the mail server hostname? ->

sudo postconf myhostname  

myhostname = domain

Verify the mail domains ->

sudo yunohost user info furk4ngg  

mail:furk4ngg@domain

Which domains accept mail? ->

sudo cat /etc/postfix/virtual-mailbox-domains

Show the dedicated sender addresses used by applications (Nextcloud, Synapse, etc.) ->
sudo postmap -s /etc/postfix/app_senders_login_maps

IMAP SETTINGS

Admin page -> https://mail.domain//app/?admin
username:admin
password:/var/www/snappymail/app/data/data/default/admin_password.txt

Server: domain

Port: 993

Security: SSL/TLS

Use short login: OFF

Lowercase login: ON

Require verification: ON

Allow self signed: OFF

SMTP SETTINGS

Server: domain

Port: 587

Security: STARTTLS

Use short login: OFF

Lowercase login: ON

Use authentication: ON

Use login as sender: OFF

Force AUTH PLAIN: OFF

Use php mail(): OFF

Require verification: ON

Allow self signed: OFF

DKIM 1024 bit uyarısı
sudo opendkim-testkey -d domain -s mail -vvv
1048 bit starts with MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQ...
2048 bit starts with MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A...

/baska maillerden yonlendirme hesabi/

TEST ADRESSES

DNS Checker -> https://mxtoolbox.com/DNSLookup.aspx
Validate your DKIM and SPF DNS records. -> https://dmarcdkim.com/tools/check-dkim-record?domain=domain
Mail Tester -> https://www.mail-tester.com/
MX Records and Blacklist check -> https://mxtoolbox.com/SuperTool.aspx
SPF Test -> https://mxtoolbox.com/spf.aspx
Domain Health Report -> https://mxtoolbox.com/emailhealth/
SEO TEST -> https://www.seobility.net/en/seocheck/
Web Page Quality -> https://pagespeed.web.dev/

If its all good

Create a new account named dmarc@domain in YunoHost.
TXT _dmarc "v=DMARC1; p=reject; rua=mailto:dmarc@domain; adkim=s; aspf=s; pct=100"
Test it -> https://easydmarc.com/tools/dmarc-lookup

In your Server Hosting change (Reverse DNS Management>PTR Records(IPV4 to mail.domain / IPV6 to mail.domain))

sudo cp /etc/postfix/main.cf /etc/postfix/main.cf.bak
export TERM=xterm-256color
sudo vim /etc/postfix/main.cf > myhostname = mail.domain

sudo postconf myhostname

myhostname = mail.domain

openssl s_client -starttls smtp -connect mail.domain:587
Type>EHLO test

250-mail.domain

PTR Test
dig -x +short

mail.domain

If all three point to mail.domain, the mail configuration is fully consistent.

Emails appear under YunoHost → Users
You can connect and use your mail with these mail providers:Thunderbird,Gmail,Outlook,Proton Mail or with your Webmail Client(Snappy Mail)

📦 Wireguard VPN Setup

In my opinion, this is not anonymity, since all tunnel traffic exits through a single VPS IP address

On public Wi-Fi, all traffic is encrypted until it reaches your VPS

You can securely access services such as Nextcloud, Gitea, and SSH

You can restrict SSH and management panels so they are only accessible through the VPN

You can also route DNS queries through your own server, preventing the local network from seeing them

sudo apt update
sudo apt install wireguard qrencode
Test>wg --version

wireguard-tools v1.0.20210914 - https://git.zx2c4.com/wireguard-tools/

export TERM=xterm-256color
sudo nano /etc/sysctl.conf
Make sure the following are present:

net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1

sudo sysctl -p

sudo -i
sudo mkdir -p /etc/wireguard
cd /etc/wireguard

umask 077
wg genkey > server_private.key
wg pubkey < server_private.key > server_public.key

chmod 600 server_private.key
chmod 644 server_public.key
Server Public Key -> sudo cat /etc/wireguard/server_public.key

We will use this key for future clients

Server Private Key -> sudo cat /etc/wireguard/server_private.key

ls -lah /etc/wireguard
It should look similar to this:

server_private.key
server_public.key
wg0.conf

ip route | grep default If resoult has eth:

elif(ens18):

Create wg0.conf

export TERM=xterm-256color
nano /etc/wireguard/wg0.conf

[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = SERVER_PRIVATE_KEY

PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

chmod 600 /etc/wireguard/wg0.conf

Test -> ls -l /etc/wireguard
For wg0.conf and server_private.key, you should see the following:

-rw-------

IPV6 eklenecek

Enable the service

systemctl enable wg-quick@wg0
systemctl start wg-quick@wg0

Test>
systemctl status wg-quick@wg0 --no-pager
wg
ip addr show wg0

sudo yunohost firewall list
sudo yunohost firewall allow UDP 51820
sudo yunohost firewall reload

sudo ss -lun | grep 51820

*:51820

Create Client Key
For Mobile Clients

Create Mobile Client Key

cd /etc/wireguard
umask 077
wg genkey | tee phone_private.key > /dev/null
wg pubkey < phone_private.key > phone_public.key
chmod 600 phone_private.key
chmod 644 phone_public.key

Test -> ls -l phone_*

-rw------- phone_private.key
-rw-r--r-- phone_public.key

Phone Public Key -> sudo cat phone_public.key

export TERM=xterm-256color
nano /etc/wireguard/wg0.conf
Add this into end of the page

   [Peer]
   # Phone
   PublicKey = PHONE_PUBLIC_KEY
   AllowedIPs = 10.8.0.2/32

systemctl restart wg-quick@wg0
wg

peer: XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
allowed ips: 10.8.0.2/32

Phone.conf

Phone Private Key -> sudo cat phone_private.key
Server Public Key -> sudo cat /etc/wireguard/server_public.key
export TERM=xterm-256color
nano /etc/wireguard/phone.conf

   [Interface]
   PrivateKey = PHONE_PRIVATE_KEY
   Address = 10.8.0.2/24
   DNS = 1.1.1.1
    
   [Peer]
   PublicKey = SERVER_PUBLIC_KEY
   Endpoint = VPS_IP:51820
   AllowedIPs = 0.0.0.0/0, ::/0
   PersistentKeepalive = 25

QR Code -> qrencode -t ansiutf8 < /etc/wireguard/phone.conf

Install the official WireGuard application
Add Tunel(+)
Scan the QR code
🎉 You are ready to use yor VPN

Delete Mobile Client Key

   rm -f \
   /etc/wireguard/phone_private.key \
   /etc/wireguard/phone_public.key \
   /etc/wireguard/phone.conf

and delete this block in wg0.conf

   [Peer]
   # Phone
   PublicKey = PHONE_PUBLIC_KEY
   AllowedIPs = 10.8.0.2/32

sudo systemctl restart wg-quick@wg0

For Desktop Clients
Arch sudo pacman -S wireguard-tools
Debian/Ubuntu/Raspberry Pi OS sudo apt install wireguard
Fedora sudo dnf install wireguard-tools

Create Desktop Client Key

cd /etc/wireguard
umask 077
wg genkey | tee desktop_private.key > /dev/null
wg pubkey < desktop_private.key > desktop_public.key
chmod 600 desktop_private.key
chmod 644 desktop_public.key

Test -> ls -l

-rw------- desktop_private.key
-rw-r--r-- desktop_public.key

Desktop Public Key -> sudo cat desktop_public.key

export TERM=xterm-256color
nano /etc/wireguard/wg0.conf
Add this into end of the page

   [Peer]
   # Desktop
   PublicKey = DESKTOP_PUBLIC_KEY
   AllowedIPs = 10.8.0.3/32

systemctl restart wg-quick@wg0
wg

peer: XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
allowed ips: 10.8.0.3/32

desktop.conf

Desktop Private Key -> sudo cat desktop_private.key
Server Public Key -> sudo cat /etc/wireguard/server_public.key

In your PC
export TERM=xterm-256color
sudo nano /etc/wireguard/wg0.conf

   [Interface]
   PrivateKey = DESKTOP_PRIVATE_KEY
   Address = 10.8.0.3/24
   PreUp = ip route add VPS_IP/32 via 192.168.1.1 dev enp11s0
   PostDown = ip route del VPS_IP/32 via 192.168.1.1 dev enp11s0
        
   [Peer]
   PublicKey = SERVER_PUBLIC_KEY
   Endpoint = VPS_IP:51820
   AllowedIPs = 0.0.0.0/0
   PersistentKeepalive = 25

sudo chmod 600 /etc/wireguard/wg0.conf

Open VPN -> sudo wg-quick up wg0
Close VPN -> sudo wg-quick down wg0
Status -> sudo wg

Otomatic Connect when Pc is opened -> sudo systemctl enable wg-quick@wg0
Close that option -> sudo systemctl disable wg-quick@wg0

If you get connection error delete 'DNS = 1.1.1.1' from your desktop.conf and try again
sudo wg-quick up wg0

🎉 You are ready to use yor VPN

Delete Mobile Client Key

   rm -f \
   /etc/wireguard/desktop_private.key \
   /etc/wireguard/desktop_public.key \
   /etc/wireguard/desktop.conf

and delete this block in wg0.conf

   [Peer]
   # Desktop
   PublicKey = DESKTOP_PUBLIC_KEY
   AllowedIPs = 10.8.0.3/32

sudo systemctl restart wg-quick@wg0

wg

peer: XXXXXXXXXXXXX
latest handshake: 5 seconds ago
transfer: 120 KiB received, 90 KiB sent

Test -> https://ifconfig.me

You should see the VPS_IP

DNS Leak Test -> https://browserleaks.com/dns

⚠️ If you want to add a new client device, generate a new key pair, assign a new VPN address (10.8.0.2, 10.8.0.3, 10.8.0.4, ...), and repeat the steps above using a different name instead of phone or desktop.

phone.conf/desktop.conf
Full Tunnel Mode -> AllowedIPs = 0.0.0.0/0 Bütün internet trafiğin VPN'den geçer.

Split Tunnel Mode -> AllowedIPs = 10.8.0.0/24 Sadece sunucuna ait trafik VPN'den geçer.

Delete Server Key

   rm -f \
   /etc/wireguard/server_private.key \
   /etc/wireguard/server_public.key \
   /etc/wireguard/wg0.conf

sudo systemctl disable --now wg-quick@wg0

-AdGuard Settings-

Bind to public IP addresses? (If you have an private IP choose NO) -> (Yes)
Enable DNS-over-HTTPS/TLS/QUIC? -> (No)

sudo apt update
sudo apt install apache2-utils

sudo grep -A4 '^users:' /var/www/adguardhome/AdGuardHome.yaml

Should see current user

New Password

htpasswd -B -C 10 -n -b USERNAME 'NEW_PASSWORD'

USERNAME:$2y$10$...

sudo systemctl stop adguardhome

sudo cp /var/www/adguardhome/AdGuardHome.yaml \
/var/www/adguardhome/AdGuardHome.yaml.bak

sudo nano /var/www/adguardhome/AdGuardHome.yaml

Replace only the password: value in the following section:

users: name: USERNAME password: $2y$10$...

sudo chown adguardhome:adguardhome /var/www/adguardhome/AdGuardHome.yaml
sudo systemctl start adguardhome
sudo systemctl status adguardhome --no-pager

Close uBlock origin or other 3rd party blockers to load login page

Login Page -> https://ads.domain/login.html