Russia has rained missiles near Ukraine's Black Sea port of Odesa, hitting an apartment building and a resort and killing at least 19 people, Ukrainian officials say, hours after Russian troops were driven off nearby Snake Island.
One section of a nine-storey apartment block was completely destroyed by a missile that struck at 1am on Thursday.
Residents were helping rescue workers comb the rubble.
Ukrainian officials said at least 16 people had been killed at the apartment block in the village of Serhiivka, and another three, including one child, in strikes that hit nearby holiday resorts.
The Kremlin denied targeting civilians: "I would like to remind you of the president's words that the Russian Armed Forces do not work with civilian targets," Kremlin spokesperson Dmitry Peskov told reporters.
Thousands of civilians have been killed since Russia invaded Ukraine on February 24 in a "special operation" to root out nationalists.
A day earlier, Russia pulled its troops off Snake Island, a desolate but strategically important outcrop that it seized on the war's first day and has used to control the northwestern Black Sea, where it has blockaded Odesa and other ports.
In his nightly video address, President Volodymyr Zelenskiy hailed what he described as a strategic victory.
"It does not yet guarantee security. It does not yet ensure that the enemy will not come back," he said. "But this significantly limits the actions of the occupiers. Step by step, we will push them back from our sea, our land and our sky."
In eastern Ukraine, where Russia is pressing its main ground offensive, Ukrainian forces were holding on to the city of Lysychansk, although officials described it as under ferocious artillery attack.
In Kyiv, Ukrainian lawmakers gave a standing ovation as the flag of the European Union was carried through the chamber to stand alongside Ukraine's own flag behind the dais, a symbol of Ukraine's formal EU candidate status granted last week.
The strike on Odesa, using long-range missiles, comes after days in which Russia has escalated such attacks deep in Ukraine, far from front lines, including an attack on Monday that killed at least 19 people in a crowded shopping mall.
A Ukrainian general said on Thursday that Russia may be trying to hit military targets but is killing civilians by firing inaccurate, obsolete missiles into populous areas.
Russia has focused its main ground campaign on the east, where it demands Kyiv cede full control of two provinces to pro-Russian separatist proxies.
Ukraine's last bastion in one of those provinces, Luhansk, is the city of Lysychansk across the Siverskyi Donets river, which is close to being encircled under relentless Russian artillery assault.
The Russians were shelling Lysychansk from different directions and approaching from several sides, regional Governor Serhiy Gaidai said on Ukrainian television.
"The superiority in fire power of the occupiers is still very much in evidence," Zelenskiy said. "They have simply brought in all their reserves to hit us."
Russia has used its control of the sea to impose a blockade on Ukraine, one of the world's biggest grain exporters, threatening to shatter Ukraine's economy and cause global famine. Moscow denies it is to blame for a food crisis, which it says is caused by Western sanctions and Ukrainian sea mines.
Pushing the Russians off Snake Island could be a step towards reopening Odesa's port, although military analysts say Russia could still threaten cargo ships at sea.
Despite yielding ground and taking punishing losses in the eastern Donbas in recent weeks, Ukraine hopes to inflict enough damage to exhaust Russia's advancing army, and turn the tide in coming months with advanced weapons arriving from the West.
The United States announced a further $US800 million in weapons and military aid. US President Joe Biden, speaking after a NATO summit in Madrid, said America and its allies were united in standing up to Russian President Vladimir Putin.
"I don't know how it's going to end, but it will not end with Russia defeating Ukraine," Biden told a news conference. "We are going to support Ukraine for as long as it takes."
Australian Associated Press
Sign up for our newsletter to stay up to date.