Wolkra

Oppaat

Julkaise sovellus Docker Composella VPS:llä

Julkaise sovellus Docker Composella VPS:llä: asenna Docker Ubuntuun tai Debianiin, kirjoita compose.yaml, lisää HTTPS Caddylla, pidä salaisuudet turvassa ja päivitä.

Päivitetty 4 min lukuaika

Julkaise sovellus Docker Composella VPS:llä näin: asenna Docker Engine ja Compose-laajennus, sijoita compose.yaml- ja .env-tiedostot projektihakemistoon, aja docker compose up -d ja aseta eteen käänteinen välityspalvelin, kuten Caddy, HTTPS:ää varten. Päivitykset hoituvat sen jälkeen komennolla docker compose pull && docker compose up -d.

Tässä oppaassa rakennetaan pieni mutta realistinen kokonaisuus: verkkosovellus, Postgres-tietokanta ja Caddy automaattista HTTPS:ää varten, Ubuntu 24.04:llä tai Debian 12:lla.

1. Valmistele palvelin

Aloita palvelimella, jolle on tehty ensimmäiset askeleet: päivitykset, sudo-käyttäjä, SSH-avaimet ja palomuuri. Tälle kokonaisuudelle 2 GB muistia on järkevä vähimmäismäärä.

Osoita DNS-tietue palvelimeen ennen aloittamista, jotta HTTPS toimii heti ensimmäisellä yrityksellä:

text
app.example.com.   A      203.0.113.10        ; esimerkkiosoite
app.example.com.   AAAA   2001:db8::10        ; esimerkkiosoite

2. Asenna Docker Engine ja Compose

Käytä Dockerin omaa pakettivarastoa; jakeluiden paketit ovat usein vanhempia.

bash
sudo apt update
sudo apt install -y ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
. /etc/os-release
sudo curl -fsSL "https://download.docker.com/linux/$ID/gpg" -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
https://download.docker.com/linux/$ID $VERSION_CODENAME stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list >/dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

$ID on ubuntu tai debian, joten samat rivit toimivat molemmissa. Tarkista:

bash
sudo docker run --rm hello-world
docker compose version

Anna käyttäjällesi oikeus ajaa Dockeria ilman sudoa (kirjaudu sen jälkeen ulos ja takaisin sisään):

bash
sudo usermod -aG docker $USER

Jäsenyys docker-ryhmässä vastaa käytännössä root-oikeuksia. Lisää ryhmään vain luotettuja käyttäjiä.

Oikotie: Wolkran Docker-sovellus yhdellä klikkauksella asentaa Docker CE:n ja Composen puolestasi.

3. Järjestä projekti

bash
mkdir -p ~/apps/myapp && cd ~/apps/myapp

Selkeä rakenne tekee palvelimesta helposti ymmärrettävän vielä kuukausien päästä:

text
~/apps/myapp/
├── compose.yaml
├── .env            # salaisuudet, ei gitiin
└── Caddyfile

4. Kirjoita compose.yaml

yaml
services:
  app:
    image: ghcr.io/example/myapp:1.4.2
    restart: unless-stopped
    env_file: .env
    environment:
      DATABASE_URL: postgres://myapp:${POSTGRES_PASSWORD}@db:5432/myapp
    depends_on:
      db:
        condition: service_healthy
    expose:
      - "3000"

  db:
    image: postgres:16
    restart: unless-stopped
    environment:
      POSTGRES_USER: myapp
      POSTGRES_DB: myapp
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    volumes:
      - db-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U myapp"]
      interval: 10s
      retries: 5

  caddy:
    image: caddy:2
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
      - "443:443/udp"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy-data:/data
      - caddy-config:/config

volumes:
  db-data:
  caddy-data:
  caddy-config:

Huomionarvoista:

  • Lukitse levykuvien versiot (1.4.2, 16), jotta uudelleenkäynnistys ei koskaan hae yllättävää pääversiopäivitystä.
  • expose, ei ports, sovellukselle ja tietokannalle. Ne ovat tavoitettavissa vain Compose-verkon sisällä. Vain Caddy julkaisee portteja.
  • Nimetyt volyymit säilyttävät datan, kun kontit luodaan uudelleen.
  • depends_on terveystarkistuksella odottaa, että Postgres ottaa yhteyksiä vastaan.

Korvaa ghcr.io/example/myapp omalla levykuvallasi ja portillasi.

5. Tallenna salaisuudet .env-tiedostoon

bash
cat > .env <<EOF
POSTGRES_PASSWORD=$(openssl rand -hex 24)
APP_SECRET=$(openssl rand -hex 32)
EOF
chmod 600 .env

Compose lukee projektihakemiston .env-tiedoston ${...}-korvauksia varten, ja env_file välittää sen sovellukselle. Lisää .env tiedostoon .gitignore, jos hakemisto on git-työkopio.

6. Lisää HTTPS Caddylla

Luo Caddyfile:

text
app.example.com {
    encode zstd gzip
    reverse_proxy app:3000
}

Caddy hakee ja uusii varmenteen automaattisesti heti, kun DNS osoittaa palvelimeen ja portit 80 ja 443 ovat auki. Lisää vaihtoehtoja löydät Caddy-välityspalvelinoppaasta.

7. Käynnistä kokonaisuus

bash
docker compose up -d
docker compose ps
docker compose logs -f caddy

Kun Caddy kirjaa lokiin certificate obtained successfully, avaa https://app.example.com.

8. Muista palomuuri

Docker lisää iptables-sääntöjä, jotka käsitellään ennen UFW:tä. Portti, joka on julkaistu ports:-määrityksellä, on tavoitettavissa internetistä, vaikka UFW väittäisi sen olevan estetty. Kolme tapaa pysyä turvassa:

  1. Julkaise vain käänteinen välityspalvelin (kuten yllä).
  2. Sido kaikki muu localhostiin: "127.0.0.1:5432:5432".
  3. Suodata palvelimen edessä pilvipalomuurilla, jota Docker ei voi ohittaa. Salli portit 80 ja 443 kaikkialta ja portti 22 vain omasta osoitteestasi.

9. Päivitä ilman draamaa

Vaihda levykuvan tagi tiedostossa compose.yaml ja aja sitten:

bash
docker compose pull
docker compose up -d
docker image prune -f

Compose luo uudelleen vain ne palvelut, joiden levykuva tai määritys on muuttunut. Palataksesi edelliseen versioon aseta vanha tagi ja aja up -d uudelleen. Ota tilannevedos ennen suuria päivityksiä, kuten Postgresin uutta pääversiota, joka vaatii vedoksen ja palautuksen.

10. Varmuuskopioi data

Volyymit sijaitsevat hakemistossa /var/lib/docker/volumes. Tietokannalle looginen vedos on turvallisempi kuin tiedostojen kopioiminen:

bash
docker compose exec -T db pg_dump -U myapp myapp | gzip > ~/backups/myapp-$(date +%F).sql.gz

Aja tämä cronista joka yö ja kopioi tiedostot pois palvelimelta. Palvelintason varmuuskopiot auttavat myös: Wolkrassa päivittäiset varmuuskopiot maksavat 20 % palvelimen hinnasta ja säilyttävät 7 palautuspistettä. Varmuuskopiointistrategiaopas kokoaa kaiken yhteen.

11. Lokit ja rajat

Dockerin oletuslokit kasvavat rajatta. Rajoita ne yleisesti tiedostossa /etc/docker/daemon.json:

json
{
  "log-driver": "json-file",
  "log-opts": { "max-size": "10m", "max-file": "3" }
}

Aja sitten sudo systemctl restart docker. Voit myös rajoittaa palvelukohtaista muistia asetuksella mem_limit: 512m, jotta yksi kontti ei voi viedä muilta kaikkea muistia.

12. Käynnistys koneen käynnistyessä

restart: unless-stopped yhdessä käytössä olevan Docker-palvelun kanssa tarkoittaa, että kokonaisuus palaa uudelleenkäynnistyksen jälkeen. Testaa se kerran:

bash
sudo reboot
# kirjaudu uudelleen sisään
docker compose -f ~/apps/myapp/compose.yaml ps

13. Julkaise CI:stä

Kun kokonaisuus toimii, julkaisut voivat olla automaattisia. CI-työ kääntää ja lähettää levykuvan uudella tagilla, yhdistää sitten palvelimeen SSH:lla ja ajaa:

bash
cd ~/apps/myapp
sed -i 's|myapp:.*|myapp:1.4.3|' compose.yaml
docker compose pull app
docker compose up -d app

Anna CI-työlle oma SSH-avain, joka on rajattu tähän palvelimeen, kuten SSH-avainoppaassa kuvataan.

Milloin kasvaa yhtä palvelinta suuremmaksi

Compose yhdellä palvelimella vie pitkälle. Kun tarvitset enemmän, tavalliset seuraavat askeleet ovat:

Jos haluat hallita monia sovelluksia verkkokäyttöliittymän kautta, Coolify-sovellus yhdellä klikkauksella rakentuu samalle Docker-pohjalle. Lisää ideoita löydät sivulta Docker-hosting.

Usein kysytyt kysymykset

Riittääkö Docker Compose tuotantokäyttöön?

Yhdellä palvelimella kyllä. Monet pienet ja keskisuuret sovellukset pyörivät Composella vuosia. Siirry orkestrointityökaluun vasta, kun tarvitset useita palvelimia, automaattista vikasietoisuutta tai porrastettuja päivityksiä usean koneen yli.

Kuinka ison VPS:n tarvitsen Docker Composelle?

Laske yhteen, mitä kukin kontti käyttää. Verkkosovellus, Postgres ja Redis toimivat mukavasti 2–4 GB:n muistilla; jätä tilaa levykuvien käännöksille, jos käännät palvelimella.

Miksi UFW ei estä konttieni portteja?

Docker lisää omat iptables-sääntönsä, jotka käsitellään ennen UFW:tä. Julkaise portit osoitteeseen 127.0.0.1 ja aseta käänteinen välityspalvelin eteen, tai suodata liikenne pilvipalomuurilla.

Pitäisikö levykuvat kääntää palvelimella?

Pienissä projekteissa se toimii. Toistettavia julkaisuja varten käännä CI:ssä, lähetä levykuva rekisteriin ja hae se palvelimelle pelkällä pullilla.

Voinko jättää Dockerin asentamisen väliin?

Kyllä. Valitse Wolkrassa palvelinta luodessasi Docker CE -sovellus yhdellä klikkauksella; siinä Docker ja Compose-laajennus ovat valmiiksi asennettuina.

Käynnistä palvelin Frankfurtissa

Luo tili, lataa saldoa ja aja palvelinta alkaen €3.49 kuukaudessa. Maksat vain käyttämistäsi tunneista. Mittaamaton kaistanleveys kaikissa paketeissa.